刪除 mysql.user 中 host='localhost' 的行、或錯誤修改權限欄位後重啟,出現:
SHOW DATABASES 僅顯示 information_schema、test,mysql 庫消失。mysql 庫裡的 user、db、tables_priv 等授權表決定了所有權限。若 root 帳號記錄缺失或權限列全為 N,服務啟動後拒絕所有連線,自然看不見任何用戶庫。
# Linux
systemctl stop mysqld
# 或
service mysqld stop
# Windows
net stop mysql
# Linux 前台啟動 (另開終端)
mysqld_safe --skip-grant-tables --skip-networking &
# Windows 命令列
mysqld --skip-grant-tables --skip-networking
--skip-networking 防止無授權狀態下被外部連入,安全第一。
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;
# 關閉跳過授權的實例
mysqladmin -u root shutdown
# 正常啟動
systemctl start mysqld
# 驗證
mysql -u root -p
SHOW DATABASES; -- 應看到 mysql, sys, performance_schema 等
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,重啟後自動生效。CREATE USER、GRANT、ALTER USER、REVOKE。admin@'%' 遠程備用超管帳號,避免 localhost 單點失效。mysql 庫 (mysqldump --system=all --routines --triggers mysql)。skip-name-resolve 減少 DNS 依賴。