Voir aussi http://codex.wordpress.org/WordPress_Backups.
Wordpress est un CMS codé en PHP et dont les données sont stockées dans une base MySQL. Les images et paramètres particuliers sont placés dans un répertoire wp-content
. Toutes ces informations (configuration + assets + base de données) doivent être sauvegardés régulièrement, pour pouvoir restaurer la situation telle qu’elle était au moment souhaité.
Le site [codex.wordpress.org] a bien une section concernant les sauvegardes automatiques, mais son contenu est un peu insuffisant :
Various plugins exist to take automatic scheduled backups of your WordPress database. This helps to manage your backup collection easily. You can find automatic backup plugins in the Plugin Browser on the WordPress Administration Screens or through the WordPress Plugin Directory.
Quelques liens sont donnés en plus, afin d’aller un peu plus loin dans la sauvegarde des données, notamment :
- A shell script for a complete wordpress backup
- Backing up your database
- Restoring your database from backup
Pour la sauvegarde, on va définir les étapes suivantes:
- Sauvegarder la base de données
- Sauvegarder les données
- Automatisation tout ce brol en se basant sur le premier lien, ci-dessus.
Sauvegarde des données #
Pour la base de données, le plus simple est d’utiliser la commande mysqldump
pour copier la structure des tables et leurs données dans un fichier. Il existe un plugin (
WP-DBManager), qui fait exactement la même chose, si vous préférez.
mysqldump --add-drop-table -h <server_name> -u <db_user> -p <db_name> | gzip > backup-2015-01-04.bak.sql.gz
Il faut ensuite sauvegarder le contenu de l’installation, afin de pouvoir restaurer les média, la configuration, les thèmes, etc.
Un script existe et s’occupe très bien de toutes ces étapes. Ce script doit être adapté un chouia pour correspondre à vos besoins (notamment sur le nom des fichiers générés). En cas de modifications/améliorations, n’hésitez pas à poster vos changements. Pour ma part, les changements effectués sont dispos ci-dessous et sur Gist. Ils prennent les paramètres passés au script pour les attribuer à l’URL du site, au nom d’utilisateur, mot de passe et nom de la base de données. Pas encore parfait, loin de là:
#!/bin/bash
# This script creates a compressed backup archive of the given directory and the given MySQL table. More details on implementation here: http://theme.fm
# Feel free to use this script wherever you want, however you want. We produce open source, GPLv2 licensed stuff.
# Author: Konstantin Kovshenin exclusively for Theme.fm in June, 2011
# Modified by me in June 2015.
# Set the date format, filename and the directories where your backup files will be placed and which directory will be archived.
NOW=$(date +"%Y-%m-%d-%H%M")
SITEURL="$1"
USERNAME=$(whoami)
FILE="$SITEURL.$NOW.tar"
BACKUP_DIR="/home/$USERNAME/backups"
WWW_DIR="/var/www/$SITEURL/"
# MySQL database credentials
DB_USER="$2"
DB_PASS="$3"
DB_NAME="$4"
DB_FILE="$SITEURL.$NOW.sql"
# Tar transforms for better archive structure.
WWW_TRANSFORM="s,^var/www/$SITEURL,www,"
DB_TRANSFORM="s,^home/$USERNAME/backups,database,"
# Create the archive and the MySQL dump
tar -cvf $BACKUP_DIR/$FILE --transform $WWW_TRANSFORM $WWW_DIR
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/$DB_FILE
# Append the dump to the archive, remove the dump and compress the whole archive.
tar --append --file=$BACKUP_DIR/$FILE --transform $DB_TRANSFORM $BACKUP_DIR/$DB_FILE
rm $BACKUP_DIR/$DB_FILE
gzip -9 $BACKUP_DIR/$FILE
Restaurer les données dans la base #
En partant du fichier backup-2015-01-04.bak.sql.gz
généré ci-dessus, on doit d’abord le décompresser, puis importer le contenu dans la base SQL. Comme on a ajouté l’option --add-drop-table
, le drop s’effectue avant que l’import ne s’effectue, si la table existe déjà. Par exemple :
DROP TABLE IF EXISTS `wp_commentmeta`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `wp_commentmeta` (
`meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`comment_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`meta_key` varchar(255) DEFAULT NULL,
`meta_value` longtext,
PRIMARY KEY (`meta_id`),
KEY `comment_id` (`comment_id`),
KEY `meta_key` (`meta_key`)
) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARSET=utf8;
Bref, on décompresse le fichier, et on l’importe dans la db:
mysql -h localhost -u <db_user> -p <db_name> < backup-2015-01-04.bak.sql
# ex : mysql -h localhost -u wp_user -p wp_db < backup-2015-01-04.bak.sql