萬盛學電腦網

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

MySQL 忘記 root 密碼?skip-grant-tables 緊急重置全流程

生產環境誤忘 MySQL root 密碼是運維高發場景。本文提供標準化、可落地的 skip-grant-tables 繞過認證重置流程,並強調安全收尾步驟,防止長期裸奔風險。

核心原理

在 [mysqld] 節點添加 skip-grant-tables 後重啟,MySQL 啟動時不加載權限表,所有連接無需密碼即可獲得最高權限,從而直接操作 mysql.user 表修改密碼。

標準操作步驟(Linux / Windows 通用)

1. 修改配置文件

# Linux: /etc/my.cnf 或 /etc/mysql/my.cnf
# Windows: my.ini(通常在安裝目錄或 C:\ProgramData\MySQL\MySQL Server x.x\)

[mysqld]
port=3306
skip-grant-tables   # 新增此行,建議置於 port 之後

2. 重啟 MySQL 服務

# Linux systemd
systemctl restart mysqld

# Windows 管理員 CMD / PowerShell
net stop mysql
net start mysql

3. 無密碼登錄並修改密碼

mysql -u root
# 進入後直接回車,無需輸入密碼

# MySQL 5.7+ (authentication_string 列)
UPDATE mysql.user SET authentication_string = PASSWORD('NewStrongPass123!') WHERE User = 'root';

# MySQL 5.6 或更早 (password 列)
UPDATE mysql.user SET password = PASSWORD('NewStrongPass123!') WHERE User = 'root';

FLUSH PRIVILEGES;
EXIT;

4. 關鍵收尾:移除 skip-grant-tables 並重啟

# 註釋或刪除該行
# skip-grant-tables

systemctl restart mysqld  # 或 net stop/start mysql

5. 驗證新密碼

mysql -u root -p'NewStrongPass123!' -e "SELECT VERSION();"

安全警示 ⚠️

  • 啟用期間任何人可無密碼 root 登錄,務必在內網隔離環境操作,或臨時修改 bind-address=127.0.0.1 限制本地訪問
  • 嚴禁長期保留skip-grant-tables,屬於嚴重安全漏洞
  • MySQL 8.0+ 建議改用 --init-file 方式重置,更安全無需重啟兩次

MySQL 8.0+ 替代方案(無需 skip-grant-tables)

# 1. 創建初始化文件 /tmp/init.sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';

# 2. 啟動時指定
mysqld --init-file=/tmp/init.sql --user=mysql

# 3. 登錄驗證後刪除 init 文件

建議將此流程納入運維應急預案,定期演練,關鍵時刻不手忙腳亂。

copyright © 萬盛學電腦網 all rights reserved