Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2012, 17h44   #1
Invité de passage
 
Inscription : janvier 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 10
Points : 3
Points : 3
Par défaut Créer un patch différentiel entre deux bases de données

Bonjour à tous.

Je cherche un moyen de générer automatique un patch différentiel entre deux bases de sonnées.

Je m'explique :
On a livré une première version du projet il y a 6 mois.
En 6 mois le site a vécu et évolué : créations de comptes utilisateurs, rédactions d'articles, etc..
Entre temps on a développé un "lot 2" dans le quel on à modifié les tables, créée du contenu etc, ...

Le processus de mise à jour envisagé est le suivant :
1 ) On fait deux copies de la base de prod. A et B
2 ) On applique des modifications sur la base B pour qu'elle corresponde au nouveau programme. (cette étape va prendre du temps ! Les modifications ne sont pas effectués directement sur la base mais par le programme..(donc, malheureusement, je ne peux pas faire mon ptit fichier patch à la mano))
3 ) On génère le patch en ce basant sur les différences entre A et B
4 ) On applique le patch sur la base de prod (qui a eu le temps de vivre ces propres aventures entre temps)

D'où ma question : Comment générer un patch qui permet de mettre à jour une base de données à partir de la différence entre deux bases ?


J'espère avoir été claire... Si vous avez des questions ou besoin de plus d'information, n'hésitez pas à demander


Merci par avance pour votre aide,
Et bonne année à tous
Rémy DEV est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 18h23   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Je dirais que le mieux serait quand même de créer une procédure SQL et/ou un programme PHP qui transférera les données de l'anciennes structure de données vers la nouvelle.

Une fois la procédure crée, testée, débugguée, validée, tu arrêtes le site actuel, tu lances la procédure puis tu mets en ligne le nouveau site.

Si tu veux faire ça sans arrêt du site actuel, tu auras toujours le risque qu'une donnée ne soit pas reprise.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 09h26   #3
Invité de passage
 
Inscription : janvier 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 10
Points : 3
Points : 3
Du coups j'imagine que cette "procédure SQL" il va falloir que je la code à la main.........
Rémy DEV est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 12h47   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Ben oui ! Tu croyais que ton patch allait se créer tout seul ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 16h54   #5
Invité de passage
 
Inscription : janvier 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 10
Points : 3
Points : 3
Ba pourquoi pas ....
Il existe peut être des outils pour le faire ....
Mais pour le moment je n'en ai pas trouvé ....

Actuellement je fait un export sql des deux tables que je veux comparer et j'utilise KDiff3 pour voir les différences entre les deux.
Rémy DEV est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 17h55   #6
Invité de passage
 
Inscription : janvier 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 10
Points : 3
Points : 3
Pour ceux que cela intéresse :

voici un code php qui permet de trouver les différences de contenu entre deux exports de base de données.

J'ai fait mes exports avec phpMyAdmin et les paramètres suivant:
  • Afficher les commentaires : NON
  • données seules
  • Fonction à utiliser lors de l'exportation des données : REPLACE
  • inclure les noms de colonnes dans chaque énoncé INSERT. Par exemple: INSERT INTO tbl_name (col_A,col_B,col_C) VALUES (1,2,3)
Toutes les lignes sont donc dépendantes et ressemble à ça :
Code :
REPLACE INTO `nom_de_la_table` (`id`, `limitation_id`, `value`) VALUES(5865, 862, '78');
code php.
Code PHP :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?php
set_time_limit(0);
ini_set('memory_limit', '2G');
 
echo "<h1 id=top>Générateur de différentiel de base de données</h1>";
 
$original = "p2.sql"; // export de la base de données d'origine
$modifie = "a2.sql";  // export de la base de données modifiée
$diff = "diff.sql";   // nom du fichier de résultat
 
$ct_idem = 0; // Compteur des lignes présentes dans les deux fichiers
 
$o_arr = file($original, FILE_SKIP_EMPTY_LINES); // Ou ouvre le fichier original sous forme de tableau. (comme ça on peut le parcourir)
 
$add = file($modifie, FILE_SKIP_EMPTY_LINES); // On ouvre le fichier modifié sous forme de tableau.
 
$del = array(); // dell est le tableau dans le quel on va ajouter les instruction de suppression des ligne qui était présente dans le fichier d'orrigine 
                // mais qui ont été supprimé dans le fichier modifié
 
foreach($o_arr as $i => $line){ // Pour chaque ligne du fichier d'origine
    $key = array_search($line, $add);
    if($key === null){
        //ERROR
    }
    if(!$key){ // Cette ligne était dans le fichier d'origine mais n'existe plus dans le fichier modifié
        $del[] = del($line); // On ajoute à la liste des lignes à supprimer
    }else{
        $add[$key] = ''; // Cette ligne est présente dans les deux fichiers. Elle n'est donc pas intéressante. On la neutralise.
        $ct_idem++;
    }
}
 
// $add ne contient plus que les lignes du fichier modifié qui n'était pas déjà présente dans le fichier d'origine.
// Les lignes qui n'était pas dans le fichier d'origine sont toujours là.
 
// $del contient les DELETE des lignes qui était dans le fichier d'origine mais qui n'existe plus dans le fichier modifié.
 
// Dans la première boucle on a simplement remplacer les lignes à supprimer par des lignes vides.
// On va maintenant les supprimer pour de bon.
$add2 = array();
foreach($add as $line){
    if(trim($line)){
        $add2[] = $line;
    }
}
$add= $add2;
 
if (is_writable($diff)) {
 
    // 'w' Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
    if (!$handle = fopen($diff, 'w')) {
        echo "Impossible d'ouvrir le fichier ($diff)";
    }else{
        if (fwrite($handle, implode('',$del)) === FALSE) {
            echo "Impossible d'écrire dans le fichier ($diff)";
        }
        if (fwrite($handle, implode('',$add)) === FALSE) {
            echo "Impossible d'écrire dans le fichier ($diff)";
        }
        fclose($handle);
    }
 
} else {
    echo "Le fichier $diff n'est pas accessible en écriture.";
}
 
 
 
/* ========================================================================== */
 
/** Transforme une instruction REPLACE en DELETE */ 
function del($line){
    // REPLACE INTO `ezpolicy_limitation_value` (`id`, `limitation_id`, `value`) VALUES(5865, 862, '78');
 
    $p1 = strpos($line, '`')+1;
    $p2 = strpos($line, '`', $p1);
    $table = substr($line, $p1, $p2-$p1);
 
    $p3 = strpos($line, '(')+1;
    $p4 = strpos($line, ')', $p3);
    $atts = substr($line, $p3, $p4-$p3);
 
    $p5 = strpos($line, '(', $p4)+1;
    $p6 = strpos($line, ')', $p5);
    $vals = substr($line, $p5, $p6-$p5);
 
    $att_array = explode(',', $atts);
    $val_array = explode(',', $vals);
    $att_array = array_map('trim', $att_array);
    $val_array = array_map('trim', $val_array);
 
    $id_key = array_search('`id`', $att_array);
    $id = $val_array[$id_key];
 
    $del = "DELETE FROM $table WHERE id=$id;\n";
 
    return $del;
}
Rémy DEV est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h13.


 
 
 
 
Partenaires

Hébergement Web