Blog

Sauvegarder ses données sur un hébergement OVH mutualisé

09 aout
2011

Je l'ai une fois de plus appris à mes dépends : il ne faut jamais faire confiance aveuglément et toujours bien lire les petites lignes (surtout chez OVH).

Remettons nous dans le contexte.

Ce matin, mal réveillé, je décide de vider les commentaires indésirables de ma base de donnée (oui comme ça directement depuis MySQL, j'ai le droit c'est ma base ^^).

Et là, c'est le drame, au lieu de supprimer une publicité pour un stimulant dont nous tairons le nom, voilà que j'efface la totalité de ma table commentaires. Argh.

SOS OVH ?

Un brin agacé mais tout de même serein, j'ouvre l'administration de mon hébergement mutualisé OVH, car je sais que les bases de données sont sauvegardées toutes les nuits, et qu'ils mettent à disposition de leur clients un outil permettant de récupérer ces backups.

Je me connecte donc, toujours serein, fait ma demande de récupération de ma base à la date d'hier (les commentaires de ce matins sont perdus, me dis-je, mais c'est un moindre mal).

Je reçois le lien par email vers le fichier généré et là, stupeur et stupéfaction, voici ce que j'obtiens :

 

	-- MySQL dump 10.11
	--
	-- Host: mysqlx-x.x    Database: xxxxxxx
	-- ------------------------------------------------------
	-- Server version    x.x.xx-x-log

	/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
	/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
	/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
	/*!40101 SET NAMES utf8 */;
	/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
	/*!40103 SET TIME_ZONE='+00:00' */;
	/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
	/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
	/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
	/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

 

C'est tout.

Pas de structure, encore moins de données. Fini la sérénité : je décroche pour téléphone pour passer un savon à OVH... qui m'éconduit gentiment en me disant que j'aurais mieux dut lire la documentation, et notamment ce passage  :

ATTENTION : Ces sauvegardes fonctionnent uniquement sur les tables MyISAM. Les tables InnoDB ne sont en effet pas compatibles avec le système de snapshot que nous utilisons.

(source : http://guides.ovh.com/SaveBasesMySQL)

 

Pif. Me voilà fort dépourvu, moi qui était très fier de mes bases InnoDB et de leurs jolies transactions.

Du coup, en suivant l'adage populaire "relève toi les manches sinon ça te retombera sur le coin du nez un beau jour" (si si il existe), j'ai repris et amélioré l'exemple de script de backup qu'OVH propose.

Une proposition de solution

Cette simple ligne sauve des vies :

system("mysqldump -h".$pdo_host." -u".$pdo_user." -p".$pdo_pwd." ".$bdd_name." | gzip> bdd_archived.zip");

Je viens donc de me coder un script complet qui permet d'archiver non seulement ma base de donnée mais aussi l'intégralité de mes données sur 7 jours glissants.

Je vous livre la version commentée :

	// -----------
	// Préparation
	// -----------
	
		// On définit les dossiers par défaut
		$rootFolder = "/";
		$archivesFolder = $rootFolder."_archives/";

		// On définit où seront les fichiers archivés (
		$nameFilesBkp = $archivesFolder.date("D")."_files";
		$nameBddBkp = $archivesFolder.date("D")."_bdd";
		
		// Information de la base de donnée
		$pdo_host = "votreserveurovh";		// Exemple : "mysql2-1.start"
		$pdo_user = "votrenomdutilisateur";	
		$bdd_name = "votrebasededonnee";	// Chez OVH, c'est la même chose que $pdo_user
		$pdo_pwd = "votremotdepasse";

		// Si il n'existe pas, on créé le dossier d'archive
		if(!file_exists($archivesFolder))
			mkdir($archivesFolder, 0777, true);

			
	// -----------------------------
	// Archives de la base de donnée
	// -----------------------------
		
		// Extrait et compresse les données en une seule commande
		system("mysqldump -h".$pdo_host." -u".$pdo_user." -p".$pdo_pwd." ".$bdd_name." | gzip> ".$nameBddBkp.".zip");
	
	
	// ------------------------------------------------------------------
	// Archives des fichiers
	// (depuis http://www.ingeny.fr/php/compression-zip-recursive-en-php)
	// ------------------------------------------------------------------
	
		// Teste la version de PHP
		if(substr(phpversion(), 0, 1) < 5)
			exit("Vous devez utiliser PHP5 ou supérieur. Vous utilisez ".phpversion()."");

		// Teste que le module php5-zip est chargé
		if(false === extension_loaded('zip'))
			exit("Le module PHP5 Zip n'est pas chargé");

		// On créée un objet itérateur qui permettra de parser les fichiers récursivement
		$iter =	new RecursiveIteratorIterator(
			new RecursiveDirectoryIterator(
				ROOT_DIR ,RecursiveDirectoryIterator::KEY_AS_FILENAME
			), RecursiveIteratorIterator::SELF_FIRST
		);

		// On instantie une ressource ZIP
		$zip = new ZipArchive();
		
		// On fait pointerla ressource au bon endroit
		$fichier= $nameFilesBkp.".zip";
		$res = $zip->open($fichier, ZipArchive::CREATE);

		// Puis, dossier par dossier, on compresse les fichiers
		foreach ($iter as $entry):  
			$filename = str_replace(ROOT_DIR, '', $entry);

			if('/' === $filename{0})
			$filename = substr($filename, 1);

			$zip->addFile($entry, $filename);

		endforeach;

		$zip->close();



J'espère que ce bout de code pourra servir à certains d'entre vous avant que le ciel ne leur tombe sur la tête.


Un petit commentaire ?





YLegrand
,
10/08/11, 23h15
Pensez à exclure les fichiers fraîchement zippés, sinon vous risquez d'avoir des surprises au bout de quelques jours !
Auclair,
15/08/11, 00h01
Bonsoir, J'avais créé ma base chez OVH en MyISAM car j'avais lu le passage en question. Créant une nouvelle base, j'envisage d'utiliser innoDB pour améliorer l'intégrité et la sécurité. Question : avez vous testé avec succès votre DUMP innoDB en faisant une restauration (logs compris) ? Remarque : étant vraiment parano, j'ai automatisé une sauvegarde quotidienne et l'envoi automatique du dump zippé par e-mail. Si le bout de code relatif à l'envoi du mail vous intéresse...
YLegrand,
15/08/11, 09h42
Bonjour, Oui la restauration du dump fonctionne à merveille, c'est exactement la technique que j'utilise manuellement entre mes bases de test et de prod, avec une surcouche d'automatisation. Par contre de mémoire les logs SQL ne sont pas accessible depuis PHPMyAdmin fourni par OVH, si ? J'ai déjà codé une classe pour l'envoi de mail évolués, mais n,hésitez pas à me l'envoyer en effet. Vous trouverez l'adresse email sur la page "A propos"