web-dev-qa-db-fra.com

mysqldump avec db dans un fichier séparé

J'écris une commande sur une seule ligne qui sauvegarde toutes les bases de données dans leurs noms respectifs au lieu d'utiliser le dumping tout dans un sql.

Par exemple: db1 est enregistré dans db1.sql et db2 est enregistré dans db2.sql

Jusqu'à présent, j'avais rassemblé les commandes suivantes pour récupérer toutes les bases de données.

mysql -uuname -ppwd -e 'show databases' | grep -v 'Database'

Je prévois de le canaliser avec awk pour faire quelque chose comme

awk '{mysqldump -uuname -ppwd $1 > $1.sql}'

Mais ça ne marche pas.

Je suis nouveau à bash, donc je peux me tromper dans ma pensée.
Que dois-je faire pour lui faire exporter la base de données dans leurs noms respectifs?

mettre à jour:
Ok, j'ai finalement réussi à le faire fonctionner à partir des conseils ci-dessous.
Ceci est le script final

# replace [] with your own config
# replace own dir to save
# echo doesn't work. hmm...

mysql -u[uname] -p'[pwd]' -e "show databases" \
| grep -Ev 'Database|information_schema' \
| while read dbname; \
do \
echo 'Dumping $dbname' \
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\
done

La partie en écho de ne fonctionne pas cependant.

27
resting
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
38
ziad-saab

La création de sauvegardes par base de données est en effet beaucoup plus efficace. Non seulement plus facile à restaurer une fois nécessaire, mais j'ai également constaté que la sauvegarde de toute la base de données se briserait si une table était cassée/corrompue. Et en créant des sauvegardes par base de données, il ne se cassera que pour cette base de données et le reste est toujours valide.

L'oneliner que nous avons créé pour sauvegarder nos bases de données mysql est:

mysql -s -r -u bupuser -pSecret -e 'show databases' | while read db; do mysqldump -u bupuser -pSecret $db -r /var/db-bup/${db}.sql; [[ $? -eq 0 ]] && gzip /var/db-bup/${db}.sql; done

Mieux vaut créer un nouvel utilisateur mysql en lecture seule 'bupuser' avec le mot de passe 'Secret' (changez!). Il va d'abord récupérer la liste des bases de données. Bouclez ensuite et pour chaque base de données créez un fichier dump.sql dans/var/db-bup (vous pouvez changer). Et seulement quand il n'y a pas d'erreurs rencontrées, puis gzipez le fichier qui économisera vraiment considérablement le stockage. Lorsque certaines bases de données ont rencontré des erreurs, vous verrez le fichier .sql et non le fichier .sql.qz.

16
Bob Siefkes

Voici un script simple qui va:

  • vider tous les DB et compresser la sortie -> SCHEMA_NAME.sql.gz
  • utiliser [autocommit/unique_checks/foreign_key_checks] pour accélérer l'importation
  • exclure les schémas par défaut

Fichier: Dump_all.sh

Comment utiliser:
./ Dump_all.sh -> va vider tous les DB
./ Dump_all.sh SCHEMA_NAME -> va vider la base de données SCHEMA_NAME

#!/bin/bash
MYSQL_USER="root"
MYSQL_PASS="YOUR_PASS"

echo "-- START --"

echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > tmp_sqlhead.sql
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;" > tmp_sqlend.sql

if [ -z "$1" ]
  then
    echo "-- Dumping all DB ..."
    for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
    do
      if [ "$I" = information_schema ] || [ "$I" =  mysql ] || [ "$I" =  phpmyadmin ] || [ "$I" =  performance_schema ]  # exclude this DB
      then
         echo "-- Skip $I ..."
       continue
      fi
      echo "-- Dumping $I ..."
      # Pipe compress and concat the head/end with the stoutput of mysqlump ( '-' cat argument)
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
    done

else
      I=$1;
      echo "-- Dumping $I ..."
      # Pipe compress and concat the head/end with the stoutput of mysqlump ( '-' cat argument)
      mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
fi

# remove tmp files
rm tmp_sqlhead.sql
rm tmp_sqlend.sql

echo "-- FINISH --"
10
WonderLand

Voici ce qui a fonctionné pour moi

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done
1
Tom Berghuis

En cherchant les packages disponibles pour le projet AutoMySQLBackup proposé par @Jeshurun, je suis tombé sur Hollande .

Intrigué par le nom (j'habite en Belgique au sud des Pays-Bas, parfois - ou mieux certaines parties - dénommé "Hollande"), j'ai décidé de le vérifier. Cela peut peut-être aussi vous aider.

0
Bram

Pas une réponse à votre question, mais jetez un œil au projet AutoMySQLBackup sur Sourceforge, au lieu de réinventer la roue. Il fait ce que vous voulez et offre une tonne de fonctionnalités supplémentaires, notamment la compression, le chiffrement, la rotation et les notifications par e-mail. Je l'ai utilisé il y a quelque temps et cela a très bien fonctionné.

0
Jeshurun

Cela semble bien. La seule chose que je peux trouver pour le moment (sans tester), c'est qu'il vous manque un point-virgule après Afficher les tableaux.

0
BLaZuRE

C'est ce que j'utilise, c'est très simple et fonctionne bien pour moi.

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname"> "$(date +%Y%m%d)-$dbname".sql; done

Avec option de compression:

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname" | gzip> /tmp/"$(date +%Y%m%d)-$dbname".sql.gz; done

Si vous n'avez pas ajouté le mot de passe dans la commande, vous devez en saisir un plus le nombre total de bases de données dont vous disposez.

0
Yasir Elsharif