Comment sauvegarder une grosse table ?

Comment sauvegarder une grosse table ? - SQL/NoSQL - Programmation

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


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
Reply

Marsh Posté le 24-02-2004 à 09:45:55   

Reply

Marsh Posté le 24-02-2004 à 10:06:08    

mysqldump

Reply

Marsh Posté le 24-02-2004 à 10:07:06    

Dans un script ? :)


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
Reply

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

Reply

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


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
Reply

Marsh Posté le 24-02-2004 à 10:34:35    

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

Reply

Marsh Posté le 24-02-2004 à 10:36:06    

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


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
Reply

Marsh Posté le 24-02-2004 à 10:37:57    

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

Reply

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?

Reply

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

Reply

Marsh Posté le 24-02-2004 à 11:10:07   

Reply

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
la question est de savoir si elle est directement accessible :o


 
comment peut-on savoir ca?

Reply

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.

Reply

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

Reply

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

Reply

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)


Message édité par MagicBuzz le 24-02-2004 à 11:44:57
Reply

Marsh Posté le 24-02-2004 à 11:44:52    

Ou alors t'augmente le timemout...


Message édité par kfman le 24-02-2004 à 11:48:39
Reply

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.

Reply

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


Message édité par kfman le 24-02-2004 à 11:48:32
Reply

Marsh Posté le 24-02-2004 à 11:51:20    

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:

Reply

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

Reply

Marsh Posté le 24-02-2004 à 11:55:33    

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

Reply

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.

Reply

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

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

Reply

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


---------------
Le chat c'est bon, mangez en :p
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed