首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL 無法建立/顯示資料庫:權限不足與跳過授權表修復指南

     編輯:程式設計綜合問答

錯誤現象

mysql -uroot -p
SHOW DATABASES;  -- 之前建的庫不見了
CREATE DATABASE user;
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'user'

核心原因

  1. 匿名用戶殘留: MySQL 安裝預設會建立 ''@'localhost' 匿名帳號,權限極低。若 root 登入時未正確匹配 root@localhost,可能被當成匿名用戶。
  2. 權限表損壞或未刷新: mysql.user 表中 root 權限異常,或 FLUSH PRIVILEGES 未執行。
  3. 資料庫目錄殘留但權限表無記錄: data 目錄下有資料夾但 information_schema 未同步。

標準修復流程 (Linux/macOS)

# 1. 停止服務
sudo systemctl stop mysqld

# 2. 跳過授權表啟動 (免密、全權限)
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 3. 新終端免密登入
mysql -u root

# 4. 修復 root 權限
USE mysql;
-- 刪除匿名用戶
DELETE FROM user WHERE User='';
-- 確保 root@localhost 存在且密碼正確
UPDATE user SET authentication_string=PASSWORD('新密碼'), plugin='mysql_native_password' WHERE User='root' AND Host='localhost';
-- 授予所有權限
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='localhost';
FLUSH PRIVILEGES;
EXIT;

# 5. 正常重啟
sudo pkill mysqld_safe
sudo systemctl start mysqld

# 6. 驗證
mysql -uroot -p新密碼 -e "SHOW DATABASES; CREATE DATABASE testdb;"

Windows 環境對應步驟

  1. 服務管理器停止 MySQL 服務。
  2. 命令列 (管理員) 執行:mysqld --skip-grant-tables --skip-networking (保持視窗開啟)。
  3. 新命令列視窗:mysql -u root 免密進入,執行上述 SQL 修復。
  4. 關閉第一個視窗 (Ctrl+C),服務管理器重新啟動 MySQL 服務。

常見誤區

  • 直接刪除 data 目錄重裝: 會導致現有資料遺失,非必要勿用。
  • 只改密碼不刪匿名用戶: 匿名用戶優先匹配導致 root 仍被視為匿名。
  • 忘記 FLUSH PRIVILEGES: 修改 mysql.user 表後必須刷新,否則修改不生效。

預防措施

  1. 安裝後立即執行 mysql_secure_installation:刪匿名用戶、禁用 root 遠程登入、移除 test 資料庫。
  2. 建立專用應用帳號,最小權限原則,避免直接用 root 連線應用。
  3. 定期備份 mysql 系統庫 (含 user、db、tables_priv 等權限表)。

總結

「Access denied for user ''@'localhost'」經典錯誤,本質是 匿名用戶搶佔連線 或 root 權限表異常。透過 --skip-grant-tables 進入維護模式,清理匿名用戶、重設 root 密碼與權限、FLUSH PRIVILEGES 即可徹底解決。

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