恢復 MySQL 備份時 View 出現問題
我有一個包含一些表、視圖和常式的數據庫(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
沒有此新數據庫的權限。在這種情況下,您可以在執行還原之前映射
user1
到db2
或替換user1
為user2
backup.sql 文件(假設user2
具有必要的權限db2
- 通常情況下,當您進行生產數據庫備份然後將其還原為測試數據庫時)。您可以在此答案中閱讀更多詳細資訊。