2009-11-01 64 views

回答

2

通過備份,我假設你的意思只是沒有數據的定義。

現在看來,mysqldump並沒有區分VIEWs和TABLEs,所以最好的辦法是將命令行上的VIEWs顯式指定給mysqldump,或者在mysqldump之前動態地找出這個列表,然後傳遞它像以前一樣下降。

您可以使用此查詢得到一個特定的數據庫中的所有觀點:

SHOW FULL TABLES WHERE table_type='view';

+0

感謝,該命令是有用的。 –

14

注:此從Ken答案從建議的編輯搬到自己的答案。

這裏是利用以上

mysql -u username INFORMATION_SCHEMA 
    --skip-column-names --batch 
    -e "select table_name from tables where table_type = 'VIEW' 
     and table_schema = 'database'" 
    | xargs mysqldump -u username database 
    > views.sql 

這將提取所有視圖名稱的變體通過查詢該INFORMATION_SCHEMA數據庫,然後通過管道將它們xargs的制訂的mysqldump命令一個完整的命令行的例子。 --skip-column-names和--batch需要使輸出xargs友好。如果您有很多視圖,則此命令行可能會變得太長,在這種情況下,您希望爲該選擇添加某種附加過濾器(例如,查找以給定字符開始的所有視圖)。

11

我修改Andomar's excellent answer允許數據庫(和其他設置),只指定一次:

#!/bin/bash -e 
mysql --skip-column-names --batch -e \ 
"select table_name from information_schema.views \ 
where table_schema = database()" $* | 
xargs --max-args 1 mysqldump $* 

我這個保存爲mysql-dump-views.sh,並通過調用它:

$ mysql-dump-views.sh -u user -ppassword databasename >dumpfile.sql 
4

在備份意見多個數據庫通過使用information_schema很容易:

mysql --skip-column-names --batch -e 'select CONCAT("DROP TABLE IF EXISTS ", TABLE_SCHEMA, ".", TABLE_NAME, "; CREATE OR REPLACE VIEW ", TABLE_SCHEMA, ".", TABLE_NAME, " AS ", VIEW_DEFINITION, "; ") table_name from information_schema.views' 
+0

謝謝,這非常有幫助。我的觀點分佈在多個數據庫模式中,而這一切都得到了解決。 – thoughtcrimes1984

-1

感謝你 - 非常有用。

一個嗝,但 - 也許因爲我有一個稍微令人費解的一套看法引用其他意見等:

我發現了「定義者」用戶需求存在,並且對目標模式正確的權限,否則由於事物定義不足,mysql不會生成引用其他視圖的視圖。

在生成的:

/* 50013和DEFINER = <user> @<host> SQL SECURITY DEFINER */

- >確保<user> @<host>是確定你的目標實例,或用替換此字符串使用者。

感謝 索爾斯坦

0

我會盡可能地堅持的mysqldump的輸出,如OP問,因爲它包含的信息有關,不能用一個簡單的查詢重建視圖的轉換來自INFORMATION_SCHEMA。

這是我從我的源數據庫創建部署視圖腳本:

SOURCEDB="my_source_db" 
mysql $SOURCEDB --skip-column-names -B -e \ 
"show full tables where table_type = 'view'" \ 
| awk '{print $1}' \ 
| xargs -I {} mysqldump $SOURCEDB {} > views.sql