IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Déplacement de données MySQL - Archivage


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2
    Par défaut Déplacement de données MySQL - Archivage
    Bonjour,

    Mon problème:
    Je doit déplacer des données MySQL (3 tables, uniquement les données inscrite de puis de 6mois, identifiable par un champ date) sur une autre base (contenant 3 tables avec la même structure) via un CRON qui exécute toute les semaines un script PHP


    Idées de solution ?
    1. 3 requêtes de sauvegarde que je stoque dans un fichier (via OUTFILE)
    2. 3 requêtes de restauration dans la nouvelle BDD (via INFILE)
    3. Vérification du succès de l'insertion des données (comment faire?)
    4. Suppression des données dans la BDD 1

    ou

    1. Copie des données INSERT INTO `database2`.`table2` SELECT * FROM `database1`.`table1` ;
    2. Vérification du succès de l'insertion des données (comment faire?)
    3. Suppression des données dans la BDD 1

    ou

    Autre solution ?

    Je précise que c'est un shop en ligne et c'est pour l'archivage des commandes. Je ne peut me permettre de perdre des données en route... et on parle de plusieurs centaine de milliers de données.

    Est-ce que je m'y prend mal, quel serait la meilleure solution ? Votre expérience est la bienvenue.
    Comment s'assurer que tout ce passera bien lors du chargement avec les clés primaires ? (qui étaient en auto-incrément dans la première BDD)

    Merci d'avance pour votre aide!

  2. #2
    Membre expérimenté
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Par défaut
    En fait, tes deux solutions sont excellentes. Personnellement, je dirais que la deuxième est plus pratique, mais la première a l'avantage de préserver tes données dans un fichier externe que tu peux stocker ailleurs pour des raisons de sécurité et de backup éventuel. La seule chose qu'il te faudrait dans tes tables d'archives est un champ additionnel qui stockerait la date et l'heure d'archivage.

    Après, pour faire fonctionner tes requêtes, tu n'as qu'à faire un truc du genre:

    INSERT INTO `database2`.`table2` SELECT `database1`.`table1`.*, now() FROM `database1`.`table1` ;

    Et après, pour vérifier tu fais simplement un SELECT avec un where sur le champ d'archivage.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    autre solution un trigger qui a chaque nouvelle insertion copie dans la base de sauvegarde la nouvelle ligne et supprime toutes celles plus vieilles de 6 mois.

    Avantages : pas de cron pas de php juste un trigger en plus, facilite la maintenance
    Inconvenients : impossible avec des tables MyIsam

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2
    Par défaut
    Merci pour vos réponses!

    osuwariboy> pas compris ta requête INSERT, surtout la fin, now() FROM `database1`.`table1` ; tu pourrais m'éclairer un peu stp ?

    Boo64 > j'ai découvert grâce à toi les triggers, super pratique mais c'est une fonction qui requiert les SUPER PRIVILEGE sur la DB, ce qui n'est malheureusement pas possible en hébergement mutualisé...

    C'est réactif sur ce forum!

  5. #5
    Membre expérimenté
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Par défaut
    Salut Ziniweb,

    Pour commencer, la fonction now() est une fonction SQL qui retourne la date actuelle. Si on suppose la structure simple suivante pour les deux tables concernées:

    Database1.table1
    {
    champ1 INT(11) auto_increment,
    champ2 varchar(255)
    }

    Database2.table1
    {
    champ1 INT(11) auto_increment,
    champ2 varchar(255),
    champ3 DATETIME
    }

    Maintenant, on va dire que la Database1 est ta BD active et que Database2 est ta BD d'archivage.

    J'imagine que tu sais que si on fait:

    SELECT * FROM Database1.table1

    Je récupère toutes les données de la table Database1.table1 sous le format:

    Champ1 | Champ2
    1 | Valeur quelconque
    2 | Autre valeur

    Cependant, si je fais la requête suivante:

    SELECT Database1.table1.*, now() as DateActuelle FROM Database1.table1

    J'obtiens le résultat suivant:

    Champ1 | Champ2 | DateActuelle
    1 | Valeur quelconque | 2010-11-22 11:12:43
    2 | Autre valeur | 2010-11-22 11:12:54

    Comme tu vois, le fait d'utiliser la fonction now() rajoute une colonne au résultat de notre requête. En conséquence, cette requête:

    INSERT INTO `database2`.`table2` SELECT `database1`.`table1`.*, now() FROM `database1`.`table1` ;

    Va parfaitement remplir les trois colonnes de ma table d'archivage, la dernière contenant la date et l'heure à laquelle l'insertion s'est produite.

    Après, si tu veux savoir si ton insertion a réussi, tu peux faire un truc du genre:

    SELECT * FROM `database2`.`table2` WHERE champ3 >= 2010-11-22 et tu vas avoir toutes les lignes ajoutées aujourd'hui.

    J'espère avoir réussi à éclairer ta lanterne, bonne chance

Discussions similaires

  1. connexion a une base de donné mysql
    Par ithery75 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/02/2005, 20h57
  2. [JDBC]acces à une base de données mysql
    Par sehaba dans le forum JDBC
    Réponses: 13
    Dernier message: 07/12/2004, 00h39
  3. probleme construction base de donnes MySql...Help
    Par chakan dans le forum Requêtes
    Réponses: 7
    Dernier message: 21/07/2004, 11h27
  4. connection à base de donnée MYSQL
    Par zouzou_zaza dans le forum Bases de données
    Réponses: 11
    Dernier message: 04/07/2004, 12h31
  5. XML->Base de donnée Mysql
    Par lheureuxaurelie dans le forum XQUERY/SGBD
    Réponses: 4
    Dernier message: 10/03/2004, 23h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo