Habituellement, après avoir vidé une base de données MySQL avec la commande mysqldump
, je tar/gzip immédiatement le fichier résultant. Je cherche un moyen de le faire en une seule commande:
Donc à partir de là:
mysqldump dbname -u root -p > dbname.sql
tar czvf dbname.sql.tgz dbname.sql
rm dbname.sql
Pour quelque chose comme ça:
mysqldump dbname -u root -p > some wizardry > dbname.sql.tgz
Ou encore mieux (puisque je scp'e habituellement le fichier de vidage sur un autre serveur):
mysqldump dbname -u root -p > send dbname.sql.tgz to user@Host
J'utilise bash sur debian.
mysqldump --opt <database> | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'
Vous ne pouvez pas utiliser tar dans un tube comme celui-ci, et vous n'en avez pas besoin de toute façon, car vous ne sortez qu'un seul fichier. tar n'est utile que si vous avez plusieurs fichiers.
Si vous l'exécutez localement, utilisez simplement la commande suivante pour sauvegarder votre base de données et la compresser à l'aide de gzip:
mysqldump -u userName -p (passwordPrompt) yourDatabaseName | gzip -c > output.gz
(Édition: clé fixe -c)
Utilisez un canal nommé.
mkfifo mysql_pipe
gzip -9 -c < mysql_pipe > name_of_dump.gz &
mysqldump database > mysql_pipe
rm mysql_pipe
Je l'utilise tout le temps, c'est génial.
J'ai écrit un script rapide pour aspirer une base de données mysql distante. Il utilise la compression mysql, la compression gzip et ssh. Aspiré une base de données de plusieurs Go à un rythme incroyable.
ssh -C user@Host "mysqldump --opt --compress database <table> | gzip -9 -c" > outputfile.sql.gz
Un avantage secondaire est qu'il ne nécessite aucun espace libre sur le serveur de base de données source, vous pouvez donc l'utiliser pour sauvegarder une base de données sur un serveur avec zéro espace disque libre avant de procéder à un élagage de vos données.
J'espère que cela aide quelqu'un.
Utilisez pv
et surveillez le taux!
mysqldump prod_db -h dbslave | pv | gzip -c > prod_2012_08_20.dump.tgz
Ou, si vous connaissez la taille (3 Go), obtenez une estimation précise:
mysqldump prod_db -h dbslave | pv -s 3g | gzip -c > prod_2012_08_20.dump.tgz
Essaye ça:
mysqldump --all-databases --password=dbpassword | gzip -c | ssh user@servername "cat >/tmp/filename_of_your_choice.gz"
Veuillez noter que je ne suis en aucun cas bon dans ces domaines, je viens de combiner 2 options sur le Web en une seule.
Cela peut très bien être mieux d'une autre manière, mais c'est un doublure qui fonctionne pour moi.
Il nécessite cependant ssh.keys
à installer et à accepter si vous souhaitez l'utiliser dans des scripts ou crontab
ou similaire.
Vous pouvez faire comme:
mysqldump --add-drop-table -h dbhost -u dbuser -p dbname (tablename tablename ... ) | gzip -c > wp.sql.gz
par exemple.
mysqldump --add-drop-table -h localhost -u root -p wordpress | gzip -c > wp.sql.gz
J'ai travaillé sur ce script bash ci-dessous qui essaie de rassembler tous les bons conseils que j'ai vus en matière de vidage/restauration avec mysql. Il est destiné aux opérations à distance.
Reconfigurez simplement vars et essayez-le. :)
Les fonctionnalités sont:
Ce qui doit être amélioré:
Je partage ce script ici en espérant qu'il puisse être amélioré par la communauté. (mieux vu avec nano ou un autre éditeur qui colore le code)
--------------------------------- couper ici --------------- -------------------
#!/bin/bash
#set -x
#REQUIRED VARS
SOURCE_USER=root #MySQL user
SOURCE_Host=localhost
SOURCE_PASSWORD=yourmysqlpass #optional
SOURCE_DBNAME=yourdbname
TARGET_Host=192.168.1.2
TARGET_DBNAME=yourdbname
TARGET_SSHUSER=root
TARGET_SSHPASSWORD=yoursshpass #optional
TABLES='table1 table2 table3 table4'
TARGET_DIR="/data/dumpfiles"
EXEC_ACTION_TEXT[0]='Reimport TABLES directly into remote MySQL database'
EXEC_ACTION_TEXT[1]='Backup gzipped data to TARGED_DIR on remote TARGET_Host'
EXEC_ACTION=0
#print config
echo "---------------------------------"
echo " SOURCE_USER: $SOURCE_USER (MySQL)"
if [ "SOURCE_PASSWORD" != "" ]; then
echo " SOURCE_PASSWORD:<present> "; else
echo " SOURCE_PASSWORD:<to be asked> "
fi
echo " SOURCE_Host: $SOURCE_Host "
echo " SOURCE_DBNAME: $SOURCE_DBNAME "
echo " TARGET_Host: $TARGET_Host "
echo " TARGET_DBNAME: $TARGET_DBNAME "
echo " TARGET_SSHUSER: $TARGET_SSHUSER "
if [ "TARGET_SSHPASSWORD" != "" ]; then
echo " TARGET_SSHPASS: <present> "; else
echo " TARGET_SSHPASS: <to be asked> "
fi
echo " TABLES: $TABLES "
echo " EXEC_ACTION: $EXEC_ACTION - ${EXEC_ACTION_TEXT[$EXEC_ACTION]}"
echo " TARGET_DIR: $TARGET_DIR (only for action 1)"
echo "---------------------------------"
echo "PRESS <ENTER> to continue..."; read; echo
#read the mysql password from command-line (SOURCE and TARGET uses the same password)
if [ "$SOURCE_PASSWORD" == "" ]; then
echo -n "Type $SOURCE_USER password for MySQL servers: "; read -s SOURCE_PASSWORD; echo
fi
echo "Creating database $TARGET_DBNAME on $TARGET_Host if not exists ... "
mysql \
--user=$SOURCE_USER \
--password=$SOURCE_PASSWORD \
--Host=$TARGET_Host \
--execute "create database if not exists $TARGET_DBNAME;"
echo '--------------------------------------------------------------------------------------'
echo "**** ATTENTION ****: execute this command on mysql server at $TARGET_Host :"
echo "GRANT ALL PRIVILEGES ON $TARGET_DBNAME.* TO '$SOURCE_USER'@'%' IDENTIFIED BY 'yourpass';"
echo '--------------------------------------------------------------------------------------'
echo "PRESS <ENTER> to continue..."; read; echo
#read the password from command-line
if [ "$TARGET_SSHPASSWORD" == "" ]; then
echo -n "Type the password for remote SSH Server (TARGET) ['$TARGET_SSHUSER'@'$TARGET_Host']: "; read -s TARGET_SSHPASSWORD; echo
fi
for thistable in $TABLES
do
case "$EXEC_ACTION" in
0)
thisaction="gunzip | mysql --user=$SOURCE_USER --password=$SOURCE_PASSWORD -D $TARGET_DBNAME"
endmessage='remote reimporting has finished'
;;
1)
thisaction="cat > $TARGET_DIR/`date +%Y.%m.%d`-"$thistable".gz"
endmessage="$thisaction has finished"
;;
*) echo "EXEC_ACTION=$EXEC_ACTION not supported" && exit 1
esac
echo "---------------------------------------------------------------------"
echo "-- table $thistable"
echo "---------------------------------------------------------------------"
(
echo -n "-- setting variables... " > /dev/stderr #talk to user via stderr
echo "SET AUTOCOMMIT=0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;"
echo -n "starting mysqldump... " > /dev/stderr
mysqldump --opt --user=$SOURCE_USER --password=$SOURCE_PASSWORD --Host=$SOURCE_Host $SOURCE_DBNAME $thistable
echo -n "done mysqldump, reseting variables... " > /dev/stderr
echo "SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; SET AUTOCOMMIT=1;"
echo -n "commiting... " > /dev/stderr
echo "COMMIT;"
echo "done!" > /dev/stderr
) | \
gzip -c -2 | \
pv | \
sshpass -p $TARGET_SSHPASSWORD ssh $TARGET_SSHUSER'@'$TARGET_Host $thisaction
echo $endmessage ' with exit status '$?
done
Vous pouvez également stocker votre mot de passe dans un fichier de configuration et utiliser cette option --defaults-extra-file:
mysqldump --defaults-extra-file=mysqldump.cnf DataBaseName | gzip -c > DBOutputName.sql.gz
Le fichier de configuration peut ressembler à ceci:
[mysqldump]
Host = localhost
user = username
password = "password"