Adakah opsi untuk mysqldump untuk mengabaikan basis data untuk cadangan?

23

Kami memiliki 40 database di server kami.

Kami ingin mengambil 36 database cadangan menggunakan mysqldump. Bagaimana saya bisa mengabaikan 4 basis data yang tersisa dalam perintah mysqldump? Apakah ada opsi untuk mysqldump untuk mengabaikan database untuk cadangan di MySQL?

Saya tahu perintah mysqldump umum tetapi sangat panjang. Saya ingin mengabaikan hanya 4 database dan perlu mengambil cadangan dbs yang tersisa.

ashuthosh
sumber

Jawaban:

16

Kembali pada 16 Des 2011, saya menjawab pertanyaan Bagaimana Anda tabel spesifik mysqldump?

Saya mengumpulkan semua tabel tidak termasuk satu set nama tabel tertentu.

Menggunakan prinsip yang sama, Anda bisa mengumpulkan semua nama database dari tabel metadata information_schema.schematayang Anda inginkan mysqldump'd, membuat kueri untuk mengembalikan daftar itu, lalu menggunakan daftar database itu untuk merumuskan perintah 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

Yang perlu Anda lakukan adalah memasukkan basis data yang tidak Anda inginkan ke mysqldump DATABASES_TO_EXCLUDE

Cobalah !!!

RolandoMySQLDBA
sumber
Tidak perlu mengecualikan information_schemaitu tidak dibuang. 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/en/mysqldump.html
Luka
15

Gunakan grep untuk mengecualikan database yang tidak Anda inginkan:

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

Dari melihat /programming/19354870/bash-command-line-and-input-limit sepertinya Anda akan dapat menangani antrean panjang. Kalau tidak, Anda selalu bisa

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done
kritis
sumber
Orang harus menambahkan `| paste -sd "" -` setelah grepuntuk lulus dari keluaran multiline ke satu baris dengan setiap nama basis data dipisahkan oleh spasi, yang diperlukan oleh mysqldump. Jadi perintahnya adalahcandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.
8

Saya tidak berpikir itu mungkin, tetapi Anda dapat mencoba solusi ini yang harus Anda ketik nama semua database yang ingin Anda buang.

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

Beri tahu saya jika solusinya membantu.

Cybermatatu
sumber
1
Saya tahu perintah ini. Tapi itu sangat panjang. Saya ingin mengabaikan 4 database dan perlu mengambil cadangan dbs yang tersisa.
ashuthosh
3

Bahkan di sini begitu banyak jawaban bagus, jadi posting ini hanya untuk menambah satu pilihan lagi. Dengan skrip di bawah 2 baris, Anda dapat mengambil semua cadangan semua server DB dengan mengabaikan beberapa 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
Zafar Malik
sumber
1
Terima kasih telah menyertakan syskarena itu adalah bagian dari MySQL 5.7
RolandoMySQLDBA
terima kasih @Rando_MySQLDBA, saya selalu mendapat bantuan dari posting / blog Anda yang sangat bagus ... terima kasih lagi atas pujian Anda ...
Zafar Malik
1

Banyak yang selalu ingin mysqldump mengabaikan database.

Percayakah Anda bahwa opsi itu ada sekarang ??? Tidak, tidak di mysqldump.

Oracle (Yuck, toowee, masih tidak tergelincir) memiliki DataPump (expdb impdp) untuk membuang database Oracle. Sejak MySQL 5.7 dalam keluarga Oracle (masih sakit), program utilitas cadangan baru disebut mysqlpump , yang dilengkapi dengan --exclude-database dan opsi lain yang rapi. Seperti datapump saudara tirinya yang lebih tua , mysqlpump juga memiliki fitur paralelisme untuk membantu mempercepat dump dan membagi pekerjaan . Saat ini, saya belum tergabung dalam pekerjaan, tetapi terlihat sangat menjanjikan. Ketika saya menyelam lebih dalam ke mysqlpump saya mungkin menemukan bahwa itu membawa tampilan dan perasaan yang sama dengan datapump Oracle .

Jika ada orang di MySQL Parallel Universe dengan cerita tentangnya, silakan posting di sini.

RolandoMySQLDBA
sumber
0

Jawaban Rolando cukup bagus, tetapi saya ingin skrip yang dapat digunakan kembali di seluruh proyek. Jadi, saya mengambil skripnya dan memodifikasinya sehingga Anda dapat melakukan hal-hal seperti:

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

Berikut ini skrip yang dimodifikasi:

#!/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}

(Saya masih berharap bahwa --ignore-databaseopsi akan ditambahkan ke versi mysqldump di masa depan)

Redgeoff
sumber
0

Sejak MySQL 5.7.8, Anda dapat menggunakan mysqlpump(yang TIDAK sama dengan mysqldump) sebagai berikut:

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

Ganti saja db1,db2,db3,db4dengan empat basis data yang ingin Anda kecualikan.

Sumber: Blog Server MySQL

Leo Galleguillos
sumber