c3sarin Posted May 27, 2010 Report Share Posted May 27, 2010 Como estan, aca les dejo un php que se encarga de hacer un respaldo de una base de datos mysql, sin importar qué tan grande sea, yo tengo respaldada la de mi trabajo todos los dias gracias a esta magia que hice, el proceso se demora como minuto y medio y funciona impeque. Les voy a detallar algunas partes del script... ACA PONEN LOS DATOS DE USTEDES, NECESARIOS PARA LA CONECCION $usuario="nombre_usuario"; $passwd="clave"; $host="localhost"; $bd="nombre_base_datos"; $ruta_respaldo="informes/backup/respaldo_".date("d-m-Y").".sql"; ACA SE PONE LA RUTA DONDE VA A QUEDAR EL RESPALDO, en mi caso es informes/backup/ tienen que cambiarle eso para indicar en donde va a quedar metido el archivo, a la carpeta deben darle los permisos necesarios para que este php pueda crear el archivo $registro_tablas_chicas=300;// las tablas que tienen esta cantidad de registros o menos, se consideran como tablas chicas... se respaldan todas juntas, si quieren pueden cambiar esa cantidad, todas las tablas con mas de esa cantidad se respaldan por separado $maximo_registros=30000;//el maximo de registros que aguanta un backup. Si una tabla tiene mas de estos registros, se tiene que respaldar por partes, si una tabla tiene 100.000 registros por ejemplo, se respalda del registro 1 al 30.000, despues el script se refresca solito y respalda del 30.001 al 60.000, despues del 60.001 al 90.000 y finalmente del 90.001 al 100.000 Al echar a andar el script veran que la pagina está en blanco y se va refrescando solita, dejenlo correr hasta que termine, despues les va a aparecer esto : despues donde dice descargar archivo pinchan click derecho / guardar destino como, y guardan el respaldo en la parte del compu que quieran. En mi caso pesa ahora 140 megas el respaldo, pero donde el servidor está en mi mismo trabajo, me demoro un moco, en su caso no sé cuanto se vaya a demorar... Cuando ya tengan respaldado todo, pinchen donde dice eliminar respaldo, para sacar el archivo .sql del servidor, si no hacen eso se les va a llenar de respaldos el pobrecito. Despues me comentan a ver cómo les fue, lo que tienen que hacer es : 1 crear un php, 2 ponerle el codigo que se describe mas abajo, 3 hacer los cambios que ya comenté, sobre todo los de la coneccion. 4 subirlo al servidor en cuestion, asegurense de que la carpeta en que debe quedar el respaldo de verdad exista 5 llamar a la paginita que hace el respaldo 6 respaldar a su pc y despues eliminar el respaldo del servidor. Despues me cuentan como les fue, saludos. ESTE ES EL SCRIPT COMPLETO <? $usuario="nombre_usuario"; $passwd="clave"; $host="localhost"; $bd="nombre_base_datos"; $con=mysql_connect($host,$usuario,$passwd); $ruta_respaldo="informes/backup/respaldo_".date("d-m-Y").".sql"; $array_tablas_chicas=array();//en un array junto todas las tablas chicas $registro_tablas_chicas=300;//las tablas que tienen esta cantidad de registros o menos, se consideran como tablas chicas... se respaldan todas juntas de un viaje $maximo_registros=30000;//el maximo de registros que aguanta un backup. Si una tabla tiene mas de estos registros, se tiene que respaldar por partes if (isset($_GET["paso"])){ $paso=$_GET["paso"]; }else{//no hay get del paso $paso=0; unlink($ruta_respaldo);// Lo borro en caso de que exista }//cerrando altiro el If que ve si hay get del paso // FUNCIONES function crear_respaldo($tablita,$desde,$todo){ global $bd; global $txt; global $maximo_registros; if ($desde==0){//Se respalda la estructura $sql="SHOW CREATE TABLE ".$tablita; $search_estructura_tabla=mysql_db_query($bd,$sql) or die(mysql_error()); while($row=mysql_fetch_array($search_estructura_tabla)) { $estructura=$row[1]; $txt.=$estructura.";\n\n"; }//cerrando el while que recorre la descripccion de la tabla }//cerrando if que revisa si hay que respaldar la estructura de la tabla //Datos if ($todo=='si'){//se respalda toda la tabla $consulta="SELECT * FROM ".$tablita; }else{//se respalda la parte que corresponde $consulta="SELECT * FROM ".$tablita." LIMIT ".$desde.",".$maximo_registros; }//cerrando If que ve si se respalda toda la tabla o una parte de ella $respuesta=mysql_db_query($bd,$consulta) or die (mysql_error()); while($fila=mysql_fetch_array($respuesta,MYSQL_ASSOC)){ $columnas=array_keys($fila); foreach($columnas as $columna){ if(gettype($fila[$columna])=="NULL"){ $values[]="NULL"; }else{ $values[]="'".$fila[$columna]."'"; } }//end del foreach $txt.="INSERT INTO `$tablita` VALUES (".implode(",",$values).");\n"; unset($values); }//cerrando el while //Fin de Datos $txt.="\n\n\n";//para hacer espacio a la escructura de la siguiente tabla, para que no quede todo junto }//Fin de la funcion //********************************************************** //********************************************************** function respaldar(){ global $ruta_respaldo; global $txt;//texto que hay que chantar global $paso; /* $salida2=str_replace("ñ" , "ñ" , $salida2); $salida2=str_replace("Ñ" , "ñ" , $salida2); $salida2=str_replace("á" , "á" , $salida2); $salida2=str_replace("Á" , "á" , $salida2); $salida2=str_replace("é" , "á" , $salida2); $salida2=str_replace("É" , "á" , $salida2); $salida2=str_replace("í" , "á" , $salida2); $salida2=str_replace("Í" , "á" , $salida2); $salida2=str_replace("ó" , "á" , $salida2); $salida2=str_replace("Ó" , "á" , $salida2); $salida2=str_replace("ú" , "á" , $salida2); $salida2=str_replace("Ú" , "á" , $salida2); */ if ($paso==0){ $fp=fopen($ruta_respaldo,"w"); }else{ $fp=fopen($ruta_respaldo,"a"); }//cerrando altiro el if fputs($fp,$txt); fclose($fp);//cierro el archivo, ya que terminé de meterle las lineas }//fin de la funcion // FIN FUNCIONES //Recorro las tablas de la base de datos y veo cuantos registros tiene cada una de ellas $contador_tablas=1;//Por defecto, para llevar el orden de la que toca respaldar en cada momento $search_tablas=mysql_db_query($bd,"SHOW TABLES FROM $bd") or die(mysql_error()); $cantidad_tablas_base_datos=mysql_num_rows($search_tablas); while($row = mysql_fetch_array($search_tablas)) { $tabla=strtolower($row[0]); $search_info_tabla=mysql_db_query($bd,"DESCRIBE $tabla") or die(mysql_error()); //La consulta sacada lanza todos los atributos de la entidad, pero solo me interesa en este caso sacar el primero el cual es la clave de la tabla $clave_obtenida='no';//para poder hacer lo anteriormente comentado while($row=mysql_fetch_array($search_info_tabla)) { if ($clave_obtenida=='no'){ $clave_principal=$row[0]; $clave_obtenida='si'; }//cerrando altiro el if que ve si me falta obtener la clave principal }//cerrando el while que recorre la descripccion de la tabla //consulto el total de registros que tiene la tabla $search_total_registros_tabla=mysql_db_query($bd,"SELECT COUNT($clave_principal) FROM $tabla") or die(mysql_error()); while($row = mysql_fetch_array($search_total_registros_tabla)) { $total_registros=$row[0]; }//cerrando el while que recorre la descripccion de la tabla //RESPALDO TABLAS GRANDES if ($total_registros>$registro_tablas_chicas){//es una tabla grande if ($paso==$contador_tablas){//Toca respaldar la tabla !!! if ($total_registros>$maximo_registros){//se respalda por parte if (isset($_GET["from"])){ $from=$_GET["from"]; }else{//no hay get $from=0; }//cerrando altiro el If que ve si hay get del from $tope=$from+$maximo_registros; if ($from<=$total_registros){//se respalda la parte que estamos recorriendo $txt=''; crear_respaldo($tabla,$from,'no'); respaldar(); $from=$from+$maximo_registros;//Para que continue con la siguiente parte echo "<META HTTP-EQUIV='REFRESH' CONTENT=0;URL='backup.php?paso=$paso&from=$from'>"; }//cerrando if que ve si se respalda la parte que estamos recorriendo }else{//se puede respaldar enterita !!! $txt=''; crear_respaldo($tabla,'0','si'); respaldar(); }//cerrando if que revisa si la tabla se respalda por parte o enterita }//cerrando if que revisa si toca respaldar la tabla grande }else{//la tabla es chica, la paso al array de las tablas chicas $array_tablas_chicas[]=$tabla; }//cerrando el if que ve si se trata de una tabla grande //FIN RESPALDO TABLAS GRANDES $contador_tablas++; }//cerrando el while que recorre las tablas de la base de datos // RESPALDO DE LAS TABLAS CHICAS if ($paso==0){ $txt=''; foreach ($array_tablas_chicas as $tabla){ crear_respaldo($tabla,'0','si'); }//cerrando el foreach que recorre el array de las tablas chicas // RESPALDO respaldar(); }//cerrando if que revisa si estamos en el paso 0, respaldo de tablas chicas // FIN RESPALDO DE LAS TABLAS CHICAS if ($paso>$cantidad_tablas_base_datos){//Proceso finalizado // Link hacia el archivo de descarga echo "<a href='$ruta_respaldo'>Descargar respaldo</a><br><br>"; echo "<a href='backup.php?paso=$paso&del=del'>Eliminar respaldo</a>"; echo "<script>alert('Respaldo finalizado');</script>"; if (isset($_GET["del"])){//se borra el respaldo unlink($ruta_respaldo);// Lo borro en caso de que exista echo "<script>alert('Respaldo eliminado');</script>"; }//cerrando if que ve si hay get del parametro para borrar el respaldo }else{//faltan tablas por recorrer $paso=$paso+1; echo "<META HTTP-EQUIV='REFRESH' CONTENT=0;URL='backup.php?paso=$paso'>"; }//cerrando el if que ve si faltan tablas por recorrer ?> Link to comment Share on other sites More sharing options...
sanfield Posted August 1, 2010 Report Share Posted August 1, 2010 Hola lo voy a probar si funciona me serviria mucho. muchas gracias Link to comment Share on other sites More sharing options...
xomarx69 Posted August 27, 2010 Report Share Posted August 27, 2010 Buen aporte para los que trabajan con esta base de datos, pero MySQL no tendrá alguna manera de automatizar respaldos a cinta o a disco?, respaldos incrementales?, respaldos totales?, etc. Saludos. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now