MySQL 密碼管理包含「知舊密碼修改」與「遺忘 Root 密碼重置」兩大場景。本文整理 mysqladmin、ALTER USER、SET PASSWORD 等標準修改命令,並給出生產級 Root 密碼遺忘重置標準流程(--skip-grant-tables),兼容 MySQL 5.6/5.7/8.0 版本差異。
# 修改 root 密碼
mysqladmin -u root -p'old_password' password 'NewStrongPass123!'
# 修改其他用戶
mysqladmin -u app_user -p'old_password' password 'NewPass456@'
-- MySQL 5.7+ / 8.0 推薦
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 或指定插件
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'NewStrongPass123!';
-- MySQL 5.6 / 兼容舊版
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPass123!');
-- 或
UPDATE mysql.user SET Password = PASSWORD('NewStrongPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
SET PASSWORD = 'NewStrongPass123!'; -- 修改當前登錄用戶密碼
以 --skip-grant-tables 啟動 mysqld,跳過權限表驗證,允許無密碼登錄並擁有超級權限,直接更新 mysql.user 表或執行 ALTER USER。
@rem 1. 停止服務
net stop mysql
@rem 2. 跳過權限表啟動(保持窗口開啟)
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --console --skip-grant-tables --skip-networking
@rem 3. 新開 cmd 窗口,無密碼登錄
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u root
@rem 4. 重置密碼(MySQL 8.0/5.7 必須用 ALTER USER)
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;
@rem 5. 退出,關閉手動 mysqld 窗口 (Ctrl+C),正常啟動服務
net start mysql
@rem 6. 驗證
mysql -u root -p'NewStrongPass123!' -e "SELECT VERSION();"
# 1. 停止服務
systemctl stop mysqld
# 2. 創建臨時運行目錄
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
# 3. 手動啟動 --skip-grant-tables(前台運行,另開終端操作)
/usr/sbin/mysqld --skip-grant-tables --skip-networking --user=mysql --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock --pid-file=/var/run/mysqld/mysqld.pid &
# 4. 本地無密碼登錄
mysql -u root -p # 直接回車
# 5. 重置密碼(版本差異見下表)
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;
# 6. 關閉手動進程,正常啟動
kill $(cat /var/run/mysqld/mysqld.pid)
systemctl start mysqld
# 7. 驗證
mysql -u root -p'NewStrongPass123!' -e "SELECT USER();"
| 版本 | 密碼列 | 重置命令 | 注意事項 |
|---|---|---|---|
| MySQL 8.0 | authentication_string | ALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd'; | 默認插件 caching_sha2_password |
| MySQL 5.7 | authentication_string | ALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd'; | 插件 mysql_native_password / sha256_password |
| MySQL 5.6 | Password | UPDATE mysql.user SET Password=PASSWORD('pwd') WHERE User='root'; | PASSWORD() 函數返回 41 字符哈希 |
| MariaDB 10.4+ | Password | ALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd'; | 兼容 MySQL 語法 |
ERROR 1290: The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement → 未執行 FLUSH PRIVILEGES; 先刷新權限緩存。Unknown column 'Password' → 5.7+ 表結構無 Password 列,改用 ALTER USER。validate_password 報錯密碼太弱 → 臨時降低策略 SET GLOBAL validate_password.policy=LOW; 或設置強密碼(≥8 位、含大小寫數字特殊符號)。Host 列是否匹配(localhost vs 127.0.0.1 vs %),按需更新所有相關行。DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;INSTALL PLUGIN validate_password SONAME 'validate_password.so';MySQL 密碼管理鐵律:
1. 知舊密碼用 ALTER USER/mysqladmin,標準、安全、可審計。
2. 遺忘 Root 密碼用 --skip-grant-tables --skip-networking + ALTER USER,版本差異只在密碼列與函數。
3. 重置後必做安全收尾:清匿名、禁 Root 遠程、強密碼策略、審計記錄。
將此流程文檔化、腳本化,納入應急預案演練,確保關鍵時刻「敢動、會動、動對」。