清理預設帳號時不慎刪除 root 用戶,且未授予任何權限,導致無法正常登入管理。利用 MySQL --skip-grant-tables 模式繞過權限系統,即可重建 root 帳號並恢復完整權限。
--skip-grant-tables 讓 mysqld 啟動時不載入權限表,任何連線均擁有最高權限,但也意味著極高安全風險,操作期間請確保:
service mysqld stop
mysqld_safe --skip-grant-tables &
背景執行,終端機保持開啟。
mysql -u root USE mysql;
INSERT INTO user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject)
VALUES ('localhost', 'root', '', '', '', '');
注意:MySQL 5.7+ 密碼欄位為 authentication_string,語法需調整。
UPDATE user SET Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y', Reload_priv='Y', Shutdown_priv='Y', Process_priv='Y', File_priv='Y', Grant_priv='Y', References_priv='Y', Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='Y', Create_tmp_table_priv='Y', Lock_tables_priv='Y', Execute_priv='Y', Repl_slave_priv='Y', Repl_client_priv='Y', Create_view_priv='Y', Show_view_priv='Y', Create_routine_priv='Y', Alter_routine_priv='Y', Create_user_priv='Y', Event_priv='Y', Trigger_priv='Y', Create_tablespace_priv='Y', authentication_string='' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES; QUIT;
# 終止背景 mysqld_safe (Ctrl+C 或 kill) service mysqld restart
mysql -u root -p # 輸入空密碼或新設密碼登入成功
| 版本 | 密碼欄位 | 建議語法 |
|---|---|---|
| 5.5 / 5.6 | Password | UPDATE ... SET Password=PASSWORD('newpwd') |
| 5.7 / 8.0 | authentication_string | ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpwd'; (需正常模式) |
5.7+ 版本在 --skip-grant-tables 下無法使用 ALTER USER,需先 UPDATE authentication_string='',重啟後再用 ALTER USER 設定強密碼。
恢復登入後,立即執行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongP@ssw0rd!'; FLUSH PRIVILEGES;
並檢查 user 表是否有匿名帳號、無密碼帳號、% 主機帳號,一併清理。