首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL Root 密碼遺忘重置全方案:Skip-Grant、Init-File、Docker、Windows 多場景覆蓋

     編輯:MySQL 綜合教學

核心原理

繞過權限系統驗證 → 以 root 身份登錄 → 修改密碼 → 恢復正常模式。關鍵參數:--skip-grant-tables (跳過授權表)、--init-file (啟動執行 SQL 文件)。

場景一:Linux 通用 (Skip-Grant Tables)

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

# 2. 創建臨時配置 (避免修改主配置)
cat > /etc/my.cnf.d/skip-grant.cnf <<'EOF'
[mysqld]
skip-grant-tables
skip-networking  # 僅本地訪問,安全
EOF

# 3. 啟動
systemctl start mysqld

# 4. 無密碼登錄
mysql -u root

# 5. 修改密碼 (5.7+)
FLUSH PRIVILEGES;  -- 必須先執行,因 skip-grant 導致授權表不可寫
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass#2024';
-- 或 8.0+
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass#2024' PASSWORD EXPIRE NEVER;

# 6. 清理並重啟
rm /etc/my.cnf.d/skip-grant.cnf
systemctl restart mysqld

# 7. 驗證
mysql -u root -p'NewStrongPass#2024' -e "SELECT 1;"

場景二:Init-File 方式 (無需重啟兩次)

# 1. 準備 SQL 文件
cat > /tmp/reset_root.sql <<'EOF'
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass#2024';
FLUSH PRIVILEGES;
EOF

# 2. 停止服務
systemctl stop mysqld

# 3. 啟動並執行 init-file (需指定用戶)
mysqld --user=mysql --init-file=/tmp/reset_root.sql --daemonize

# 4. 驗證
mysql -u root -p'NewStrongPass#2024' -e "SELECT 1;"

# 5. 清理
rm /tmp/reset_root.sql
# 正常重啟服務 (若用 --daemonize 需 kill 後 systemctl start)
systemctl restart mysqld

場景三:MySQL 5.6 / 早期版本

mysql -u root
UPDATE mysql.user SET Password=PASSWORD('NewPass') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

場景四:Docker 容器環境

# 方法 1: docker exec 進入運行中容器 (需知舊密碼或已配置免密)
docker exec -it mysql-container mysql -u root -p

# 方法 2: 掛載 init-file 重啟
# 1. 準備 reset.sql 於宿主機
# 2. docker run -v /host/reset.sql:/docker-entrypoint-initdb.d/reset.sql ... (僅首次初始化有效)

# 方法 3: 修改入口點 (臨時)
docker commit mysql-container mysql-reset
docker run --rm -it --entrypoint="" mysql-reset mysqld --skip-grant-tables --skip-networking &
# 另開終端 docker exec 進入修改密碼
# 最後 docker stop/start 原容器

場景五:Windows 環境

# 1. 管理員 CMD 停止服務
net stop MySQL80  # 服務名查看: sc query type= service state= all | findstr MySQL

# 2. 創建 init-file
echo ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass#2024'; FLUSH PRIVILEGES; > C:\mysql\reset_root.sql

# 3. 啟動並執行 (命令行模式,非服務)
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --init-file=C:\mysql\reset_root.sql --console

# 4. 看到 "ready for connections" 後 Ctrl+C 停止
# 5. 正常啟動服務
net start MySQL80

# 6. 驗證
mysql -u root -pNewStrongPass#2024 -e "SELECT 1;"

場景六:云托管 (RDS/CloudSQL/PolarDB)

  • 控制台「重置密碼」按鈕 (最簡單、最安全)
  • 不支持 skip-grant-tables、init-file、直接操作 mysql.user
  • 部分支持 CLI/API:aws rds modify-db-instance --db-instance-identifier x --master-user-password NewPass

常見失敗原因與修正

現象原因修正
ERROR 1290: The MySQL server is running with --skip-grant-tables未執行 FLUSH PRIVILEGES修改密碼前必須 FLUSH PRIVILEGES
ERROR 1819: Password does not meet policyvalidate_password 策略拒絕臨時降低策略或用符合策略的密碼
ERROR 1396: Operation CREATE USER failed用戶已存在,用 ALTER USER統一用 ALTER USER 'root'@'host' IDENTIFIED BY ...
無法連接 (skip-grant 後)skip-networking 導致 TCP 不通用 Unix Socket: mysql -u root -S /var/lib/mysql/mysql.sock
Windows 服務啟動失敗init-file 路徑含空格/權限/編碼路徑無空格、UTF-8 編碼、mysql 用戶可讀

重置後必做安全加固

  1. 驗證新密碼登錄成功
  2. 檢查 mysql.user 無匿名賬號、無 root@%
  3. 啟用 validate_password 組件
  4. 配置 PASSWORD EXPIRE INTERVAL 90 DAY
  5. 記錄變更時間、操作人、原因,納入變更管理

Root 密碼重置是「破窗效應」的起點:一次非授權重置,可能意味著系統已被滲透。重置後務必全盤排查:異常賬號、UDF、計劃任務、Webshell、SSH 金鑰、防火牆規則。將 Root 密碼存入密碼管理器,建立「無 Root 直連、運維用專用賬號」文化,從源頭消除遺忘場景。

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