Comment sauvegarder une grosse table ? - SQL/NoSQL - Programmation
Marsh Posté le 24-02-2004 à 10:07:06
ReplyMarsh Posté le 24-02-2004 à 10:28:21
gni ? j'ai répondu a ta question
maintenant si t'as des précisions a apporter sur le contexte dans lequel doit se faire cette sauvegarde, soit plus clair !
Marsh Posté le 24-02-2004 à 10:30:07
Ce que je voulais dire, c'est que PhpMyAdmin utilise un mysqldump non ? Donc s'il le foire, je vais le foirer aussi si je fais un script non ?.
Marsh Posté le 24-02-2004 à 10:34:35
mais tu veux appeler ca en PHP ?
le bordel avec phpmyadmin (je pense) c'est que c'est le temps d'exécution du script qui dépasse la limite
ca a rien a voir avec mysqldump qui partirait en latte, 10 Mo c'est que dalle
Marsh Posté le 24-02-2004 à 10:36:06
Beh yes en PHP, la BDD est sur un serveur distant (Hébergement mutualisé )
Marsh Posté le 24-02-2004 à 10:37:57
ben en 20s ca va etre plus coton
j'pense que tu devrais tenter de le faire a la mano en plusieurs blocs
Marsh Posté le 24-02-2004 à 11:07:26
comment fait-on un mysqldump ou mysqlimport sur une base de données distante?
dans un script? mais comment les excuter dans un script? en utilisant des fonctions qui excute des applications systemes?
Marsh Posté le 24-02-2004 à 11:10:07
la question n'est pas de savoir si elle est distante ou pas
la question est de savoir si elle est directement accessible
Marsh Posté le 24-02-2004 à 11:11:54
HappyHarry a écrit : la question n'est pas de savoir si elle est distante ou pas |
comment peut-on savoir ca?
Marsh Posté le 24-02-2004 à 11:37:11
Tu fais un script PHP qui extraît en petits blocs de 1 Mo chacun par exemple, et à chaque ittération, tu fais un echo("." ) toutes les 1000 lignes par exemple.
Ca va permettre à PHP de ne pas expirer au bout de 20 secondes.
Marsh Posté le 24-02-2004 à 11:40:09
C'est la technique que j'utilise en ASP pour régupérer générer un fichier ZIP de 500 Mo à partir d'une table, donc avec 10 Mo sans traîtement, ça devrait passer...
Marsh Posté le 24-02-2004 à 11:41:17
MagicBuzz a écrit : Tu fais un script PHP qui extraît en petits blocs de 1 Mo chacun par exemple, et à chaque ittération, tu fais un echo("." ) toutes les 1000 lignes par exemple. |
tu fais des petits blocs avec le "LIMIT"?
serait tu ou on peu avoir un script deja tt fait qui permettrait d'extraire les tables et la base en faisant l'extraction par ce principe de bloc?
mais phpmyadmin ne le fait pas ca ? c dommage je trouve
Marsh Posté le 24-02-2004 à 11:44:48
non, y'a pas de script tout fait. mais franchement, c'est pas compliqué, fait un effort.
de toute façon, tu trouveras pas tout fait, parceque tout dépends du format désiré.
plutôt qu'un dump, on préfère généralement un fichier contenant des lignes "insert ..." pour chaque ligne.
plus lent à générer et à exécuter, ça a l'avantage de ne pas risquer de foutre en l'air une base de données existante lors de la restauration, ni de problème de conflit de charset.
restaure un dump de données unicode dans une base paramètrée en ANSI, tu vas bien rire (jaune)
Marsh Posté le 24-02-2004 à 11:44:52
Ou alors t'augmente le timemout...
Marsh Posté le 24-02-2004 à 11:45:48
kfman a écrit : Ou alors t'augemente le timemout... |
chez un hébergeur, c'est rare qu'on ait le droit, et c'est trop dangereux : si tu fais une boucle qui part en live, tu croûte le serveur pendant tout le temps du timeout, donc ralonger ce dernier est très dangereux, c'est un coup à crasher le serveur complètement.
Marsh Posté le 24-02-2004 à 11:47:36
Il pourrait éventuellement bencher son script pour voir le temps normal et modifier avec ça (si possible):
http://www.nexen.net/docs/php/anno [...] ution_time
Marsh Posté le 24-02-2004 à 11:51:20
saxgard a écrit : |
ca m'aurait étonné tiens
Marsh Posté le 24-02-2004 à 11:53:40
MagicBuzz a écrit : non, y'a pas de script tout fait. mais franchement, c'est pas compliqué, fait un effort. |
parceque moi ce que j'utilise pour récuperer une base distante c'ets EMS MySql Manager
il récupère deja par bloque c'ets pas mal foutu , donc j'arrive sans problème a récuperer toute une base dans un fichier .sql
mon problème c'est juste de pouvoir la restaurer en cas de pépin (hmmm cela dit peut etre que que EMS le fait je sais pas mais j'ai pas eu l'occasion de tester )
mais faudrait que je voix pour me faire un script comme tu as dit
donc si je comprend bien ton script de récuperation serait de mettre toutes les lignes d'une table dans un fichier texte (ou CVS pourquoi pas)
et ensuite pour la récuperation de lire chaque ligne du fichier texte en faisant un insert c'ets ca?
et biensur de faire un affichage tous les x insert toujours bon?
le probleme c'ets que meme si je fais un echo entre temps je craint qu'il prenne en compte le timeout
ah moin que je n'ai pas bien compris
parceque des fois je suis un peu lourd et long à la détente
Marsh Posté le 24-02-2004 à 11:55:33
HappyHarry a écrit : |
en tant que développeur on m'a toujours appris de d'abord voir si il ya deja quelquechose d'existant et bien tester au lieu de refaire tt soit meme ce qui ets une perte de temps
cela dit je n'ai pas demandé a ce qu'on le fasse pour moi , ce qui est different biensur , si ca n'existe pas je le ferais bien evidemment faut juste que je comprenne bien
Marsh Posté le 24-02-2004 à 12:01:36
Y'a deux timeout sur un serveur web.
Le timeout de connection, qui semble être celui qui te pose problème : c'est le délais sans échange avec le serveur lors du chargement d'une page avant qu'il t'affiche le message "impossible de charger la page" ou autre. 20 secondes, ça semble être ce timeout.
Le second timeout est la durée de vie maximum d'un script. C'est généralement beaucoup plus long. En ASP, par défaut c'est 300 secondes, il est courant que ce soit poussé à 900 secondes.
C'est le délais d'éxécution d'un script sur le serveur. Même s'il échange activement avec le client, le serveur l'empêchera de tourner plus longtemps que son temps imparti, jugeant que s'il dure plus longtemps, c'est qu'il a bugé (boucle infinie par exemple). C'est ce timeout qui est généralement rallongé à tord à la place de l'autre...
Je ne sais pas comment on peut rallonger le premier timeout. A priori, ça vient du navigateur, où de l'OS qui fait tourner le navigateur, aucune idée.
Mettre un echo("." ); toutes les 1000 lignes par exemple, va forcer le serveur et le navigateur à échanger des informations pendant l'éxécution du script. En plus, ça te permet de voir où il en est, et si c'est rapide ou non
Par contre, si tu dépasses le délais maximum d'éxécution d'un script, tu ne pourras rien faire pour le contourner, mise à part faire l'extract en plusieurs fois (assez chaud à automatiser, bien que tout à fait possible avec un javascript).
PS: lors de chaque echo("." ); pense à faire un flush (je sais pas comment on fait en PHP) afin de forcer le serveur à lancer immédiatement le caractère au navigateur et non le conserver en cache, sinon ça changera rien.
Marsh Posté le 24-02-2004 à 12:02:49
Pour l'algo, tu peux t'inspirer ce ce script (Extract SQL Server 2000 à partir de VBS, histoire que tu ne puisses en prendre que l'algo )
Code :
|
Marsh Posté le 24-02-2004 à 12:39:42
MagicBuzz a écrit : Pour l'algo, tu peux t'inspirer ce ce script (Extract SQL Server 2000 à partir de VBS, histoire que tu ne puisses en prendre que l'algo )
|
je te remercie pour ces réponses clair (le flush répond a un problème que je me posait et tu vient d'y répondre tres bien)
et merci pour ton algo meme si ta fais un signe pas tres zentil
Marsh Posté le 26-02-2004 à 16:21:51
c ptet possible de niquer le timeout avec la fonction
set_time_limit(0);
http://fr2.php.net/set_time_limit
Marsh Posté le 24-02-2004 à 09:45:55
Bonjour à tous,
J'aimerais sauvegarder une grosse table MySQL qui fait environ 10 Mo. En passant par PhpMyAdmin, ca foire, ca me dit que la page n'est pas trouvé au bout de 20s
Y a-t-il une méthode pour faire un backup d'une grosse table ?
Merci à tous
---------------
Envie d'un bol d'air ? Traxxas Revo 3.3