誤執行 DROP USER 'root'@'localhost' 並 FLUSH PRIVILEGES 後,無任何超級用戶可登入。利用 --skip-grant-tables 繞過權限系統,直接操作 mysql.user 表重建 root,是經典急救方案。
mysqld --skip-grant-tables 啟動時:
mysql.user、db、tables_priv 等)。官方文檔原文:
This option causes the server to start without using the privilege system at all, which gives anyone with access to the server unrestricted access to all databases.
service mysqld stopmysqld_safe --skip-grant-tables &
# 或前台調試
/usr/libexec/mysqld --skip-grant-tables --user=mysql &
mysql -u root
# 直接進入,無需密碼
USE mysql;
-- 5.7+ authentication_string 列
INSERT INTO user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES ('localhost', 'root', '', '', '', '');
-- 5.6 Password 列
-- INSERT INTO user (Host, User, Password) VALUES ('localhost', 'root', '');
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='' -- 5.7+ 密碼為空
WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
mysqladmin shutdown # 或 kill 進程
service mysqld start
mysql -u root -p
# 密碼為空直接回車
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPwd!'; -- 5.7+
-- 或
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPwd!'); -- 5.6
--skip-grant-tables 期間任何人可無密碼登入,**務必在內網/控制台操作,禁止暴露公網**。authentication_string,5.6 用 Password,8.0+ 推薦 ALTER USER 而非直接 UPDATE。mysql.user 是否有匿名用戶、無密碼用戶、過度授權賬號,全數清理。誤刪 root 不可怕,--skip-grant-tables 是通用急救鑰匙。平時多演練,關鍵時刻手不抖。