首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 修改用戶密碼的三種標準方法:從 SQL 語句到客戶端工具的完整操作指南

     編輯:MySQL 資料庫相關知識

方法一:UPDATE user 表直改 (通用、需 FLUSH PRIVILEGES)

# 1. 登入 MySQL
mysql -u root -p

# 2. 切換到 mysql 系統庫
USE mysql;

# 3. 更新密碼 (MySQL 5.7+ authentication_string 欄位)
UPDATE user SET authentication_string = PASSWORD('NewPass123!') WHERE User = 'hunte';

# 4. 刷新權限緩存 (關鍵!否則不生效)
FLUSH PRIVILEGES;

# 5. 退出驗證
QUIT
mysql -u hunte -p'NewPass123!'

版本差異:MySQL 5.6 及以前用 `Password` 欄位;5.7+ 用 `authentication_string`;8.0 建議用 `ALTER USER`。

方法二:SET PASSWORD 語法 (語義清晰、自動刷新)

mysql -u root -p
-- MySQL 5.7/8.0 語法
SET PASSWORD FOR 'hunte'@'%' = 'NewPass123!';
-- 或指定插件 (8.0+)
SET PASSWORD FOR 'hunte'@'%' = PASSWORD('NewPass123!');  -- 兼容寫法

-- 5.6 舊語法 (已棄用)
SET PASSWORD FOR 'hunte'@'%' = PASSWORD('NewPass123!');
-- 無需手動 FLUSH PRIVILEGES

方法三:mysqladmin 客戶端工具 (無需進入 SQL 交互、腳本友好)

# 修改當前用戶密碼 (需知舊密碼)
mysqladmin -u hunte -p'OldPass' password 'NewPass123!'

# Root 修改其他用戶密碼 (需 root 權限)
mysqladmin -u root -p'RootPass' password 'NewPass123!' -u hunte
# 注意:-u hunte 指定目標用戶,但某版本 mysqladmin 不支援此語法,建議用 SQL 方式

MySQL 8.0 推薦標準:ALTER USER (最安全、功能最全)

-- 基本修改
ALTER USER 'hunte'@'%' IDENTIFIED BY 'NewPass123!';

-- 指定認證插件 (兼容舊驅動)
ALTER USER 'hunte'@'%' IDENTIFIED WITH mysql_native_password BY 'NewPass123!';

-- 密碼過期策略
ALTER USER 'hunte'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'hunte'@'%' PASSWORD HISTORY 5;          -- 禁止重用最近 5 次密碼
ALTER USER 'hunte'@'%' PASSWORD REUSE INTERVAL 365 DAY; -- 1 年內不得重用
ALTER USER 'hunte'@'%' FAILED_LOGIN_ATTEMPTS 5;     -- 5 次失敗鎖定
ALTER USER 'hunte'@'%' PASSWORD_LOCK_TIME 2;        -- 鎖定 2 天

-- 解鎖
ALTER USER 'hunte'@'%' ACCOUNT UNLOCK;

緊急情況:忘記 Root 密碼 / 權限表損壞

跳過授權表重置 (通用標準流程)

# 1. 停止服務
systemctl stop mysqld  或  net stop MySQL80

# 2. 跳過授權表、跳過網絡啟動
mysqld_safe --skip-grant-tables --skip-networking &
# Windows: mysqld --skip-grant-tables --skip-networking

# 3. 無密碼登入
mysql -u root

# 4. 修復權限表 (若損壞) 並修改密碼
FLUSH PRIVILEGES;  -- 必須先執行,否則 UPDATE 無效
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPass123!';
-- 或 5.7 語法
UPDATE mysql.user SET authentication_string = PASSWORD('NewRootPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

# 5. 正常重啟
mysqladmin -u root -p'NewRootPass123!' shutdown
systemctl start mysqld

密碼策略合規性檢查 (validate_password)

-- 查看當前策略
SHOW VARIABLES LIKE 'validate_password%';

-- 臨時降低策略等級 (僅當前會話/全局)
SET GLOBAL validate_password.policy = LOW;      -- LOW/MEDIUM/STRONG
SET GLOBAL validate_password.length = 4;        -- 最小長度

-- 修改密碼
ALTER USER 'hunte'@'%' IDENTIFIED BY 'short';

-- 恢復生產策略
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 8;

應用層密碼變更最佳實踐

  1. 雙寫過渡期:應用配置同時保留新舊密碼,驗證新密碼成功後再移除舊密碼。
  2. 配置中心管理:密碼存放於 Consul/Etcd/Apollo/Nacos,應用啟動動態拉取,變更無需重新部署。
  3. 輪換自動化:定時任務生成新密碼 → ALTER USER → 更新配置中心 → 滾動重啟應用 → 驗證 → 清理舊密碼。
  4. 審計日誌:記錄修改時間、操作人、目標用戶、客戶端 IP,滿足合規要求。

常見錯誤與解決

錯誤原因解決
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements密碼不符合 validate_password 策略提供更強密碼、或臨時降低策略等級
ERROR 1396 (HY000): Operation ALTER USER failed for 'user'@'%'用戶不存在 / Host 不匹配SELECT User, Host FROM mysql.user 確認確切用戶名
FLUSH PRIVILEGES 後仍不生效未提交事務 / 權限表損壞 / 緩存未刷重新執行 FLUSH PRIVILEGES;檢查 mysql.user 表數據
mysqladmin password 報錯舊密碼錯誤 / 語法不支援指定目標用戶改用 SQL 方式 ALTER USER / SET PASSWORD

總結:選對工具,事半功倍

  • **日常運維/腳本自動化** → `ALTER USER` (8.0+) / `SET PASSWORD` (5.7) + 配置中心。
  • **手工一次性修改** → MySQL Workbench / phpMyAdmin / DBeaver 圖形化界面。
  • **緊急救援/忘記 Root 密碼** → `--skip-grant-tables` + `ALTER USER`。
  • **舊版兼容/特定插件需求** → `IDENTIFIED WITH mysql_native_password BY '...'`。

密碼管理是資料庫安全的第一道防線。掌握標準修改方法、理解版本差異、建立自動化輪換流程、準備緊急救援預案,才能在合規審計、安全事件、版本升級等場景中從容應對。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved