繞過權限系統驗證 → 以 root 身份登錄 → 修改密碼 → 恢復正常模式。關鍵參數:--skip-grant-tables (跳過授權表)、--init-file (啟動執行 SQL 文件)。
# 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;"
# 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 -u root
UPDATE mysql.user SET Password=PASSWORD('NewPass') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
# 方法 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 原容器
# 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;"
skip-grant-tables、init-file、直接操作 mysql.useraws 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 policy | validate_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 用戶可讀 |
mysql.user 無匿名賬號、無 root@%validate_password 組件PASSWORD EXPIRE INTERVAL 90 DAYRoot 密碼重置是「破窗效應」的起點:一次非授權重置,可能意味著系統已被滲透。重置後務必全盤排查:異常賬號、UDF、計劃任務、Webshell、SSH 金鑰、防火牆規則。將 Root 密碼存入密碼管理器,建立「無 Root 直連、運維用專用賬號」文化,從源頭消除遺忘場景。