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

MySQL 預設 root 用戶消失/權限丟失緊急修復指南

     編輯:MySQL 資料庫相關知識

現象:誤操作 mysql.user 表導致無法登入、看不見系統庫

刪除 mysql.user 中 host='localhost' 的行、或錯誤修改權限欄位後重啟,出現:

  • SHOW DATABASES 僅顯示 information_schema、test,mysql 庫消失。
  • root 無法登入或無任何權限。

根因

mysql 庫裡的 user、db、tables_priv 等授權表決定了所有權限。若 root 帳號記錄缺失或權限列全為 N,服務啟動後拒絕所有連線,自然看不見任何用戶庫。

緊急修復四步走 (需系統 root/Administrator 權限)

步驟 1:停止 MySQL 服務

# Linux
systemctl stop mysqld
# 或
service mysqld stop

# Windows
net stop mysql

步驟 2:跳過授權表啟動 (--skip-grant-tables)

# Linux 前台啟動 (另開終端)
mysqld_safe --skip-grant-tables --skip-networking &

# Windows 命令列
mysqld --skip-grant-tables --skip-networking

--skip-networking 防止無授權狀態下被外部連入,安全第一。

步驟 3:無密碼登入並修復權限

mysql -u root  -- 免密進入

-- 修復 root@localhost 記錄 (MySQL 5.7+ 權限欄位較多,建議用 UPDATE)
USE mysql;

-- 5.7 / 8.0 通用:確保 host='localhost'、user='root' 存在且權限全 Y
-- 先檢查
SELECT Host, User, authentication_string, plugin FROM user WHERE User='root';

-- 若缺失 localhost 行,插入 (plugin 採用 caching_sha2_password 或 mysql_native_password)
INSERT INTO user (Host, User, authentication_string, plugin, 
  Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv,
  Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv,
  References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv,
  Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv,
  Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv,
  Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv,
  Account_locked, Password_expired)
VALUES ('localhost', 'root', '', 'mysql_native_password',
  'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','N','N');

-- 或更新現有行所有權限為 Y
UPDATE user SET Select_priv='Y', Insert_priv='Y', ... ALL_PRIVS='Y' WHERE User='root' AND Host='localhost';

-- 8.0 需刷新權限快取
FLUSH PRIVILEGES;

步驟 4:正常重啟驗證

# 關閉跳過授權的實例
mysqladmin -u root shutdown

# 正常啟動
systemctl start mysqld

# 驗證
mysql -u root -p
SHOW DATABASES;  -- 應看到 mysql, sys, performance_schema 等

補充:MySQL 8.0 特殊注意點

  • 預設認證插件 caching_sha2_password,舊驅動可能不支援;建議 root 改 mysql_native_password:
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpwd';
  • PASSWORD() 函數已移除,密碼存儲於 authentication_string。
  • 若 --skip-grant-tables 下無法 FLUSH PRIVILEGES,重啟後自動生效。

預防措施

  1. 嚴禁直接操作 mysql 系統表,改用 CREATE USER、GRANT、ALTER USER、REVOKE。
  2. 建立 admin@'%' 遠程備用超管帳號,避免 localhost 單點失效。
  3. 定期備份 mysql 庫 (mysqldump --system=all --routines --triggers mysql)。
  4. 生產環境啟用 skip-name-resolve 減少 DNS 依賴。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved