root 密碼遺失是 DBA 必經考驗。本文提供針對 Linux 系統服務、Windows 服務、Docker 容器 三大部署場景的標準化、可驗證重置流程,並解析原理與安全加固建議。
MySQL 權限驗證發生在服務啟動後。若以 --skip-grant-tables 啟動,mysqld 不載入 mysql.user 等授權表,任何用戶無需密碼即可連線並擁有超級權限。利用此窗口期更新 mysql.user 表中 root 的 authentication_string (5.7+) 或 Password (5.6-) 欄位,再正常重啟即可。
# 1. 建立臨時 drop-in 覆蓋啟動參數
systemctl edit mysqld
# 編輯器中輸入:
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --skip-grant-tables --skip-networking $MYSQLD_OPTS
# 2. 重載配置並重啟
systemctl daemon-reload
systemctl restart mysqld
# 3. 無密碼登入重置
mysql -u root
# MySQL 5.7+ (authentication_string)
UPDATE mysql.user SET authentication_string=PASSWORD('NewStrongPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
EXIT;
# 4. 移除覆蓋並正常重啟
systemctl revert mysqld
systemctl daemon-reload
systemctl restart mysqld
# 5. 驗證新密碼
mysql -u root -p'NewStrongPass123!' -e "SELECT USER();"
# 1. 停止服務
service mysqld stop # 或 systemctl stop mysqld
# 2. 手動啟動跳過授權 (後台)
mysqld_safe --skip-grant-tables --skip-networking --user=mysql &
# 3. 登入重置 (同方法 A 步驟 3)
# 4. 關閉臨時進程並正常啟動
mysqladmin -u root shutdown # 新密碼已生效可關閉
service mysqld start
# 1. 停止服務
net stop MySQL80 # 服務名視安裝而定
# 2. 管理員 CMD/PowerShell 手動啟動
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
mysqld --skip-grant-tables --skip-networking --console
# 3. 新開管理員終端登入重置
mysql -u root
# 同 Linux 步驟 3
# 4. 關閉前台進程 (Ctrl+C),正常啟動服務
net start MySQL80
# 1. 提交當前容器狀態為鏡像 (保護數據)
docker commit mysql_container mysql_backup:before_reset
# 2. 以 --skip-grant-tables 重新運行臨時容器掛載原數據卷
docker run -d --name mysql_reset \
-v mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=temp \
mysql:8.0 --skip-grant-tables --skip-networking
# 3. 進入容器重置
docker exec -it mysql_reset mysql -u root
# 同步驟 3
# 4. 清理臨時容器,重啟原容器
docker stop mysql_reset && docker rm mysql_reset
docker restart mysql_container
# 5. 驗證
docker exec -it mysql_container mysql -u root -p'NewStrongPass123!' -e "SELECT VERSION();"
| 版本 | 密碼欄位 | 重置 SQL |
|---|---|---|
| 5.6 及之前 | Password (CHAR(41)) | UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='root'; |
| 5.7 / 8.0 | authentication_string (TEXT) | UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='root'; |
| 8.0.4+ (caching_sha2_password) | authentication_string | ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'; (推薦,自動處理插件) |
dba_admin@'10.0.0.%' 擁有 GRANT OPTION,作為 root 失效時的備用入口。my.cnf 設置 skip-grant-tables=OFF (默認),防止惡意重啟繞過。監控服務啟動參數變更。require_secure_transport=ON,防止密碼明文傳輸被竊聽。結語:root 密碼重置本質是利用啟動參數繞過認證層直接操作系統表。掌握三大場景標準流程、理解版本差異、落地安全加固,才是合格 DBA 的必修課。