| 
	
		|  Autor | Tema: Problema para realizar respaldo de MySQL con PHP !!  (Leído 7,249 veces) |  
	| 
			| 
					
						| Diabliyo 
								       
								
								 Desconectado 
								Mensajes: 1.441
								
								 
								shell# _
								
								
								
								
								
								     | 
 
Tengo una aplicacion web casi completada, solo me falta la parte de RESPALDOS, en esta parte tengo la idea de que el usuario con solo presionar un boton se realize un respaldo de todas las tablas y valores de la Base de Datos existente. Estoy iniciando a codificar el script pero no logro obtener los nombres de las tablas :S, vaya, para obtener el contenido de cada tabla solamente utilizo mysql_query()  y meto toda la consulta a un mysql_fetch_array() . Pero no encuentro como obtener los nombres de las tablas  ?? (show tables; )... Alguna idea ??... <?php		if( !strcmp($_GET["set"], "generar_respaldo") ) //genera un nuevo respaldo			{			$file= fopen( "backups/respaldo_". date( "dmy", time() ). ".mysql", "w" );			$link= conectar(); 			fputs( $file, "#################################################\n" );			fputs( $file, "#########\tTABLAS DEL SISTEMA\t#########\n" );			fputs( $file, "#################################################\n" ); 			//escribiendo tablas :: No tengo idea como obtener los NOMBRES de las TABLAS :(			//while( $buf= mysql_fetch_array( mysql_query( "show tables;", $link ) ) )			//	fputs( $file, "create table ". $buf. "\n" );			//unset($buf); 			fputs( $file, "\n#########################################################\n" );			fputs( $file, "#########\tINFORMACION DE LAS TABLAS\t#########\n" );			fputs( $file, "#########################################################\n" ); 			//mysql_close($link); 			echo "Respaldo Generado con exito.";			}?>
 bye bye
 
 |  
						| 
								|  |  
								| « Última modificación: 23 Septiembre 2008, 22:37 pm por Diabliyo » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Diabliyo 
								       
								
								 Desconectado 
								Mensajes: 1.441
								
								 
								shell# _
								
								
								
								
								
								     | 
 
Listo, solucione como visualizar las tablas, ahora estoy buscando como obtener no solo los valores de los campos de las tablas, sino el tipo de campo para escribirlo en el archivo que genera mi aplicacion PHP. Aqui el pedazo de script que llevo: <?php			//escribiendo TABLAS				{				fputs( $file, "create table ". $buf[0]. "(" );				$cons2= mysql_query( "describe ". $buf[0]. ";", $link );				$i=0;				$primary_key=0;					{					if( $i>0 )					else						$primary_key= $buf2[0];					fputs( $file, $buf2[0] );					$i++;					}				fputs( $file, ", PRIMARY KEY(". $primary_key. ")" );				}?>
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| :ohk<any> 
								       
								
								 Desconectado 
								Mensajes: 1.744
								
								 
								Yo lo que quiero que me salga bien es la vida.
								
								
								
								
								
								     | 
 
Seria bueno destripar el Phpmyadmin, para ver las consultas y el codigo empleado para generar los respaldos.
 Me has picado con la idea, voy a buscar al respecto.
 Un saludo
 |  
						| 
								|  |  
								|  |  En línea | 
 
 Y es que a veces pienso que si no estuviera loco no podría salir adelante.Lo que no se es capaz de dar, en realidad no se posee, uno es poseído por ello.
 |  |  |  | 
			| 
					
						| Diabliyo 
								       
								
								 Desconectado 
								Mensajes: 1.441
								
								 
								shell# _
								
								
								
								
								
								     | 
 
