萬盛學電腦網

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

MySQL 忘記 root 密碼?不重啟服務也能輕鬆重置!

前言

遺忘 MySQL root 密碼是資料庫管理員常見的頭痛問題。傳統做法通常需要停止服務、啟動跳過權限驗證模式、修改密碼後再重啟服務,過程繁瑣且造成服務中斷。本文將介紹三種重置密碼的方法,重點講解完全不重啟 mysqld 進程的進階技巧,讓你在生產環境中也能從容應對密碼遺失危機。

方法一:單實例標準重置流程(需重啟)

此為最經典的重置方式,適用於單實例環境:

  1. 停止服務:/etc/init.d/mysql stop
  2. 跳過權限啟動:mysqld_safe --skip-grant-tables --user=mysql &
    關鍵參數 --skip-grant-tables 讓 MySQL 忽略授權驗證,允許無密碼登入。
  3. 進入資料庫修改密碼:
    shell> mysql
    mysql> UPDATE mysql.user SET password=PASSWORD('123456') WHERE user='root' AND host='localhost';
    mysql> FLUSH PRIVILEGES;
    
  4. 關閉並重啟服務:
    shell> mysqladmin -uroot -p123456 shutdown
    shell> /etc/init.d/mysql start
    shell> mysql -uroot -p123456
    

方法二:多實例環境密碼重置(需重啟)

針對 mysqld_multi 管理的多實例架構:

  1. 關閉實例:mysqld_multi stop
  2. 帶配置檔啟動跳過權限:mysqld_safe --defaults-file=/data/mysql/mysql3377/mysql3377.cnf --skip-grant-tables &
  3. 使用 Socket 連線修改密碼:mysql -uroot -p -S /tmp/mysql3377.sock(此時密碼為空)
  4. 執行更新並重啟實例:mysqld_multi restart 3377

方法三:核心亮點——不重啟 mysqld 熱修改密碼

前提條件:擁有另一個具備 test 資料庫寫入權限的低權限帳號(或同版本其他實例的帳號)。

操作步驟

  1. 複製權限表文件:
    [root@localhost mysql]# cp mysql/user.* test/
    [root@localhost mysql]# chown mysql.mysql test/user.*
    
    將 mysql 資料庫下的 user 表文件(user.MYD、user.MYI、user.frm)複製到 test 資料庫目錄,並修正擁有者。
  2. 以低權限帳號登入修改密碼:
    mysql> USE test;
    mysql> UPDATE user SET password=PASSWORD('yayun') WHERE user='root';
    Query OK, 0 rows affected (0.00 sec)
    Rows matched: 5  Changed: 0  Warnings: 0
    
    注意:此處 Rows matched: 5, Changed: 0 可能因密碼值相同導致,實際已寫入新密碼雜湊值。
  3. 覆蓋回原權限表並備份:
    mv mysql/user.MYD mysql/user.MYD.bak
    mv mysql/user.MYI mysql/user.MYI.bak
    cp test/user.MY* mysql/
    chown mysql.mysql mysql/user.*
    
  4. 發送 SIGHUP 信號重載權限:
    [root@localhost mysql]# pgrep -n mysql
    2184
    [root@localhost mysql]# kill -SIGHUP 2184
    
    SIGHUP 信號通知 MySQL 重新讀取授權表,無需重啟進程即可生效新密碼。
  5. 驗證新密碼:
    [root@localhost mysql]# mysql -uroot -pyayun
    Welcome to the MySQL monitor...
    mysql>
    
    登入成功,密碼重置完成!

原理解析與注意事項

  • 核心機制:MyISAM 引擎的權限表(user.MYD/user.MYI)為獨立文件,直接替換文件後發送 SIGHUP 觸發 reload_grant_tables() 即可熱加載。
  • 適用版本:MySQL 5.5/5.6 等使用 MyISAM 儲存權限表的版本。MySQL 8.0+ 權限表改為 InnoDB,此法不再適用。
  • 風險提示:操作前務必備份原文件;確保低權限帳號確實擁有 test 庫的 INSERT/UPDATE 權限;生產環境建議先在測試環境驗證。

總結

「不重啟重置密碼」利用 MyISAM 權限表文件獨立性與 SIGHUP 熱加載機制,實現零停機修改 root 密碼。雖然現代 MySQL 版本權限表架構已變更,但此思路對理解 MySQL 權限系統、文件層面操作極具參考價值。遇到密碼遺失時,優先嘗試官方 --init-file 方案(同樣需重啟),若極度不能停機,可參考本文思路探索適配當前版本的熱修方案。

copyright © 萬盛學電腦網 all rights reserved