web-dev-qa-db-fra.com

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

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.

23
ashuthosh

De retour le 16 décembre 2011, j'ai répondu à la question Comment créez-vous des tables spécifiques à mysqldump?

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 à partir de la table de métadonnées information_schema.schemata que vous voulez que mysqldump'd, créez une requête pour renvoyer cette liste, puis utilisez 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 que vous ne voulez pas que mysqldump'd dans DATABASES_TO_EXCLUDE

Essaie !!!

16
RolandoMySQLDBA

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 https://stackoverflow.com/questions/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
15
srcritical

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.

8
Cybermatatu

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
3
Zafar Malik

Alternativement, vous pouvez consulter les liens suivants;

Option Ignorer la base de données Mysqldump

            OR

Quelques hacks pour simuler mysqldump --ignore-database

Implémentation de mysqldump –ignore-database

Faites-moi savoir si la solution est utile.

Bonne chance!

2
Cybermatatu

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 vient avec - - exclude-databases et d'autres options intéressantes. Comme son frère aîné datapump , mysqlpump propose également 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 celui d'Oracle datapump .

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

1
RolandoMySQLDBA

Depuis MySQL 5.7.8, vous pouvez utiliser mysqlpump (qui n'est PAS identique à mysqldump) comme suit:

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

Remplacez simplement db1,db2,db3,db4 avec les quatre bases de données que vous souhaitez exclure.

Source: Blog du serveur MySQL

0
Leo Galleguillos

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
# https://dba.stackexchange.com/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'un --ignore-database l'option sera ajoutée à une future version de mysqldump)

0
redgeoff