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.
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done
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.
Voici un script simple qui va:
SCHEMA_NAME.sql.gz
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 --"
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
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.
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é.
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.
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.