Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1657 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Comment sauvegarder une grosse table ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment sauvegarder une grosse table ?

n°652671
Max Evans
Posté le 24-02-2004 à 09:45:55  profilanswer
 

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 ;) :jap:


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
mood
Publicité
Posté le 24-02-2004 à 09:45:55  profilanswer
 

n°652699
HappyHarry
Posté le 24-02-2004 à 10:06:08  profilanswer
 

mysqldump

n°652701
Max Evans
Posté le 24-02-2004 à 10:07:06  profilanswer
 

Dans un script ? :)


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
n°652717
HappyHarry
Posté le 24-02-2004 à 10:28:21  profilanswer
 

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 ! :o

n°652720
Max Evans
Posté le 24-02-2004 à 10:30:07  profilanswer
 

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 ?.


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
n°652732
HappyHarry
Posté le 24-02-2004 à 10:34:35  profilanswer
 

mais tu veux appeler ca en PHP ? :heink:
 
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

n°652735
Max Evans
Posté le 24-02-2004 à 10:36:06  profilanswer
 

Beh yes en PHP, la BDD est sur un serveur distant (Hébergement mutualisé :/)


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
n°652738
HappyHarry
Posté le 24-02-2004 à 10:37:57  profilanswer
 

ben en 20s ca va etre plus coton :o
 
j'pense que tu devrais tenter de le faire a la mano en plusieurs blocs

n°652801
saxgard
Posté le 24-02-2004 à 11:07:26  profilanswer
 

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?

n°652809
HappyHarry
Posté le 24-02-2004 à 11:10:07  profilanswer
 

la question n'est pas de savoir si elle est distante ou pas
la question est de savoir si elle est directement accessible :o

mood
Publicité
Posté le 24-02-2004 à 11:10:07  profilanswer
 

n°652817
saxgard
Posté le 24-02-2004 à 11:11:54  profilanswer
 

HappyHarry a écrit :

la question n'est pas de savoir si elle est distante ou pas
la question est de savoir si elle est directement accessible :o


 
comment peut-on savoir ca?

n°652859
MagicBuzz
Posté le 24-02-2004 à 11:37:11  profilanswer
 

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.

n°652866
MagicBuzz
Posté le 24-02-2004 à 11:40:09  profilanswer
 

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... ;)

n°652870
saxgard
Posté le 24-02-2004 à 11:41:17  profilanswer
 

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.
 
Ca va permettre à PHP de ne pas expirer au bout de 20 secondes.


 
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

n°652876
MagicBuzz
Posté le 24-02-2004 à 11:44:48  profilanswer
 

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)


Message édité par MagicBuzz le 24-02-2004 à 11:44:57
n°652877
kfman
Credo quia absurdum
Posté le 24-02-2004 à 11:44:52  profilanswer
 

Ou alors t'augmente le timemout...


Message édité par kfman le 24-02-2004 à 11:48:39
n°652880
MagicBuzz
Posté le 24-02-2004 à 11:45:48  profilanswer
 

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.

n°652884
kfman
Credo quia absurdum
Posté le 24-02-2004 à 11:47:36  profilanswer
 

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


Message édité par kfman le 24-02-2004 à 11:48:32
n°652890
HappyHarry
Posté le 24-02-2004 à 11:51:20  profilanswer
 

saxgard a écrit :


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?


 
ca m'aurait étonné tiens :pfff:

n°652896
saxgard
Posté le 24-02-2004 à 11:53:40  profilanswer
 

MagicBuzz a écrit :

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)


 
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  :D )
 
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   :D

n°652898
saxgard
Posté le 24-02-2004 à 11:55:33  profilanswer
 

HappyHarry a écrit :


 
ca m'aurait étonné tiens :pfff:


 
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

n°652912
MagicBuzz
Posté le 24-02-2004 à 12:01:36  profilanswer
 

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.

n°652913
MagicBuzz
Posté le 24-02-2004 à 12:02:49  profilanswer
 

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 :fuck:)
 

Code :
  1. function sqlFormat(str, datatype)
  2. if isNull(str) then
  3.  sqlFormat = "NULL"
  4. else
  5.  select case datatype
  6.  case 129, 200, 201, 202:
  7.   sqlFormat = "'" & Replace(str, "'", "''" ) & "'"
  8.  case 131, 5, 3:
  9.   sqlFormat = Replace(cstr(str), ",", "." )
  10.  case 135:
  11.   sqlFormat = "convert(datetime, " & sqlFormat(str, 129) & ", " & dteFormat & " )"
  12.  case else:
  13.   sqlFormat = str & " - " & datatype
  14.   sqlFormat = vbCrLf & vbCrLf & "Error: [" & str & "] is datatype [" & datatype & "] not supported !" & vbCrLf & vbCrLf
  15.   nbErrors = nbErrors + 1
  16.  end select
  17. end if
  18. end function
  19. dim nbErrors
  20. dim cnx
  21. dim rsTables
  22. dim sqlTables
  23. dim rsData
  24. dim sqlData
  25. dim fso
  26. dim fil
  27. dim field
  28. dim insertSQL
  29. dim dte
  30. dim dteFormat
  31. dim cols
  32. dim vals
  33. dte = cdate("1/2/3" )
  34. if day(dte) = 1 then
  35. dteFormat = "103"
  36. else
  37. dteFormat = "101"
  38. end if
  39. nbErrors = 0
  40. set fso = CreateObject("Scripting.FileSystemObject" )
  41. set fil = fso.CreateTextFile("data.sql", true)
  42. set cnx = CreateObject("ADODB.Connection" )
  43. cnx.ConnectionString = "Provider=SQLOLEDB.1;User ID=jiminyusr;Password=jiminypwd;Initial Catalog=JIMINY;Data Source=NTSERV-ORA816;Packet Size=4096"
  44. cnx.Open
  45. set rsTables = CreateObject("ADODB.RecordSet" )
  46. set rsTables.ActiveConnection = cnx
  47. set rsData = CreateObject("ADODB.RecordSet" )
  48. set rsData.ActiveConnection = cnx
  49. sqlTables = "select name from sysobjects where type = 'U' and name != 'dtproperties'"
  50. rsTables.Open sqlTables
  51. fil.WriteLine "SET NOCOUNT ON"
  52. fil.WriteLine "GO"
  53. do while not rsTables.EOF
  54. sqlData = "select * from [" & rsTables("name" ) & "]"
  55. rsData.Open sqlData
  56. fil.WriteLine "-- Début de la table " & rsTables("name" )
  57. fil.WriteLine "SET IDENTITY_INSERT [" & rsTables("name" ) & "] ON"
  58. fil.WriteLine "GO"
  59. do while not rsData.EOF
  60.  cols = ""
  61.  vals = ""
  62.  insertSQL = "INSERT INTO [" & rsTables("name" ) & "] ($1) VALUES ($2)"
  63.  for each field in rsData.Fields
  64.   cols = cols & "[" & field.name & "], "
  65.   vals = vals & sqlFormat(field.value, field.type) & ", "
  66.  next
  67.  insertSQL = Replace(Replace(insertSQL, "$1", left(cols, len(cols) - 2)), "$2", left(vals, len(vals) - 2))
  68.  fil.WriteLine insertSQL
  69.  rsData.MoveNext
  70. loop
  71. fil.WriteLine "SET IDENTITY_INSERT [" & rsTables("name" ) & "] OFF"
  72. fil.WriteLine "GO"
  73. fil.WriteLine "-- Fin de la table " & rsTables("name" )
  74. rsData.Close
  75. rsTables.MoveNext
  76. loop
  77. fil.WriteLine "SET NOCOUNT OFF"
  78. fil.WriteLine "GO"
  79. rsTables.Close
  80. set rsTables = Nothing
  81. set rsData = Nothing
  82. cnx.Close
  83. set cnx = Nothing
  84. msgbox "Terminé avec " & nbErrors & " erreur(s)"


Message édité par MagicBuzz le 24-02-2004 à 12:03:12
n°652954
saxgard
Posté le 24-02-2004 à 12:39:42  profilanswer
 

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 :fuck:)
 

Code :
  1. function sqlFormat(str, datatype)
  2. if isNull(str) then
  3.  sqlFormat = "NULL"
  4. else
  5.  select case datatype
  6.  case 129, 200, 201, 202:
  7.   sqlFormat = "'" & Replace(str, "'", "''" ) & "'"
  8.  case 131, 5, 3:
  9.   sqlFormat = Replace(cstr(str), ",", "." )
  10.  case 135:
  11.   sqlFormat = "convert(datetime, " & sqlFormat(str, 129) & ", " & dteFormat & " )"
  12.  case else:
  13.   sqlFormat = str & " - " & datatype
  14.   sqlFormat = vbCrLf & vbCrLf & "Error: [" & str & "] is datatype [" & datatype & "] not supported !" & vbCrLf & vbCrLf
  15.   nbErrors = nbErrors + 1
  16.  end select
  17. end if
  18. end function
  19. dim nbErrors
  20. dim cnx
  21. dim rsTables
  22. dim sqlTables
  23. dim rsData
  24. dim sqlData
  25. dim fso
  26. dim fil
  27. dim field
  28. dim insertSQL
  29. dim dte
  30. dim dteFormat
  31. dim cols
  32. dim vals
  33. dte = cdate("1/2/3" )
  34. if day(dte) = 1 then
  35. dteFormat = "103"
  36. else
  37. dteFormat = "101"
  38. end if
  39. nbErrors = 0
  40. set fso = CreateObject("Scripting.FileSystemObject" )
  41. set fil = fso.CreateTextFile("data.sql", true)
  42. set cnx = CreateObject("ADODB.Connection" )
  43. cnx.ConnectionString = "Provider=SQLOLEDB.1;User ID=jiminyusr;Password=jiminypwd;Initial Catalog=JIMINY;Data Source=NTSERV-ORA816;Packet Size=4096"
  44. cnx.Open
  45. set rsTables = CreateObject("ADODB.RecordSet" )
  46. set rsTables.ActiveConnection = cnx
  47. set rsData = CreateObject("ADODB.RecordSet" )
  48. set rsData.ActiveConnection = cnx
  49. sqlTables = "select name from sysobjects where type = 'U' and name != 'dtproperties'"
  50. rsTables.Open sqlTables
  51. fil.WriteLine "SET NOCOUNT ON"
  52. fil.WriteLine "GO"
  53. do while not rsTables.EOF
  54. sqlData = "select * from [" & rsTables("name" ) & "]"
  55. rsData.Open sqlData
  56. fil.WriteLine "-- Début de la table " & rsTables("name" )
  57. fil.WriteLine "SET IDENTITY_INSERT [" & rsTables("name" ) & "] ON"
  58. fil.WriteLine "GO"
  59. do while not rsData.EOF
  60.  cols = ""
  61.  vals = ""
  62.  insertSQL = "INSERT INTO [" & rsTables("name" ) & "] ($1) VALUES ($2)"
  63.  for each field in rsData.Fields
  64.   cols = cols & "[" & field.name & "], "
  65.   vals = vals & sqlFormat(field.value, field.type) & ", "
  66.  next
  67.  insertSQL = Replace(Replace(insertSQL, "$1", left(cols, len(cols) - 2)), "$2", left(vals, len(vals) - 2))
  68.  fil.WriteLine insertSQL
  69.  rsData.MoveNext
  70. loop
  71. fil.WriteLine "SET IDENTITY_INSERT [" & rsTables("name" ) & "] OFF"
  72. fil.WriteLine "GO"
  73. fil.WriteLine "-- Fin de la table " & rsTables("name" )
  74. rsData.Close
  75. rsTables.MoveNext
  76. loop
  77. fil.WriteLine "SET NOCOUNT OFF"
  78. fil.WriteLine "GO"
  79. rsTables.Close
  80. set rsTables = Nothing
  81. set rsData = Nothing
  82. cnx.Close
  83. set cnx = Nothing
  84. msgbox "Terminé avec " & nbErrors & " erreur(s)"




 
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  :D

n°656493
nidosaur
Hugh !^.
Posté le 26-02-2004 à 16:21:51  profilanswer
 

c ptet possible de niquer le timeout avec la fonction
 
  set_time_limit(0);
 
http://fr2.php.net/set_time_limit


---------------
Le chat c'est bon, mangez en :p
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Comment sauvegarder une grosse table ?

 

Sujets relatifs
problème de tablecreer une table (temporaire) en VBA à partir des données d'une requete
Création de tablePb création requête création de table
Créer une table avec le résultat d'une requête sous VB Access[PHP] Faire un 'u' sur tous les champs d'une table
[DELPHI] requete SQL : comment préciser la table de recherche ?[DELPHI] Comment effacer tous les éléments d'une table ?
Je ne peux inserer une donnee dans une table Access avec ADO (Win XP) 
Plus de sujets relatifs à : Comment sauvegarder une grosse table ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR