mysql> UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='root';
mysql> FLUSH PRIVILEGES;
注意:MySQL 5.7+ password 欄位重命名為 authentication_string,且 PASSWORD() 函數在 8.0 移除。
-- 方法 1:ALTER USER (推薦)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';
-- 方法 2:SET PASSWORD
SET PASSWORD FOR 'root'@'localhost' = 'newpass';
-- 方法 3:mysqladmin (命令列)
mysqladmin -uroot -p'oldpass' password 'newpass'
-- 密碼過期策略
ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 密碼複雜度 (validate_password 元件)
-- my.cnf: validate_password_policy=MEDIUM
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過權限表啟動
mysqld_safe --skip-grant-tables --skip-networking &
# 3. 免密登入修改
mysql -uroot
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';
# 4. 正常重啟
mysqladmin shutdown
systemctl start mysqld
| 版本 | 推薦語法 | 舊語法兼容 |
|---|---|---|
| ≤ 5.6 | UPDATE mysql.user SET Password=PASSWORD('x') | -- |
| 5.7 | ALTER USER / SET PASSWORD | UPDATE mysql.user SET authentication_string=PASSWORD('x') |
| 8.0 | ALTER USER / SET PASSWORD | PASSWORD() 已移除,不可用 |
優先使用 ALTER USER,版本無關、語義清晰、安全合規。