萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL Root 密碼遺忘與用戶誤刪:三大場景完整恢復指南

從「鎖在門外」到「重掌大權」:MySQL 權限恢復全流程

MySQL Root 帳號是資料庫的「最高通行證」,一旦密碼遺忘或帳號被誤刪,運維人員往往陷入恐慌。本文針對 Windows/Linux/Unix 三大平台、密碼遺忘/用戶誤刪/權限損壞 三大場景,提供經過生產環境驗證的恢復方案,並附上安全加固建議。

核心原理:跳過權限表驗證 (--skip-grant-tables)

MySQL 啟動時載入 mysql.user 權限表。加上 --skip-grant-tables 參數後,不載入權限表,任意用戶無密碼即可登入,且擁有最高權限。這是所有恢復方案的基石。

方案一:修改配置文件法(通用、持久化)

步驟

  1. 編輯配置:
    Windows: my.ini | Linux/Unix: /etc/my.cnf 或 /etc/mysql/my.cnf
    在 [mysqld] 區段添加:
    skip-grant-tables
  2. 重啟服務:
    Windows: net stop mysql && net start mysql
    Linux: systemctl restart mysqld 或 service mysql restart
  3. 無密碼登入並修復:
    mysql -u root
  4. 執行修復 SQL(見下方場景對應語句)
  5. 移除配置並重啟:刪除 skip-grant-tables,重啟服務生效。

方案二:命令列臨時啟動法(無需改配置、適合容器/臨時實例)

# 1. 停止服務
systemctl stop mysqld

# 2. 後台啟動跳過權限
mysqld_safe --skip-grant-tables &

# 3. 登入修復
mysql -u root

# 4. 修復完成後
mysqladmin -u root shutdown
systemctl start mysqld

場景對應修復 SQL

場景 A:僅忘記 Root 密碼

USE mysql;
-- MySQL 5.7+ 使用 authentication_string,8.0+ 同
UPDATE user SET authentication_string = PASSWORD('NewStrongPass123!') WHERE User = 'root';
FLUSH PRIVILEGES;

MySQL 8.0.4+ 推薦:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';

場景 B:Root 用戶被誤刪除

USE mysql;
-- 1. 重建用戶(MySQL 5.7 語法,8.0 需調整欄位)
INSERT INTO user SET 
    Host = 'localhost',
    User = 'root',
    authentication_string = PASSWORD('NewStrongPass123!'),
    Select_priv = 'Y', Insert_priv = 'Y', Update_priv = 'Y', Delete_priv = 'Y',
    Create_priv = 'Y', Drop_priv = 'Y', Reload_priv = 'Y', Shutdown_priv = 'Y',
    Process_priv = 'Y', File_priv = 'Y', Grant_priv = 'Y', References_priv = 'Y',
    Index_priv = 'Y', Alter_priv = 'Y', Show_db_priv = 'Y', Super_priv = 'Y',
    Create_tmp_table_priv = 'Y', Lock_tables_priv = 'Y', Execute_priv = 'Y',
    Repl_slave_priv = 'Y', Repl_client_priv = 'Y', Create_view_priv = 'Y',
    Show_view_priv = 'Y', Create_routine_priv = 'Y', Alter_routine_priv = 'Y',
    Create_user_priv = 'Y', Event_priv = 'Y', Trigger_priv = 'Y';

-- 2. 8.0 需額外刷新權限表結構
FLUSH PRIVILEGES;

注意:MySQL 8.0 user 表結構變更較大(新增 account_locked, password_last_changed 等欄位),建議用 CREATE USER 'root'@'localhost' IDENTIFIED BY '...'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; 重建更安全。

場景 C:Root 帳號存在但 Host 限制導致無法遠程登入

USE mysql;
UPDATE user SET Host = '%' WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

生產環境建議改為具體 IP:Host = '10.0.0.%'。

Windows 平台專屬快速腳本

@echo off
REM 停止服務
net stop mysql

REM 跳過權限啟動(需以管理員執行)
cd /d "C:\Program Files\MySQL\MySQL Server 8.0\bin"
start mysqld --skip-grant-tables

REM 等待啟動
timeout /t 5

REM 修改密碼
mysql -u root -e "USE mysql; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!'; FLUSH PRIVILEGES;"

REM 正常重啟
mysqladmin -u root -pNewPass123! shutdown
net start mysql
echo 密碼已重置,請妥善保管!
pause

安全加固:恢復後必做的 5 件事

  1. 立即修改為強密碼:≥16 位,含大小寫、數字、特殊符號。
  2. 限制 Host:生產環境禁止 root@'%',僅允許 localhost 或跳板機 IP。
  3. 建立運維專用帳號:CREATE USER 'dba'@'10.0.0.%' IDENTIFIED BY '...'; GRANT SELECT, SHOW VIEW, PROCESS ON *.* TO 'dba'@'10.0.0.%'; 日常運維用此帳號。
  4. 啟用審計日誌:安裝 MariaDB Audit Plugin 或 MySQL Enterprise Audit,記錄所有 Root 操作。
  5. 備份 mysql 系統庫:mysqldump --single-transaction --routines --triggers mysql > mysql_system_$(date +%F).sql,災難時可秒級恢復權限表。

容器化環境(Docker/K8s)特殊處理

# Docker 臨時掛載配置啟動
docker run -d --name mysql-recover \
  -v /custom/my.cnf:/etc/my.cnf \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0 --skip-grant-tables

# 進入容器修復
docker exec -it mysql-recover mysql -u root

# 修復後移除 --skip-grant-tables 重建容器

掌握這套流程,下次面對「Root 進不去」的緊急情況,只需冷靜執行三步:停服務 → 跳過權限 → 修復表 → 重服務,五分鐘內找回掌控權。

copyright © 萬盛學電腦網 all rights reserved