Programmer des copies de tables sur une base mysql

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 552 fois - Téléchargée 27 fois

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

Ajouter un commentaire Commentaires
Messages postés
329
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
29 mars 2015
3
ouaip effectivement ça serai achement bien ça !
faudrait y penser à l'export zip avec sauvegarde de la bdd sur le serveur direct ;)
cool !!!
@+
Messages postés
12
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
1 août 2005

Et puis pourquoi pas avec un petit zippage du fichier au passage, et un petit Hashage pour verifier son intégrité à la fin ?
Tout cela en automatique ?
Bon, d'accord, ca s'eloigne de la première source, j'admets... :)
Messages postés
12
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
1 août 2005

Et puis pourquoi pas avec un petit zippage du fichier au passage, et un petit Hashage pour verifier son intégrité à la fin ?
Tout cela en automatique ?
Bon, d'accord, ca s'eloigne de la première source, j'admets... :)
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
Si ça serait possible, et ça serait préférable ;-)
Messages postés
12
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
1 août 2005

Ou bien simplement recréer l'export de MySQL et le stocker dans sur un FTP ? Ca ne serait pas possible ?
Afficher les 12 commentaires

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.