生產環境多基於Linux部署MySQL 5.6,Root密碼遺忘時需通過 --skip-grant-tables 進入免驗證模式修改。本文記錄標準操作流程、關鍵參數說明及5.6版本特有的 SET PASSWORD 二次驗證機制。
# 查看版本 mysql -V # 或 rpm -qa | grep -i mysql # 輸出示例 MySQL-server-5.6.15-1.el6.x86_64 MySQL-client-5.6.15-1.el6.x86_64 ...
service mysql stop # 或 systemctl stop mysqld (CentOS 7+) # 輸出: Shutting down MySQL.. SUCCESS!
mysqld_safe --skip-grant-tables & # 輸出示例: # 140211 15:37:49 mysqld_safe Logging to '/var/lib/mysql/hostname.err'. # 140211 15:37:49 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql # 關鍵: 必須加 & 後台運行,否則佔用終端無法操作
mysql
# 進入交互模式,無需密碼
USE mysql;
# MySQL 5.6 密碼列名為 password (5.7+ 為 authentication_string)
UPDATE user SET password=PASSWORD('123456') WHERE user='root';
# Query OK, 4 rows affected (匹配 root@localhost, root@127.0.0.1, root@::1, root@hostname)
FLUSH PRIVILEGES; -- 必須刷新,否則修改不生效
EXIT;
# 關閉 skip-grant-tables 進程 # 方式1: 前台運行時 Ctrl+C # 方式2: 後台運行時 jobs kill %1 # 或 kill# 正常啟動 service mysql start # Starting MySQL SUCCESS!
mysql -uroot -p123456
# 5.6 特有: 首次登錄後若密碼被標記為過期,會強制要求修改
# ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
SET PASSWORD = PASSWORD('123456');
# Query OK, 0 rows affected
SHOW DATABASES;
# 正常顯示數據庫列表
mysql.user 表中 Root 默認存在 4 個 Host 組合:
root@localhost (Socket連接)root@127.0.0.1 (TCP回環)root@::1 (IPv6回環)root@hostname (主機名連接)建議: 統一修改所有 Root 賬號密碼,或按需保留特定 Host。
password 列,PASSWORD('plain') 生成 41 位十六進制哈希authentication_string,哈希算法升級為 caching_sha2_password (8.0默認) 或 mysql_native_password--skip-grant-tables 模式下,權限表不加載到內存,直接修改磁盤表數據。FLUSH PRIVILEGES 強制重新讀取授權表到內存,使修改即時生效。否則正常啟動後仍舊密碼。
MySQL 5.6.6+ 引入密碼過期策略。--skip-grant-tables 修改密碼時,password_expired 列可能被置為 Y。首次正常登錄會觸發強制修改流程,執行 SET PASSWORD 後重置過期標記。
| 問題 | 原因 | 解決 |
|---|---|---|
| mysqld_safe 啟動後無法連接 | Socket文件路徑不匹配 | 指定 --socket=/var/lib/mysql/mysql.sock 或配置文件 [client] socket路徑 |
| UPDATE 0 rows affected | WHERE條件不匹配 (Host大小寫、IPv6格式) | SELECT user, host FROM user; 確認精確值再 UPDATE |
| 服務啟動失敗: The server quit without updating PID file | data目錄權限錯誤 / 殘留進程 / 配置錯誤 | chown -R mysql:mysql /var/lib/mysql; 檢查錯誤日志; kill殘留進程 |
| 密碼修改後遠程無法連接 | 無 root@% 賬號 / 防火牆 / bind-address=127.0.0.1 | CREATE USER 'root'@'%' IDENTIFIED BY 'pwd'; GRANT ALL...; 開放3306; my.cnf bind-address=0.0.0.0 |
# 1. 刪除匿名用戶
DELETE FROM mysql.user WHERE User='';
# 2. 禁止Root遠程登錄 (僅保留localhost/127.0.0.1)
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');
# 3. 刪除test庫
DROP DATABASE test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
# 4. 刷新生效
FLUSH PRIVILEGES;
# 5. 啟用密碼驗證插件 (my.cnf)
[mysqld]
plugin-load=validate_password.so
validate_password_policy=MEDIUM
validate_password_length=12