Mysql

為什麼mysqldump返回錯誤1143:無法執行’show table status like

  • September 3, 2019

我執行以下命令來創建一個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

mysqldump -f -ubackup -psomething --single-transaction --quick somedatabase | gzip > 4_19.gz

如果您可以強制轉儲以使視圖出現在轉儲文件中,您可能需要對其進行編輯(請參閱我的舊文章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 命令。

引用自:https://dba.stackexchange.com/questions/84370