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

MySQL Root 密碼忘記?兩種重置方案:標準 Skip-grant-tables 與「黑科技」表文件拷貝法

     編輯:MySQL 資料庫相關知識

方案一:標準流程(需重啟,通用安全)

步驟

  1. 停庫: kill (禁用 kill -9,防數據損壞)
  2. 改配置: my.cnf [mysqld] 加 skip-grant-tables
  3. 啟庫: 正常啟動 MySQL
  4. 免密登入: mysql -uroot(無需密碼)
  5. 改密碼(三種方式任選一):
    -- 方式 1:SET PASSWORD(推薦,無需 flush)
      SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
    
      -- 方式 2:UPDATE user 表
      UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='root' AND Host='localhost';
      FLUSH PRIVILEGES;
    
      -- 方式 3:mysqladmin(需另開終端,庫已啟動)
      mysqladmin -u root password 'newpass'
  6. 收尾: 註釋 skip-grant-tables,重啟 MySQL,新密碼驗證

關鍵提示:kill vs kill -9

信號行為風險
kill (SIGTERM)通知進程優雅退出,執行清理、刷盤安全
kill -9 (SIGKILL)強制終止,進程無法執行任何清理**可能導致數據頁損壞、無法啟動**

方案二:「黑科技」利用 MyISAM 表文件可攜性熱修改(無需重啟,風險較高)

原理: mysql.user 仍為 MyISAM 引擎(5.7 前),表文件(.frm/.MYD/.MYI)可跨實例直接複製、修改、覆蓋,配合 kill -HUP 熱加載。

實操步驟

  1. 複製表文件到測試庫:
    cp /data/mysql3306/data/mysql/user.{frm,MYD,MYI} /data/mysql3306/data/test/
  2. 登入測試實例修改密碼:
    USE test;
    UPDATE user SET authentication_string=PASSWORD('hello') WHERE User='root' AND Host='localhost';
  3. 複製回原實例:
    cp /data/mysql3306/data/test/user.{frm,MYD,MYI} /data/mysql3306/data/mysql/
  4. 熱加載權限:
    kill -HUP $(pidof mysqld)
      # 或
      kill -HUP 
  5. 驗證:
    mysql -uroot -phello  # 成功登入

原理解析:kill -HUP

  • 發送 SIGHUP 信號,MySQL 重新讀取授權表、配置文件、刷新日志
  • **不重啟進程**,業務連接不中斷

⚠️ 風險警告(生產慎用!)

  • MySQL 8.0+ mysql.user 已改為 InnoDB,**此法失效**
  • 文件級複製繞過事務/鎖/崩潰恢復機制,**極易導致數據字典不一致**
  • 並發 DDL/DML 可能衝突,**僅限極端緊急、無備份、接受風險時使用**

總結建議

  1. 首選方案一:標準、安全、版本通用、可審計
  2. 方案二僅作應急備選:MySQL 5.6/5.7、MyISAM user 表、極端場景、有完整備份可回滾
  3. 根治: 密碼管理納入密碼箱/秘密管理系統,定期輪換、審計、禁止明文存儲
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved