Mejorando.la Conferencia, 24 y 25 de febrero, Ciudad de México y transmisión online

Foros del Web » Programación para sitios web » PHP »

BackUp de MySQL con PHP y compresión ZIP

Estas en el tema de BackUp de MySQL con PHP y compresión ZIP en el foro de PHP en Foros del Web. Muy buenas La base de datos con la que trabajo ha llegado a 1GB de tamaño, por lo que seguir haciendo dumps a lo bruto ...
  #1 (permalink)  
Antiguo 01/02/2010, 06:46
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Málaga, España
Mensajes: 182
Información BackUp de MySQL con PHP y compresión ZIP

Muy buenas

La base de datos con la que trabajo ha llegado a 1GB de tamaño, por lo que seguir haciendo dumps a lo bruto no es viable.

Es por ello que me he currado un script y lo he añadido al "cron diario" del servidor.

La forma de funcionar es ver las distintas bases de datos de usuario y volcarlas mediante el comando mysqldump. Posteriormente se comprime en ZIP y se eliminan los archivos temporales utilizados. Luego eliminaría las copias antiguas (en este caso, anteriores a 3 dias)

He visto en otro tema un script bastante bueno que prescinde del uso de mysqldump (enlace), pero tardaría más en ejecutarse.

Código PHP:
<?php
#############################################
#
# Tarea de copia seguridad de todas las bases de datos en MySQL
#
# CopyLeft, puedes hacer con este script lo que te de la gana
#
#############################################
set_time_limit(0);
header("Content-type: text/plain; charset=UTF-8");
echo 
date("Y-m-d H:i"time()) . " Creando copia de seguridad MySQL...\r\n";

// Datos de acceso a MySQL
$myhost "localhost";
$myuser 'root';
$mypass 'miclave';
$DB mysql_connect($myhost$myuser$mypass) or die(date("Y-m-d H:i"time()) . " ERROR!! No se pudo conectar a MySQL.\r\n");

// Otros parámetros
$OUTDIR "D:\\backup\\"// Cambiar segun necesidades y tipo servidor
$now date("YmdHi"time());
$outfile "MySQL_$now.zip";
$periodo time() - 259200// Los archivos anteriores a este periodo (3 dias = 259200 segundos) serán borrados

// Crear nuevo archivo ZIP
# Más información sobre la clase PHP
# http://es.php.net/manual/en/class.ziparchive.php
echo date("Y-m-d H:i"time()) . " Creando '$OUTDIR$outfile.zip' ... ";
$zip = new ZipArchive;
if (!
$zip->open("$OUTDIR$outfile"ZIPARCHIVE::CREATE)) die("ERROR!!\r\n");
echo 
"OK.\r\n";

// Tomar un listado de bases de datos
$q mysql_query("SHOW DATABASES");

// Volcar todas las bases
while ($database mysql_fetch_row($q))
    if (
$database[0] != "information_schema" && $database[0] != "mysql")
        {
        
// Nombrar archivo
        
$filename "{$database[0]}.sql";
        
$tempfile date("YmdHis"time()) . ".~swap";

        echo 
date("Y-m-d H:i"time()) . " Volcando '$filename' ... ";

        
// Volcar datos
        
system("mysqldump -h $myhost -u $myuser -p$mypass --opt {$database[0]} > $OUTDIR$tempfile");

        echo 
"OK.\r\n"
        
date("Y-m-d H:i"time()) . " Agregando '$filename' a '$outfile' ... ";

        
//  Agregar archivo al ZIP
        
$zip->addFile($OUTDIR.$tempfile$filename);

        
// Recordar los temporales utilizados
        
$DUMPFILES[] = $OUTDIR.$tempfile;

        echo 
"OK.\r\n";
        }

// Desconectar de la base de datos
mysql_close($DB);

// Cerrar archivo ZIP
$zip->close();

// Eliminar temporales. Importante hacerlo DESPUÉS de cerrar el ZIP
foreach($DUMPFILES as $file)
    
unlink($file);

// Elminar archivos antiguos
echo date("Y-m-d H:i"time()) . " Eliminando copias antiguas...\r\n";
$D opendir($OUTDIR);
while (
$F readdir($D))
    if (
$F != "." && $F != "..")
        if (
filectime($OUTDIR.$F) < $periodo)
            if (!
unlink($OUTDIR.$F))
                echo 
date("Y-m-d H:i"time()) . " No se pudo eliminar el archivo $F.\r\n";        
closedir($D);

echo 
date("Y-m-d H:i"time()) . " Tarea finalizada.\r\n";
?>
Gracias a la compresión en ZIP ahora la copia diaria ocupa ~77MB en vez de ~1GB.

Espero que os sirva a muchos/as.

Saludos
  #2 (permalink)  
Antiguo 01/02/2010, 07:37
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 13.704
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Gracias por compartirlo, lo pruebo y te dejo saber.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 01/02/2010, 09:19
 
Fecha de Ingreso: abril-2009
Mensajes: 45
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Buenas yo tambien tengo un Script muy Similar a ese solo que no uso system si no ssh_exec

pero eso no importa... de echo tengo un problema similar de permisos en un servidor compartido...

de echo voy a abrir un tema pero gracias por compartirlo
  #4 (permalink)  
Antiguo 01/02/2010, 09:25
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Málaga, España
Mensajes: 182
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Cita:
Iniciado por AztekaMX Ver Mensaje
Buenas yo tambien tengo un Script muy Similar a ese solo que no uso system si no ssh_exec

pero eso no importa... de echo tengo un problema similar de permisos en un servidor compartido...

de echo voy a abrir un tema pero gracias por compartirlo
Los permisos pueden ser un dolor de cabeza si ejecutas el script desde el servidor web, ya que en window$ se ejecutan como WWWUSR (o algo así) y en linux se ejecutan con los privilegios del propietario del script.

Al ponerlo en tareas programadas se ejecuta como el propietario de la tarea (que debe ser un administrador).
Al ponerlo en el cron puedes especificar quien ejecuta la tarea (que "normalmente" es root)

Te lo cuento porque yo tuve el problema de privilegios al probar el script desde web, pero desde tareas programadas va perfecto.

Suerte.
  #5 (permalink)  
Antiguo 26/05/2011, 15:46
 
Fecha de Ingreso: mayo-2010
Mensajes: 39
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Eres un genio!!!. Este script es...en dos palabras impre - zionante.
Muchas gracias por compartirlo.

Etiquetas: backup, mysql, zip
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas

¿Nuevo en el foro? Regístrate



La zona horaria es GMT -6. Ahora son las 00:07.
SEO by vBSEO 3.3.2