Duplication d'une base de données pour sauvegarde

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 395 fois - Téléchargée 15 fois

Contenu du snippet

Si l'on a un serveur qui permet d'avoir un nombre "illimité" de bases de données, la sauvegarde complète d'une base de données peut permettre de faire des restaurations rapides si de graves erreurs sont faites sur la base de production (suppression ou vidage de tables.
Ce script n'est donc pas à utiliser sur des serveurs mutualisés ou gratuits qui ne proposent qu'une seule base !
Attention, ce petit script ne vous dispense pas de faire des exportations de base (à récupérer sur votre ordinateur) en cas de crash du serveur sql !

Source / Exemple :


<?
$db="base"; // Base a sauvegarder
$dbdest=$db."_".date("Ymd_Hi"); // Cela créera la base avec le nom de la base intiale + date et heure ex : base_20001231_2359
// Fonction permettant de gérer le moteur de stockage InnoDB. N'a pas d'intérêt pour les moteurs MyIsam mais fonctionne cf commentaire de webdeb le 19/12/2008 13:23:23 
function begin()
{
@mysql_query("BEGIN");
}
function commit()
{
@mysql_query("COMMIT");
}
function rollback()
{
@mysql_query("ROLLBACK");
}

$connexion=mysql_connect("localhost","root","pass"); //on effectue la connexion
if (!$connexion) {
die('Connexion impossible : ' . mysql_error());
exit;
}

echo "Lancement de la sauvegarde<br><br>\n";

//Création de la base de données de sauvegarde
$SQL="CREATE DATABASE `$dbdest` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"; // Si besoin modifier les character
$result=mysql_query($SQL);
if (!$result) {
die('Erreur sur la creation de la base $dbdest : ' . mysql_error());
exit;
}

echo "Base $dbdest créée.<br>\n";

//Création et copie des tables
$tables = mysql_list_tables($db, $connexion);
while ($enr = mysql_fetch_row($tables)) {
$SQL="CREATE TABLE $dbdest.$enr[0] SELECT * FROM $db.$enr[0];";
begin();
$result=@mysql_query($SQL);
if (!$result) {
rollback();
die('Requête invalide sur la table $enr[0] : ' . mysql_error());
exit;
}else{
commit();
echo "TABLE ".$enr[0]." sauvegardée.<br>\n";
}
}
echo "<br><br>Sauvegarde terminée. La base de sauvegarde est $dbdest.<br>\n\n";
mysql_close($connexion);
?>

Conclusion :


Le but est surtout de pouvoir faire des sauvegardes rapides et de mettre cette page à la disposition des personnes qui modifient les bases de données. Elles gèrent ainsi leurs sauvegardes.
Tous les commentaires sont bons. Merci.

Attention, je redis qu'il faut avoir la possibilité de créer des bases de données multiples.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
jeudi 13 novembre 2008
Statut
Membre
Dernière intervention
30 avril 2009

Bonjour,

j'ai utilisé ce script il marche très bien, mais lorsque les table sont copiés il semble que l'auto incrémentation ne se copie pas. Ça ajoute également la valeur "0" par défault...

qqun a-t-il une solution ? c'est une variable de mysql qui n'est pas correcte ?

merci !
Messages postés
7
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
28 avril 2014

slt je m'adresse à fmarie s'il peut mettre des commentaires dans son code car pour les débutants comme nous c'est un peu difficile de comprendre.
Messages postés
488
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
4
>> Sinon, pourquoi ne pas utiliser l'extension mysqli plutôt que mysql ?

Ou même PDO tant qu'à faire :)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Salut,

Concernant l'exécution d'un script shell par l'utilisateur, il est vivement recommandé, à moins d'apporter un soin extrême à la configuration de PHP et du serveur (ce qui n'est pas une mince affaire), de ne pas le faire directement par PHP.

Le mieux est, comme le disait WebDeb, d'utiliser une tâche auto avec cron, exécutée sous root.
Il n'est pas nécessaire que la tâche soit exécutée 1 fois par jour... On peut imaginer que le script de backup cherche un fichier précis à un endroit précis (lequel aura été créé par PHP dans un répertoire de l'utilisateur qui ne se trouve pas dans l'arborescence de publication http). Si le fichier est trouvé (il peut d'ailleurs contenir le(s) nom(s) de la / des base(s) à sauvegarder), alors le dump est effectué. Sinon, non.
Cette tâche peut très bien être exécutée toutes les 5/10 minutes par exemple.
Dans le même ordre d'idée, pour la restauration, on peut imaginer l'inverse... L'utilisateur doit placer son fichier .sql à un endroit précis. La tâche de restauration cherche les fichiers SQL dans ce répertoire précis et les exécute. Idem, elle peut tourner toutes les 5/10 minutes.

C'est à mon avis une des solutions les plus simples à mettre en place sans sacrifier la sécurité (plutôt que d'avoir un script PHP qui exécute un script shell contenant le mot de passe MySQL de root) et, puisque tu t'adresses à des personnes qui ont un serveur dédié, bien plus adaptées qu'un script PHP.

Pour revenir sur le point 2 évoqué par WebDeb : pourquoi utiliser MySQL connect sur chaque page avec des variables définies dans un autre fichier ? Pourquoi ne pas simplement inclure un fichier qui contient la fonction mysql_connect() avec les arguments ? Bon c'est du détail, hein...

Sinon, pourquoi ne pas utiliser l'extension mysqli plutôt que mysql ?
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
36
# mysql_query($SQL);
# if (!$SQL) {

<=>

# $truc = mysql_query($SQL);
# if (!$truc) {
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.