我正在尝试在 ubuntu os 上列出 mysql 数据库中的所有表。但我一直收到这个错误;
mysql> use mysql;
Database changed
mysql> show tables;
ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
Run Code Online (Sandbox Code Playgroud)
我检查了我的 mysql 版本:
mysql Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)
Run Code Online (Sandbox Code Playgroud)
所以它似乎是mysql的最新版本。
我该如何解决这个错误?
请帮忙
小智 14
我将用户表从另一个 mysql 服务器转移到新安装并遇到此错误。因此,如果您没有该mysql.infoschema用户,您可以尝试:
sudo systemctl stop mysql
sudo mysqld --upgrade=FORCE
Run Code Online (Sandbox Code Playgroud)
这对我来说是固定的。
小智 10
DROP USER 'mysql.infoschema'@'localhost';
Run Code Online (Sandbox Code Playgroud)
其余的解决方案就像以前的答案。
mysql> CREATE USER 'mysql.infoschema'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT SELECT ON *.* TO `mysql.infoschema`@`localhost`;
Run Code Online (Sandbox Code Playgroud)
小智 7
当该数据库(在您的情况下为 mysql)中存在任何视图/触发器,其定义者(换句话说,用户)是视图的定义者,但用户本身不存在时,就会发生此错误。全新安装的 mysql 应该有该用户
mysql> select user,host from mysql.user where user='mysql.infoschema';
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
+------------------+-----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
具有权限:
mysql> show grants for 'mysql.infoschema'@'localhost';
+-------------------------------------------------------+
| Grants for mysql.infoschema@localhost |
+-------------------------------------------------------+
| GRANT SELECT ON *.* TO `mysql.infoschema`@`localhost` |
+-------------------------------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
由于某种原因,该用户在您的用户列表中丢失/删除,这就是为什么当您列出表时它也会检查其中的视图并抱怨其丢失的定义器。
解决方案 :
只需创建具有上述权限的用户,就应该停止显示错误。
创建用户:
mysql> CREATE USER 'mysql.infoschema'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
授予权限:
mysql> GRANT SELECT ON *.* TO `mysql.infoschema`@`localhost`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Run Code Online (Sandbox Code Playgroud)