bảng bỏ qua mysqldump với ký tự đại diện


8

Tôi cần lấy một bãi chứa cơ sở dữ liệu chứa 50 bảng lẻ trong đó tôi muốn loại trừ khoảng 15 số lẻ có tiền tố exam_

Tôi đã thử mysqldump --ignore-table=dbname.exam_* và thậm chí đã thử --ignore-table=dbname.exam_% Nó không hoạt động như mong đợi. Tôi đã phải sử dụng --ignore-tablenhiều lần.

Chỉnh sửa: Tôi đã thấy một vài kịch bản shell liệt kê tables not like tablename_%và chuyển nó tới mysqldump.

Tuy nhiên, tôi muốn biết nếu có một tùy chọn trong mysqldump hoặc mysql, như vậy để làm điều tương tự mà không cần phải kịch bản nó.

Chỉnh sửa-thêm: Cuối cùng đã sử dụng một tập lệnh để kết xuất DB trừ các bảng, sử dụng ignore-table=nhiều lần.


bạn có thể đăng kịch bản bạn đã sử dụng? có thể lưu trữ nó tại gist.github.com
rubo77

@ rubo77: Tôi không có kịch bản đó nữa. Đó là một kịch bản cơ bản. Sử dụng lệnh mysql Tôi có một danh sách các bảng tôi muốn loại trừ. Mã hóa cứng danh sách thành tập lệnh BASH để tạo kết xuất bất cứ khi nào cần. May mắn cho tôi, danh sách là không đổi. Ngoài ra, một giải pháp được đăng ở đây có thể hữu ích đối với kịch bản.
anup

Vẫn tốt hơn: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
anup

Câu trả lời:


13

Không, không có tùy chọn nào như thế trong mysqldumplệnh, như các tài liệu nói:

--ignore-bảng = db_name.tbl_name

Không kết xuất bảng đã cho, phải được chỉ định bằng cả tên
cơ sở dữ liệu và bảng. Để bỏ qua nhiều bảng, sử dụng tùy chọn này
nhiều lần. Tùy chọn này cũng có thể được sử dụng để bỏ qua lượt xem.


Là một sang một bên, nó có thể là giá trị tạo ra một người sử dụng mysql dump đó không có quyền truy cập vào các bảng, sau đó cố gắng một mysqldump --all-databaseschỉ để xem nếu nó lỗi ra, hoặc chỉ bỏ qua giao cho DDB tiếp theo ..
NickW

Chưa thử, nhưng âm thanh tốt. Đối với giải pháp, tôi đã viết một kịch bản shell để tránh các bảng.
anup

@NickW Điều đó có thể làm việc. Nhưng nếu bạn muốn linh hoạt hơn, bạn cần thực hiện một truy vấn riêng để lấy tên bảng. Xem câu trả lời của tôi dưới đây.
Butussy Butkus

phiên bản nhanh và bẩn: lừa cơ sở dữ liệu. sử dụng giao diện web của phpMyAdmin để dễ dàng loại bỏ các bảng bạn không muốn xem. sau đó đổ và không cần ký tự đại diện. nếu bạn muốn thực hiện CLI và không nhớ một bước thứ ba sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight

3

Bạn có thể lấy tên bảng mà bạn muốn từ mysql, sau đó sử dụng chúng để xây dựng các tham số kết xuất mysql của bạn.

Trong ví dụ dưới đây, chỉ cần thay thế "someprefix" bằng tiền tố của bạn (ví dụ: "tests_").

Các SHOW TABLEStruy vấn có thể được thay đổi để tìm bộ khác của bảng. Hoặc bạn có thể sử dụng truy vấn đối với INFORMATION_SCHEMAbảng để sử dụng nhiều tiêu chí hơn nữa.

#/bin/bash

#this could be improved but it works
read -p "Mysql username and password" user pass

#specify your database, e.g. "mydb"
DB="mydb"

SQL_STRING='SHOW TABLES LIKE "someprefix%";'
DBS=$(echo $SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#next two lines untested, but intended to add a second excluded table prefix
#ANOTHER_SQL_STRING='SHOW TABLES LIKE "otherprefix%";'
#DBS="$DBS""\n"$(echo $ANOTHER_SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#-B is for batch - tab-separated columns, newlines between rows
#-s is for silent - produce less output
#both result in escaping special characters

#but the following might not work if you have special characters in your table names
IFS=$'\n' read -r -a TABLES <<< $DBS

IGNORE="--ignore_table="$DB"."
IGNORE_TABLES=""

for table in $TABLES; do
        IGNORE_TABLES=$IGNORE_TABLES" --ignore_table="$DB"."$table
done

#Now you have a string in $IGNORE_TABLES like this: "--ignore_table=someprefix1 --ignore_table=someprefix2 ..."

mysqldump $DB --routines -u $user -p$pass $IGNORE_TABLES > specialdump.sql

Điều này được xây dựng với sự trợ giúp từ câu trả lời này về việc nhận "tất cả các bảng loại trừ trong bash": https://stackoverflow.com/a/9232076/631764

và câu trả lời này về việc bỏ qua các bảng với một số bash được sử dụng: https://stackoverflow.com/a/425172/631764


Dựa trên câu trả lời được chọn, tôi đã viết một kịch bản tương tự như câu trả lời của bạn. Cảm ơn cho việc này lên. Chỉnh sửa: chỉ cần nhớ rằng tôi đã sử dụng hai lệnh với mẫu loại trừ đường ống và grep.
anup

0

Tôi nghĩ rằng sử dụng information_schemalà một tuyến đường tốt để thực hiện điều này.

select group_concat(concat('--ignore-table=', TABLE_SCHEMA, '.', table_name) SEPARATOR ' ') 
from information_schema.tables 
where TABLE_SCHEMA = 'Actual_DB_NAME' and TABLE_NAME like 'Actual_TABLE_NAME%';
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.