首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 誤刪 root 用戶緊急恢復實戰:--skip-grant-tables 模式

     編輯:MySQL 綜合教學

MySQL 誤刪 root 用戶緊急恢復實戰:--skip-grant-tables 模式

誤執行 DROP USER 'root'@'localhost' 並 FLUSH PRIVILEGES 後,無任何超級用戶可登入。利用 --skip-grant-tables 繞過權限系統,直接操作 mysql.user 表重建 root,是經典急救方案。

原理

mysqld --skip-grant-tables 啟動時:

  • 不加載權限表(mysql.user、db、tables_priv 等)。
  • 所有連接擁有無限制權限(相當於 root)。
  • 禁用插件、UDF、Event Scheduler。

官方文檔原文:

This option causes the server to start without using the privilege system at all, which gives anyone with access to the server unrestricted access to all databases.

操作步驟(MySQL 5.5/5.6/5.7 通用)

  1. 停止實例:service mysqld stop
  2. 以跳過權限模式啟動:
    mysqld_safe --skip-grant-tables &
    # 或前台調試
    /usr/libexec/mysqld --skip-grant-tables --user=mysql &
  3. 無密碼登入:
    mysql -u root
    # 直接進入,無需密碼
  4. 重建 root 用戶(若已不存在):
    USE mysql;
    -- 5.7+ authentication_string 列
    INSERT INTO user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
    VALUES ('localhost', 'root', '', '', '', '');
    -- 5.6 Password 列
    -- INSERT INTO user (Host, User, Password) VALUES ('localhost', 'root', '');
  5. 授予全權限(直接 UPDATE 權限列,因 GRANT 在 skip-grant-tables 下無效):
    UPDATE user SET
      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',
      Create_tablespace_priv='Y',
      authentication_string=''  -- 5.7+ 密碼為空
    WHERE User='root' AND Host='localhost';
    FLUSH PRIVILEGES;
  6. 重啟實例恢復正常模式:
    mysqladmin shutdown  # 或 kill 進程
    service mysqld start
  7. 驗證登入並修改密碼:
    mysql -u root -p
    # 密碼為空直接回車
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPwd!';  -- 5.7+
    -- 或
    mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPwd!'); -- 5.6

關鍵注意事項

  1. 僅限本地操作:--skip-grant-tables 期間任何人可無密碼登入,**務必在內網/控制台操作,禁止暴露公網**。
  2. 版本差異:5.7+ 用 authentication_string,5.6 用 Password,8.0+ 推薦 ALTER USER 而非直接 UPDATE。
  3. FLUSH PRIVILEGES 必執行:將內存權限緩存持久化到磁盤,否則重啟後失效。
  4. 事後審計:檢查 mysql.user 是否有匿名用戶、無密碼用戶、過度授權賬號,全數清理。

誤刪 root 不可怕,--skip-grant-tables 是通用急救鑰匙。平時多演練,關鍵時刻手不抖。

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