2009-11-01 5 views

Trả lời

2

Bằng cách sao lưu, tôi giả sử bạn chỉ là định nghĩa không có dữ liệu. Có vẻ như ngay bây giờ mysqldump không phân biệt giữa VIEW và TABLE, vì vậy có lẽ điều tốt nhất cần làm là chỉ định VIEWs một cách rõ ràng trên dòng lệnh tới mysqldump hoặc tìm ra danh sách này động trước mysqldump và sau đó đi qua nó xuống như trước.

Bạn có thể nhận được tất cả các quan điểm trong một cơ sở dữ liệu cụ thể sử dụng truy vấn này:

SHOW FULL TABLES WHERE table_type='view';

+0

nhờ, lệnh là hữu ích. –

14

Chú ý: Câu trả lời này từ Ken chuyển từ đề nghị chỉnh sửa để sở hữu câu trả lời.

đây là một dòng lệnh ví dụ đầy đủ sử dụng một biến thể của các bên trên

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 

này chiết xuất tất cả các tên xem qua một truy vấn đến cơ sở dữ liệu INFORMATION_SCHEMA, sau đó ống họ xargs để xây dựng một lệnh mysqldump. --skip-column-name và --batch là cần thiết để làm cho đầu ra xargs thân thiện. Dòng lệnh này có thể mất quá nhiều thời gian nếu bạn có nhiều lượt xem, trong trường hợp này bạn muốn thêm một số loại bộ lọc bổ sung vào lựa chọn (ví dụ: tìm tất cả các chế độ xem bắt đầu bằng một ký tự nhất định).

11

tôi sửa đổi Andomar's excellent answer để cho phép các cơ sở dữ liệu (và các thiết lập khác) chỉ được xác định khi:

#!/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 $* 

tôi tiết kiệm này như mysql-dump-views.sh và gọi nó qua:

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

Sao lưu tầm nhìn bao quát nhiều cơ sở dữ liệu dễ dàng bằng cách chỉ sử dụng 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

Cảm ơn, điều này rất hữu ích. Quan điểm của tôi đã được trải rộng trên nhiều lược đồ cơ sở dữ liệu và điều này đã có tất cả chúng. – thoughtcrimes1984

-1

Cảm ơn điều này - rất hữu ích.

Một nấc cục mặc dù - có lẽ vì tôi có một bộ hơi phức tạp các quan điểm mà tham khảo quan điểm khác vv:

tôi phát hiện ra rằng "DEFINER" người dùng cần để tồn tại và có đủ quyền hạn trên giản đồ mục tiêu, nếu không mysql sẽ không tạo ra các khung nhìn tham khảo các khung nhìn khác vì nó định nghĩa mọi thứ không đủ.

Trong tạo: DEFINER

/* 50013 DEFINER = <user> @<host> SQL AN NINH */

-> đảm bảo <user> @<host> là ok trên dụ mục tiêu của bạn, hoặc thay thế chuỗi này với một người dùng có.

Cảm ơn Thorstein

0

tôi sẽ dính vào càng sát càng tốt để đầu ra của mysqldump như OP hỏi, vì nó bao gồm một loạt các thông tin về quan điểm cho rằng không thể được xây dựng lại với một truy vấn đơn giản từ INFORMATION_SCHEMA.

Đây là cách tôi có thể tạo một cái nhìn kịch bản triển khai từ cơ sở dữ liệu nguồn của tôi:

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