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

MySQL 不重啟服務修改 root 密碼的三種方案(含免重啟黑科技)

     編輯:MySQL 資料庫相關知識

方案對比總覽

方案需重啟適用場景風險等級
skip-grant-tables + 修改 user 表是(2次)忘記 root 密碼、無其他管理帳號中(需修改配置、短暫無認證)
mysqld_safe --init-file是(1次)忘記 root 密碼、腳本化自動化低(官方推薦,無免認證窗口)
複製 user 表至測試庫修改再覆蓋 + SIGHUP否擁有低權限帳號、極高可用性要求高(直接操作系統表檔案,極易損壞)

方案一:skip-grant-tables(經典但需重啟兩次)

# 1. 編輯 my.cnf
[mysqld]
skip-grant-tables
skip-networking  # 安全起見,禁用 TCP 連線

# 2. 重啟 MySQL
systemctl restart mysqld

# 3. 免密登入修改密碼
mysql -u root
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('newpwd') WHERE User = 'root';
mysql> FLUSH PRIVILEGES;

# 4. 移除配置並再次重啟
# 註釋 skip-grant-tables / skip-networking
systemctl restart mysqld
缺點:啟用 `skip-grant-tables` 期間**任何人可免密登入**,生產環境極度危險;需兩次重啟影響可用性。

方案二:mysqld_safe --init-file(官方推薦,單次重啟)

# 1. 建立初始化 SQL 檔
echo "ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpwd';" > /tmp/mysql-init.sql
# 5.7 以下用:UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root'; FLUSH PRIVILEGES;

# 2. 停止服務
systemctl stop mysqld

# 3. 以 init-file 啟動(後台執行)
mysqld_safe --init-file=/tmp/mysql-init.sql &

# 4. 驗證新密碼
mysql -u root -p'newpwd'
優點:無免認證窗口、單次重啟、適合自動化腳本。MySQL 5.7+ 建議用 `ALTER USER` 而非直接 UPDATE 系統表。

方案三:不重啟 MySQL 修改 root 密碼(高風險黑科技,慎用!)

前提條件:擁有一個可連線的低權限帳號(如 `test`),且該帳號有 `test` 庫寫入權限。

原理

  1. MyISAM 表的 `.MYD`(資料)、`.MYI`(索引)、`.frm`(結構)檔案獨立儲存。
  2. 將 `mysql.user` 表檔案複製到 `test` 庫,低權限帳號即可修改 `test.user` 表內容。
  3. 修改完成後,覆蓋回 `mysql.user` 並發送 `SIGHUP` 讓 MySQL 重新讀取授權表。

操作步驟(MyISAM 表專用,InnoDB 無效)

# 1. 複製 user 表檔案到 test 庫(需 root 系統權限)
cp /var/lib/mysql/mysql/user.* /var/lib/mysql/test/
chown mysql:mysql /var/lib/mysql/test/user.*

# 2. 低權限帳號登入修改 test.user
mysql -u test -p12345
mysql> USE test;
mysql> UPDATE user SET authentication_string = PASSWORD('yayun') WHERE User = 'root';
# 或 5.6:UPDATE user SET Password = PASSWORD('yayun') WHERE User = 'root';

# 3. 覆蓋回 mysql 庫(備份舊檔)
mv /var/lib/mysql/mysql/user.MYD /var/lib/mysql/mysql/user.MYD.bak
mv /var/lib/mysql/mysql/user.MYI /var/lib/mysql/mysql/user.MYI.bak
cp /var/lib/mysql/test/user.MY* /var/lib/mysql/mysql/
chown mysql:mysql /var/lib/mysql/mysql/user.*

# 4. 發送 SIGHUP 重新載入授權表
pgrep -n mysqld
kill -SIGHUP 

# 5. 驗證
mysql -u root -p'yayun'

極高風險警示

  • 僅適用 MyISAM 存儲引擎(MySQL 5.7 以前 `mysql.user` 預設為 MyISAM)。MySQL 8.0 `mysql.user` 為 InnoDB,**此法完全失效且極大機率損壞系統表**。
  • 直接操作 `.MYD/.MYI` 繞過 SQL 層,**任何寫入錯誤、版本不匹配、檔案損壞將導致 MySQL 無法啟動、權限系統崩潰**。
  • `SIGHUP` 行為依版本不同:部分版本僅刷新日誌,**不重新讀取授權表**;官方文檔建議用 `FLUSH PRIVILEGES` 或重啟。
  • 並發寫入 `user` 表時覆蓋檔案會導致資料不一致。

最佳實踐建議

  1. 日常管理:使用 `ALTER USER 'root'@'%' IDENTIFIED BY 'newpwd';` **無需重啟**,即時生效。
  2. 忘記密碼:首選 `mysqld_safe --init-file`,單次重啟、安全可控。
  3. 極高可用性場景:部署 ProxySQL / MaxScale 連線池,後端採用多實例主從,單點密碼輪換不影響整體服務。
  4. 嚴禁 在生產環境嘗試方案三,除非你有完整備份、可接受停機回滾、且確認 `mysql.user` 為 MyISAM。

總結

MySQL 5.7+ 修改 root 密碼**完全不需要重啟**,`ALTER USER` 即時生效。只有「忘記密碼且無其他管理帳號」才需走 `init-file` 流程。網上流傳的「複製 user 表檔案 + SIGHUP」是早期 MyISAM 時代的駭客技巧,**在 InnoDB 系統表時代已徹底失效且極度危險**,請勿在生產環境嘗試。

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