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

MySQL 常見問題排查手冊:忘記密碼、無法登錄、GRANT 報錯三大經典場景解決

     編輯:MySQL 綜合教學

場景一:忘記 Root 密碼 (通用重置流程)

步驟

  1. 停止 MySQL:systemctl stop mysqld / service mysqld stop
  2. 啟動跳過權限表模式:
    mysqld_safe --skip-grant-tables --skip-networking &
            # 或編輯 my.cnf [mysqld] 添加 skip-grant-tables,重啟服務
            
  3. 無密碼登錄修改密碼:
    mysql -u root
            USE mysql;
            -- MySQL 5.7.6+ / 8.0
            UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
            -- MySQL 5.7.5- / 5.6
            UPDATE user SET Password=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
            FLUSH PRIVILEGES;
            EXIT;
            
  4. 正常啟動驗證:移除 skip-grant-tables,重啟 MySQL,用新密碼登錄。

場景二:用戶無法登錄 (Access Denied)

排查清單

  1. 服務是否運行:systemctl status mysqld / ps -ef | grep mysqld
  2. 主機名匹配:MySQL 賬號格式 'user'@'host'。
    • 客戶端未指定 -h 時默認連接 localhost (走 Unix Socket)。
    • 若 user 表中只有 'bob'@'127.0.0.1',無 'bob'@'localhost',則 mysql -u bob 失敗。
    • 解決:mysql -h 127.0.0.1 -u bob -p 或補全賬號:
      CREATE USER 'bob'@'localhost' IDENTIFIED BY 'pass'; GRANT ALL ON *.* TO 'bob'@'localhost';
  3. 匿名用戶干擾:若存在 ''@'localhost',MySQL 匹配優先級可能導致具名用戶被匿名用戶「搶佔」。
    解決:DROP USER ''@'localhost'; FLUSH PRIVILEGES;
  4. 密碼插件不匹配 (MySQL 8.0):默認 caching_sha2_password,老客戶端不支持。
    解決:ALTER USER 'bob'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';

場景三:執行 GRANT 報錯 Access denied for user 'root'@'localhost' to database 'db'

根因

root@localhost 缺少 GRANT OPTION 權限 (即 Grant_priv='N'),無法將權限授予他人。

解決步驟

-- 1. 以最高權限用戶登錄 (如 root@% 或通過 skip-grant-tables)
mysql -u root -p

-- 2. 檢查權限
SELECT User, Host, Grant_priv FROM mysql.user WHERE User='root' AND Host='localhost';
-- 結果 Grant_priv = 'N'

-- 3. 賦予 GRANT OPTION
UPDATE mysql.user SET Grant_priv='Y' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

-- 4. 重新登錄 (必須重新連接生效)
EXIT;
mysql -u root -p
-- 現在可以 GRANT 了

進階:權限表匹配優先級 (關鍵知識)

MySQL 按 **Host 特異性降序、User 特異性降序** 排序 user 表,逐行匹配。**最先匹配到的行生效**。

-- 排序示例 (越靠前優先級越高)
'root'@'localhost'     -- Host 具體
'root'@'127.0.0.1'     -- Host 具體
'root'@'%'             -- Host 通配
''@'localhost'         -- 匿名用戶,Host 具體 (極易干擾)
''@'%'                 -- 匿名用戶,通配

因此:**匿名用戶 ''@'localhost' 優先級高於 'bob'@'%'**,導致 bob 從 localhost 連接時被匿名用戶匹配,若匿名用戶無密碼/密碼不同,bob 登錄失敗。**

總結速查表

現象首要排查核心修復
忘記 root 密碼是否有其他高權限賬號skip-grant-tables + UPDATE user SET authentication_string=...
指定用戶無法登錄SELECT User, Host FROM mysql.user WHERE User='xxx';補全 'user'@'localhost' / 刪除匿名用戶 / 修正密碼插件
GRANT 報 Access DeniedSELECT Grant_priv FROM mysql.user WHERE User='root' AND Host='localhost';UPDATE ... SET Grant_priv='Y'; FLUSH PRIVILEGES; 並重連
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved