Exportez et importez toutes les bases de données MySQL en même temps


354

Je souhaite conserver une sauvegarde de toutes mes bases de données MySQL. J'ai plus de 100 bases de données MySQL. Je veux les exporter tous en même temps et les réimporter tous en même temps sur mon serveur MySQL. Comment puis je faire ça?

Réponses:


777

Exportation:

mysqldump -u root -p --all-databases > alldb.sql

Recherchez la documentation de mysqldump . Vous voudrez peut-être utiliser certaines des options mentionnées dans les commentaires:

mysqldump -u root -p --opt --all-databases > alldb.sql
mysqldump -u root -p --all-databases --skip-lock-tables > alldb.sql

Importation:

mysql -u root -p < alldb.sql

1
mysqldump -uroot -p --opt --all-databases> alldb.sql
un codeur

7
mysqldump -uroot -p --all-databases --skip-lock-tables> alldb.sql
temple

12
Ajoutez des options --verbose ou -v pour voir comment le vidage progresse.
bagonyi

4
@ HalilÖzgür à partir de la page de manuel mysqldump: "mysqldump ne vide pas la base de données INFORMATION_SCHEMA ou performance_schema par défaut. Pour vider l'un ou l'autre, nommez-le explicitement sur la ligne de commande et utilisez également l'option --skip-lock-tables."
mmalone

2
ATTENTION , l'importation écrasera tous vos utilisateurs MySQL existants.
RousseauAlexandre

219

Autre solution:

Il sauvegarde chaque base de données dans un fichier différent

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`

for db in $databases; do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
       # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
    fi
done

3
Je préférerais cette approche, car cela rend le vidage de toutes les bases de données sous forme de fichier différent.
Arda

10
Vous pouvez simplifier / améliorer un peu le script: Remplacez la 9ème ligne [bases de données = ...] par ces deux lignes: ExcludeDatabases="Database|information_schema|performance_schema|mysql"[ligne suivante] databases=`-u $USER -p$PASWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`et supprimez complètement les lignes ifet fi. Dans la variable, ExcludeDatabasesvous stockez les noms des bases de données qui ne doivent pas être sauvegardées [normalement les bases de données système].
Peter VARGA

2
@jruzafa Vous pouvez utiliser -Bse "show databases"pour éviter une sortie de formatage supplémentaire et ainsi vous pouvez supprimer | tr -d "| " | grep -v Database. Dans mon script d'exportation, cette ligne estdatabases=`mysql -u $USER -p$PASSWORD -Bse "SHOW DATABASES;"
miquel


1
AVERTISSEMENT: Le commentaire très utile de @AlBundy ci-dessus contient une séquence de caractères unicode U+200C U+200Bentre le "c" et le "h" du mot "schéma" . Cela interrompt la copie et le collage de ce bit. Plus de discussion sur ce problème ici: meta.stackexchange.com/questions/170970/…
billynoah

29

Toutes les réponses que je vois à cette question peuvent avoir des problèmes avec les jeux de caractères dans certaines bases de données en raison du problème de rediriger la sortie de mysqldumpvers un fichier dans l'opérateur shell >.

Pour résoudre ce problème, vous devez effectuer la sauvegarde avec une commande comme celle-ci

mysqldump -u root -p --opt --all-databases -r backup.sql

Pour faire une bonne restauration BD sans aucun problème avec les jeux de caractères. De toute évidence, vous pouvez modifier le jeu de caractères par défaut selon vos besoins.

mysql -uroot -p --default-character-set=utf8
mysql> SET names 'utf8';
mysql> SOURCE backup.sql;

Que fait -r?
Luca Reghellin

3
-r définit le nom du fichier de destination sur lequel la sortie sera écrite.
NetVicious

Serait-il préférable d'utiliser utf8mb4 au lieu d'utf8 pour le jeu de caractères?
kojow7

1
Cela dépend de ce que vous stockez dans vos tables. Le jeu de caractères utf8 a un maximum de 3 octets pour chaque caractère. utf8mb4 a un maximum de 4 octets pour chaque caractère. Évidemment, si votre base de données est sur utf8mb4, vous devez utiliser ce jeu de caractères pour la restaurer.
NetVicious

9

Sur la base de ces réponses, j'ai créé un script qui sauvegarde toutes les bases de données dans des fichiers séparés, puis les compresse en une archive avec la date comme nom.

Cela ne demandera pas de mot de passe, peut être utilisé dans cron. Pour stocker le mot de passe, .my.cnfvérifiez cette réponse https://serverfault.com/a/143587/62749

Fait aussi avec des commentaires pour ceux qui ne sont pas très familiers avec les scripts bash.

#!/bin/bash

# This script will backup all mysql databases into 
# compressed file named after date, ie: /var/backup/mysql/2016-07-13.tar.bz2

# Setup variables used later

# Create date suffix with "F"ull date format
suffix=$(date +%F)
# Retrieve all database names except information schemas. Use sudo here to skip root password.
dbs=$(sudo mysql --defaults-extra-file=/root/.my.cnf --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema")
# Create temporary directory with "-d" option
tmp=$(mktemp -d)
# Set output dir here. /var/backups/ is used by system, 
# so intentionally used /var/backup/ for user backups.
outDir="/var/backup/mysql"
# Create output file name
out="$outDir/$suffix.tar.bz2"

# Actual script

# Check if output directory exists
if [ ! -d "$outDir" ];then
  # Create directory with parent ("-p" option) directories
  sudo mkdir -p "$outDir"
fi

# Loop through all databases
for db in $dbs; do
  # Dump database to temporary directory with file name same as database name + sql suffix
  sudo mysqldump --defaults-extra-file=/root/.my.cnf --databases "$db" > "$tmp/$db.sql"
done

# Go to tmp dir
cd $tmp

# Compress all dumps with bz2, discard any output to /dev/null
sudo tar -jcf "$out" * > "/dev/null"

# Cleanup
cd "/tmp/"
sudo rm -rf "$tmp"

1
Heureux que vous soyez revenu pour apporter vos ajouts. un vote de ma part
Fr0zenFyr

7

Pourquoi analyser une sortie formatée alors que la commande mysql peut faire directement ce que vous voulez?

databases=`mysql -u $USER -p$PASSWORD --batch --skip-column-names -e "SHOW DATABASES;" | grep -E -v "(information|performance)_schema"`

Répertorie les noms de base de données et uniquement cela.


3

Soyez prudent lors de l'exportation et de l'importation vers différentes versions de MySQL car les tables mysql peuvent avoir différentes colonnes. Les privilèges accordés peuvent ne pas fonctionner si vous n'avez pas de chance. J'ai créé ce script (mysql_export_grants.sql) pour vider les subventions pour l'importation dans la nouvelle base de données, juste au cas où:

#!/bin/sh
stty -echo
printf 'Password: ' >&2
read PASSWORD
stty echo
printf "\n"
if [ -z "$PASSWORD" ]; then
        echo 'No password given!'
        exit 1
fi
MYSQL_CONN="-uroot -p$PASSWORD"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g'

3

Lorsque vous videz toutes les bases de données. De toute évidence, il s'agit de données volumineuses. Vous pouvez donc préférer ci-dessous pour mieux:

Création d'une sauvegarde:

mysqldump -u [user] -p[password]--single-transaction --quick --all-databases | gzip > alldb.sql.gz

Si erreur

- Attention: sauter les données de la table mysql.event. Spécifiez explicitement l'option --events.

Utilisation:

mysqldump -u [user] -p --events --single-transaction --quick --all-databases | gzip > alldb.sql.gz

Restauration de la sauvegarde:

gunzip < alldb.sql.gz | mysql -u [user] -p[password]

J'espère que cela vous aidera :)


3

J'ai écrit ce commentaire il y a déjà plus de 4 ans et j'ai décidé maintenant de répondre à une question.

Le script de jruzafa peut être un peu simplifié:

#!/bin/bash

USER="zend"
PASSWORD=""
#OUTPUT="/Users/rabino/DBs"

#rm "$OUTPUTDIR/*gz" > /dev/null 2>&1

ExcludeDatabases="Database|information_schema|performance_schema|mysql"
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | egrep -v $ExcludeDatabases`

for db in $databases; do
    echo "Dumping database: $db"
    mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
    # gzip $OUTPUT/`date +%Y%m%d`.$db.sql
done

Remarque:

  1. Les bases de données exclues - principalement les tables système - sont fournies dans la variable ExcludeDatabases
  2. Veuillez noter que le mot de passe est fourni dans la ligne de commande. Ceci est considéré comme peu sûr. Étudiez cette question .

0

mysqldump -uroot -proot --all-databases> allDB.sql

note: -u "votre nom d'utilisateur" -p "votre mot de passe"


Votre réponse ne résout pas vraiment le problème, car il demande d'exporter toutes les bases de données à la fois. Vous pouvez peut-être vous améliorer un peu: mysqldump -uroot -proot --all-databases> allDB.sql note: -u "votre nom d'utilisateur" -p "votre mot de passe"
Marwan Salim

0

Exportez toutes les bases de données dans Ubuntu

1 - mysqldump -u root -p --databases database1 database2 > ~/Desktop/databases_1_2.sql

OU

2 - mysqldump -u root -p --all_databases > ~/Desktop/all_databases.sql

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.