为什么 mysqldump 返回错误 1143:无法执行 'show table status like

dra*_*ool 5 mysql mysqldump backup mysql-5.5

我运行以下命令来创建一个 mysqldump

mysqldump -ubackup -psomething --single-transaction --quick somedatabase | gzip > 4_19.gz
Run Code Online (Sandbox Code Playgroud)

在创建转储的 60%(估计 zip 文件的检查大小)后,我收到以下错误:

mysqldump: Couldn't execute 'show table status like 'customer\_cohort\_paid'': SELECT command denied to user ''@'%' for column 'customer_id' in table 'sales_order' (1143)
Run Code Online (Sandbox Code Playgroud)

它谈到了一个空白用户的权限问题user ''@'%'。此外,grants对于backup用户如下:

mysql> show grants for 'backup'@'%';
+------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for backup@%                                                                                                                            |
+------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup'@'%' IDENTIFIED BY PASSWORD '*SOMETHING' |
+------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Rol*_*DBA 7

有关于此的错误报告:mysqldump: 无法执行 'show table status': SELECT command denied to user。令人惊讶的是,这根本不是错误。原因如下:

customer_cohort_paid might成为一种看法。任何用户创建的视图都不再列在mysql.user. 这样做是使这样的视图无法被倾倒。

你可以做两(2)件事之一

建议#1

强制转储 -f

mysqldump -f -ubackup -psomething --single-transaction --quick somedatabase | gzip > 4_19.gz
Run Code Online (Sandbox Code Playgroud)

如果您可以强制转储使视图出现在转储文件中,您可能需要对其进行编辑(请参阅我的旧帖子Modify DEFINER on Many Views或其他一个How do I change the DEFINER of a VIEW in Mysql?

警告:如果任何一个扩展 INSERT 命令有语法问题或不正确地转义或封装数据,则可能无法加载该 INSERT 中的数百行。

建议#2

找出创建视图的原始用户,并重新创建该用户

运行此查询: select * from mysql.tables_priv;

这将显示所有表级和列级授权。查看前三列并找出再次创建该用户的 GRANT 命令。

  • 使用 `-f` 时要格外小心,因为根据定义,它会掩盖错误,从而导致备份不完整。最后我检查过,它错误地将转储进程的退出状态设置为 0,即使发生错误也是如此。 (2认同)