Bất kỳ tùy chọn cho mysqldump để bỏ qua cơ sở dữ liệu để sao lưu?


23

Chúng tôi có 40 cơ sở dữ liệu trong máy chủ của chúng tôi.

Chúng tôi muốn lấy 36 cơ sở dữ liệu sao lưu bằng mysqldump. Làm thế nào tôi có thể bỏ qua 4 cơ sở dữ liệu còn lại trong lệnh mysqldump? Có tùy chọn nào cho mysqldump để bỏ qua cơ sở dữ liệu để sao lưu trong MySQL không?

Tôi biết lệnh mysqldump chung nhưng nó rất dài. Tôi muốn bỏ qua chỉ 4 cơ sở dữ liệu và cần phải sao lưu dbs còn lại.

Câu trả lời:


16

Trở lại vào ngày 16 tháng 12 năm 2011, tôi đã trả lời câu hỏi Làm thế nào để bạn (các) bảng cụ thể mysqldump?

Tôi đã thu thập tất cả các bảng không bao gồm một tập hợp các tên bảng nhất định.

Sử dụng các nguyên tắc tương tự, bạn có thể đã thu thập tất cả các tên cơ sở dữ liệu từ bảng siêu dữ liệu information_schema.schematamà bạn muốn mysqldump'd, tạo một truy vấn để trả về danh sách đó, sau đó sử dụng danh sách cơ sở dữ liệu đó để tạo lệnh mysqldump.

DATABASES_TO_EXCLUDE="db1 db2 db3"
EXCLUSION_LIST="'information_schema','mysql'"
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
    EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -ANe"${SQLSTMT}"`
do
    MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done
MYSQLDUMP_OPTIONS="--routines --triggers"
mysqldump ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES} > MySQLDatabases.sql

Tất cả những gì bạn cần làm là đưa cơ sở dữ liệu mà bạn không muốn mysqldump'd vào DATABASES_TO_EXCLUDE

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


Không cần phải loại trừ information_schemanó không bị đổ đi. mysqldump does not dump the INFORMATION_SCHEMA or performance_schema database by default. To dump either of these, name it explicitly on the command line and also use the --skip-lock-tables option. You can also name them with the --databases option. Before MySQL 5.5 mysqldump silently ignores INFORMATION_SCHEMA even if you name it explicitly on the command line. dev.mysql.com/doc/refman/5.5/vi/mysqldump.html
Luka

15

Sử dụng grep để loại trừ cơ sở dữ liệu bạn không muốn:

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
mysqldump --databases $candidates 

Từ việc xem /programming/19354870/bash-command-line-and-input-limit có vẻ như bạn sẽ có thể xử lý các hàng dài. Nếu không bạn luôn có thể

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done

Người ta nên thêm `| paste -sd "" -` sau khi grepchuyển từ đầu ra đa dòng sang một dòng duy nhất với mỗi tên cơ sở dữ liệu được phân tách bằng khoảng trắng , được yêu cầu bởi mysqldump. Vì vậy, lệnh sẽ làcandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.

8

Tôi không nghĩ là có thể, nhưng bạn có thể thử những giải pháp này mà bạn sẽ phải nhập tên của tất cả các cơ sở dữ liệu mà bạn muốn kết xuất.

mysqldump -u root -password --databases db1 db2 db3 ... db36 > mydb_dump.sql

Hãy cho tôi biết nếu giải pháp giúp.


1
Tôi biết lệnh này. Nhưng nó rất dài. Tôi muốn bỏ qua 4 cơ sở dữ liệu và cần phải sao lưu dbs còn lại.
ashuthosh

3

Ngay cả ở đây rất nhiều câu trả lời tuyệt vời, vì vậy bài đăng này chỉ là để thêm một sự lựa chọn. Bằng cách dưới 2 dòng trong tập lệnh, bạn có thể lấy tất cả các máy chủ của mình sao lưu DB mà bỏ qua một số DB.

DB_LIST=`mysql -Nse "SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql','information_schema','performance_schema','sys');"`

mysqldump -R -B $DB_LIST > BACKUPNAME.sql

1
Cảm ơn bạn đã bao gồm sysvì đó là một phần của MySQL 5.7
RolandoMySQLDBA

cảm ơn @RolandoMySQLDBA, tôi luôn nhận được sự giúp đỡ từ các bài đăng / blog tuyệt vời của bạn ... cảm ơn lần nữa vì lời khen của bạn ...
Zafar Malik


1

Nhiều người luôn muốn mysqldump bỏ qua cơ sở dữ liệu.

Bạn có tin rằng lựa chọn đó tồn tại bây giờ ??? Không, không phải trong mysqldump.

Oracle (Yuck, toowee, vẫn không tặc lưỡi) có DataPump (expdb impdp) để kết xuất cơ sở dữ liệu Oracle. Vì MySQL 5.7 trong gia đình Oracle (vẫn còn gây tổn thương), chương trình tiện ích sao lưu mới được gọi là mysqlpump , đi kèm với --exclude-cơ sở dữ liệu và các tùy chọn gọn gàng khác. Giống như datapump cũ hơn của nó , mysqlpump cũng có tính năng song song để giúp tăng tốc các bãi chứa và phân chia công việc . Tại thời điểm này, tôi chưa kết hợp với công việc, nhưng có vẻ rất hứa hẹn. Khi tôi sâu lặn vào mysqlpump Tôi có thể thấy rằng nó mang lại cái nhìn tương tự và cảm giác như Oracle datapump .

Nếu có ai trong Vũ trụ song song MySQL có câu chuyện về nó, xin vui lòng gửi nó ở đây.


0

Câu trả lời của Rolando khá hay, nhưng tôi muốn một kịch bản có thể được sử dụng lại trong các dự án. Vì vậy, tôi lấy kịch bản của anh ấy và sửa đổi nó để bạn có thể làm những việc như:

$ mysqldump-ignore-databases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema' '--skip-lock-tables' > mydbs.sql

Đây là kịch bản sửa đổi:

#!/usr/bin/env bash

# This is an adapted version of Rolando's awesome script at
# /dba//a/35104/94046

# Usage: mysqldump-ignore-databases.sh username password dbs-to-exclude mysqldump-options
# e.g.
#   mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema'
#                               '--skip-lock-tables' > dbs.sql
#
#   mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'mysql' '-h example.com' '-h example.com' > dbs.sql

USERNAME=$1
PASSWORD=$2
DATABASES_TO_EXCLUDE=$3
MYSQLDUMP_OPTIONS=$4
MYSQL_OPTIONS=$5

EXCLUSION_LIST=""
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
  if [ "${EXCLUSION_LIST}" != "" ]
  then
    EXCLUSION_LIST="${EXCLUSION_LIST},"
  fi
  EXCLUSION_LIST="${EXCLUSION_LIST}'${DB}'"
done

SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"

MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -u${USERNAME} -p${PASSWORD} ${MYSQL_OPTIONS} -ANe"${SQLSTMT}"`
do
  MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done

mysqldump -u${USERNAME} -p${PASSWORD} ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES}

(Tôi vẫn hy vọng rằng một --ignore-databasetùy chọn sẽ được thêm vào phiên bản tương lai của mysqldump)


0

Kể từ MySQL 5.7.8, bạn có thể sử dụng mysqlpump(KHÔNG giống như mysqldump) như sau:

mysqlpump --user=user --password --exclude-databases=db1,db2,db3,db4 --result-file=partial_backup.sql

Chỉ cần thay thế db1,db2,db3,db4bằng bốn cơ sở dữ liệu bạn muốn loại trừ.

Nguồn: Blog máy chủ MySQL

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.