修改**自身密碼**需自身登錄權限;修改**他人/root 密碼**需 UPDATE mysql.user 表權限 (通常需 root 或具備 CREATE USER/ALTER USER 權限的管理員)。
mysql 庫 → user 表 → 瀏覽。Password 欄位選 PASSWORD() 函數,輸入明文新密碼。FLUSH PRIVILEGES;)。避坑:直接在 Value 欄填明文密碼 **不會加密**,導致無法登錄。必須選函數 PASSWORD() (5.7+) 或 authentication_string 欄 (8.0+)。
# 修改 root 密碼 (知舊密碼)
mysqladmin -u root -p'oldpass' password 'newpass'
# 修改普通用戶密碼
mysqladmin -u user -p'oldpass' password 'newpass'
# 特殊字符密碼建議用配置文件或交互式輸入
mysqladmin -u root -p password 'newpass' # 提示輸入舊密碼
限制:無法將密碼設為空;需知舊密碼;若無法連接服務器則不可用。
INSERT INTO mysql.user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES ('%', 'jeffrey', PASSWORD('biscuit'), '', '', '');
FLUSH PRIVILEGES;
注意:5.7 密碼欄為 authentication_string,8.0 同。必須用 PASSWORD() 加密,**且必須 FLUSH PRIVILEGES**。
REPLACE INTO mysql.user (Host, User, authentication_string)
VALUES ('%', 'jeffrey', PASSWORD('biscuit'));
FLUSH PRIVILEGES;
若用戶存在則更新,不存在則插入。同樣需 PASSWORD() 和 FLUSH PRIVILEGES。
-- 修改當前用戶密碼
SET PASSWORD = 'newpass'; -- 8.0 語法
-- 修改指定用戶 (需 SUPER 權限)
SET PASSWORD FOR 'jeffrey'@'%' = 'newpass'; -- 8.0
-- 5.7 需用 PASSWORD()
SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('newpass');
優勢:自動處理加密、自動刷新權限、語法標準、支援密碼驗證插件 (caching_sha2_password 等)。
-- 5.7 語法 (8.0 已移除 IDENTIFIED BY 子句)
GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
-- 8.0 標準語法 (分離授權與認證)
CREATE USER IF NOT EXISTS 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
GRANT USAGE ON *.* TO 'jeffrey'@'%';
-- 或直接修改既有用戶
ALTER USER 'jeffrey'@'%' IDENTIFIED BY 'newpass';
關鍵變化:8.0 不再支援 GRANT ... IDENTIFIED BY,必須用 CREATE USER / ALTER USER 設置密碼,GRANT 僅授權。
systemctl stop mysqld (或 service mysql stop)。
# 方法 A:配置文件臨時添加 (推薦,可控)
echo "skip-grant-tables" >> /etc/my.cnf.d/emergency.cnf
systemctl start mysqld
mysql -u root
# 5.7
UPDATE mysql.user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
# 8.0 (authentication_string 存儲加密雜湊,直接 SET PASSWORD)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
FLUSH PRIVILEGES;
rm /etc/my.cnf.d/emergency.cnf
systemctl restart mysqld
# 驗證新密碼
mysql -u root -p'NewPass123!'
安全警告:skip-grant-tables 期間**任何人無密碼可登錄 root**,務必在內網/防火牆隔離環境操作,修改完**立即移除配置並重啟**。
| 場景 | 5.7 | 8.0 |
|---|---|---|
| 密碼欄位名 | authentication_string | authentication_string |
| 默認認證插件 | mysql_native_password | caching_sha2_password |
| SET PASSWORD 語法 | SET PASSWORD FOR user@host = PASSWORD('pass') | SET PASSWORD FOR user@host = 'pass' (無 PASSWORD()) |
| GRANT 設置密碼 | GRANT ... IDENTIFIED BY 'pass' | **不支援**,用 ALTER USER |
| FLUSH PRIVILEGES | 直接操作 user 表後必須 | 直接操作 user 表後必須;ALTER USER/SET PASSWORD 自動刷新 |
ALTER USER / SET PASSWORD** (8.0) 或 SET PASSWORD ... = PASSWORD() (5.7),標準、安全、自動刷新。validate_password 插件,強制長度、複雜度、過期輪換。log_statement = 'all' 或審計插件,記錄所有密碼變更操作。