|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() |
Bonjour pour tout le monde,
j'ai un problème avec un temps maximal d'exécution dépassé. Le but de mon script est de copier des données Oracle d'une base distante dans ma base MySQL locale. Je dois utiliser des commandes OCI pour extraire les données issues de la base Oracle. J'effectue donc un SELECT des données de ma base Oracle dans le but de les lire puis j'insers ces données dans ma base MySQL (script en PS), mais forcément c'est long et le temps d'exécution maximale est dépassé... Je ne peux pas augmenter ce temps car je n'ai aucun droit sur le serveur! J'arrive à copier le dixième de ce que je devrais copier... Serait-il possible d'effectuer une insertion à partir d'une selection, je m'explique. Peut-on faire une requête SQL du genre INSERT (dans ma base MySQL d'une autre commande SQL SELECT (les données de la base Oracle)) ????? Merci d'avance de vos réponses, car la je suis bloqué et je n'ai plus vraiment de piste... ++ PS: Voici ma boucle while qui a un temps d'exécution beaucoup trop long : Code :
|
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Salut
As-tu essayé set_execution_time(0); ? D'une côté, tu peux essayer d'améliorer le temps d'exécution de ton script en utilisant PDO (surtout pour l'INSERT). D'un autre côté, tu peux tenter les INSERT étendus. Concatène dans la boucle afin d'obtenir une requête du type : Code :
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
||
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() |
La fonction set_execution_time() n'est pas activée sur le serveur. De plus, j'aimerais améliorer le temps de réponse, car la en 30 secondes je telecharges 500 données environ avant que le message d'erreur ne s'affiche et vu que j'ai environ 10.000 données a copier, cela representerait environ 20 minutes et ça commencerait a faire beaucoup...
"D'une côté, tu peux essayer d'améliorer le temps d'exécution de ton script en utilisant PDO (surtout pour l'INSERT)." Qu'est-ce que PDO? Comment puis-je faire un INSERT étendu, étant donné que je dois insérer des données suite à une sélection? "Si cela ne fonctionne pas, tu devras utiliser une méthode plus complexe pour sélectionner les tuples" Ca m'a lair déjà des concepts compliqués ça... Merci de votre intérêt. |
|
|
00
|
|
|
#4 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Donc, si je résume :
J'ai mis à disposition [ici] un script qui fait quelque chose de similaire pour un forum phpBB, quelle que soient la taille de la BDD et les paramètres de l'hébergeur. Je vais te décrire la méthode adoptée. L'idée est d'extraire les tables petit à petit, en plusieurs exécutions du script.
Bonne chance !
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() |
Merci de ton aide, je vais bosser ce que tu m'as donné et je poste d'ici peu pour dire ou j'en suis en espèrant que l'avancement sera positif!
|
|
|
00
|
|
|
#6 |
|
Membre habitué
![]() |
Il n'y a pas de clefs primaires dans la table Oracle que je dois télécharger, comment puis-je faire pour suivre l'avancement du téléchargement??? Car si j'ai bien compris, le but est de télécharger les données Oracle vers un fichier texte et une fois que la limite de temps est atteinte, on arrête et on recommence où on était arrivé, c'est cela? C'est embêtant de devoir mettre un bouton pour cliquer et lancer la suite du téléchargement, ce serait mieux qu'il fasse automatiquement, mais c'est mieux que rien...
Il faut installer quelque chose sur le serveur? Car je n'ai aucun droit sur le serveur??? Qu'est-ce que phpBB??? Merci |
|
|
00
|
|
|
#7 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Qu'est-ce que c'est que cette base Oracle qui n'a pas de clefs primaires ?
Non, le but n'est pas de télécharger vers un fichier texte mais de construire une grosse requête unique (une requête étendue contenant plusieurs insertions en une fois, cf. la doc MySQL) que tu exécutes à la fin de l'exécution du script. Pour l'automatisme, tu peux certainement le faire avec un META refresh ou un peu de JS : le bouton est facultatif. Il suffit d'être inventif. Si tu ne sais pas ce qu'est phpBB, cela n'a pas d'importance. Note quand même que lui nous dédié un forum... Sincèrement, sans clefs primaires, je vois mal comment tu pourras t'en sortir. Il y a des clefs uniques, au moins ?
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#8 |
|
Membre habitué
![]() |
Nan je ne pense pas qu'il n'y ait de clefs uniques non plus...
D'après ce que je sais sur la base, chaque jour on y ajoute des données, et moi je dois télécharger les données de la veille, ma sélection s'effectue sur la date, et cela fait beaucoup de données... Tu ne penses pas qu'il y aurait moyen de télécharger les données dans un fichier texte au format CSV sur mon disque dur, pour ensuite les ajouter sur ma base locale MySQL à partir de ce fichier texte de mon disque dur (la dernière partie je l'ai déjà faite)??? |
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() |
Je viens d'avoir une idée. Serait-il possible d'enregistrer toutes mes données dans des tableaux, puis de faire un gros insert. Je m'explique...
Je ferai mon SELECT de mes données de ma base Oracle, puis dans mon while { je copierai mes données dans des tableaux différents pour chaque colonne, tab_col1[],tab_col2[],tab_col3[]... } puis je lancerai le gros INSERT du genre INSERT INTO ma_base_MySQL (col1,col2,col3) VALUES (tab_col1[1],tab_col2[1],tab_col3[1]) (tab_col1[2],tab_col2[2],tab_col3[2]) ... J'espère que j'ai assez bien expliqué, penses-tu que cela pourrait fonctionner??? |
|
|
00
|
|
|
#10 |
|
Membre habitué
![]() |
En fait il suffit de copier les données dans les tableaux, si cette action prends moins de 30 secondes c'est bon... Car après le "gros insert", je peux le découper en plusieurs fois, 100 données par 100 données par exemple, car j'en ai 2000-3000 à copier par table, tout cela fois 3 et tous les jous...
Mais le principe de copier les données dans des tableaux c'est pas mal nan? Par contre si ça marchait, je peux créer un tableau avec une longueur non définie? je pense que oui, si c'est vraiment le cas, je peux en connaître la longueur maximale? |
|
|
00
|
|
|
#11 | ||
|
Membre habitué
![]() |
Code :
Voila à quoi ressemblerait mon code à peu prés au final, donc j'arrive bien à copier les données dans différents tableaux, l'index maximale je le connais $index, je pourrais donc morceler mes include, mais j 'ai 2 questions. Le temps maximal d'execution c'est sur le script ou sur la boucle? car la le copiage de mes données dans les tableaux prends quasiment 30 secondes (4665 données a faire 3 fois arf), donc ca ferait beaucoup trop short! Si les 30 secondes c'est sur le script, comment puis-je faire? j'ai un problème c'est que "echo $tab_ddate[4];" ne m'affiche rien... |
||
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() Maxime PasquierExpert PHP Inscription : novembre 2004 Messages : 2 126 ![]() |
la balise code c'est en cliquant sur #, mais en mettant #...
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur. Mon espace Développez : mes Créations. Rencontre & Carte des Membres de Developpez.com, version 3.0 |
|
|
00
|
|
|
#13 |
|
Membre habitué
![]() |
dsl, qqun peut-il me répondre svp...
|
|
|
00
|
|
|
#14 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Disons que le problème se situe au niveau de la quantité de données à récupérer. Il faut réduire a quantité de tuples retournés par le SELECT, sans quoi tu auras toujours le problème de timeout.
Il faut que tu trouves un moyen fiable d'ordonner les données. Normalement, le schéma de la base te permet de le faire aisémanet à l'aide des clefs primaires. Si tu as une date d'insertion dans chaque table, tu peux l'utiliser. Si tu n'as rien de tout cela, j'ai peur que tu doives demander conseil aux gens qui gèrent la BDD. Par ailleurs, peut-être que les gens du forum SGBD auront de meilleures réponses que moi.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#15 | ||
|
Membre habitué
![]() |
J'essaye de réduire le nombre de données à insérer, du coup j'ai fait des filtres avant les insertions, mon code ressemble à celui-ci maintenant :
Code :
|
||
|
|
00
|
|
|
#16 | ||
|
Membre habitué
![]() |
Bonjour tout le monde,
j'ai un problème au niveau de requête, je dois copier environ 4000 données par jour et je n'arrive à n'en copier que 2500, car le temps d'exécution maximal de 30 secondes (que je ne peux augmenter!!!) est dépassé. Les données que je dois copier proviennent d'un serveur Oracle que je dois copier sur mon serveur locale MySQL. Est-il possible de faire une jointure entre 2 bases de ce type? Mon code est le suivant : Code :
|
||
|
|
00
|
|
|
#17 |
|
Membre habitué
![]() |
pas de réponse, bonne réponse?! nan dans ce cas-là ça marche pas lol, personne n'a un petit coup de main à me donner svp...
|
|
|
00
|
|
|
#18 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Salut
Je te l'ai dejà dit : il faut que tu trouves un moyen de réduire le nombre de tuples retournés par ta requête et que tu lances plusieurs exécutions. Je t'ai proposé de jouer avec les clef primaires. S'il n'y en a pas, je t'assure que ce n'est pas une situation normale (surtout avec Oracle) et que l'optimisation doit être faite du côté du schéma de la BDD.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#19 |
|
Membre habitué
![]() |
Salut,
oui j'essaye de diminuer le nombre de données, je voudrais faire une jointure ca me paraît être la meilleur solution, mais je ne pense pas que ce soit possible entre une base Oracle et une base MySQL, car là ça ne fonctionne pas... Une solution qui pourrait marchez aussi c'est de tout copier dans des tableaux, ça ne dépasse pas les 30 secondes, de fermer la connexion avec Oracle, puis de faire les INSERT. Mais sur ce sujet j'ai une autre question : la fameuse limite des 30 secondes concerne l'exécution de mon script PHP, de ma boucle WHILE ou de ma connexion avec Oracle? La dernière solution que j'ai mise en oeuvre actuellement c'est d'effectuer des tris dans la boucle, mais c'est trop et par conséquent, ça n'est pas une solution viable, donc il faut que je me rabbates sur la jointure ou sur les tableaux pour moi... |
|
|
00
|
|
|
#20 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
La limite de 30 secondes s'applique au temps d'exécution du script complet.
Je ne suis pas certain de comprendre le même concept de jointure que toi. Il s'agit de deux connexions complètement différentes : comment peux-tu espérer les faire dialoguer ? Ce n'est pas la bonne démarche. Il faut que tu récupères les tuples en un temps raisonnable (moins de la moitié des 30 secondes) afin de te permettre de les enregistrer ailleurs dans le temps qu'il reste. Je le répète, le schéma de la BDD n'est assurément pas correct. Les gens du forum Oracle pourront probablement mieux t'orienter que nous, puisqu'il ne s'agit pas de PHP mais d'un SGBD particulier.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com