MySQL忘记密码了怎么解决
笔者曾经有一次误删了mysqlroot用户,怎么办?
之前的解决方式是通过忽略授权表的方式重启mysql然后插入相关数据解决该问题的,但是这种方式需要重启mysql,会影响现有业务,那么有没有其他方式可以不重启MySQL就解决呢?
因为mysql的user表示MyISAM引擎的,因此我们可以通过修改对应的文件来解决这个问题。下面是本人在测试环境的一次演练,仅供参考。
一、查看现有用户
04:18:34 root@localhost [mysql]>select user,host from user;+---------------+-----------+| user | host |+---------------+-----------+| mysql.session | localhost || mysql.sys | localhost || root | localhost |+---------------+-----------+3 rows in set (0,00 sec)
二、删除本地root用户
04:18:59 root@localhost [mysql]>drop user root@'localhost';
三、再次查看用户
04:20:02 root@localhost [mysql]>select user,host from user;+---------------+-----------+| user | host |+---------------+-----------+| mysql.session | localhost || mysql.sys | localhost |+---------------+-----------+
四、移动user表相关文件
[root@localhost mysql]# cp user.* /vagrant/mysql/3307/data/test/
五、登录另一个实例并查看user表
04:23:53 root@localhost [(none)]>use test;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changed04:23:56 root@localhost [test]>show tables;+----------------+| Tables_in_test |+----------------+| user |+----------------+1 row in set (0,00 sec)04:23:58 root@localhost [test]>select * from user\G*************************** 1. row ***************************Host: localhostUser: mysql.sessionSelect_priv: NInsert_priv: NUpdate_priv: NDelete_priv: NCreate_priv: NDrop_priv: NReload_priv: NShutdown_priv: NProcess_priv: NFile_priv: NGrant_priv: NReferences_priv: NIndex_priv: NAlter_priv: NShow_db_priv: NSuper_priv: YCreate_tmp_table_priv: NLock_tables_priv: NExecute_priv: NRepl_slave_priv: NRepl_client_priv: NCreate_view_priv: NShow_view_priv: NCreate_routine_priv: NAlter_routine_priv: NCreate_user_priv: NEvent_priv: NTrigger_priv: NCreate_tablespace_priv: Nssl_type:ssl_cipher:x509_issuer:x509_subject:max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *C7A1AAE2D250AFD864050FAF4935EF6F5D185A92password_expired: Npassword_last_changed: 2018-02-23 13:19:12password_lifetime: NULLaccount_locked: Y*************************** 2. row ***************************Host: localhostUser: mysql.sysSelect_priv: NInsert_priv: NUpdate_priv: NDelete_priv: NCreate_priv: NDrop_priv: NReload_priv: NShutdown_priv: NProcess_priv: NFile_priv: NGrant_priv: NReferences_priv: NIndex_priv: NAlter_priv: NShow_db_priv: NSuper_priv: NCreate_tmp_table_priv: NLock_tables_priv: NExecute_priv: NRepl_slave_priv: NRepl_client_priv: NCreate_view_priv: NShow_view_priv: NCreate_routine_priv: NAlter_routine_priv: NCreate_user_priv: NEvent_priv: NTrigger_priv: NCreate_tablespace_priv: Nssl_type:ssl_cipher:x509_issuer:x509_subject:max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *C7A1AAE2D250AFD864050FAF4935EF6F5D185A92password_expired: Npassword_last_changed: 2018-02-23 13:19:26password_lifetime: NULLaccount_locked: Y2 rows in set (0,00 sec)
六、把本实例的root用户插入刚刚移动过来的user表
04:25:03 root@localhost [test]>insert into user select * from mysql.user where user = 'root' and host ='localhost';Query OK, 1 row affected (0,02 sec)Records: 1 Duplicates: 0 Warnings: 0
七、再次移动user文件到原先的位置
[root@localhost test]# cp user.* /vagrant/mysql/3306/data/mysql
八、重新加载配置到内存
[root@localhost test]# kill -HUP `pidof mysqld`
通过该步mysql并不会重启,对应用不会有影响
九、重新登录,OK
[root@localhost test]# mysql -uroot -p -S /tmp/mysql3306.sockEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 13Server version: 5.7.21-log MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.04:30:57 root@localhost [(none)]>
