Programmer des copies de tables sur une base mysql

Contenu du snippet

Intervenant à titre amical sur des sites persos en PHP/MySQL, j'ai rencontré le problème de prévoir un minimum de sauvegarde des données à l'intérieur de la même base. La solution présentée ici permet de programmer simplement des copies périodiques des tables voulues de la BDD.

Tout d'abord, il faut ajouter deux tables à la BDD, que je nomme `maintenance` et `sauvegardes`. La première contient le nom des tables à copier et le délai entre deux sauvegardes (en jours). Le webmaster n'a plus qu'à y indiquer les tables dont il souhaite une copie et la périodicité. La seconde table enregistre pour chaque table à sauvegarder la date de la dernière copie.

Ensuite vous devez appeler la fonction PHP svg_tables(), par exemple sur votre page d'accueil. A chaque fois qu'un internaute consulte cette page, svg_tables() vérifie s'il y a des tables à copier. Si c'est le cas, chaque table est copiée dans une nouvelle portant le même nom suivi de _copie, en écrasant au besoin les copies précédentes.

Source / Exemple :


-- Code SQL de création des deux tables `maintenance` et `sauvegardes`
CREATE TABLE maintenance (
  nom_table varchar(255) NOT NULL ,
  delai tinyint(3) unsigned NOT NULL default 0,
  PRIMARY KEY  (nom_table)
) 

CREATE TABLE sauvegardes (
  nom_table varchar(255) NOT NULL ,
  date_copie datetime NOT NULL ,
  PRIMARY KEY  (nom_table)
)

// fonction PHP qui effectue la copie des tables selon les indications de la table maintenance
function svg_tables() {
	global $BDD ; // je suppose qu'une connexion à la base est ouverte et référencée par $BDD
	$sql = "SELECT M.nom_table
		FROM maintenance M
			LEFT JOIN sauvegardes S ON M.nom_table = S.nom_table
		WHERE M.delai > 0 
			AND (S.date_copie IS NULL 
				OR CURDATE() > DATE_ADD(S.date_copie, INTERVAL delai DAY)
			)" ;
	$req = mysql_query($sql, $BDD) ;

	while ($lig = mysql_fetch_array($req) ) {
		$table = $lig['nom_table'] ;
		$sql = "DROP TABLE IF EXISTS {$table}_copie " ;
		mysql_query($sql, $BDD) ;
		$sql = "CREATE TABLE {$table}_copie SELECT * FROM $table " ;
		mysql_query($sql, $BDD) ;
		$sql = "REPLACE INTO sauvegardes (nom_table, date_copie) VALUES ('$table', CURDATE() ) " ;
		mysql_query($sql, $BDD) ;
	}
	mysql_free_result($req) ;
}

Conclusion :


Pour être un peu plus précis, une table est copiée dans deux cas :
- le délai de sauvegarde a été atteint la veille
- la table n'a jamais été copiée

Si, le 1er août à 11h, vous ajoutez une table avec copie quotidienne (delai = 1), la première copie aura lieu dès que quelqu'un appelera la page avec le déclencheur, et la suivante se produira à partir du 3 août à 0h (la condition étant Curdate > date_copie + 1 j).

A noter qu'un délai de 0 désactive la copie de la table en question ; le délai minimum est donc de 1.

Enfin, si votre craignez de ne pas avoir au moins un visiteur chaque jour, il ne vous reste plus qu'à programmer un cron pour appeler votre page régulièrement... ou à la mettre en page d'accueil de votre navigateur ;-)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.