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?
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:
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
mysql -u root -p < alldb.sql
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
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 if
et fi
. Dans la variable, ExcludeDatabases
vous stockez les noms des bases de données qui ne doivent pas être sauvegardées [normalement les bases de données système].
-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;"
U+200C U+200B
entre 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/…
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 mysqldump
vers 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;
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.cnf
vé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"
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.
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'
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 :)
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:
ExcludeDatabases
mysqldump -uroot -proot --all-databases> allDB.sql
note: -u "votre nom d'utilisateur" -p "votre mot de passe"