遇到的問題: 問題一:ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist 異常原因:未知 解決辦法: 驗證指定的用戶('mysql.infoschema ...
遇到的問題:
問題一:ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
異常原因:未知
- 解決辦法:
驗證指定的用戶('mysql.infoschema'@'localhost')是否存在於mysql資料庫中
SELECT User FROM mysql.user WHERE User = 'mysql.infoschema' AND Host = 'localhost';
如果用戶不存在,可以使用以下命令創建該用戶
CREATE USER 'mysql.infoschema'@'localhost';
如果用戶已經存在,但沒有必要的許可權,則可以使用grant語句授予所需的許可權
GRANT ALL PRIVILEGES ON *.* TO 'mysql.infoschema'@'localhost';
如果SQL語句要求對特定表具有SELECT許可權,則可以使用以下命令
GRANT SELECT ON database_name.table_name TO 'mysql.infoschema'@'localhost';
問題二:執行CREATE USER 'mysql.infoschema'@'localhost';時出現 ERROR 1726 (HY000): Storage engine 'MyISAM' does not support system tables. [mysql.db]
異常原因:"mysql.db"系統表的存儲引擎和mysql指定的存儲引擎不一致;
- 解決辦法:
查詢mysql指定的存儲引擎是InnoDB還是MyISAM,具體查詢方式根據自己的環境查詢,我的環境是docker-compose創建docker鏡像的方式部署,通過yaml文件將my.cnf文件掛載進去,具體在my.cnf的default-storage-engine=INNODB欄位;
執行以下sql切換表的存儲引擎,或者在my.cnf文件里更改存儲引擎為你表相應的存儲引擎.
切換引擎時可能會導致資料庫重,所以以上每個引擎請單獨執行。# 查詢db表的存儲引擎是什麼 SHOW TABLE STATUS LIKE 'db'; # 切換其他相關表的存儲引擎 alter table mysql.user ENGINE=InnoDB; alter table mysql.db ENGINE=InnoDB; alter table mysql.tables_priv ENGINE=InnoDB; alter table mysql.columns_priv ENGINE=InnoDB; alter table mysql.procs_priv ENGINE=InnoDB; alter table mysql.proxies_priv ENGINE=InnoDB;
問題三: 執行完成後再次運行"CREATE USER 'mysql.infoschema'@'localhost';"創建用戶時,出現user表數據寬度不一樣的問題。
異常原因:user表切換引擎導致表結構更改,無法完整創建用戶
- 解決辦法:
找一個乾凈的相同版本的mysql,從裡面將user表裡的數據轉換成sql語句(備份),再刪除有問題資料庫的user表,執行sql(恢復).
問題四: 執行完成後mysql連接會斷開,報密碼錯誤。
異常原因:由於user表時copy過來的,密碼本身是被特定演算法加密的,user表中的加密後的密鑰還原回來後並不是原密碼,無法將密碼正確存儲與還原,導緻密碼錯誤。
- 解決辦法:
在my.cnf文件裡面加入skip_grant_tables跳過密碼驗證。
問題五:加入後無效或無法跳過密碼驗證
異常原因:未知
- 解決辦法:
將原設備的mysq的data數據文件copy到另外一臺真實的設備,並且在真機原生安裝mysql,將資料庫映射到原data數據,通過真機自身的命令行使用--skip_grant_tables執行啟動,跳過密碼登陸,再將數據全量備份,重置原設備的資料庫,再重新將原數據導回,問題解決。