首先小弟必須先說,在技術領域上如果遇上很不可思議的問題,通常都是人為居多,即使是你已知的觀念都有可能因此而顛覆
在這篇的茶包在一開始小弟也覺得不可思議,但找到問題後,真的是感觸良多。
此篇所遇到的狀況是在某一台資料庫主機上使用 ROOT 登入,但是在 GRANT 的時候一直出現
mysql> GRANT ALL PRIVILEGES ON DBNAME.* TO USER@localhost; ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
首先遇到這個狀況先檢查了一下
mysql> SHOW GRANTS FOR root@localhost \G; SHOW GRANTS FOR root@localhost \G; *************************** 1. row *************************** Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '******' WITH GRANT OPTION *************************** 2. row *************************** Grants for root@localhost: GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
確認權限是 GRANT ALL
mysql> SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user \G; *************************** 1. row *************************** host: localhost user: root password: ********************** Grant_priv: Y Super_priv: Y *************************** 2. row ***************************
在確認一次 Grant_priv / Super_priv 都是 Y
權限都沒有問題,操作也都OK,但是在 GRANT 就是失敗,真是鬼打牆
最後在執行 mysql_upgrade 之後就可以 GRANT 了
$ mysql_upgrade -uroot -p Looking for 'mysql' as: mysql Looking for 'mysqlcheck' as: mysqlcheck Running 'mysqlcheck with default connection arguments Running 'mysqlcheck with default connection arguments mysql.columns_priv OK mysql.db OK mysql.event OK mysql.func OK mysql.general_log OK mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK mysql.help_topic OK mysql.host OK mysql.ndb_binlog_index OK mysql.plugin OK mysql.proc OK mysql.procs_priv OK mysql.servers OK mysql.slow_log OK mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK mysql.time_zone_name OK mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK Running 'mysql_fix_privilege_tables'... OK
這台資料庫是 MySQL 5.5,原來是因為資料庫升級了而造成 mysql 資料庫損壞
在官方是有提醒只要是升級都必須要執行 mysql_upgrade
在官方是有提醒只要是升級都必須要執行 mysql_upgrade
在官方是有提醒只要是升級都必須要執行 mysql_upgrade
這點非常的重要!!
很重要所以要說三次