Sauvegarder son serveur MySql base par base
Par PlaceOweb le jeudi, juin 26 2008, 00:39 - SQL - Lien permanent
Lorsque vos données grandissent trop vite et que votre mysqldump --all-databases génère des fichiers trop volumineux, il est temps de passer à une sauvegarde bases par bases de données. Le fait d'avoir un fichier par base réduit la taille de chacun de ces fichiers et vous permet de restaurer uniquement que les bases de données MySql dont vous avez besoin.
Dump complet de toutes les bases dans un seul fichier
Initialement, j'utilisais :
mysqldump --host="$MYSQL_HOST" --user="$MYSQL_LOG" --password="$MYSQL_PASS" --quote-names --complete-insert --extended-insert --add-drop-table --compress --all-databases > monFichierDumpContenantTouteLesBases.sql
Mais mon fichier intégral de 3Go est impossible à gérer pour ré-intégrer une seule base.
Dump bases de données par base dans un fichier séparé
Attention par défaut les routines / procédures ne sont pas incluses dans le dump, n'oubliez pas de rajouter l'option --routines : Dump stored routines (functions and procedures). Si les triggers (option : --triggers) sont bien sauvegardés par défaut, il n’en va pas de même pour les procédures stockées. Sauvegarder ses procédures stockées avec mysqldump. Et même chose pour les événements avec l'option --events
Voici donc un script pour dumper base par base : dumpMysqlBaseParBase.sh :
#!/bin/bash export BACKUPDIR=~/BackMySqlParBases/ export BTMPFILE=~/BackMySqlParBases.tmp export DATE=`/bin/date '+%Y%m%d'` export MYSQL_HOST="localhost" export MYSQL_USER="monUserMysql" export MYSQL_PASS="monPassMysql" [ -d $BACKUPDIR ] || mkdir -p $BACKUPDIR mysql -h ${MYSQL_HOST} -u ${MYSQL_USER} -p${MYSQL_PASS} > ${BTMPFILE} <<FinDeSession SHOW DATABASES; FinDeSession if [ -f ${BTMPFILE} ] ; then for db in `cat ${BTMPFILE} | egrep -v "Database|information_schema"` do echo $db export FILEBK=$db.$DATE.sql mysqldump --events --routines --triggers -h ${MYSQL_HOST} -u ${MYSQL_USER} -p${MYSQL_PASS} $db > $BACKUPDIR/$FILEBK #[ -f $BACKUPDIR/$FILEBK ] && gzip --force --best $BACKUPDIR/$FILEBK #[ -f $BACKUPDIR/$FILEBK.gz ] && scp $BACKUPDIR/$FILEBK.gz $HOST:$BACKUPDIR/ done fi
Et pour finir, l'automatisation par cron :
# Dump BASE PAR BASE # Suppression des vieux fichiers 30 02 * * * find ~/BackMySqlParBases -mtime +3 -type f -exec rm -fv {} \; # Dump 45 02 * * * ./dumpMysqlBaseParBase.sh
Également afin d'exporter ses dumps vers un autre serveur de sauvegarde on peut reprendre le script afin qu'il envoi les fichiers automatiquement par FTP :
(alternativement on aurait pu utiliser Backup Manager selon sauvegarde automatique des fichiers avec Backup Manager sur le serveur de sauvegarde OVH ou Sauvegarde Apache et MySQL pour dedibackup.dedibox.fr ou dedibackup-bzn.online.net)
Dans le dernier script, on note l'utisation de date passée :
# Aujourd'hui moins 10 jours date=`date --date '10 day ago' +%Y-%m-%d` # et lors de l'utilisation de la commande : ftp -inv prompt mdelete ${date}* # resterai a supprimer uniquement si des fichiers du jour sont présents ...
backupMysqlDumpBaseParBase.sh :
#!/bin/sh ### Début de la configuration # Nom du dossier (dans le home) qui contiendra les dumps export BACKUP_FOLDERNAME=BackUp export BACKUP_DIR=~/${BACKUP_FOLDERNAME}/ export BACKUP_TMPFILE=~/${BACKUP_FOLDERNAME}.tmp export DATE=`date +"%Y-%m-%d"` # Dump MySql # Serveur MySql : export MYSQL_HOST="localhost" # Identifiant : export MYSQL_USER="monUtilisateurMysql" # Mot de passe : export MYSQL_PASS="monPassMysql" # Dépôt automatique par FTP # Serveur FTP : FTP_HOST="monAdresseDuServeurFtp" # Identifiant : FTP_USER="monUtilisateurFtp" # Mot de passe : FTP_PASS="monMotDePasseFtp" ### Fin de la configuration # Ce script doit être a la racine des fichiers a archiver cd ~ # Suppression de l'ancien backup rm -fr ${BACKUP_FOLDERNAME} # (Re) Création du dossier de backup [ -d ${BACKUP_DIR} ] || mkdir -p ${BACKUP_DIR} ## Sauvegarde locale #for fichier in `ls` #do # if [ -d "$fichier" ] # then # echo "$fichier (répertoire)" # else # echo "$fichier" # fi # tar --exclude ${BACKUP_FOLDERNAME} -czvf ${BACKUP_DIR}$DATE.$fichier.tar.gz $fichier 1>${BACKUP_DIR}$DATE.$fichier.txt #done # Sauvegarde des bases MySql mysql --host="${MYSQL_HOST}" --user="${MYSQL_USER}" --password="${MYSQL_PASS}" > ${BACKUP_TMPFILE} <<FinDeSession SHOW DATABASES; FinDeSession if [ -f ${BACKUP_TMPFILE} ] ; then for db in `cat ${BACKUP_TMPFILE} | egrep -v "Database|information_schema"` do echo "Dump BASE : "$db export FILEBK=$DATE.${MYSQL_HOST}.$db.sql mysqldump -h ${MYSQL_HOST} -u ${MYSQL_USER} -p${MYSQL_PASS} $db > ${BACKUP_DIR}/$FILEBK [ -f ${BACKUP_DIR}/$FILEBK ] && gzip --force --best ${BACKUP_DIR}/$FILEBK #[ -f ${BACKUP_DIR}/$FILEBK.gz ] && scp ${BACKUP_DIR}/$FILEBK.gz $HOST:${BACKUP_DIR}/ done fi # Envoi via ftp # lftp -e "cd $REMOTE ; put $FILE ; quit" "$SERVER" for fichier in `ls ${BACKUP_DIR}` do # ### Envoi FTP ### echo -n "Envoi FTP du fichier : $fichier ..." ftp -n ${FTP_HOST} <<FinDeSession user "${FTP_USER}" "${FTP_PASS}" binary prompt cd / lcd ${BACKUP_DIR} put $fichier bye FinDeSession echo " ... FIN de transmission" done echo "Fin de dump Mysql et d'envoi via Ftp"
N'oubliez pas de purger régulièrement votre serveur de sauvegarde de ces vieux fichiers soit manuellement en ligne de commande FTP mdelete ou via un script que vous créerez. Pour ne plus répondre au messages de confirmation, utilisez "prompt"
mysqldump
mysqldump Ver 10.13 Distrib 5.1.56, for debian-linux-gnu (x86_64) By Igor Romanenko, Monty, Jani & Sinisa. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license. Dumping structure and contents of MySQL databases and tables. Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf The following groups are read: mysqldump client The following options may be given as the first argument: --print-defaults Print the program argument list and exit. --no-defaults Don't read default options from any option file. --defaults-file=# Only read default options from the given file #. --defaults-extra-file=# Read this file after the global files are read. --all Deprecated. Use --create-options instead. -A, --all-databases Dump all the databases. This will be same as --databases with all databases selected. -Y, --all-tablespaces Dump all the tablespaces. -y, --no-tablespaces Do not dump any tablespace information. --add-drop-database Add a DROP DATABASE before each create. --add-drop-table Add a DROP TABLE before each create. --add-locks Add locks around INSERT statements. --allow-keywords Allow creation of column names that are keywords. --character-sets-dir=name Directory for character set files. -i, --comments Write additional information. --compatible=name Change the dump to be compatible with a given mode. By default tables are dumped in a format optimized for MySQL. Legal modes are: ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires MySQL server version 4.1.0 or higher. This option is ignored with earlier server versions. --compact Give less verbose output (useful for debugging). Disables structure comments and header/footer constructs. Enables options --skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys --skip-set-charset. -c, --complete-insert Use complete insert statements. -C, --compress Use compression in server/client protocol. -a, --create-options Include all MySQL specific create options. -B, --databases Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. 'USE db_name;' will be included in the output. -#, --debug[=#] This is a non-debug version. Catch this and exit. --debug-check Check memory and open file usage at exit. --debug-info Print some debug info at exit. --default-character-set=name Set the default character set. --delayed-insert Insert rows with INSERT DELAYED. --delete-master-logs Delete logs on master after backup. This automatically enables --master-data. -K, --disable-keys '/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put in the output. -E, --events Dump events. -e, --extended-insert Use multiple-row INSERT syntax that include several VALUES lists. --fields-terminated-by=name Fields in the output file are terminated by the given string. --fields-enclosed-by=name Fields in the output file are enclosed by the given character. --fields-optionally-enclosed-by=name Fields in the output file are optionally enclosed by the given character. --fields-escaped-by=name Fields in the output file are escaped by the given character. --first-slave Deprecated, renamed to --lock-all-tables. -F, --flush-logs Flush logs file in server before starting dump. Note that if you dump many databases at once (using the option --databases= or --all-databases), the logs will be flushed for each database dumped. The exception is when using --lock-all-tables or --master-data: in this case the logs will be flushed only once, corresponding to the moment all tables are locked. So if you want your dump and the log flush to happen at the same exact moment you should use --lock-all-tables or --master-data with --flush-logs. --flush-privileges Emit a FLUSH PRIVILEGES statement after dumping the mysql database. This option should be used any time the dump contains the mysql database and any other database that depends on the data in the mysql database for proper restore. -f, --force Continue even if we get an SQL error. -?, --help Display this help message and exit. --hex-blob Dump binary strings (BINARY, VARBINARY, BLOB) in hexadecimal format. -h, --host=name Connect to host. --ignore-table=name Do not dump the specified table. To specify more than one table to ignore, use the directive multiple times, once for each table. Each table must be specified with both database and table names, e.g., --ignore-table=database.table. --insert-ignore Insert rows with INSERT IGNORE. --lines-terminated-by=name Lines in the output file are terminated by the given string. -x, --lock-all-tables Locks all tables across all databases. This is achieved by taking a global read lock for the duration of the whole dump. Automatically turns --single-transaction and --lock-tables off. -l, --lock-tables Lock all tables for read. --log-error=name Append warnings and errors to given file. --master-data[=#] This causes the binary log position and filename to be appended to the output. If equal to 1, will print it as a CHANGE MASTER command; if equal to 2, that command will be prefixed with a comment symbol. This option will turn --lock-all-tables on, unless --single-transaction is specified too (in which case a global read lock is only taken a short time at the beginning of the dump; don't forget to read about --single-transaction below). In all cases, any action on logs will happen at the exact moment of the dump. Option automatically turns --lock-tables off. --max_allowed_packet=# The maximum packet length to send to or receive from server. --net_buffer_length=# The buffer size for TCP/IP and socket communication. --no-autocommit Wrap tables with autocommit/commit statements. -n, --no-create-db Suppress the CREATE DATABASE ... IF EXISTS statement that normally is output for each dumped database if --all-databases or --databases is given. -t, --no-create-info Don't write table creation info. -d, --no-data No row information. -N, --no-set-names Suppress the SET NAMES statement --opt Same as --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys. Enabled by default, disable with --skip-opt. --order-by-primary Sorts each table's rows by primary key, or first unique key, if such a key exists. Useful when dumping a MyISAM table to be loaded into an InnoDB table, but will make the dump itself take considerably longer. -p, --password[=name] Password to use when connecting to server. If password is not given it's solicited on the tty. -P, --port=# Port number to use for connection. --protocol=name The protocol to use for connection (tcp, socket, pipe, memory). -q, --quick Don't buffer query, dump directly to stdout. -Q, --quote-names Quote table and column names with backticks (`). --replace Use REPLACE INTO instead of INSERT INTO. -r, --result-file=name Direct output to a given file. This option should be used in MSDOS, because it prevents new line '\n' from being converted to '\r\n' (carriage return + line feed). -R, --routines Dump stored routines (functions and procedures). --set-charset Add 'SET NAMES default_character_set' to the output. Enabled by default; suppress with --skip-set-charset. -O, --set-variable=name Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value. --single-transaction Creates a consistent snapshot by dumping all tables in a single transaction. Works ONLY for tables stored in storage engines which support multiversioning (currently only InnoDB does); the dump is NOT guaranteed to be consistent for other storage engines. While a --single-transaction dump is in process, to ensure a valid dump file (correct table contents and binary log position), no other connection should use the following statements: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE, as consistent snapshot is not isolated from them. Option automatically turns off --lock-tables. --dump-date Put a dump date to the end of the output. --skip-opt Disable --opt. Disables --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys. -S, --socket=name The socket file to use for connection. --ssl Enable SSL for connection (automatically enabled with other flags).Disable with --skip-ssl. --ssl-ca=name CA file in PEM format (check OpenSSL docs, implies --ssl). --ssl-capath=name CA directory (check OpenSSL docs, implies --ssl). --ssl-cert=name X509 cert in PEM format (implies --ssl). --ssl-cipher=name SSL cipher to use (implies --ssl). --ssl-key=name X509 key in PEM format (implies --ssl). --ssl-verify-server-cert Verify server's "Common Name" in its cert against hostname used when connecting. This option is disabled by default. -T, --tab=name Create tab-separated textfile for each table to given path. (Create .sql and .txt files.) NOTE: This only works if mysqldump is run on the same machine as the mysqld server. --tables Overrides option --databases (-B). --triggers Dump triggers for each dumped table. --tz-utc SET TIME_ZONE='+00:00' at top of dump to allow dumping of TIMESTAMP data when a server has data in different time zones or data is being moved between servers with different time zones. -u, --user=name User for login if not current user. -v, --verbose Print info about the various stages. -V, --version Output version information and exit. -w, --where=name Dump only selected records. Quotes are mandatory. -X, --xml Dump a database as well formed XML.