Une option pour mysqldump d'ignorer les bases de données pour la sauvegarde?

23

Nous avons 40 bases de données sur notre serveur.

Nous voulons effectuer une sauvegarde de 36 bases de données en utilisant mysqldump. Comment puis-je ignorer les 4 bases de données restantes dans la commande mysqldump? Existe-t-il une option pour mysqldump d'ignorer les bases de données pour la sauvegarde dans MySQL?

Je connais la commande générale mysqldump mais elle est très longue. Je veux ignorer seulement 4 bases de données et dois prendre la sauvegarde dbs restante.

ashuthosh
la source

Réponses:

16

De retour le 16 décembre 2011, j'ai répondu à la question Comment pouvez-vous mysqldump table (s) spécifique (s)?

J'ai collecté toutes les tables sans inclure un certain ensemble de noms de table.

En utilisant les mêmes principes, vous auriez pu collecter tous les noms de base de données de la table de métadonnées information_schema.schemataque vous souhaitez mysqldump, créer une requête pour renvoyer cette liste, puis utiliser cette liste de bases de données pour formuler la commande 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

Tout ce que vous devez faire est de mettre les bases de données dans lesquelles vous ne voulez pas que mysqldump'd DATABASES_TO_EXCLUDE

Essaie !!!

RolandoMySQLDBA
la source
Il n'est pas nécessaire d'exclure information_schemaqu'il ne soit de toute façon pas vidé. 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

Utilisez grep pour exclure les bases de données dont vous ne voulez pas:

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

En regardant /programming/19354870/bash-command-line-and-input-limit, il semble que vous serez en mesure de gérer les longues lignes. Sinon, vous pouvez toujours

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done
critique
la source
Il faut ajouter `| collez -sd "" -` après le grepafin de passer de la sortie multiligne à une seule ligne avec chaque nom de base de données séparé par un espace, ce qui est requis par mysqldump. Donc, la commande seracandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.
8

Je ne pense pas que ce soit possible, mais vous pouvez essayer ces solutions que vous devrez taper les noms de toutes les bases de données que vous souhaitez vider.

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

Faites-moi savoir si la solution est utile.

Cybermatatu
la source
1
je connais cette commande .mais elle est très longue. je veux ignorer 4 bases de données et j'ai besoin de prendre la sauvegarde dbs restante.
ashuthosh
3

Même ici, il y a tant d'excellentes réponses, donc ce message est juste pour ajouter un choix de plus. En dessous de 2 lignes dans le script, vous pouvez prendre toutes vos sauvegardes de DB en ignorant certaines 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
la source
1
Merci de l'inclure syscar cela fait partie de MySQL 5.7
RolandoMySQLDBA
merci @RolandoMySQLDBA, je reçois toujours de l'aide de vos excellents articles / blogs ... merci encore pour votre compliment ...
Zafar Malik
1

Beaucoup ont toujours voulu que mysqldump ignore les bases de données.

Croiriez-vous que cette option existe maintenant ??? Non, pas dans mysqldump.

Oracle (Yuck, toowee, ne roule toujours pas) a DataPump (expdb impdp) pour vider les bases de données Oracle. Depuis MySQL 5.7 dans la famille Oracle (toujours en difficulté), le nouvel utilitaire de sauvegarde s'appelle mysqlpump , qui est fourni avec --exclude-databases et d'autres options intéressantes . Comme son ancien datapump stepbrother , mysqlpump propose également le parallélisme pour aider à accélérer les vidages et à diviser le travail . Pour le moment, je ne me suis pas intégré au travail, mais cela semble très prometteur. Quand je plonge profondément dans mysqlpump, je pourrais trouver qu'il apporte le même look and feel que le datapump d'Oracle .

S'il y a quelqu'un dans MySQL Parallel Universe avec des histoires à ce sujet, veuillez le poster ici.

RolandoMySQLDBA
la source
0

La réponse de Rolando est plutôt bonne, mais je voulais un script qui puisse être réutilisé sur plusieurs projets. J'ai donc pris son script et l'ai modifié pour que vous puissiez faire des choses comme:

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

Voici le script modifié:

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

(J'espère toujours qu'une --ignore-databaseoption sera ajoutée à une future version de mysqldump)

redgeoff
la source
0

Depuis MySQL 5.7.8, vous pouvez utiliser mysqlpump(qui n'est PAS le même que mysqldump) comme suit:

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

Il suffit de remplacer db1,db2,db3,db4 par les quatre bases de données que vous souhaitez exclure.

Source: Blog du serveur MySQL

Leo Galleguillos
la source