一、问题背景
今早连接 mysql8
的的时候突然提示1149-The user specified as a definer('mysql.infoschema@localhost') does not exist
; 但是引用程序里面从CURD还是可以正常使用的。
二、问题根源
初步判断是因为 mysql.user
表里面的mysql.infoschema
记录相关的信息损耗或者缺失。
既然找到了产生这个问题的根源,就可以对症下药了
三、解决办法
3.1、方案一
- 使用账号登录到mysql控制台
mysql -uroot -p
- 使用mysql语句创建账号
CREATE USER 'mysql.infoschema'@'localhost' IDENTIFIED BY '你的密码';
如果上述步骤没有报错,那么恭喜你成功解决了1149的问题;不过大概率会提示
mysql8 ERROR 1726 (HY000): Storage engine ‘MyISAM’ does not support system tables. [mysql.user]
这个问题的解决方案是:
ALTER TABLE mysql.user ENGINE = InnoDB;
然后重新创建账号;
修复之后,继续创建用户,发现哪个表报上面的错,就用上面的语句更改引擎。如果最终提示:
mysql8 ERROR 1726 (HY000): Storage engine ‘MyISAM’ does not support system tables. [mysql.user]
此方法行不通,看方法2。
3.2、方案2
- 进入mysql控制台
mysql -uroot -p
- 切换数据库
use mysql;
- 查询用户信息
select * from user where User ='mysql.infoschema';
- 删除用户(如果3.能查询到这个用户信息)
delete from user where User ='mysql.infoschema';
- 重新插入用户信息(什么都不用改,包括
mysql_native_password
这个值)
INSERT INTO mysql.user(`Host`,`User`,`plugin`,`authentication_string`,ssl_cipher,x509_issuer,x509_subject) VALUES ('localhost','mysql.infoschema','mysql_native_password','*THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE','','','');
- 更新用户信息
update mysql.user set Select_priv = 'Y' where User = 'mysql.infoschema';
- 刷新账号
FLUSH PRIVILEGES;
至此,就可以顺利解决mysql的1149问题了。
顺便一提,如果你的mysql是通过docker安装的,那么先使用 docker exec -it 容器名或者id /bin/bash
进入到容器内部,然后再进行上述步骤。