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

MySQL Root 密碼遺忘重置全平台指南:Windows/Linux/macOS 通用實戰手冊

     編輯:MySQL 資料庫相關知識

核心原理

啟動參數 --skip-grant-tables 使 MySQL 跳過權限表驗證,允許無密碼以 root 身分登入,進而更新 mysql.user 表的 authentication_string(5.7+)或 Password(5.6-)欄位。

Windows 環境(含 5.7/8.0 差異)

方法一:命令列模式(適用 5.5/5.6/5.7/8.0)


# 1. 以管理員身分開啟 CMD / PowerShell
# 2. 停止服務
net stop mysql
# 或
sc stop mysql

# 3. 跳過授權表啟動(前景模式,開新視窗執行)
cd "C:\Program Files\MySQL\MySQL Server 5.7\bin"
mysqld --skip-grant-tables --console

# 4. 新開視窗,無密碼登入
mysql -u root

# 5. 更新密碼(關鍵:5.7+ 欄位名不同)
-- MySQL 5.7 / 8.0
USE mysql;
UPDATE user SET authentication_string = PASSWORD('NewPass123!') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

-- MySQL 5.6 及之前
UPDATE user SET Password = PASSWORD('NewPass123!') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

# 6. 關閉前景 mysqld (Ctrl+C),正常啟動服務
net start mysql

# 7. 驗證新密碼
mysql -u root -p'NewPass123!'

方法二:初始化檔案法(5.7/8.0 推薦,無需前景進程)


# 1. 建立 init-file.sql
# MySQL 5.7 / 8.0
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';

# 2. 停止服務 → 啟動帶 init-file
net stop mysql
mysqld --init-file=C:\temp\init-file.sql --console

# 3. 看到 "ready for connections" 即可 Ctrl+C,移除 init-file 參數正常啟動

Linux / Unix 環境(systemd / SysVinit 通用)

方法一:--skip-grant-tables(傳統通用)


# 1. 停止服務
systemctl stop mysqld
# 或
service mysql stop

# 2. 建立臨時 socket 目錄(防止啟動衝突)
mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld

# 3. 前景啟動跳過授權
mysqld_safe --skip-grant-tables --skip-networking &

# 4. 無密碼登入更新
mysql -u root
# 同 Windows 步驟 5 的 SQL

# 5. 正常重啟
killall mysqld
systemctl start mysqld

方法二:systemd override(乾淨、無前景進程)


# 1. 建立 override
systemctl edit mysqld
# 輸入:
[Service]
ExecStart=
ExecStart=/usr/sbin/mysqld --init-file=/root/init-file.sql $MYSQLD_OPTS

# 2. 建立 init-file.sql (同上)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';

# 3. 重啟服務
systemctl daemon-reload
systemctl start mysqld

# 4. 觀察日誌確認密碼已改,移除 override 並重啟
systemctl edit mysqld  # 清空內容存檔
systemctl daemon-reload
systemctl restart mysqld

macOS (Homebrew) 環境


brew services stop mysql
mkdir -p /tmp/mysql_sock
mysqld_safe --skip-grant-tables --socket=/tmp/mysql_sock/mysql.sock --datadir=/usr/local/var/mysql &
mysql -u root -S /tmp/mysql_sock/mysql.sock
# 更新密碼 SQL
killall mysqld
brew services start mysql

Docker 容器環境


# 1. 進入容器
docker exec -it mysql-container bash

# 2. 修改配置
echo "skip-grant-tables" >> /etc/mysql/my.cnf  # 在 [mysqld] 區段下

# 3. 重啟容器
docker restart mysql-container

# 4. 進入更新密碼
docker exec -it mysql-container mysql -u root
# 執行 UPDATE SQL

# 5. 移除 skip-grant-tables 並重啟
sed -i '/skip-grant-tables/d' /etc/mysql/my.cnf
docker restart mysql-container

驗證與善後檢查清單

  1. SELECT User, Host, plugin, authentication_string FROM mysql.user WHERE User='root'; 確認所有 root 帳號密碼已同步更新。
  2. FLUSH PRIVILEGES; 必須執行,否則記憶體權限快取未刷新。
  3. 檢查 validate_password 元件是否啟用,新密碼需符合複雜度策略。
  4. 更新應用配置檔、CI/CD 秘密變數、備份腳本中的密碼。
  5. 啟用審計日誌記錄此次管理操作。
重置密碼是高危操作,必須在維護窗口、有授權、留存審計軌跡的前提下進行。平時建議:使用密碼管理器、定期輪換、啟用雙因子認證(ProxySQL/MySQL Router 支援)、避免共用 root 帳號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved