Mysqldump chỉ các bảng có tiền tố / ký tự đại diện Mysqldump nhất định?


83

Tôi có cơ sở dữ liệu khổng lồ, lộn xộn này, tôi đang dọn dẹp. Nó chứa hơn 500 bảng, là kết quả của việc kết hợp Magento Enterprise với Joomla trong một DB duy nhất.

Để làm cho mọi thứ tồi tệ hơn, có một bộ hơn 70 bảng Joomla hoàn toàn không được sử dụng. Tất cả chúng đều có tiền tố bak_.

Chỉ cần xóa những bak_bảng này sẽ dễ dàng, nhưng tôi muốn 'bak' chúng trước (xem tôi đã làm gì ở đó?). Trong tâm trí tôi, tôi có thể hình dung một lệnh như thế này:

mysqldump -u username -p mydatabase bak_*

Nhưng điều này không hiệu quả. cách nào tốt nhất để làm việc này? Cảm ơn!

CHỈNH SỬA: Có, tôi có thể liệt kê rõ ràng 70 bảng để bao gồm hoặc ~ 430 bảng để loại trừ, nhưng tôi đang tìm cách tốt hơn để thực hiện việc này, nếu có thể.


Câu trả lời là chọn vào bảng đó theo truy vấn và thông qua truy vấn rằng với mysqldump vì mysqldump không hỗ trợ regex nhờ may mắn
Daric

1
Tôi nghĩ câu trả lời cho câu hỏi của bạn là ở đây: stackoverflow.com/questions/2949330/…
raghu

Câu trả lời do @minaz đưa ra rõ ràng là tốt hơn câu trả lời hiện được đánh dấu là tốt nhất. Tất nhiên sẽ giúp đánh dấu điều đó là tốt hơn, nếu bạn đồng ý.
Dan Dascalescu

Câu trả lời:


119

Bạn có thể chỉ định tên bảng lần lượt trên dòng lệnh nhưng không có ký tự đại diện. mysqldump databasename table1 table2 table3

Bạn cũng có thể sử dụng --ignore-tablenếu điều đó sẽ ngắn hơn.

Một ý tưởng khác là đưa các bảng vào một tệp với một cái gì đó như

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

Chỉnh sửa tệp và đưa tất cả cơ sở dữ liệu vào một dòng. Sau đó làm

mysqldump dbname `cat tables.txt` > dump_file.sql

Để thả các bảng vào một dòng (không được khuyến nghị), bạn có thể làm như sau

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

4
Nhưng dù bằng cách nào, tôi sẽ phải liệt kê ra 70 bảng để bỏ qua, hoặc 430 bảng để đưa vào. Đây là điều tôi đang cố gắng tránh làm. Tôi lẽ ra phải rõ ràng hơn trong câu hỏi của mình, nhưng cảm ơn vì câu trả lời. Điều này SẼ hoạt động, vâng;)
thaddeusmt

1
Một ý tưởng khác là đưa các bảng vào một tệp với một cái gì đó như mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txtChỉnh sửa tệp và đưa tất cả cơ sở dữ liệu vào một dòng. Sau đó làmmysqldump dbname `cat tables.txt`
sreimer

Cuối cùng tôi chỉ bỏ bảng bak_, nhưng tôi vẫn sử dụng nó để lấy danh sách bảng. Sau đó, tôi nhìn chúng cùng với dấu phẩy để tạo một câu lệnh DROP TABLE lớn gawk '{print $1"," }' tables.txt > baktables.sql. Cảm ơn!
thaddeusmt

Bất kỳ cách nào để làm điều này trong một lớp lót? tức là: mà không sử dụng tệp tạm thời làm trung gian?
Tom Auger

3
Điều này sẽ làm đượcmysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer

59

Đây là một cách dễ dàng:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

4
nó phải được show tables like "<prefix>\_%"bởi vì _cũng là một ký tự đại diện và cần được thoát ... nếu không bạn có thể nhận được một vấn đề với các bảng có cùng prefix-prefix như bak_ và bak2_ sẽ cả hai trận đấu trênbak_%
reox

5
Bạn có thể chuyển -N đến mysqlvà bạn sẽ không cần phải chạy grepđể lọc ra Tables_inhàng.
Dan Dascalescu

1
Làm việc cho tôi nhưng với mysql -NB.
wesamly

Nếu show tables like "bak\_%"không trả về gì, tất cả cơ sở dữ liệu sẽ bị hủy. Bất kỳ cách nào để ngăn chặn điều này?
Seb33300

56

Yêu thích của tôi:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

Tất cả các câu trả lời có cùng một cách tiếp cận, nhưng đây là cú pháp ngắn gọn nhất.


11
đối với những người tò mò, những cờ này là -B batch -e thực thi -s chế độ im lặng (ít đầu ra hơn) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
jsh

Tôi thích điều này. Tôi đã quay lại đây nhiều lần để lấy đoạn mã này!
Jason Galuten

Gỡ nhẹ: Bạn có thể phải điền thông số tên người dùng và mật khẩu, cho cả lệnh mysqldump VÀ mysql. Và nếu lệnh gọi mysql không thành công, mysqldump mặc định kết xuất toàn bộ cơ sở dữ liệu, điều này có thể rất lớn, đặc biệt là trong trường hợp bạn có xu hướng chỉ kết xuất một tập hợp con của dữ liệu.
gwideman 20/07/19

điều này không hoạt độngmysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
cloudbud

2

Một dòng khác để trích xuất danh sách tên của bảng mysql -sN …và sau đó sử dụng từng mục trong vòng lặp shell "for… in…" để thả chúng:

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

hoặc (phiên bản mở rộng)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

Hoặc sử dụng "group_concat" để nối * tên của các bảng, nếu chúng đủ ngắn:

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

* một số giới hạn như giá trị của "group_concat_max_len" (thường bằng 1024, ví dụ 70 bảng của bạn) có thể gây trở ngại.


Nguyên tắc tương tự, nhưng để kết xuất tất cả các bảng ngoại trừ những bảng bắt đầu bằng "bak_":

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done

2

Đã có rất nhiều câu trả lời hay, nhưng tôi đến đây với sự thay đổi như sau:

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

Bằng hành động này, tôi đã thực hiện một kết xuất bảng theo mặt nạ như% mask% từ cơ sở dữ liệu vào một tệp duy nhất. Hy vọng rằng ai đó sẽ tìm thấy nó hữu ích.


2

Kể từ MySQL 5.7, mysqlpumpcông cụ hỗ trợ lọc tên bảng với các mẫu.

Lưu ý rằng đó là một công cụ nửa chừng, vì vậy bạn cần đảm bảo rằng nó hỗ trợ các chức năng cần thiết và nó thực hiện chúng một cách chính xác (ví dụ: kể từ MySQL 5.7.12, trình kích hoạt xuất bị hỏng).


3
Hóa ra rằng "mysqlpump" không phải là lỗi đánh máy. dev.mysql.com/doc/refman/5.7/en/mysqlpump.html . Có, tùy chọn --include-table abc% cho phép chỉ định bảng để kết xuất bằng cách sử dụng ký tự đại diện. Nhưng dường như không có cách nào để mysqlpump loại trừ lượt xem. Đúng, thực sự là một nửa nướng.
gwideman 20/07/19

1

Dựa trên một số câu trả lời hay khác ở đây, tôi đã tạo tập lệnh shell để làm cho việc này dễ dàng hơn. Tập lệnh này tạo ra 3 tệp trong đầu ra - một tệp có cấu trúc cho tất cả các bảng, một tệp chứa dữ liệu cho tất cả các bảng không bị loại trừ và một tệp chứa dữ liệu cho tất cả các bảng "bị loại trừ" (bạn có thể nhận xét điều này nếu bạn thực sự không thích ' t cần nó). Sau đó, bạn có thể sử dụng (các) cái bạn cần.

#!/bin/bash

echo -n "DB Password: "
read -s PASSWORD

HOST=yourhostname.com
USER=youruser
DATABASE=yourdatabase

MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")

echo "Dumping structure..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz

echo "Dumping main data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz

echo "Dumping big table data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz

0

Giải pháp của tôi:

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`

0

mysql DATABASE -u USERNAME -p -e 'hiển thị các bảng như "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p> DUMP.sql

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.