2009-11-19 7 views
29

cơ sở dữ liệu của tôi có 3 bảng: table1, table2 và table3toàn bộ cấu trúc nhưng chỉ dữ liệu mysqldump từ các bảng được chọn trong một lệnh đơn

Tôi muốn làm một mysqldump trên cơ sở dữ liệu này với các điều kiện sau:

  • cấu trúc Dump cho tất cả các bảng
  • Chỉ đổ dữ liệu cho table1 và table2, bỏ qua dữ liệu trong table3

Hiện nay, tôi làm điều này với 2 báo cáo mysqldump

mysqldump -u user -p -d db > db_structure.sql 
mysqldump -u user -p db --ignore-table=db.table3 > table1_and_table2_data.sql 

Nhập họ theo thứ tự họ đã đổ (cấu trúc, sau đó dữ liệu từ table1 và table2)

Có cách nào để kết hợp này vào một lệnh mysqldump đơn?

+0

Tôi có cùng một câu hỏi! Bạn đã tìm thấy một cách để làm điều đó? –

Trả lời

37

Bạn không thể kết hợp chúng trong một lệnh nhưng bạn có thể thực thi cả hai lệnh cùng một lúc và xuất ra cùng một tệp.

mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql 

để tránh phải nhập mật khẩu hai lần bạn có thể làm -ppassword (lưu ý thiếu không gian!). Cũng sử dụng --no-data trong lệnh đầu tiên hoặc bạn cũng kết thúc với dữ liệu. -d là không cần thiết khi bạn chỉ làm một cơ sở dữ liệu.

+0

Cảm ơn câu trả lời này!Tuy nhiên tôi đã tự hỏi nếu ngày nay vẫn không thể làm điều này một cách thanh lịch hơn. –

+0

@ EmilioNicolás Không phải là tôi biết – Cfreak

0

Tôi không nghĩ bạn có thể làm điều đó trong một lệnh. Nhưng bạn chắc chắn có thể hợp nhất đầu ra thành một tệp. Tại sao không để bọc nó trong một số kịch bản shell làm như sau:

mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql 

Bạn sẽ chạy tập lệnh này với hai tham số: tên người dùng và mật khẩu.

6

Có thể bạn muốn kết xuất đầu ra sang một lệnh khác, thay vì chỉ chuyển hướng đến tệp và thêm vào tệp đó trong lệnh tiếp theo, bạn có thể thử (sửa đổi từ ví dụ của lệnh):

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\ 
your_command 

... trong trường hợp của tôi:

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\ 
gzip -9 > filename.sql.gz 

Kèm theo hai mysqldump lệnh trong ngoặc tạo ra một subshell có đầu ra chúng tôi ống vào gzip và sau đó chuyển hướng đó vào một tập tin.

PS: Tôi cũng không thể kết hợp nó thành một lời gọi mysqldump duy nhất.

0

Điều này thực sự khá đơn giản, sử dụng các mệnh đề ở mọi nơi trên bảng mà bạn không muốn dữ liệu và cung cấp cho nó điều kiện luôn luôn sai. Ví dụ: tải dữ liệu trên foo và gah và chỉ lược đồ trên thanh:

mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql 

Vì vậy, bạn có thể thực hiện điều này trên một dòng.

0

Bạn có thể loại bỏ các phần INSERT INTO ...:

mysqldump \ 
    --opt \ 
    -u ${DB_USER} -p${DB_PASS} \ 
    ${DB_NAME} \ 
    | grep -v 'INSERT INTO `table3`' \ 
    | grep -v 'INSERT INTO `table4`'