Root 密碼遺失是 MySQL 運維中最常見的緊急場景。本文提供 Windows 與 Linux 兩大平台的標準化重置流程,涵蓋 --skip-grant-tables 緊急模式與 mysqladmin 正規修改兩種方案,並針對 MySQL 5.7/8.0 語法差異特別標註,確保一次成功。
--skip-grant-tables 讓 mysqld 啟動時不載入權限表,任何用戶可無密碼以 root 身分連線並修改 mysql.user 表。修改完成後必須 FLUSH PRIVILEGES 重新載入權限,最後正常重啟服務生效。
net stop MySQL80 # 服務名視安裝而定,可用 `sc query` 查詢
C:\Program Files\MySQL\MySQL Server 8.0\bin)。mysqld --skip-grant-tables --console
視窗會停留在前景顯示日誌,勿關閉此視窗。
mysqladmin -u root flush-privileges password "NewStrongPass123!"
系統會提示輸入新密碼確認,輸入兩次即可。
net start MySQL80
mysql -uroot -p"NewStrongPass123!"mysql -urootUSE mysql;
-- MySQL 5.7
UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
-- MySQL 8.0+ (authentication_string 不再用 PASSWORD())
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
FLUSH PRIVILEGES;
EXIT;
| 現象 | 原因 | 解決 |
|---|---|---|
Access denied 即使用 skip-grant-tables | Windows 服務殘留進程 | 任務管理員強制結束所有 mysqld.exe 後再試 |
Unknown column 'password' | 5.7+ 欄位改為 authentication_string | 使用正確欄位名或改用 ALTER USER |
| 密碼修改後仍無法登入 | 未執行 FLUSH PRIVILEGES 或未正常重啟 | 確保完整執行重啟流程 |
systemctl stop mysqld # 或 mysql, mariadb 視發行版而定
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
mysqld_safe --skip-grant-tables --skip-networking --socket=/var/run/mysqld/mysqld.sock --pid-file=/var/run/mysqld/mysqld.pid --datadir=/var/lib/mysql &
--skip-networking禁止遠端連入,提升安全性;&放入背景。
mysql -uroot --socket=/var/run/mysqld/mysqld.sock
-- 進入 mysql shell 後:
USE mysql;
-- 5.7
UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
-- 8.0+
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
FLUSH PRIVILEGES;
EXIT;
mysqladmin -uroot --socket=/var/run/mysqld/mysqld.sock shutdown
systemctl start mysqld
mysql -uroot -p'NewPass123!'# 進入容器
docker exec -it mysql_container bash
# 容器內執行上述 Linux 流程,注意:
# 1. 容器通常無 systemd,直接 kill mysqld 進程
# 2. 資料目錄通常為 /var/lib/mysql
# 3. 修改後需重啟容器:docker restart mysql_container
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Pass123!';UPDATE ... PASSWORD(),必須用 ALTER USER 或 SET PASSWORD。UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;