誤刪 mysql.user 表中 Host='localhost' 的 root 記錄,或錯誤修改權限欄位,導致重啟後 SHOW DATABASES 僅顯示 information_schema、test,無法看見 mysql 系統庫,也無法正常登入管理。
權限表資料損毀,導致帳號無 SELECT 權限於 mysql.*,MySQL 權限系統啟動時載入失敗,帳號實際上「隱形」而非刪除。
systemctl stop mysqld
# 或
service mysql stop
--skip-grant-tables 啟動
mysqld_safe --skip-grant-tables --skip-networking &
# --skip-networking 防止此期間外部連入
mysql -u root
mysql> USE mysql;
# 檢查現有 root 帳號
mysql> SELECT User, Host, plugin, authentication_string FROM user WHERE User='root';
# 修復:確保 localhost 與 127.0.0.1 皆有 root,且權限全 Y
mysql> 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'
WHERE User='root' AND Host IN ('localhost','127.0.0.1','::1');
# 若缺少記錄則 INSERT
mysql> FLUSH PRIVILEGES;
mysql> EXIT;
pkill -f "mysqld_safe --skip-grant-tables"
systemctl start mysqld
mysql -u root -p
mysql> SHOW DATABASES; -- 應包含 mysql, information_schema, performance_schema, sys 等
authentication_string,不再是 Password。plugin 欄位預設 caching_sha2_password (8.0) 或 mysql_native_password (5.7),若客戶端不支援需同步修改。mysql.global_grants、mysql.role_edges 等權限表,修復時需一併檢查。DELETE/UPDATE mysql.user,改用 CREATE/DROP/ALTER USER、GRANT/REVOKE 管理帳號。mysqldump --system=mysql.user,mysql.db,mysql.tables_priv,mysql.columns_priv,mysql.procs_priv -d mysql > grants.sqlFLUSH PRIVILEGES 並備份。