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?
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?
Câu trả lời:
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 !!!
@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.
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.).
--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-table
thay thế?
Illegal use of option --ignore-table=<database>.<table>
trừ khi tôi chỉ định bảng là schemaname.tablename
.
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-table
tùy chọn:
mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql
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.
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