如果忘记了MySQL的root用户密码有两种解决方案。
在启动mysqld的时候加上参数skip-grant-tables
mysql 8里面加了这个参数会自动加上–skip-networking不允许远程连接,加入的方法可以是在命令行加入,类似:mysqld_safe —skip-grant-tables &
或者修改启动的参数文件,如:/etc/my.cnf或者 /etc/mysql/mysql.cnf ,在[mysqld]下面加上skip-grant-tables
root@infokist:/etc/mysql# service mysql restart root@infokist:/etc/mysql# mysql mysql> update mysql.user set authentication_string=password('dingjia') where user='root'; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
但在MySQL 8版本中,这种方式已经不可行,因为其已移除了PASSWORD()函数。可以使用alter user的命令,但注意要载入权限表后才能alter user。
mysql> alter user root identified by 'dingjia'; ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement mysql> flush privileges; Query OK, 0 rows affected (0.07 sec) mysql> alter user root@localhost identified by 'dingjia'; Query OK, 0 rows affected (0.02 sec)、
密码修改完成后记得把配置文件里面的参数skip-grant-tables去掉,重新启动。
init-file方案
这种方法只会重启一次MySQL实例,而且基本上不存在安全隐患。
先关闭实例,再创建一个sql文件,例如chpw.sql,在文件里面写上密码修改语句。
alter user 'root'@'localhost' identified by 'dingjia';
注意这个文件要mysqld线程能访问,最后,使用–init-file参数启动实例,类似: mysqld_safe --init-file=/tmp/chpw.sql &
如果mysql实例是通过服务脚本来管理的,在配置文件里面加入下面的一行再启动实例。
init-file=/tmp/chpw.sql
实例启动成功后,密码即修改完毕。