萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 修改 Root 密碼與用戶管理完整指南:6 種方法與忘記密碼救援

修改密碼的 6 種標準方法

方法一:phpMyAdmin 圖形介面(最直觀)

  1. 登入 phpMyAdmin → 選擇 mysql 資料庫 → user 表
  2. 編輯 root 用戶行
  3. Password 欄位選擇 PASSWORD 函數 → 輸入新密碼
  4. 執行 → 重新整理權限:FLUSH PRIVILEGES;

方法二:mysqladmin 命令列工具

# 修改 root 密碼(需輸入舊密碼)
mysqladmin -u root -p password 'new_password'

# 修改其他用戶密碼
mysqladmin -u username -p password 'new_password'

# ⚠️ 限制:無法將密碼設為空、需連線正常

方法三:INSERT 直接操作 user 表(需 FLUSH PRIVILEGES)

mysql> INSERT INTO mysql.user (Host, User, Password)
    -> VALUES ('%', 'jeffrey', PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES;

⚠️ 實際上是新增用戶而非修改既有用戶。

方法四:REPLACE INTO(覆蓋式新增/更新)

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

方法五:SET PASSWORD 語法(推薦,無需 FLUSH)

-- MySQL 5.7.6+ 標準語法
SET PASSWORD FOR 'jeffrey'@'%' = 'biscuit';  -- 自動哈希

-- 5.7.6 前舊語法(需 PASSWORD())
SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');

方法六:GRANT ... IDENTIFIED BY(最彈性,無需 FLUSH)

-- 同時授權與設定密碼
GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';

-- 僅修改密碼(保留原權限)
GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'newpass';

⚠️ 關鍵注意事項

  • PASSWORD() ≠ Unix crypt():MySQL 專用雜湊,不可互通
  • MySQL 8.0+:PASSWORD() 已移除,SET PASSWORD 與 GRANT ... IDENTIFIED BY 自動使用 caching_sha2_password 插件
  • Plugin 欄位:SELECT User, Host, plugin FROM mysql.user; 確認認證插件
  • 雙重主機記錄:'user'@'localhost' 和 'user'@'%' 需同步修改

🆘 忘記 Root 密碼?緊急重置流程

步驟 1:停止 MySQL 服務

# systemd 系統
sudo systemctl stop mysqld

# 或傳統方式
sudo killall -TERM mysqld

步驟 2:跳過授權表啟動

# 前台執行(另開終端機操作)
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 或 systemd 臨時修改
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
sudo systemctl start mysqld

步驟 3:無密碼登入並重置

mysql -u root  # 無需密碼直接進入

-- MySQL 5.7 / 8.0
FLUSH PRIVILEGES;  -- 必須先執行(skip-grant-tables 狀態下)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass2024!';
-- 或舊版
UPDATE mysql.user SET authentication_string = PASSWORD('NewPass') WHERE User = 'root';
FLUSH PRIVILEGES;

步驟 4:正常重啟

sudo systemctl stop mysqld
sudo systemctl unset-environment MYSQLD_OPTS  # 若用 systemd 臨時修改
sudo systemctl start mysqld

# 驗證
mysql -u root -p'NewStrongPass2024!' -e "SELECT VERSION();"

用戶管理最佳實務

建立專用應用帳號(最小權限原則)

-- 僅授權特定資料庫
CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'10.0.0.%';
FLUSH PRIVILEGES;

只讀帳號(報表/備份用)

CREATE USER 'readonly'@'%' IDENTIFIED BY 'ReadOnlyPass!';
GRANT SELECT ON *.* TO 'readonly'@'%';
FLUSH PRIVILEGES;

查看用戶權限

SHOW GRANTS FOR 'root'@'localhost';
SHOW GRANTS FOR 'app_user'@'10.0.0.%';

撤銷權限與刪除用戶

REVOKE ALL PRIVILEGES ON *.* FROM 'old_user'@'%';
DROP USER 'old_user'@'%';

密碼安全強化

  • 密碼複雜度:啟用 validate_password 元件
  • 密碼過期:ALTER USER 'user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
  • 鎖定/解鎖帳號:ALTER USER 'user'@'%' ACCOUNT LOCK/UNLOCK;
  • 強制 SSL 連線:GRANT ... REQUIRE SSL;
  • 定期輪換:自動化腳本定期更新應用帳號密碼

自動化密碼輪換腳本範例

#!/bin/bash
# rotate_db_password.sh

USER="app_user"
HOST="10.0.0.%"
NEW_PASS=$(openssl rand -base64 32)

mysql -u root -p"$ROOT_PASS" -e "
    ALTER USER '$USER'@'$HOST' IDENTIFIED BY '$NEW_PASS';
    FLUSH PRIVILEGES;
"

# 更新應用配置(Consul/Vault/環境變數等)
# 重啟應用服務
# 記錄審計日誌

掌握多種修改密碼方式,建立完善用戶權限體系,並準備好忘記密碼的應急預案,是 DBA 的基本功!

copyright © 萬盛學電腦網 all rights reserved