Làm thế nào để bạn mysqldump cụ thể bảng (s)?


Câu trả lời:


540

Nếu bạn đang bán các bảng t1, t2 và t3 từ mydb

mysqldump -u... -p... mydb t1 t2 t3 > mydb_tables.sql

Nếu bạn có một tấn bảng trong mydb và bạn muốn kết xuất mọi thứ trừ t1, t2 và t3, hãy làm điều này:

DBTODUMP=mydb
SQL="SET group_concat_max_len = 10240;"
SQL="${SQL} SELECT GROUP_CONCAT(table_name separator ' ')"
SQL="${SQL} FROM information_schema.tables WHERE table_schema='${DBTODUMP}'"
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
TBLIST=`mysql -u... -p... -AN -e"${SQL}"`
mysqldump -u... -p... ${DBTODUMP} ${TBLIST} > mydb_tables.sql

Hãy thử một lần !!!

CẬP NHẬT 2014 / 03-06 10:15 EST

@RoryDonohue chỉ ra cho tôi rằng GROUP_CONCAT chức năng cần phải có chiều dài tối đa của nó mở rộng. Tôi đã thêm biến nhóm session_concat_max_len vào câu trả lời của mình với độ dài tối đa là 10K. Cảm ơn, @RoryDonohue.


43
Để loại trừ chỉ một vài bảng, bạn có thể sử dụng --ignore-table = Table1 --ignore-table = Table2 --ignore-table =
Table3,

@codecowboy, bạn có thể đổi SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"sang SQL="${SQL} AND table_name NOT LIKE 'foo\_%'". Tôi chỉ thử nó và nó hoạt động. Bạn có thể thay đổi điều kiện thành '% foo%' để có được tất cả các bảng có chứa 'foo' ở bất kỳ đâu trong tên của chúng (bao gồm 'thực phẩm', 'đánh lừa', v.v.).
Butussy Butkus

1
Không phải là cách tiếp cận để loại trừ các bảng ở đây dư thừa và quá mức cần thiết cho sự tồn tại của --ignore-tableđối số? Và nếu vậy, sẽ tốt hơn nếu loại bỏ tập lệnh của bạn khỏi câu trả lời và chỉ đề nghị --ignore-tablethay thế?
Đánh dấu Amery

@codewaggle Điều đó gây ra lỗi Illegal use of option --ignore-table=<database>.<table>trừ khi tôi chỉ định bảng là schemaname.tablename.
WAF

Công cụ tuyệt vời, lý do nào biến SQL không phải là đa dòng?
sdkks

72

Một lưu ý để mở rộng về câu trả lời của RolandoMySQLDBA .

Kịch bản mà anh ấy đưa vào là một cách tiếp cận tuyệt vời để bao gồm ( and table_name in) hoặc loại trừ ( and table_name NOT in) danh sách các bảng.

Nếu bạn chỉ cần loại trừ một hoặc hai bảng, bạn có thể loại trừ chúng riêng lẻ với --ignore-tabletùy chọn:

mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql

29

Khi bạn có nhiều hơn một vài bảng, việc chạy một cái gì đó như thế này sẽ tốt hơn nhiều:

mysql databasename -u [user] -p[password] -e 'show tables like "table_name_%"' 
       | grep -v Tables_in 
       | xargs mysqldump [databasename] -u [root] -p [password] > [target_file]

Hoặc đôi khi như thế này:

mysqldump -u [user] -p[password] databasename `echo "show tables like 'table_name_%';" 
       | mysql -u[user] -p[password] databasename 
       | sed '/Tables_in/d'` > [target_file]

Hãy nhớ rằng các lệnh đó phải được gõ chỉ trong một dòng.


11

Bạn có thể làm điều đó đơn giản bằng cách sử dụng lệnh dưới đây:

mysqldump -uusername -ppassword dbname \
  --ignore-table=schema.tablename1    \
  --ignore-table=schema.tablename2    \
  --ignore-table=schema.tablename3 > mysqldump.sql

4
--ignore-bảng là để loại trừ các bảng nhất định khỏi mysqldump, không bao gồm. :)
Praveen Prasannan

3
Tuy nhiên, người ta có thể liệt kê tất cả các bảng để loại trừ và nó sẽ loại bỏ những bảng còn lại :-)
Colin 't Hart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.