修改 MySQL root 密碼是運維高頻操作,但版本差異(5.6/5.7/8.0)、字段變更(password → authentication_string)、加密插件(caching_sha2_password)導致舊命令失效。本文梳理四種標準方法,附版本適用表與避坑指南。
# 首次設置密碼(默認空密碼) mysqladmin -u root password 'NewPass123' # 已有密碼時修改 mysqladmin -u root -p'OldPass' password 'NewPass123' # 注意:-p 後直接跟舊密碼無空格,password 後跟新密碼有空格
SET PASSWORD。-- 5.6 及以前
UPDATE mysql.user SET Password = PASSWORD('NewPass123') WHERE User = 'root';
FLUSH PRIVILEGES;
-- 5.7 / 8.0 (password 字段已移除)
UPDATE mysql.user SET authentication_string = PASSWORD('NewPass123') WHERE User = 'root';
FLUSH PRIVILEGES;
authentication_string,否則報 Unknown column 'password'。systemctl stop mysqldmysqld_safe --skip-grant-tables & (systemd 環境請用 systemctl set-environment MYSQLD_OPTS="--skip-grant-tables")mysql -u rootUSE mysql;
-- 5.7/8.0
UPDATE user SET authentication_string = PASSWORD('NewPass123') WHERE User='root' AND Host='localhost';
-- 或 8.0 推薦
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123';
FLUSH PRIVILEGES;
systemctl start mysqldmysql -u root -p'NewPass123'| 方法 | MySQL 5.6 | MySQL 5.7 | MySQL 8.0 |
|---|---|---|---|
| mysqladmin | ✅ | ✅ | ✅ |
| SET PASSWORD / PASSWORD() | ✅ | ✅ | ❌ (棄用) |
| ALTER USER | ❌ | ✅ | ✅ (推薦) |
| UPDATE user.Password | ✅ | ❌ (無此列) | ❌ |
| UPDATE user.authentication_string | ❌ (無此列) | ✅ | ✅ |
| skip-grant-tables 重置 | ✅ | ✅ | ✅ (需 FLUSH PRIVILEGES 後 ALTER USER) |
| 報錯 | 原因 | 修正 |
|---|---|---|
| Unknown column 'password' | 5.7+ 移除 password 列 | 改用 authentication_string |
| ERROR 1290 (HY000): --skip-grant-tables 下不能執行 ALTER USER | 8.0 限制 | 先 FLUSH PRIVILEGES; 再 ALTER USER |
| Access denied for user 'root'@'localhost' | 密碼錯誤/插件不匹配 | 指定 mysql_native_password 或重置 |
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'; FLUSH PRIVILEGES;validate_password 插件強制策略。選對方法、懂版本差異、重安全策略,root 密碼管理不再是負擔。