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

MySQL Root 密碼重置完整指南:Windows/Linux 通用方案

     編輯:MySQL 資料庫相關知識

前言

Root 密碼遺失是 MySQL 運維中最常見的緊急場景。本文提供 Windows 與 Linux 兩大平台的標準化重置流程,涵蓋 --skip-grant-tables 緊急模式與 mysqladmin 正規修改兩種方案,並針對 MySQL 5.7/8.0 語法差異特別標註,確保一次成功。

核心原理

--skip-grant-tables 讓 mysqld 啟動時不載入權限表,任何用戶可無密碼以 root 身分連線並修改 mysql.user 表。修改完成後必須 FLUSH PRIVILEGES 重新載入權限,最後正常重啟服務生效。

方案一:Windows 平台

方法 A:mysqladmin 方式 (推薦,適用 5.7+)

  1. 以系統管理員身分開啟 CMD / PowerShell。
  2. 停止服務:
    net stop MySQL80  # 服務名視安裝而定,可用 `sc query` 查詢
  3. 進入安裝目錄 bin 資料夾 (如 C:\Program Files\MySQL\MySQL Server 8.0\bin)。
  4. 跳過授權表啟動:
    mysqld --skip-grant-tables --console
    視窗會停留在前景顯示日誌,勿關閉此視窗。
  5. 另開新視窗,進入同目錄,重設密碼:
    mysqladmin -u root flush-privileges password "NewStrongPass123!"

    系統會提示輸入新密碼確認,輸入兩次即可。

  6. 關閉第一個視窗 (Ctrl+C 停止 mysqld),正常啟動服務:
    net start MySQL80
  7. 驗證:mysql -uroot -p"NewStrongPass123!"

方法 B:SQL 更新方式 (適用所有版本)

  1. 步驟 1-4 同方法 A。
  2. 新視窗免密登入:mysql -uroot
  3. 執行更新:
    USE mysql;
    -- MySQL 5.7
    UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
    -- MySQL 8.0+ (authentication_string 不再用 PASSWORD())
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
    FLUSH PRIVILEGES;
    EXIT;
  4. 重啟服務驗證 (同方法 A 步驟 5-6)。

常見問題排查

現象原因解決
Access denied 即使用 skip-grant-tablesWindows 服務殘留進程任務管理員強制結束所有 mysqld.exe 後再試
Unknown column 'password'5.7+ 欄位改為 authentication_string使用正確欄位名或改用 ALTER USER
密碼修改後仍無法登入未執行 FLUSH PRIVILEGES 或未正常重啟確保完整執行重啟流程

方案二:Linux 平台

標準流程 (systemd 管理)

  1. 停止服務:
    systemctl stop mysqld  # 或 mysql, mariadb 視發行版而定
  2. 建立臨時目錄與 socket 檔位置 (避免權限衝突):
    mkdir -p /var/run/mysqld
    chown mysql:mysql /var/run/mysqld
  3. 跳過授權表啟動 (前景模式):
    mysqld_safe --skip-grant-tables --skip-networking --socket=/var/run/mysqld/mysqld.sock --pid-file=/var/run/mysqld/mysqld.pid --datadir=/var/lib/mysql &
    --skip-networking 禁止遠端連入,提升安全性;& 放入背景。
  4. 免密登入並修改密碼:
    mysql -uroot --socket=/var/run/mysqld/mysqld.sock
    
    -- 進入 mysql shell 後:
    USE mysql;
    -- 5.7
    UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
    -- 8.0+
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
    FLUSH PRIVILEGES;
    EXIT;
  5. 停止緊急模式進程:
    mysqladmin -uroot --socket=/var/run/mysqld/mysqld.sock shutdown
  6. 正常啟動服務:
    systemctl start mysqld
  7. 驗證登入:mysql -uroot -p'NewPass123!'

Docker 容器場景

# 進入容器
docker exec -it mysql_container bash

# 容器內執行上述 Linux 流程,注意:
# 1. 容器通常無 systemd,直接 kill mysqld 進程
# 2. 資料目錄通常為 /var/lib/mysql
# 3. 修改後需重啟容器:docker restart mysql_container

MySQL 8.0 特別注意事項

  • 預設認證插件為 caching_sha2_password,舊版客戶端 (Navicat 12-, 舊 JDBC) 可能無法連線。解決:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Pass123!';
  • PASSWORD() 函數已移除,不可再用 UPDATE ... PASSWORD(),必須用 ALTER USER 或 SET PASSWORD。
  • 密碼策略預設啟用 (validate_password),新密碼需滿足長度、大小寫、數字、特殊字元要求。

事後加固建議

  1. 建立專用管理帳號,禁用 root 遠端登入:UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;
  2. 啟用密碼過期策略:ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
  3. 記錄密碼至密碼管理器 (Bitwarden, 1Password, KeePass),杜絕明文儲存。
  4. 配置自動備份並定期演練恢復,含權限表備份。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved