這里主要介紹在不知MySQL的root密碼的情況下,使用--skip-grant-tables關閉MySQL服務器的認證,從而可以重置root的密碼。MySQL版本為5.7。
1、關閉MySQL
sudo service mysqld stop
2、使用--skip-grant-tables 和 --skip-networking 重啟MySQL
sudo mysqld --skip-grant-tables --skip-networking &
--skip-grant-tables:此選項會讓MySQL服務器跳過驗證步驟,允許所有用戶以匿名的方式,無需做密碼驗證直接登陸MySQL服務器,並且擁有所有的操作權限。
--skip-networking:此選項會關門MySQL服務器的遠程連接。這是因為以--skip-grant-tables方式啟動MySQL服務器會有很大的安全隱患,為了降低風險,需要禁止遠程客戶端的連接。
3、本地連接mysql
shell> mysql
--skip-grant-tables已經關閉MySQL服務器的認證,以匿名方式,無需密碼即可連接。
4、重置密碼
在重置密碼前,先要重載授權表:
mysql> FLUSH PRIVILEGES;
MySQL 5.7.6+:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
MySQL 5.7.6以及之后的版本,使用ALTER USER語法來修改密碼。
MySQL 5.7.5以及之前的版本
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');
MySQL 5.7.5以及之前的版本使用SET PASSWORD語法修改密碼。
如果上面的方法修改密碼有錯,可以直接修改mysql.user表:
UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
注意:mysql5.7 user表里已經去掉了password字段,改為了authentication_string。
5、重啟服務器
service mysqld restart
因為之前使用--skip-grant-tables啟動,所以需要重啟mysql服務器,去掉--skip-grant-tables。
參考:https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html