Jump to content

Respaldo de base de datos con PHP


Recommended Posts

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 :

Imagen IPB

 

despues donde dice descargar archivo pinchan click derecho / guardar destino como, y guardan el respaldo en la parte del compu que quieran.

Imagen IPB

 

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("ñ" , "&ntilde" , $salida2);

$salida2=str_replace("Ñ" , "&ntilde" , $salida2);

$salida2=str_replace("á" , "&aacute" , $salida2);

$salida2=str_replace("Á" , "&aacute" , $salida2);

$salida2=str_replace("é" , "&aacute" , $salida2);

$salida2=str_replace("É" , "&aacute" , $salida2);

$salida2=str_replace("í" , "&aacute" , $salida2);

$salida2=str_replace("Í" , "&aacute" , $salida2);

$salida2=str_replace("ó" , "&aacute" , $salida2);

$salida2=str_replace("Ó" , "&aacute" , $salida2);

$salida2=str_replace("ú" , "&aacute" , $salida2);

$salida2=str_replace("Ú" , "&aacute" , $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

  • 2 months later...
  • 4 weeks later...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...