Gracias por tu interes ohk , pero si gustas puedes aportarle algo a mi script, hasta el momento ya puedo generar el respaldo casi por completo, ya pudo escribir los crate table  y solo me falta escribir la parte de los values()  en lo que es inser into . Por favor ayudenme con la variabe $big_buffer , es la clave para terminar el script, aun estoy en eso    !! Aqui dejo el avance del script hasta ahorita: <?php		if( !strcmp($_GET["set"], "generar_respaldo") ) //genera un nuevo respaldo			{			$file= fopen( "backups/respaldo_". date( "dmy", time() ). ".mysql", "w" ); //creamos archivo script backup			$link= conectar(); //conectamos a la BDD 			fputs( $file, "#################################################\n" );  //escribimos			fputs( $file, "#########\tTABLAS DEL SISTEMA\t#########\n" );  //escribimos			fputs( $file, "#################################################\n" );  //escribimos 			//escribiendo TABLAS			$cons= mysql_query( "show tables;", $link ); //observamos las nombre de las tablas			while( $buf=mysql_fetch_row($cons) ) //las introducimos con 'mysql_fetch_row'				{				fputs( $file, "create table ". $buf[0]. "(" ); //escribimos				$cons2= mysql_query( "describe ". $buf[0]. ";", $link ); //observamos la descripcion de las tablas				$i=0; //inicializacion				$primary_key=0; //inicializacion para detectar el PRIMARY KEY					{					if( $i>0 ) //si el inicializados es mayor a 0						fputs( $file, ", " ); //escribimos					else //estamos en el primer valor, por lo tanto es el PRIMARY KEY						$primary_key= $buf2["Field"]; //copiamos PRIMARY KEY					fputs( $file, $buf2["Field"] ); //escribimos 					//estereotipos de campos en bases de datos MySQL					fputs( $file, " ". $buf2["Type"] ); //Type, Tipo (varchar, text, int, bigint, etc...)					fputs( $file, " not NULL" ); //not NULL, todo llevara not null :D					$i++; //incrementamos					}				fputs( $file, ", PRIMARY KEY(". $primary_key. ")" ); //escribimos PRIMARY KEY				fputs( $file, ");\n" ); //escribimos cierre del 'create table'				} 			fputs( $file, "\n#########################################################\n" ); //escribimos			fputs( $file, "#########\tINFORMACION DE LAS TABLAS\t#########\n" );  //escribimos			fputs( $file, "#########################################################" );  //escribimos 			/*			El metodo de insercion debe ser asi:			insert into TABLA(ID, VALOR1, VALOR2 ) values( 'valor', 'valor', 'valor' );			*/ 			$cons= mysql_query( "show tables;", $link );  //observamos las tablas			while( $buf=mysql_fetch_row($cons) )  //metemos los valores con 'mysql_fetch_row'				{				//creamos el buffer de contenido de VALUES, para insertarlo al final				/*$i=0;				while( $tr_buf= mysql_query( "select * from ". $buf[0]. ";", $link ) )					{					$big_buffer[$i]="";					$cons2= mysql_query( "describe ". $buf[0]. ";", $link );					while( $buf2=mysql_fetch_array($cons2) )						{						if( $i>0 )							$big_buffer[$i] .= ",";						$big_buffer[$i] .= "'". $tr_buf[$buf2["Field"]]. "'";						}					$i++;					}				unset($cons2);				unset($buf2);				unset($i);				unset($tr_buf);*/ 				//iniciamos ciclo segun el numero de miembros insertados existente en dicha tabla				for( $j=0; $j<mysql_num_rows( mysql_query( "select * from ". $buf[0]. ";", $link )); $j++) //ciclo					{					fputs( $file, "\ninsert into ". $buf[0]. "(" ); //escribimos principio del INSERT					$cons2= mysql_query( "describe ". $buf[0]. ";", $link );  //obtenemos descripcion de la tabla					$i=0;						{						if( $i>0 )						fputs( $file, $buf2["Field"] );						$i++;						}					fputs( $file, ")" ); //finalizamos INSERT 					fputs( $file, "values(" ); //abrimos el VALUES					//fputs( $file, $big_buffer[$i] ); //escribimos resultados					fputs( $file, ");" ); //finalizamos VALUES					}				}  			echo "Respaldo Generado con exito.";			}?>
 |  
						| 
								|  |  
								| « Última modificación: 24 Septiembre 2008, 01:50 am por Diabliyo » |  En línea | 
 
 |  |  |  |  |  | 
			| 
					
						| Diabliyo 
								       
								
								 Desconectado 
								Mensajes: 1.441
								
								 
								shell# _
								
								
								
								
								
								     | 
 
mysqldump es funcional solo en Servidores Locales (localhost), pero si hablamos de Servidores de Hosting Gratuito o de Pago, la limitacion de utilizacion de funciones como: exec(), system(), shell(), no permiten utilizar mysqldump  asi que seria ineficiente la idea    !!... Abria que forzosamente hace un codigo personalizado y funcional para cualquier situacion    !!.. Entre mas portables y funcionales seamos, y evitemos el uso de aplicaciones secundarias, es mas efectivo !!... Aun continuo con el codigo, se aceptan aportaciones, ya que aun no queda listo el codigo    !!.. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Hans el Topo 
								       
								
								 Desconectado 
								Mensajes: 1.754
								
								 
								"Estoy cansado de no hacer nada"
								
								
								
								
								
								     | 
 
bueno, en todos los hostings que he estado permiten al menos el system,
 he estado buscando un código que híce hace bastante tiempo para realizar lo mismo que tu y no he sido capaz de encontrarlo, además creo que lo borré justamente la semana pasada
 mi script simplemente hacía backup del contenido de las tablas, algunas cosillas que me dierón problemas :
 
 -los datos binarios y derivados (blob) se suelen corromper a la hora de tratarlos
 
 -otro tema a tener en cuenta es que si no realizas los inserts compuestos debes repetir la cabecera cada x kb porque sino peta
 
 si saco un poco de tiempo te preparo el tema de datos
 
 
 
 
 
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Diabliyo 
								       
								
								 Desconectado 
								Mensajes: 1.441
								
								 
								shell# _
								
								
								
								
								
								     | 
 
Gracias por tu contestacion Hans el Topo . Pero ahora ya logre realizar el respaldo por con exito , el codigo es el siguiente: <?php		if( !strcmp($_GET["set"], "generar_respaldo") ) //genera un nuevo respaldo			{			$file= fopen( "backups/respaldo_". date( "dmy", time() ). ".mysql", "w" ); //creamos archivo script backup			$link= conectar(); //conectamos a la BDD 			fputs( $file, "#################################################\n" );  //escribimos			fputs( $file, "#########\tTABLAS DEL SISTEMA\t#########\n" );  //escribimos			fputs( $file, "#################################################\n" );  //escribimos 			//escribiendo TABLAS			$cons= mysql_query( "show tables;", $link ); //observamos las nombre de las tablas			while( $buf=mysql_fetch_row($cons) ) //las introducimos con 'mysql_fetch_row'				{				fputs( $file, "create table ". $buf[0]. "(" ); //escribimos				$cons2= mysql_query( "describe ". $buf[0]. ";", $link ); //observamos la descripcion de las tablas				$i=0; //inicializacion				$primary_key=0; //inicializacion para detectar el PRIMARY KEY					{					if( $i>0 ) //si el inicializados es mayor a 0						fputs( $file, ", " ); //escribimos					else //estamos en el primer valor, por lo tanto es el PRIMARY KEY						$primary_key= $buf2["Field"]; //copiamos PRIMARY KEY					fputs( $file, $buf2["Field"] ); //escribimos 					//estereotipos de campos en bases de datos MySQL					fputs( $file, " ". $buf2["Type"] ); //Type, Tipo (varchar, text, int, bigint, etc...)					fputs( $file, " not NULL" ); //not NULL, todo llevara not null :D					$i++; //incrementamos					}				fputs( $file, ", PRIMARY KEY(". $primary_key. ")" ); //escribimos PRIMARY KEY				fputs( $file, ");\n" ); //escribimos cierre del 'create table'				} 			fputs( $file, "\n#########################################################\n" ); //escribimos			fputs( $file, "#########\tINFORMACION DE LAS TABLAS\t#########\n" );  //escribimos			fputs( $file, "#########################################################" );  //escribimos 			/*			El metodo de insercion debe ser asi:			insert into TABLA(ID, VALOR1, VALOR2 ) values( 'valor', 'valor', 'valor' );			*/ 			$cons= mysql_query( "show tables;", $link );  //observamos las tablas			while( $buf=mysql_fetch_row($cons) )  //metemos los valores con 'mysql_fetch_row'				{				//creamos el buffer de contenido de VALUES, para insertarlo al final				$i=0;				$cons_tr= mysql_query( "select * from ". $buf[0]. ";", $link );					{					$big_buffer[$i]="";					$cons2= mysql_query( "describe ". $buf[0]. ";", $link );					$r=0;						{						if( $r>0 )							$big_buffer[$i] .= ",";						$big_buffer[$i] .= "'". $tr_buf[$buf2["Field"]]. "'";						$r++;						}					$i++;					} 				//iniciamos ciclo segun el numero de miembros insertados existente en dicha tabla				for( $j=0; $j<mysql_num_rows( mysql_query( "select * from ". $buf[0]. ";", $link )); $j++) //ciclo					{					fputs( $file, "\ninsert into ". $buf[0]. "(" ); //escribimos principio del INSERT					$cons2= mysql_query( "describe ". $buf[0]. ";", $link );  //obtenemos descripcion de la tabla					$i=0;						{						if( $i>0 )						fputs( $file, $buf2["Field"] );						$i++;						}					fputs( $file, ")" ); //finalizamos INSERT 					fputs( $file, " values(" ); //abrimos el VALUES					fputs( $file, $big_buffer[$j] ); //escribimos resultados					fputs( $file, ");" ); //finalizamos VALUES					}				}  			echo "Respaldo Generado con exito.";			}?>
 |  
						| 
								|  |  
								| « Última modificación: 25 Septiembre 2008, 02:10 am por Diabliyo » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Hans el Topo 
								       
								
								 Desconectado 
								Mensajes: 1.754
								
								 
								"Estoy cansado de no hacer nada"
								
								
								
								
								
								     | 
 
se me ha olvidado comentarte que uno de los mayores inconvenientes del script es qye dependerá completamente del tiempo de ejecución máximo que permita el servidor, es decir, cuando tengas muchos mgs de datos si el script tarda más de 30 segundos (el tiempo por defecto) se cortará |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Diabliyo 
								       
								
								 Desconectado 
								Mensajes: 1.441
								
								 
								shell# _
								
								
								
								
								
								     | 
 
se me ha olvidado comentarte que uno de los mayores inconvenientes del script es qye dependerá completamente del tiempo de ejecución máximo que permita el servidor, es decir, cuando tengas muchos mgs de datos si el script tarda más de 30 segundos (el tiempo por defecto) se cortará
 Eso si xD, habra que limitarle el tiempo, yo aconsejaria poner algo asi: <?php //... codigo para generar respaldo ?>
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
   |