我运行以下命令来创建一个mysqldump
mysqldump -ubackup -psomething --single-transaction --quick somedatabase | gzip > 4_19.gz
在创建转储的 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)
它谈到了空白用户的权限问题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)
我究竟做错了什么?
对此有一个错误报告:mysqldump: Couldn't execute 'show table status': SELECT command denied to user。令人惊讶的是,这根本不是一个错误。这就是为什么:
customer_cohort_paid might
成为一个观点。无论用户创建了该视图,都不再在mysql.user
. 这样做是使这种观点无法被抛弃。你可以做两(2)件事之一
建议 #1
强制转储
-f
如果您可以强制转储以使视图出现在转储文件中,您可能需要对其进行编辑(请参阅我的旧帖子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 命令。