Qualche opzione per mysqldump di ignorare i database per il backup?


23

Abbiamo 40 database nel nostro server.

Vogliamo eseguire il backup di 36 database utilizzando mysqldump. Come posso ignorare i restanti 4 database nel comando mysqldump? C'è qualche opzione per mysqldump di ignorare i database per il backup in MySQL?

Conosco il comando generale mysqldump ma è molto lungo. Voglio ignorare solo 4 database e devo fare il backup dei dbs rimanenti.

Risposte:


16

Il 16 dicembre 2011, ho risposto alla domanda Come si eseguono le tabelle specifiche di mysqldump?

Ho raccolto tutte le tabelle senza includere un determinato set di nomi di tabella.

Usando gli stessi principi, potresti aver raccolto tutti i nomi dei database dalla tabella dei metadati information_schema.schematache desideri mysqldump, creare una query per restituire tale elenco, quindi utilizzare tale elenco di database per formulare il comando 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

Tutto quello che devi fare è inserire i database in cui non vuoi che mysqldump sia inserito DATABASES_TO_EXCLUDE

Provaci !!!


Non è necessario escludere information_schemache non venga comunque scaricato. 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

Usa grep per escludere i database che non vuoi:

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

Dal guardare /programming/19354870/bash-command-line-and-input-limit sembra che sarai in grado di gestire le lunghe file. Altrimenti puoi sempre

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

Si dovrebbe aggiungere `| incolla -sd "" -` dopo il grepper passare dall'output multilinea a una singola riga con ogni nome di database separato da uno spazio, richiesto da mysqldump. Quindi il comando saràcandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.

8

Non credo sia possibile, ma puoi provare queste soluzioni che dovrai digitare i nomi di tutti i database che vuoi scaricare.

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

Fammi sapere se la soluzione aiuta.


1
Conosco questo comando. Ma è molto lungo. Voglio ignorare 4 database e devo fare il backup dei dbs rimanenti.
Ashuthosh,

3

Anche qui tante risposte eccellenti, quindi questo post è solo per aggiungere un'altra scelta. Al di sotto di 2 righe nello script, puoi prendere i tuoi server tutti i backup del DB ignorando alcuni 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
Grazie per aver incluso sysdato che fa parte di MySQL 5.7
RolandoMySQLDBA il

grazie @RolandoMySQLDBA, ricevo sempre aiuto dai tuoi post / blog eccellenti ... grazie ancora per il tuo complimento ...
Zafar Malik,


1

Molti hanno sempre voluto che mysqldump ignorasse i database.

Crederesti che l'opzione esiste ora ??? No, non in mysqldump.

Oracle (Yuck, toowee, ancora non rotola fuori lingua) ha DataPump (expdb impdp) per scaricare i database Oracle. Da MySQL 5.7 nella famiglia Oracle (ancora dannoso), il nuovo programma di utilità di backup si chiama mysqlpump , che viene fornito con --exclude-database e altre opzioni accurate. Come il vecchio datapump del fratellastro , mysqlpump presenta anche un parallelismo per accelerare i dump e dividere il lavoro . In questo momento, non mi sono inserito nel lavoro, ma sembra molto promettente. Quando mi immergo profondamente in mysqlpump, potrei scoprire che porta lo stesso aspetto e la stessa sensazione del datapump di Oracle .

Se c'è qualcuno nell'universo parallelo MySQL con storie a riguardo, pubblicalo qui.


0

La risposta di Rolando è piuttosto bella, ma volevo una sceneggiatura che potesse essere riutilizzata in tutti i progetti. Quindi, ho preso la sua sceneggiatura e l'ho modificata in modo da poter fare cose come:

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

Ecco lo script modificato:

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

(Spero ancora che --ignore-databaseun'opzione verrà aggiunta a una versione futura di mysqldump)


0

Da MySQL 5.7.8, puoi usare mysqlpump(che NON è lo stesso di mysqldump) come segue:

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

Sostituisci semplicemente db1,db2,db3,db4con i quattro database che desideri escludere.

Fonte: MySQL Server Blog

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.