傳統方案:skip-grant-tables 需重啟服務,影響業務。本文介紹 利用 MyISAM 表文件複製 + SIGHUP 熱加載 的零停機方案。
mysql.user 是 MyISAM,文件級複製即時生效SIGHUP 會重新讀取授權表 (相當於 FLUSH PRIVILEGES)mysql.user 到可寫庫 (如 test),修改密碼哈希,複製回原位,發送 SIGHUPcd /var/lib/mysql
cp mysql/user.* test/
chown mysql:mysql test/user.*
mysql -ureadwrite -p test
UPDATE test.user SET password=PASSWORD('NewPass123') WHERE user='root' AND host='localhost';
cp test/user.MY* mysql/
kill -SIGHUP $(pidof mysqld)
mysql -uroot -p'NewPass123'
SHOW GRANTS;
| 風險 | 應對 |
|---|---|
| 舊密碼被遺留應用使用 | 修改前備份原哈希,或改建新超管賬號再恢復舊哈希 |
| 權限表損壞導致無法登入 | 操作前備份 mysql/user.*,失敗可還原 |
| MySQL 8.0+ 權限表改為 InnoDB | 此法僅適用 5.7 及之前 (MyISAM 權限表),8.0 需官方重置流程 |
MySQL 5.1 / 5.5 / 5.6 / 5.7 (權限表為 MyISAM)。MySQL 8.0 請用 --init-file 重啟重置。
原文:Recovering MySQL access without restart