Mysql

恢復 MySQL 備份時 View 出現問題

  • December 19, 2019

我有一個包含一些表、視圖和常式的數據庫(InnoDB)……

我定期使用命令行進行備份:

mysqldump -u user -ppassword --routines db_name > backup.sql

但我也有使用工作台創建備份的問題

順便說一句,備份過程終止沒有問題或警告……

恢復後我遇到了一些問題,恢復過程順利結束,沒有錯誤,但某些視圖已損壞

  • 如果我嘗試更改它或查看結構,我得到一個空/空白結果
  • 如果我在視圖上執行選擇,我會收到正確的結果(比如視圖沒有損壞)……

我不能改變視圖本身..

我該如何解決?為什麼我有這個問題?

我使用 MySQL Workbench 5.2.35 CE 得到一個空白/空結果….

使用普通 sql (describe view_name) 我收到以下錯誤:

錯誤程式碼:1356。視圖“db.view_name”引用無效的表或列或函式或視圖的定義者/呼叫者缺乏使用它們的權限

但是select * from view_name仍然返回預期的結果

SHOW CREATE VIEW view_name

錯誤程式碼:1356。視圖“view_name”引用了無效的表或列或函式>或視圖的定義者/呼叫者缺乏使用它們的權限

SELECT * FROM INFORMATION_SCHEMA.TABLES where table_schema = 'db_name' and table_name = 'view_name'

TABLE_CATALOG   def 
TABLE_SCHEMA    db_name 
TABLE_NAME      view_name 
TABLE_TYPE  VIEW
ENGINE  VERSION NULL
ROW_FORMAT  NULL
TABLE_ROWS  NULL
AVG_ROW_LENGTH  NULL
DATA_LENGTH NULL
MAX_DATA_LENGTH NULL
INDEX_LENGTH    NULL
DATA_FREE   NULL
AUTO_INCREMENT  NULL
CREATE_TIME NULL
UPDATE_TIME NULL
CHECK_TIME  NULL
TABLE_COLLATION NULL
CHECKSUM    NULL
CREATE_OPTIONS  NULL
TABLE_COMMENT  'View ''db_name.view_name'' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them'

該視圖是由其他視圖相互連接生成的視圖。

視圖的定義必須包含在轉儲文件中。

要查看定義,請在轉儲文件上執行以下命令:

cat backup.sql | grep -A 3 "CREATE ALGORITHM" > backup_views.sql
cat backup_views.sql

然後,您可以刪除有問題的視圖並手動重新創建它們。

如果你有另一台伺服器已經建立了視圖,你應該只用 mysqldump 模式。它也將包含視圖。@DTest 和我之前寫過關於這個的文章

視圖總是在 mysqldump 中最後處理(在所有表之後)。

如果一個視圖引用另一個視圖,並且視圖的創建順序沒有考慮到這一點,也可能會出現此問題。

實際上,作為錯誤報告,這可能與視圖定義器/呼叫器有關。通常發生在您備份db1視圖定義器所在的位置user1,然後您以不同的名稱恢復此備份時,例如db2,因此user1沒有此新數據庫的權限。

在這種情況下,您可以在執行還原之前映射user1db2或替換user1user2backup.sql 文件(假設user2具有必要的權限db2- 通常情況下,當您進行生產數據庫備份然後將其還原為測試數據庫時)。

您可以在此答案中閱讀更多詳細資訊。

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