|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 2 ![]() |
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! |
|
|
00
|
|
|
#2 |
|
Membre actif
![]() Tobbi Filteau Inscription : mai 2010 Messages : 176 ![]() |
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. |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 338 ![]() |
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
__________________
Stay in Bed .. Save Energy |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 2 ![]() |
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! |
|
|
00
|
|
|
#5 |
|
Membre actif
![]() Tobbi Filteau Inscription : mai 2010 Messages : 176 ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com