登錄mysql,使用show databases;和show tables;這兩個命令時報錯ERROR 1449,備份數據庫時報了同樣的錯誤,這樣的話卸載mysql重裝就變得非常危險。
報錯信息
ERROR 1449 (HY000): The user specified as a definer (‘mysql.infoschema’@‘localhost’) does not exist
錯誤分析
報錯信息提示用戶mysql.infoschema@localhost不存在,執行命令
select user,host from mysql.user;
然而看到mysql.infoschema用戶是存在的,這讓人一頭霧水,去搜索了一圈,說是讓使用mysql_upgrade命令,這個命令在mysql8.0已經被廢棄了,但是我們還有別的解決辦法。
兩種方案
第一種:
在終端執行
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
打開mysqld.cnf文件
在末尾鍵入以下代碼(作用是跳過mysql的登錄驗證):
skip-external-locking
skip-grant-tables
wq保存並退出,service mysql restart重啓mysql server,這樣就實現了mysql的免密登錄,在終端下輸入mysql再回車,使用show databases;命令,如果運氣好的話,應該不會再報錯了,也可以正常備份。
可是mysql免密登錄在本地還好,甚至要方便一些,但在服務端有很大的風險,沒事,還有第二種方案。
第二種:
註釋掉剛纔添加過的配置文件代碼,重啓mysql,mysql -uroot -p登錄,執行下列命令:
刪除導致報錯的用戶
DROP USER 'mysql.infoschema'@'localhost';
重新創建該用戶,密碼自己定義,留空也可以
CREATE USER 'mysql.infoschema'@'localhost' IDENTIFIED BY 'password';
賦予權限
GRANT ALL PRIVILEGES ON . TO 'mysql.infoschema'@'localhost' WITH GRANT OPTION;
使更改生效
FLUSH PRIVILEGES;
此時使用show databases;命令可以正常查看數據庫了,問題解決,不需要卸載重裝。
可能的問題
或許你使用了上述的方法,但發現web項目不能訪問,以wordpress爲例,會出現連接數據庫時出錯,這時在終端使用以下命令:
mysql -u wordpress -p
輸入你的密碼,應該是不能正常連接的,這與mysql8.0的新的加密方式有關,可以使用以下方式進行修正:
登錄mysql
mysql -u root -p
選擇數據庫
use mysql;
修改plugin字段
update user set plugin="mysql_native_password";
刪除原有用戶
drop user 'wordpress'@'localhost';
重新創建,密碼要跟原來的保持一致,當然也可以重新設置,然後修改項目配置文件
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'password';
賦予權限
GRANT all ON wordpress.* TO 'wordpress'@'localhost';
FLUSH PRIVILEGES;
exit;
重啓mysql服務,再次訪問web項目正常。如果你的項目有很多個,可能每一個都要修改,但是數據不會丟失。
寫在後面
暫時沒有發現是什麼導致了這個問題,試過很多方法也沒有重現,不過問題算是解決了。