Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum 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 22/11/2010, 13h44   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 2
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 2
Points : 0
Points : 0
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!
Ziniweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h50   #2
Membre actif
 
Tobbi Filteau
Inscription : mai 2010
Messages : 176
Détails du profil
Informations personnelles :
Nom : Tobbi Filteau

Informations forums :
Inscription : mai 2010
Messages : 176
Points : 177
Points : 177
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.
osuwariboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 15h07   #3
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
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
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 16h38   #4
Invité de passage
 
Inscription : novembre 2010
Messages : 2
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 2
Points : 0
Points : 0
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!
Ziniweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 17h19   #5
Membre actif
 
Tobbi Filteau
Inscription : mai 2010
Messages : 176
Détails du profil
Informations personnelles :
Nom : Tobbi Filteau

Informations forums :
Inscription : mai 2010
Messages : 176
Points : 177
Points : 177
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
osuwariboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h11.


 
 
 
 
Partenaires

Hébergement Web