Volcar base de datos MySQL grande a formato especifico de XML

82 views
Skip to first unread message

alberto diez

unread,
Feb 6, 2013, 11:08:52 AM2/6/13
to phpbar...@googlegroups.com

Tengo que volcar puntualmente (1 vez al día) todo el contenido de una base de datos a un XML.

Hasta ahora no había problemas porque la base de datos tenía uno 25.000 registros y aunque tardara un poco, hacia una consulta que me sacaba toda la información y me iba almacenando la información con el formato que le daba, en un fichero XML.

Ahora la base de datos ha crecido más, y solo lo que es la consulta a la base de datos, me genera un error que me detiene la ejecución, con el mensaje de "Maximum execution time of 600 seconds exceeded"

¿Que me recomendáis, generar el XML por partes, o hay forma de optimizar el servidor y la configuración para solucionar esto? La base de datos seguirá creciendo, por lo que entiendo que quizá la opción sel servidor es "pan para hoy, y hambre para mañana"

¿Que me decis?


victor.g...@gmail.com

unread,
Feb 6, 2013, 12:49:47 PM2/6/13
to phpbar...@googlegroups.com
has probado de poner un set_time_limit(0); al principio del script?

Otra solucion es hacerlo por partes,y que el script se autollame cuando a acabado una porción pasando le el offset
O directamente ejecutar la query con el cliente de cosnola de mysql: mysql -X -e "SELECT * FROM tabla"
Saludos



2013/2/6 alberto diez <alberto...@gmail.com>



--
Has recibido este mensaje porque estás suscrito al grupo "Grupo de programadores PHP de Barcelona" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a phpbarcelona...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a phpbar...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/phpbarcelona?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

Albert Moreno

unread,
Feb 6, 2013, 12:46:49 PM2/6/13
to phpbar...@googlegroups.com

Que tipo de base de datos es?
Es relacional?

El 06/02/2013 18:45, "alberto diez" <alberto...@gmail.com> va escriure:

Carlos Buenosvinos

unread,
Feb 6, 2013, 12:59:06 PM2/6/13
to phpbar...@googlegroups.com
+1 a Victor

Gonzalo Avila Cabrera

unread,
Feb 6, 2013, 1:03:20 PM2/6/13
to phpbar...@googlegroups.com
Realizar esa tarea por PHP no es recomendable... quizás podrías evaluar realizar la operación directamente desde la Base de Datos, pero para ayudaros podrías comentar qué Base de Datos utilizas...

Gonzalo Avila Cabrera

unread,
Feb 6, 2013, 1:01:51 PM2/6/13
to phpbar...@googlegroups.com
Realizar esa tarea por PHP no es recomendable... quizás podrías evaluar realizar la operación directamente desde la Base de Datos, pero para ayudaros podrías comentar qué Base de Datos utilizas...
Saludos Cordiales,
Database Administrator
Gonzalo Ávila Cabrera.
Celular: +56 7 1093 090

Fernando Palomo García

unread,
Feb 6, 2013, 3:30:25 PM2/6/13
to phpbar...@googlegroups.com
o si crece mucho más el volumen quizá "divide y vencerás" , , 

asignas los offsets a diferentes procesos, cada uno genera un xml parcial y al final los unes todos. ejemplo: 

proceso padre: divide la tarea en N jobs

proceso hijo 1...N 
 procesa su parte  y la guarda en output.xml.N 

proceso padre: reune los output.xml.1 ... output.xml.N  uniéndolos en output.xml

php no tiene soporte para threads , a no ser que lo compiles, yo jugué con esto hace años, la verdad que me funcionó bien.  Si no quieres usar hebras,  puedes lanzar a los hijos como procesos background, y que al comenzar cada uno deje un flag en /tmp/ . El proceso principal se queda en un bucle con sleep comprobando que todos los flags están ya bajados para hacer la fase de reunión de outputs. 



Saludos





Eduard Llach

unread,
Feb 6, 2013, 3:45:14 PM2/6/13
to phpbar...@googlegroups.com

Llamadme cutre, pero yo lo que hago en procesos tan grandes es procesar un número máximo de registrios

Select * from tabla limit 0,5000 order by id

Cuando llegó al final

Die('window.location.href="web.php?last_processed_id=xxxx"') ;

Así vuelvo a tener 60 segundos para procesar..

Select * from tabla limit 0,5000 where Id > last_processed_id order by id

Y cuando llego al final, cierro el proceso

Edu

El 06/02/2013 21:30, "Fernando Palomo García" <sev...@gmail.com> va escriure:

alberto diez

unread,
Feb 6, 2013, 4:09:01 PM2/6/13
to phpbar...@googlegroups.com
El time_limit esta probado, pero el problema es con la consulta que saca gran parte de la información. La consulta tiene sus indices y es relacional, pero tengo que sacar los datos con un formato especifico que no defino yo.

Entonces por lo que veo, no me va a quedar otra que hacerlo por trozitos, y unir al final..

Albert Moreno

unread,
Feb 6, 2013, 3:55:04 PM2/6/13
to phpbar...@googlegroups.com

Pienso que para procesos con copias tan grandes, mas que pensar en como hacer la select o juntarlas o lo que sea, habria que girar la tortilla y ver que queremis guardar y porque. Probablemente con un tipo de base de datos no relacional o bien con tablas portables (innodb, myisam), podrias gestionar la copia u operacion directamente del archivo. Mas limpio, rapido y practico.

Vamos es una idea.
Saludos

El 06/02/2013 21:45, "Eduard Llach" <eduar...@gmail.com> va escriure:

victor.g...@gmail.com

unread,
Feb 6, 2013, 4:50:30 PM2/6/13
to phpbar...@googlegroups.com
es raro que con el set_time_limit se muera como haces la llamada, por navegador o desde consola con un curl? te recomiendo lo ultimo poniendo el parámetro de time out (--max-time) yo he corrido proceso largos así y no no se han muerto, bueno si alguno se acababa muriendo por memoria que sera el otro problema que puedes encontrar si lo que generas es muy grande.

Pero como casi todos te hemos dicho lo mejor siempre es divide y vencerás
2013/2/6 alberto diez <alberto...@gmail.com>
El time_limit esta probado, pero el problema es con la consulta que saca gran parte de la información. La consulta tiene sus indices y es relacional, pero tengo que sacar los datos con un formato especifico que no defino yo.

Daniel Vigueras

unread,
Feb 7, 2013, 6:09:29 AM2/7/13
to phpbar...@googlegroups.com
Para una tarea como la tuya de exportar a XML no te recomiendo que lo hagas desde PHP, ya que mysqldump tiene directamente el parámetro -X que te exporta la base de datos en formato XML.

Saludos

--
Daniel Vigueras
http://www.danielvigueras.com
@danielvigueras


El miércoles, 6 de febrero de 2013 a las 22:50, victor.g...@gmail.com escribió:

> es raro que con el set_time_limit se muera como haces la llamada, por navegador o desde consola con un curl? te recomiendo lo ultimo poniendo el parámetro de time out (--max-time) yo he corrido proceso largos así y no no se han muerto, bueno si alguno se acababa muriendo por memoria que sera el otro problema que puedes encontrar si lo que generas es muy grande.
>
> Pero como casi todos te hemos dicho lo mejor siempre es divide y vencerás
>
> --------------------------------------------
> Victor Guardiola Latorre
> http://victor.masquesoft.net
> vic...@masquesoft.net (mailto:vic...@masquesoft.net)
> v_gua...@yahoo.com (mailto:v_gua...@yahoo.com)
> victor.g...@gmail.com (mailto:victor.g...@gmail.com)
> Linux user #288624
> TLF:667367484
> Skype: vguardiola
> or Num#Ext: +(34)931-845517 # 288
> ----
> http://www.masquesoft.net
> http://www.masquejuegos.net
> http://www.masquelinux.net
> http://www.masquewireless.net
>
>
> 2013/2/6 alberto diez <alberto...@gmail.com (mailto:alberto...@gmail.com)>
> > El time_limit esta probado, pero el problema es con la consulta que saca gran parte de la información. La consulta tiene sus indices y es relacional, pero tengo que sacar los datos con un formato especifico que no defino yo.
> >
> > Entonces por lo que veo, no me va a quedar otra que hacerlo por trozitos, y unir al final..
> >
> >
> >
> >
> >
> > El miércoles, 6 de febrero de 2013 17:08:52 UTC+1, alberto diez escribió:
> > >
> > > Tengo que volcar puntualmente (1 vez al día) todo el contenido de una base de datos a un XML.
> > >
> > > Hasta ahora no había problemas porque la base de datos tenía uno 25.000 registros y aunque tardara un poco, hacia una consulta que me sacaba toda la información y me iba almacenando la información con el formato que le daba, en un fichero XML.
> > >
> > > Ahora la base de datos ha crecido más, y solo lo que es la consulta a la base de datos, me genera un error que me detiene la ejecución, con el mensaje de "Maximum execution time of 600 seconds exceeded"
> > >
> > > ¿Que me recomendáis, generar el XML por partes, o hay forma de optimizar el servidor y la configuración para solucionar esto? La base de datos seguirá creciendo, por lo que entiendo que quizá la opción sel servidor es "pan para hoy, y hambre para mañana"
> > >
> > > ¿Que me decis?
> > --
> > Has recibido este mensaje porque estás suscrito al grupo "Grupo de programadores PHP de Barcelona" de Grupos de Google.
> > Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a phpbarcelona...@googlegroups.com (mailto:phpbarcelona%2Bunsu...@googlegroups.com).
> > Para publicar una entrada en este grupo, envía un correo electrónico a phpbar...@googlegroups.com (mailto:phpbar...@googlegroups.com).
> > Visita este grupo en http://groups.google.com/group/phpbarcelona?hl=es.
> > Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
> >
> >
>
>
> --
> Has recibido este mensaje porque estás suscrito al grupo "Grupo de programadores PHP de Barcelona" de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a phpbarcelona...@googlegroups.com (mailto:phpbarcelona...@googlegroups.com).
> Para publicar una entrada en este grupo, envía un correo electrónico a phpbar...@googlegroups.com (mailto:phpbar...@googlegroups.com).
Reply all
Reply to author
Forward
0 new messages