遺忘 MySQL root 密碼是常見運維場景。本文提供 CentOS 系統下通用的密碼重置流程,基於跳過權限表啟動實例,適用於 MySQL 5.6/5.7/8.0(部分命令略有差異,文中標註)。
mysqld、mysql 或 mariadb)。# Systemd 系統
systemctl stop mysqld
# 或 SysVinit
service mysqld stop
啟動參數 --skip-grant-tables 使臨時實例不驗證密碼;--skip-networking 防止外部連入(安全)。
mysqld_safe --skip-grant-tables --skip-networking &
# 輸出示例:
# Starting mysqld daemon with databases from /var/lib/mysql
# mysqld_safe[12345]: started
MySQL 8.0+ 注意:需額外指定 --shared-memory(Windows)或確保 socket 文件可寫;部分版本需先建立 /var/run/mysqld 目錄並授權。
mysql -u root
# 進入 mysql> 提示符
MySQL 5.7 / 8.0(推薦 ALTER USER):
FLUSH PRIVILEGES; -- 必須先執行,刷新 grant tables
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 或支援 mysql_native_password 插件
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewStrongPass123!';
MySQL 5.6 舊語法:
FLUSH PRIVILEGES;
UPDATE mysql.user SET authentication_string = PASSWORD('NewStrongPass123!') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
QUIT;
# 停止臨時實例
mysqladmin -u root -p shutdown
# 輸入新密碼確認
# 正常啟動
systemctl start mysqld
mysql -u root -p
# 輸入新密碼,成功進入即完成重置
| 現象 | 原因與解決 |
|---|---|
| ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement | 未執行 FLUSH PRIVILEGES; 就嘗試修改密碼 |
| mysqld_safe 無法啟動,提示 socket 錯誤 | 檢查 /var/run/mysqld 目錄存在且 mysql 用戶可寫 |
| 密碼策略報錯 | 新密碼需滿足 validate_password 策略:長度、大小寫、數字、特殊字符 |
| Host 不是 localhost | 檢查 SELECT User, Host FROM mysql.user; 確認實際 Host 值(可能為 127.0.0.1、% 等) |
mysql_secure_installation 移除匿名用戶、禁止 root 遠程登錄、刪除 test 庫。