Este artículo muestra cómo realizar un backup parcial o completo de bases de datos MySQL utilizando tan sólo código PHP. Esto es muy útil por ejemplo cuando un cliente no nos facilita datos de acceso a la base de datos de una aplicación web y sólo disponemos de un acceso FTP , o cuando sí disponemos de los datos de conexión a la base de datos pero no podemos acceder a ella a través de la red (sólo disponible en localhost) y tampoco podemos utilizar herramientas como mysqldump para respaldar la información porque no disponemos de privilegios para ello, o simplemente porque no tenemos acceso a una shell a la que conectarnos y ejecutar comandos.
ACTUALIZACIÓN 28/08/2017: trasladado el código fuente de los scripts myphp-backup.php y myphp-restore.php a mi repositorio de GitHub daniloaz/myphp-backup:https://github.com/daniloaz/myphp-backup
Backup de las tablas de una base de datos MySQL
En cualquiera de los escenarios anteriores, simplemente copiando y ejecutando el script PHP myphp-backup.php como indico más abajo podremos hacer un export completo o parcial (sólo algunas tablas) de la base de datos a un fichero .sql o .sql.gz que podremos descargar después desde la misma cuenta FTP. El script incluye la clase Backup_Database que se encarga de realizar todas las operaciones necesarias y dispone de distintas opciones de configuración para controlar en qué subdirectorio queremos que se almacenen los ficheros de backup y si queremos que se compriman con gzip o no. También deberemos establecer las credenciales de usuario para acceder a la base de datos, así como el nombre de ésta:
/**
* Define database parameters here
*/
define("DB_USER", 'your_username');
define("DB_PASSWORD", 'your_password');
define("DB_NAME", 'your_db_name');
define("DB_HOST", 'localhost');
define("BACKUP_DIR", 'myphp-backup-files'); // Comment this line to use same script's directory ('.')
define("TABLES", '*'); // Full backup
//define("TABLES", 'table1 table2 table3'); // Partial backup
define("CHARSET", 'utf8');
define("GZIP_BACKUP_FILE", true); // Set to false if you want plain SQL backup files (not gzipped)
Normalmente las aplicaciones PHP disponen de un fichero de configuración tipo config.php o similar en el que podremos encontrar el usuario y contraseña de la base de datos en caso de no recordarlas o si nuestro cliente no nos ha facilitado dicha información.
Si no disponemos de permisos suficientes para crear el subdirectorio donde se almacenarán nuestros ficheros de copia de seguridad (por defecto myphp-backup-files/), podremos utilizar un directorio existente. Normalmente las aplicaciones PHP disponen de algún subdirectorio con suficientes permisos para crear nuevos archivos (cache, tmp, temp, etc.), que es donde diremos a nuestro script myphp-backup.php que deje el fichero con el backup de la base de datos. También podremos usar el propio directorio raíz (DocumentRoot). Para ello asignaremos simplemente un punto (‘.’) a la constante BACKUP_DIR.
El fichero .sql.gz o .sql generado como resultado de utilizar la clase Backup_Database del script myphp-backup.php tendrá un nombre del tipo myphp-backup-\{DB_NAME\}-YYYYmmdd_HHMMSS.sql.gz:
$ ls myphp-backup-files/*.sql.gz
myphp-backup-files/myphp-backup-smf-20160131_111735.sql.gz
Restauración de las tablas de una base de datos MySQL
El fichero anterior contendrá el código SQL comprimido (o no) listo para reproducir la estructura y el contenido de la base de datos original en otra base de datos distinta o en la misma sustituyendo los datos existentes por los de nuestro fichero de backup. Para efectuar la restauración simplemente ejecutaremos el otro script de mi repositorio: myphp-restore.php. Lo único que tendremos que hacer para realizar la restauración es subir al servidor en el que queramos hacer la importación tanto el script myphp-restore.php como el propio fichero de backup, que indicaremos mediante la constante BACKUP_FILE a una carpeta en la que tengamos permisos de escritura y que indicaremos mediante la constante BACKUP_DIR.
Las opciones de configuración de las que dispone el script myphp-restore.php son las siguientes:
/**
* Define database parameters here
*/
define("DB_USER", 'your_username');
define("DB_PASSWORD", 'your_password');
define("DB_NAME", 'your_db_name');
define("DB_HOST", 'localhost');
define("BACKUP_DIR", 'myphp-backup-files'); // Comment this line to use same script's directory ('.')
define("BACKUP_FILE", 'your-backup-file.sql.gz'); // Script will autodetect if backup file is gzipped or not based on .gz extension
define("CHARSET", 'utf8');
El script detectará automáticamente si el fichero de copia de seguridad está comprimido o no con gzip basándose en la extensión de éste, por lo que no tendremos que establecer ninguna configuración adicional para esto.
Código fuente de los scripts de respaldo y restauración
Puedes encontrar el código fuente de ambos scripts en mi repositorio de Github daniloaz/myphp-backup: https://github.com/daniloaz/myphp-backup.
Y nada más. Si se te ocurre alguna característica adicional que pueda ser útil y eches en falta no dudes en dejarme un comentario. ¡Suerte!



Comentarios
Enviar comentario