Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/02/2010, 06:46
Avatar de mgusdl
mgusdl
 
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
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