transferer 350000 enregistrement d'une table local a table distante? - SQL/NoSQL - Programmation
Marsh Posté le 22-09-2003 à 07:25:43
Personnelement, je ferai transiter d'abord les enregistrement vers une bdd mysql locale, puis je balancerai la mysql locale sur la distante, ca reglerait deja une embrouille
Marsh Posté le 27-09-2003 à 19:27:18
moi si j'etais toi, je genererais un fichier texte qui serait une liste de INSERT INTO a faire pour chaque enregistrement.
INSERT INTO ....blabla...........; |
Une fois ce fichier generé, tu te demerde avec un client mysql, ou un chti script php...
Marsh Posté le 27-09-2003 à 19:55:16
plutot que de passer par une serie de requetes, je conseille plutot un fichier plat a pas fixe (ce qu'il y a de plus performant)
en effet, le probleme de la chie d'insert, c'est que si les transactions sont activees dans mysql tu risque grandement un rollback segment full et donc un plantage. et si tu force es commits 5meme par lot, non seulement tu vas faire chutter les perfs, mais surtout si pour une raison ou pour une autre ca plante, tu ne pourras pas revenir en arriere. alors qu'avec un module d'import de fichier plat tu ne devrais pas avoir ces probleme.
Marsh Posté le 27-09-2003 à 20:48:53
MagicBuzz a écrit : plutot que de passer par une serie de requetes, je conseille plutot un fichier plat a pas fixe (ce qu'il y a de plus performant) |
Tu veux dire carrément copier le fichier contenant les données de la DB sur le serveur? Encore faut-il que sont hebergeur autorise cela...
Marsh Posté le 27-09-2003 à 20:55:36
non non, avec access, faire "exporter donnee", et choisir "fichier a masque" ou un truc du genre.
ensuite, sous mysql, creer la table avec les champs formattes de la meme facon.
puis avec un gui de mysql, choisir "importer un fichier a masque"
Marsh Posté le 29-09-2003 à 09:59:17
MagicBuzz a écrit : non non, avec access, faire "exporter donnee", et choisir "fichier a masque" ou un truc du genre. |
si dans la table distante MySQl , la clé est juste un numerique et dans access la clé et un numero auto , es ce que ca peu engendré des problèmes? en partant du principe que l'on fait une transaction ACCESS a MySQL.
Marsh Posté le 29-09-2003 à 10:00:46
dans l'exportantion je ne voix pas ce que tu appelles par "fichier a masque"?
Marsh Posté le 29-09-2003 à 10:19:29
Il faut que tu exportes depuis access ta base en prenant l'option fichier texte ou excel.
Marsh Posté le 29-09-2003 à 10:31:12
Format_C a écrit : Il faut que tu exportes depuis access ta base en prenant l'option fichier texte ou excel. |
peut-on exporter juste une table?
ensuite faut'il que le prestataire accepte de mettre ajour la base MySql
Marsh Posté le 29-09-2003 à 10:36:38
Saxgard a écrit : |
oui on peut, lis la documentation de Access, c dedans ( intégralement d'ailleurs, un ami m'avait posé la meme question et ct devant ses yeux).
Marsh Posté le 29-09-2003 à 10:39:54
tetedeiench a écrit : |
ayé j'ai vu et essayé , le truc c que au niveau du prestataire ca rique d'etre un pb a moi q ue je puisse a distance mettre a jour la table de mla base distante MySql avce le fichier texte crée !
Marsh Posté le 29-09-2003 à 11:02:25
Saxgard a écrit : |
Non c'est pas trop problématique. Il suffit de faire un script qui récupère le fichier texte crée et le transforme automatiquement. Le tout c'est que la personne qui fasse l'import mette le fichier exporter toujours au même endroit sur le serveur vers lequel le script pointera (si j'ai bien compris ton pb)
Marsh Posté le 29-09-2003 à 11:04:10
Format_C a écrit : |
euh ouais c a peu pres ca ;o)
hmm le truc c que mnt faut savoir cmment se fait ce script et en plus il ya quelques pb avce le prestataire
Marsh Posté le 29-09-2003 à 11:15:35
Saxgard a écrit : |
Il faut un script php qui ouvre le fichier généré en lecture seule.
Ensuite tu lis et modifie le fichier ligne par ligne et à chaque fois tu fait un insert dans ta table.
Par exemple si une ligne de ton fichier de la table coordonnée est : $ligne = 'contact';'adresse';'telephone';'fax';etc...
Tu feras une fonction qui comptera le nbre de caractères jusqu'à la première occurence de ";" et tu dira que ton champs $contact est égal au n premiers caratères de $ligne. Puis tu remplaces dans $ligne le champs $contact.";" par rien autrement dit par "", et tu recommences l'opération par autant de champs que nécessaire.
Une fois que c'est fait tu te retrouves avec les variables $contact, $adresse, $telephone, $fax, etc... Tu n'as alors plus qu'à faire un Insert_table dans ta base mysql.
Marsh Posté le 29-09-2003 à 11:19:10
Format_C a écrit : |
ouais mais le problème c'ets que si j'excecute ce script , je ne risque pas d'avoir un timeout parceque l'execution de cette requete sera trop longue?
j'ai deja rencontré ce pb avec d'autres tables
Marsh Posté le 29-09-2003 à 11:30:38
Soit tu modifies le timeout, soit tu découpes le script en plusieurs boucles.
Par exemple ton script principal s'apelle script.php.
Quand tu le lances tu passes une variable script.php?saut2ligne=1000
Dans script.php tu dis que si la position de $ligne=$saut2ligne
alors tu dis que $saut2ligne=$saut2ligne+1000 et qu'il faut aller à la 'pagescript.php?saut2ligne='.$saut2ligne, ce qui rechargera ton script en passant scannantles lignes 1000 à 2000 etc...
Marsh Posté le 29-09-2003 à 11:33:30
Format_C a écrit : Soit tu modifies le timeout, soit tu découpes le script en plusieurs boucles. |
ah c pas bette ca , et ca peu s efaire automatiquementa lors? par une redirection?
mais on peu pa strouver un moyen qu'il y est un genre de flush sur la meme execution du script . Comme si il a fini il affiche puis continue( les requetes) puis affiche ... etc... ?
Marsh Posté le 29-09-2003 à 14:41:54
pas pitiée, utilisez pas le CSV
un fichier à masque est plus rapide, et plus compatible (pas de problème de séparateur).
il se lit et s'écrit avec des variables de type "record".
Exemple :
mettons un type "utilisateur"
|
on a deux variables contenant les données :
|
(a noter qu'il faut impérativement comme dernière valeur une string contenant un saut de ligne, c'est pas obligatoire, mais ca rends le fichier plus lisible pour le débuggage)
On écrit dans le fichier avec un write_file(variable_de_type_reccord)
PS: si le langage est bien foutu, c'est la même fonction que celle pour écrire une chaine. Les valeurs dans les variables doivent impérativement être forcée à une taille fixe (utilisation de string(xxx) lors de la déclaration)
Le fichier généré sera :
|
Il se lira de la même façon qu'il a été écrit, dans les mêmes variables. C'est à la vois très simple, et ce qu'il y a de plus performant. Ca évite de faire des traîtements de chaîne à plus savoir quoi en faire et de bosser avec des tableaux dynamiques (avec la fonction split par exemple).
Marsh Posté le 10-09-2003 à 17:51:55
voila
comment peut-on faire pour transferer 350 000 enregistrement d'une table provenant d'une base de données Access à une table d'une Base de données ditantes sur MySql ?
j'ai essayera partir d'acces ca merde ca ne copie pas tt
a partir de MySqlFront , SQLyog et dernièrement avce EMS Mysql manager et ca merde encore
uen solution?