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


318

Làm cách nào tôi có thể kết xuất một bảng hoặc bộ bảng cụ thể mà không bao gồm các bảng db còn lại?

+1

Xem thêm: [Bất kỳ tùy chọn nào cho mysqldump để bỏ qua cơ sở dữ liệu để sao lưu?] (Http://dba.stackexchange.com/q/35081/1192) 19 mar. 162016-03-19 12:32:16

431

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 hàm GROUP_CONCAT cần phải mở rộng tối đa.Tôi đã thêm biến phiên group_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.

+29

Để 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, v.v. 13 dec. 122012-12-13 13:06:49

  0

@codecowboy, bạn có thể thay đổi 'SQL =" $ {SQL} VÀ tên_bảng KHÔNG IN ('t1', 't2', 't3') "' thành' SQL = "$ {SQL} VÀ tên_bảng KHÔNG THÍCH '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.). 23 dec. 142014-12-23 02:55:37

  0

Không phải là cách tiếp cận cho * 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 đối số '--ignore-table'?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à thay vào đó chỉ đề xuất '--ignore-table'? 26 sep. 162016-09-26 17:34:31

  0

@codewaggle Điều đó gây ra lỗi 'Sử dụng tùy chọn bất hợp pháp --ignore-table =.

'trừ khi tôi chỉ định bảng là' schemaname.tablename'. – 10 jan. 172017-01-10 14:33:31

  0

Công cụ tuyệt vời, lý do nào biến SQL không phải là đa dòng? 23 jun. 172017-06-23 04:32:56

  0

Nó chỉ không hoạt động 'Truy cập bị từ chối cho người dùng vào cơ sở dữ liệu t1 khi chọn cơ sở dữ liệu' 07 feb. 182018-02-07 12:44:57


24

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

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.


65

Một lưu ý để mở rộng trên the answer by RolandoMySQLDBA .

Kịch bản mà ông đư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) một 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 tùy chọn --ignore-table :

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

8

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
+3

--ignore-table là để loại trừ các bảng nhất định khỏi mysqldump, không bao gồm.:) 16 sep. 132013-09-16 07:02:50

+1

Tuy nhiên, người ta có thể liệt kê tất cả các bảng để loại trừ và nó sẽ kết xuất chỉ những bảng còn lại :-) 07 jan. 152015-01-07 18:17:40