遺忘 MySQL root 密碼是資料庫管理員常見的頭痛問題。傳統做法通常需要停止服務、啟動跳過權限驗證模式、修改密碼後再重啟服務,過程繁瑣且造成服務中斷。本文將介紹三種重置密碼的方法,重點講解完全不重啟 mysqld 進程的進階技巧,讓你在生產環境中也能從容應對密碼遺失危機。
此為最經典的重置方式,適用於單實例環境:
/etc/init.d/mysql stopmysqld_safe --skip-grant-tables --user=mysql &--skip-grant-tables 讓 MySQL 忽略授權驗證,允許無密碼登入。shell> mysql
mysql> UPDATE mysql.user SET password=PASSWORD('123456') WHERE user='root' AND host='localhost';
mysql> FLUSH PRIVILEGES;
shell> mysqladmin -uroot -p123456 shutdown
shell> /etc/init.d/mysql start
shell> mysql -uroot -p123456
針對 mysqld_multi 管理的多實例架構:
mysqld_multi stopmysqld_safe --defaults-file=/data/mysql/mysql3377/mysql3377.cnf --skip-grant-tables &mysql -uroot -p -S /tmp/mysql3377.sock(此時密碼為空)mysqld_multi restart 3377前提條件:擁有另一個具備 test 資料庫寫入權限的低權限帳號(或同版本其他實例的帳號)。
[root@localhost mysql]# cp mysql/user.* test/
[root@localhost mysql]# chown mysql.mysql test/user.*
將 mysql 資料庫下的 user 表文件(user.MYD、user.MYI、user.frm)複製到 test 資料庫目錄,並修正擁有者。mysql> USE test;
mysql> UPDATE user SET password=PASSWORD('yayun') WHERE user='root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 5 Changed: 0 Warnings: 0
注意:此處 Rows matched: 5, Changed: 0 可能因密碼值相同導致,實際已寫入新密碼雜湊值。mv mysql/user.MYD mysql/user.MYD.bak
mv mysql/user.MYI mysql/user.MYI.bak
cp test/user.MY* mysql/
chown mysql.mysql mysql/user.*
[root@localhost mysql]# pgrep -n mysql
2184
[root@localhost mysql]# kill -SIGHUP 2184
SIGHUP 信號通知 MySQL 重新讀取授權表,無需重啟進程即可生效新密碼。[root@localhost mysql]# mysql -uroot -pyayun
Welcome to the MySQL monitor...
mysql>
登入成功,密碼重置完成!user.MYD/user.MYI)為獨立文件,直接替換文件後發送 SIGHUP 觸發 reload_grant_tables() 即可熱加載。test 庫的 INSERT/UPDATE 權限;生產環境建議先在測試環境驗證。「不重啟重置密碼」利用 MyISAM 權限表文件獨立性與 SIGHUP 熱加載機制,實現零停機修改 root 密碼。雖然現代 MySQL 版本權限表架構已變更,但此思路對理解 MySQL 權限系統、文件層面操作極具參考價值。遇到密碼遺失時,優先嘗試官方 --init-file 方案(同樣需重啟),若極度不能停機,可參考本文思路探索適配當前版本的熱修方案。