萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL GRANT 報錯 ERROR 1045 (28000) 解決:執行 mysql_upgrade 修復系統表

現象

執行 GRANT ALL ON *.* TO 'user'@'%'; 時報錯:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

但 root 密碼正確,且 SHOW GRANTS 顯示擁有全部權限(含 SUPER、GRANT OPTION)。

排查過程

1. 檢查 mysql.user 表

mysql> SELECT user, host, password FROM mysql.user;
+--------+-----------+----------+
| user   | host      | password |
+--------+-----------+----------+
| root   | localhost | *XXX1    |
| root   | 127.0.0.1 | *XXX2    |
| zabbix | localhost | *XXX3    |
+--------+-----------+----------+

用戶存在,密碼 hash 正常。

2. 確認 MySQL 版本變更

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.5.xx    |
+-----------+

查看 /var/log/yum.log 發現曾因安裝其他軟件觸發 yum update 導致 MySQL 從 5.1 升級至 5.5,但未執行 mysql_upgrade。

根因分析

MySQL 升級後,系統表(mysql.user、mysql.db、mysql.columns_priv 等)結構與新版本不兼容,導致權限檢查邏輯異常,雖然用戶記錄存在,但授權操作失敗。

解決方案

[root@server ~]# mysql_upgrade -u root -p
Enter password:
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
Running 'mysqlcheck' with default connection arguments
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
...(其餘系統表檢查並修復)
Upgrade process completed successfully.

執行完成後,再次執行 GRANT 命令:

mysql> GRANT ALL ON *.* TO 'user'@'%';
Query OK, 0 rows affected (0.00 sec)

總結

  • 必須執行 mysql_upgrade 完成 MySQL 版本升級後的系統表結構遷移與兼容性修復。
  • mysql_upgrade 會:檢查/修復所有表、升級系統表結構、刷新權限緩存、啟用新版本功能與權限體系。
  • 生產環境升級流程建議:備份 → 停服務 → 升級二進制 → 啟動 → 立即執行 mysql_upgrade → 驗證業務。
copyright © 萬盛學電腦網 all rights reserved