Aller au contenu | Aller au menu | Aller à la recherche


Sauvegarder son serveur MySql base par base

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.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet