begin process at 2012 05 27 19:57:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > DUPLICATION D'UNE BASE DE DONNÉES POUR SAUVEGARDE

DUPLICATION D'UNE BASE DE DONNÉES POUR SAUVEGARDE


 Information sur la source

Note :
4 / 10 - par 3 personnes
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Base de données Classé sous :sauvegarde, base, sql, php Niveau :Débutant Date de création :18/12/2008 Date de mise à jour :19/12/2008 22:34:08 Vu :5 271

Auteur : fmarie

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

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

  • <?
  • $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);
  • ?>
<?
$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.


 Historique

18 décembre 2008 23:03:26 :
Erreur dans le code
18 décembre 2008 23:04:55 :
Derniers détails avant validation.
19 décembre 2008 09:44:40 :
Modifications apportées suite au commentaire de Webdeb sur les points : 1/ Ajout du tag <?php 3/ Gestion d'erreur de connexion 4/ Suppression des apostrophes inutiles 6/ Gestion des erreurs de requête 8/ Ajout du mysql_close
19 décembre 2008 22:32:08 :
Modification de l'erreur suite au commentaire de coucou747 le 19/12/2008 à 19:26:16
19 décembre 2008 22:34:08 :
Mise à jour

 Sources de la même categorie

Source avec Zip ORM : DAO, ACTIVERECORD ET DBLIST par Reldan
Source avec une capture CET EXTRAIT PERMET D'AJOUTER DANS UN TABLEAU UNE AGRÉGATION ... par Denis007
EXPORT DE BASE AU FORMAT CSV par remib74
Source avec Zip RECHERCHE DES DOUBLONS DANS UNE TABLE MYSQL EN SÉLECTIONNANT... par aladec2007
[CRON] INSERT ON DUPLICATE KEY UPDATE par pierreSabatier

 Sources en rapport avec celle ci

Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42
Source avec une capture SQL/EXE EXECUTEUR DE REQUETTES SQL par enokbyreal
Source avec Zip SYSTÈME D'ARTICLES par Archima
Source avec Zip PORTAGE PDO DE MES ANCIENNES PUBLICATIONS par 8Tnerolf8
Source avec Zip Source avec une capture BASH CSVSQL: PARSER UN FICHIER CSV AVEC DES COMMANDES SQL par gentilKiki

Commentaires et avis

Commentaire de webdeb le 19/12/2008 00:51:30 1/10

Ca ne sert strictement à rien comme code. Tu t'exposes à de gros problèmes de pertes de cohérence des données au moment de la sauvegarde en procédant de cette manière. De plus ton code est complètement mal écrit pour de multiples raisons :

1/ Le bon tag PHP d'ouverture de script est <?php et non <? qui peut-être désactivés sur les serveurs dignes de ce nom,
2/ Quel est l'intérêt de faire des variables pour stocker les identifiants de connexion plutôt que de les écrire directement en dur dans le mysql_connect() ?
3/ Que se passe-t-il si la connexion au serveur SQL ne se fait pas ? Pourquoi le script continue-t-il ?
4/ Pourquoi mettre des apostrophes inutiles autour des variables ?
5/ Et si je n'utilise pas l'UTF-8 comme encodage de chaque table ?
6/ Que se passe-t-il si un mysql_query() échoue ? Pourquoi continuer le script ?
7/ Malheureusement, il n'y a aucune transaction (donc pas de moteur de stockage InnoDB) pour assurer que toutes les données ont bien été copiées et que l'intégrité référentielle entre les tables a été respectée.
8/ Pas de mysql_close() ?
9/ ...

Bref tout ça pour dire que tu peux jeter ton code à la poubelle ! On ne fait jamais de backups d'une base de données comme ça sur un site en production, c'est complètement fou. Un backup doit être réalisé par une tâche automatique qui lance périodiquement un script shell qui appelle par exemple l'utilitaire mysqldump. C'est beaucoup beaucoup beaucoup beaucoup plus performant et beaucoup beaucoup beaucoup moins dangereux pour la base de données car mysqldump est un utilitaire qui maîtrise les sauvegardes et qui est conçu pour ça.

Pour rappel :

mysqldump -u root -p MaDatabase > MaDatabase.sql

permet en 1 ligne de commande de dumper proprement MaDatabase dans le fichier MaDatabase.sql.

Commentaire de coucou747 le 19/12/2008 01:04:59 administrateur CS 1/10

c'est a cause de lignes comme ca :

$connexion=mysql_connect("$host","$user","$password");

que beaucoup de gens pensent que php est un langage de merde.

c'est pas du bash la... c'est du php !

Commentaire de fmarie le 19/12/2008 01:14:52

Je passerai sur les différents points où tu as raison et que je modifierai plus tard en effet, à savoir les points 1,3,4,6,8.
Point 2, je fais un include logiquement pour n'avoir qu'un fichier de connexion et j'ai simplement fait la copie des variables.
Point 5, à vrai dire, je n'ai pas trouver la solution et je n'ai pas non plus cherché beaucoup en effet. Si tu as la réponse, je suis preneur.
Point 7, qu'appelle-tu transaction ? Un lien d'explication me suffira.

En ce qui concerne le dump, je suis évidement d'accord avec toi mais je ne sais pas comment faire pour que sur une page d'administration d'un site internet, les utilisateurs puissent lancer cet utilitaire à tout moment.
Pour moi, l'important est que les utilisateurs puissent faire une sauvegarde avant de modifier de façon significative une base de données.

Merci de tes éventuelles réponses.

Commentaire de fmarie le 19/12/2008 12:12:56

A l'attention de Webdeb !
J'ai cherché un peu sur le point 7 et les transactions.

Si je fais quelque chose de ce type :
<?
$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

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
mysql_query($SQL);
if (!$SQL) {
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];";
$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);
?>

Est-ce que cela parait correct ?
J'ai lu cet article et repris les fonctions de départ :
http://www.devarticles.com/c/a/MySQL/Using-Transactions-with-MySQL-4.0-and-PHP/

Commentaire de fmarie le 19/12/2008 12:14:52

J'ai oublié de mettre la ligne :
begin();


entre :

$SQL="CREATE TABLE $dbdest.$enr[0] SELECT * FROM $db.$enr[0];";

et

$result=@mysql_query($SQL);

Commentaire de webdeb le 19/12/2008 13:23:23

Les transactions ne fonctionnent que si tes bases de données utilisent le moteur de stockage InnoDB. Si tu es en MyISAM, ça ne fera rien, bien que les requêtes BEGIN, COMMIT et ROLLBACK s'exécutent bien.

Commentaire de fmarie le 19/12/2008 14:27:29

Ok ! Merci de l'information !
Mes bases sont en effet en MyISAM.

Et si tu as encore 5 minutes à me consacrer pour les questions de mon message de 01:14:52 ;)

Commentaire de coucou747 le 19/12/2008 19:26:16 administrateur CS

# mysql_query($SQL);
# if (!$SQL) {

<=>

# $truc = mysql_query($SQL);
# if (!$truc) {

Commentaire de neigedhiver le 20/12/2008 22:15:13

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 ?

Commentaire de webdeb le 21/12/2008 00:04:14

>> Sinon, pourquoi ne pas utiliser l'extension mysqli plutôt que mysql ?

Ou même PDO tant qu'à faire :)

Commentaire de pouyelayese le 11/01/2009 17:28:59

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.

Commentaire de zroxx le 30/04/2009 04:03:28 10/10

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 !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

LA taille d'une base de donnée sql [ par FleX ] ba en fait je suis sur Free et j'ai une base de donnée que je manipule en php.J'aimerai savoir comment c'est ty qu'on peut bien faire pour obtenir la php et base de donnée sql.... HELP ;-) [ par zarzar ] je souhaite adapter en ligne (en php) un programme que j'ai créé sous excel et qui effectue des calculs de moyennes (avec des coeff, des matières), je Faut-il toujours une base Sql pour PHP? [ par norm131 ] Voila, je ne suis pas un expert de la programmation ni du PHP, et ma question est celle-ci: est-ce que tous les codes ou scripts php exigent une base SQL server et sauvegarde [ par paloxicide ] J'ai une base de don&#233;es sous sql server express 2005 et j'aimerais savoir s'il etait possible de sauvegarder ma base au format *.sql ou *.txt (co Envois de fichiers php vers mysql [ par jonathan724 ] Salut ! j' ai un problème, j' aimerai à partir d' un formulaire, envoyer les donnés du formulaire vers ma page mysql. J' ai déja fais le code mais il Récupérer données d'une base sql [ par Billybobbonnet ] Bonjour,Je suis débutant en php/sql et je ne sais pas comment récupérer les valeurs d'une ligne de table SQL dans des variables. Voilà la commande qui se connecter à une base sql [ par matsumato ] bonjour; j'ai essayé de me connecter à ma base de donnée et afficher le champ ename dans ma table employer et j'ai l'erreur suivant : Warning: mysql_ uploader sur serveur une base mysql entière de 50Mo via script php [ par michelvernet2 ] bonjour, impossible de trouver la bonne syntaxe PHP ( ou le bon code carrément ? ) pour uploder un fichier base.sql de 50 mega pour reconstituer ma b sql auto incrementation [ par tonytruand ] Bonsoir à vous et merci d avance pour la/les réponse Voilà depuis peu je me penche sur le PHP avec le sql J'ai ceci qui me permet d'alimenter une bas


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,530 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales