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

MySQL 密碼修改與 Root 密碼遺忘重置完整操作手冊

     編輯:MySQL 資料庫相關知識

MySQL 密碼管理包含「知舊密碼修改」與「遺忘 Root 密碼重置」兩大場景。本文整理 mysqladmin、ALTER USER、SET PASSWORD 等標準修改命令,並給出生產級 Root 密碼遺忘重置標準流程(--skip-grant-tables),兼容 MySQL 5.6/5.7/8.0 版本差異。

場景一:知舊密碼,標準修改

方法 1:mysqladmin 命令行工具(最通用)

# 修改 root 密碼
mysqladmin -u root -p'old_password' password 'NewStrongPass123!'

# 修改其他用戶
mysqladmin -u app_user -p'old_password' password 'NewPass456@'

方法 2:SQL 語句(需登錄後執行)

-- MySQL 5.7+ / 8.0 推薦
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 或指定插件
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'NewStrongPass123!';

-- MySQL 5.6 / 兼容舊版
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPass123!');
-- 或
UPDATE mysql.user SET Password = PASSWORD('NewStrongPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

方法 3:SET PASSWORD(當前會話用戶)

SET PASSWORD = 'NewStrongPass123!';  -- 修改當前登錄用戶密碼

場景二:遺忘 Root 密碼,緊急重置(--skip-grant-tables)

核心原理

以 --skip-grant-tables 啟動 mysqld,跳過權限表驗證,允許無密碼登錄並擁有超級權限,直接更新 mysql.user 表或執行 ALTER USER。

Windows 環境操作步驟

@rem 1. 停止服務
net stop mysql

@rem 2. 跳過權限表啟動(保持窗口開啟)
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --console --skip-grant-tables --skip-networking

@rem 3. 新開 cmd 窗口,無密碼登錄
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u root

@rem 4. 重置密碼(MySQL 8.0/5.7 必須用 ALTER USER)
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;

@rem 5. 退出,關閉手動 mysqld 窗口 (Ctrl+C),正常啟動服務
net start mysql

@rem 6. 驗證
mysql -u root -p'NewStrongPass123!' -e "SELECT VERSION();"

Linux 環境操作步驟 (systemd)

# 1. 停止服務
systemctl stop mysqld

# 2. 創建臨時運行目錄
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld

# 3. 手動啟動 --skip-grant-tables(前台運行,另開終端操作)
/usr/sbin/mysqld --skip-grant-tables --skip-networking --user=mysql --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock --pid-file=/var/run/mysqld/mysqld.pid &

# 4. 本地無密碼登錄
mysql -u root -p  # 直接回車

# 5. 重置密碼(版本差異見下表)
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;

# 6. 關閉手動進程,正常啟動
kill $(cat /var/run/mysqld/mysqld.pid)
systemctl start mysqld

# 7. 驗證
mysql -u root -p'NewStrongPass123!' -e "SELECT USER();"

版本差異關鍵表

版本密碼列重置命令注意事項
MySQL 8.0authentication_stringALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd';默認插件 caching_sha2_password
MySQL 5.7authentication_stringALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd';插件 mysql_native_password / sha256_password
MySQL 5.6PasswordUPDATE mysql.user SET Password=PASSWORD('pwd') WHERE User='root';PASSWORD() 函數返回 41 字符哈希
MariaDB 10.4+PasswordALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd';兼容 MySQL 語法

常見失敗排查

  • ERROR 1290: The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement → 未執行 FLUSH PRIVILEGES; 先刷新權限緩存。
  • Unknown column 'Password' → 5.7+ 表結構無 Password 列,改用 ALTER USER。
  • validate_password 報錯密碼太弱 → 臨時降低策略 SET GLOBAL validate_password.policy=LOW; 或設置強密碼(≥8 位、含大小寫數字特殊符號)。
  • 重置後仍無法登錄 → 檢查 Host 列是否匹配(localhost vs 127.0.0.1 vs %),按需更新所有相關行。

重置後安全收尾(必做)

  1. 刪除匿名用戶:DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;
  2. 禁止 Root 遠程登錄:UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;
  3. 啟用密碼策略插件:INSTALL PLUGIN validate_password SONAME 'validate_password.so';
  4. 記錄密碼變更審計日誌,納入密碼輪換管理台賬。

總結

MySQL 密碼管理鐵律:
1. 知舊密碼用 ALTER USER/mysqladmin,標準、安全、可審計。
2. 遺忘 Root 密碼用 --skip-grant-tables --skip-networking + ALTER USER,版本差異只在密碼列與函數。
3. 重置後必做安全收尾:清匿名、禁 Root 遠程、強密碼策略、審計記錄。
將此流程文檔化、腳本化,納入應急預案演練,確保關鍵時刻「敢動、會動、動對」。

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