Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Cómo hacer copias de seguridad de bases de datos con PHP y mysqldump

Imago voragine.net

Los siguientes scripts de PHP llaman al programa mysqldump para hacer una copia de seguridad de una base de datos. La primera versión, básica, genera un archivo comprimido con gzip que aloja en la ubicación desde donde se ejecute el script. La segunda versión incorpora una salida para cada comando utilizado, para saber en el caso de que haya fallo dónde se ha producido; además utiliza bzip2 como compresor, más eficiente.

Realizar copias de bases de datos mediante un script de PHP puede ser útil si no tenemos acceso SSH al servidor.

Para que estos scripts funcionen el usuario que lo ejecute debe tener permisos para escribir en la ubicación elegida.

Versión 1

<?php
// variables
$dbhost = 'example.org';
$dbname = 'nombre-base-datos';
$dbuser = 'usuario-base-datos';
$dbpass = 'contraseña-base-datos';

$backup_file = $dbname . date("Y-m-d-H-i-s") . '.gz';

// comandos a ejecutar
$command = "mysqldump --opt -h $dbhost -u $dbuser -p$dbpass $dbname | gzip > $backup_file";

// ejecución y salida de éxito o errores
system($command,$output);
echo $output;
?>

El segundo parámetro de la orden system de PHP nos permite almacenar en una variable, $output en este caso, el error estándar del comando ejecutado. En este caso nos mostrará la salida de gzip y no de mysqldump; si ha sido exitoso devuelve 0.

Versión 2

<?php
// variables
$dbhost = 'example.org';
$dbname = 'nombre-base-datos';
$dbuser = 'usuario-base-datos';
$dbpass = 'contraseña-base-datos';

$backup_file = $dbname. "-" .date("Y-m-d-H-i-s"). ".sql";

// comandos a ejecutar
$commands = array(
        "mysqldump --opt -h $dbhost -u $dbuser -p$dbpass -v $dbname > $backup_file",
      "bzip2 $backup_file"
);

// ejecución y salida de éxito o errores
foreach ( $commands as $command ) {
        system($command,$output);
        echo $output;
}
?>

En esta versión, al ejecutar cada comando por separado, obtenemos el estado de cada uno de los comandos.

22 comentarios

    • Por Diego

    Para los hosting que no permitan ejecutar mysqldump, existe una alternativa fácil de instalar vía composer, que desde php, realiza volcados de bases de datos con un montón de opciones (mas o menos las mismas que desde línea de comandos).

    Un saludo.

  1. Hola Diego, veo que también se puede instalar usando curl. Muy interesante tu versión PHP de mysqldump.

    • Por Alejandro •

    Que buena información, muy interesante.
    Yo tengo un caso particular y es que estoy intentando automatizar el envío de informes de las bases de datos postgresql en formato html con pgbadger a un servidor web, pero estoy algo atascado si tienes alguna idea que me puedas compartir te agradecería.
    Saludos

    1. Hola Alejandro,

      tu problema se sale un poco de lo que trata este post… Pero si compartes de alguna manera tu desarrollo le puedo echar un ojo.

    • Por norbertoruiz •

    El codigo es muy simple y va muy bien.

    ¿Se puede elegir la carpeta donde quieras que se guarde el fichero? Si es asi, ¿como quedaria el codigo?

    Gracias de antemano

    1. Hola norbertoruiz,

      el script no incluye una variable para configurar la ruta completa en la que se guardará el backup, sin embargo puedes incluirla en la variable $backup_file.

      Por ejemplo, para guardar las copias de seguridad en la carpeta backups dentro del directorio personal (todo esto en sistemas UNIX/Linux) quedaría de la siguiente manera:

      $backup_file = "/home/usuario/backups/" .$dbname. "-" .date("Y-m-d-H-i-s"). ".sql";

    • Por RODOLFO MIJARES •

    El servidor me arroja este error y veo que tengo todo bien otra cosa como hago para saber si tengo mysqldump Instalado:

    Warning: system() has been disabled for security reasons in /home/u170002603/public_html/respaldo.php on line 21 Warning: system() has been disabled for security reasons in /home/u170002603/public_html/respaldo.php on line 21

    1. Hola Rodolfo, la advertencia que te arroja PHP se debe a que en tu servidor no se puede usar el comando system de PHP. El administrador del servidor lo ha deshailitado por motivos de seguridad. Para activarlo habla con él. Si no es posible, tendrás que cambiar de servidor.

      Para saber si tienes mysqldump instalado puedes conectarte al servidor vía SSH e intentar ejecutar la orden manualmente. Si no tienes acceso vía SSH, puedes preguntarle al administrador del servidor.

    • Por Misael •

    Holaa y si me sale 01 pero la base esta todo bien etc.. que significa que fue exitoso?

    1. Hola Misael, el primer dígito es el código para el comando mysqldump y el segundo para el comando bzip2. El 0 significa que el comando mysqldump se ha ejecutado con éxito. Sin embargo el 1 indica que el comando bzip2 ha fallado. Si lees el manual de bzip puedes saber el significado del código de error:

      Return values: 0 for a normal exit, 1 for environmental
      problems (file not found, invalid flags, I/O errors, &c),
      2 to indicate a corrupt compressed file, 3 for an internal
      consistency error (eg, bug) which caused bzip2 to panic.

    • Por victor manuel •

    A mi me creo el archivo pero esta vacio en 0kb y me manda 11 que significa que no hizo nada algun comentario de que es lo que le pasa? saludos

    1. Hola victor manuel, los 1 significan que los comandos no se ejecutaron con éxito. Normalmente se debe a que alguno de los datos para conectar con el servidor de base de datos (nombre de usuario, contraseña, nombre de la base de datos) no es correcto: 1 for environmental
      problems (file not found, invalid flags, I/O errors, &c)

    • Por cesar •

    hola a mi tambien me paso lo del compañero anterior, me genera el archivo pero nsale con 0 kb,mire los datos localhst root y contraseña y se encuentran bien, sera que tiene algo que ver por q la instalacion del xampp la instale en particion D y en una capeta Z

    1. Hola cesar, esta solución funciona en sistemas Linux, no en Windows.

    • Por darksoul •

    buenas tardes, amigo una pregunta tendras algun ejemplo de un modulo de respaldo de base de datos postgresql con php ?

    1. Hola darksoul, no, no tengo módulo para postgresql :(

  2. me puedes ayudar como creo una base de datos en mi sitio web con instrucciones en php….muchas gracias

    1. Hola Carlos, puedes crear bases de datos usando PHP llamando al comando del sistema mysql con la orden system de PHP.

  3. Hola, buen artículo.

    ¿Cómo podemos eliminar los backups con más de un mes de antigüedad?

    Un saludo,

    1. Hola Juan,

      con system puedes ejecutar cualquier comando o programa. Para encontrar y eliminar archivos de una antigüedad definida puedes usar find, por ejemplo.

    • Por Fher Clímaco •

    Hola disculpa que significa que en el echo de la variable $output, escriba 255

    1. Hola Fher,

      255 es un código que indica error no definido. Es seguro que tu script está dando error. Revisa cada línea para ver dónde puede estar el error. Si no lo encuentras puedes probar a cambiar la manera de ejecutar los comandos para tener un mejor output del error: en vez de system() usar exec() o proc_open().

Dejar un comentario

*
*

 

No hay trackbacks