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

MySQL 修改密碼六大方法全解析:從 phpMyAdmin 到命令行、甚至忘記密碼急救

     編輯:MySQL 資料庫相關知識

前置聲明:權限前提

修改**自身密碼**需自身登錄權限;修改**他人/root 密碼**需 UPDATE mysql.user 表權限 (通常需 root 或具備 CREATE USER/ALTER USER 權限的管理員)。

方法一:phpMyAdmin 圖形界面 (新手友好,慎用於生產)

  1. 登錄 phpMyAdmin → 左側選 mysql 庫 → user 表 → 瀏覽。
  2. 編輯目標用戶行,Password 欄位選 PASSWORD() 函數,輸入明文新密碼。
  3. 執行 → 務必點擊「刷新權限」 (或執行 FLUSH PRIVILEGES;)。

避坑:直接在 Value 欄填明文密碼 **不會加密**,導致無法登錄。必須選函數 PASSWORD() (5.7+) 或 authentication_string 欄 (8.0+)。

方法二:mysqladmin 命令行工具 (最快、腳本友好)

# 修改 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 (創建用戶兼設置密碼,5.7-)


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 (覆蓋式創建/修改,5.7-)


REPLACE INTO mysql.user (Host, User, authentication_string) 
VALUES ('%', 'jeffrey', PASSWORD('biscuit'));
FLUSH PRIVILEGES;

若用戶存在則更新,不存在則插入。同樣需 PASSWORD() 和 FLUSH PRIVILEGES。

方法五:SET PASSWORD 語句 (5.7/8.0 通用,推薦)


-- 修改當前用戶密碼
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 等)。

方法六:GRANT ... IDENTIFIED BY (創建/修改兼備,5.7/8.0 語法異)


-- 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 僅授權。

緊急急救:忘記 root 密碼 (跳過授權表啟動)

  1. 停止 MySQL:systemctl stop mysqld (或 service mysql stop)。
  2. 啟動跳過授權模式:
    
    # 方法 A:配置文件臨時添加 (推薦,可控)
    echo "skip-grant-tables" >> /etc/my.cnf.d/emergency.cnf
    systemctl start mysqld
    
  3. 無密碼登錄修改:
    
    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;
    
  4. 恢復正常模式:
    
    rm /etc/my.cnf.d/emergency.cnf
    systemctl restart mysqld
    # 驗證新密碼
    mysql -u root -p'NewPass123!'
    

安全警告:skip-grant-tables 期間**任何人無密碼可登錄 root**,務必在內網/防火牆隔離環境操作,修改完**立即移除配置並重啟**。

版本差異速查表

場景5.78.0
密碼欄位名authentication_stringauthentication_string
默認認證插件mysql_native_passwordcaching_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 自動刷新

最佳實踐建議

  1. **生產環境禁用 phpMyAdmin**,改用命令行/自動化腳本/配置管理工具 (Ansible/Terraform)。
  2. **統一使用 ALTER USER / SET PASSWORD** (8.0) 或 SET PASSWORD ... = PASSWORD() (5.7),標準、安全、自動刷新。
  3. **密碼策略**:啟用 validate_password 插件,強制長度、複雜度、過期輪換。
  4. **輪換機制**:定期 (如 90 天) 自動化輪換應用賬號密碼,配合 Vault/Secrets Manager 分發。
  5. **審計日誌**:開啟 log_statement = 'all' 或審計插件,記錄所有密碼變更操作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved