Question 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 en utilisant le vidage tout en un seul.

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

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

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

Je compte le canaliser avec awk pour faire quelque chose comme

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

Mais ça ne marche pas.

Je suis nouveau à l'idée, donc je peux me tromper.
Que dois-je faire pour le faire exporter la base de données dans leurs noms respectifs?

mettre à jour:
Ok, il faut enfin réussir à 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 qui fait écho ne marche pas.


25
2018-06-03 02:46


origine


Réponses:


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

36
2018-06-03 02:54



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 faire une sauvegarde de la base de données entière se briserait au cas où une table serait cassée / corrompue. Et en créant des sauvegardes par base de données, cela ne fonctionnera que pour cette base de données et le reste est toujours valide.

Le 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

Il est préférable de créer un nouvel utilisateur mysql en lecture seule 'bupuser' avec mot de passe 'Secret' (changez!). Il va d'abord récupérer la liste des bases de données. Ensuite, faites une boucle 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 alors gzip aussi le fichier qui va vraiment sauver le stockage. Lorsque certaines bases de données ont rencontré des erreurs, vous verrez alors le fichier .sql et non le fichier .sql.qz.


16
2018-06-19 07:06



Voici un script simple qui va:

  • vider toute la base de données compresser la sortie -> SCHEMA_NAME.sql.gz
  • utilisez [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 -> videra toutes les bases de données
./Dump_all.sh SCHEMA_NAME -> videra 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 --"

8
2017-10-10 05:13



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
2017-10-31 09:31



Pas une réponse à votre question, mais jetez un oeil à la AutoMySQLBackup projet 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 cryptage, la rotation et les notifications par courrier électronique. Je l'ai utilisé il y a quelque temps et cela a très bien fonctionné.


0
2018-06-03 02:52



Cela semble bien. La seule chose que je peux trouver pour le moment (sans test) est que vous manquez un demi-long après Afficher les tables.


0
2018-06-03 02:53



En cherchant des paquets disponibles pour le projet AutoMySQLBackup suggéré par @Jeshurun, je suis tombé sur Hollande.

Intrigué par le nom (je vis en Belgique au sud des Pays-Bas, parfois - ou mieux certaines parties - appelé "Holland"), j'ai décidé de le vérifier. Peut-être que cela peut aussi vous aider.


0
2018-06-03 09:03



C'est ce que j'utilise, c'est très simple et ça marche 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 le saisir un plus le nombre total de bases de données que vous avez.


0
2017-08-29 18:51