¿Cómo hacer un backup de tablas de MySQL Server con PHP?

Con php puedes ejecutar un mysqldump tanto de tu base de datos MySQL como de sus tablas, así como también particionar en varios archivos las tablas muy grandes.

Extremista

Cuando uno contrata un servidor para alojar páginas web con motor de base de datos MySQL Server, estos suelen ofrecer herramientas como PHP MyAdmin para gestionarlas. Si bien estas herramientas permiten hacer backups, muchas veces es tedioso realizar backups desde las mismas, por lo que es posible realizar los mismos con unas pocas líneas de php utilizando el comando «mysqldump» con ciertos parámetros.

Con la sentencia mysqldump podemos realizar un backup completo de una base de datos, pero debido a que muchas veces nuestras bases de datos pueden ser muy grandes, luego tendríamos problemas para restaurarlas, dado que hay limitaciones en el tamaño de los archivos a restaurar.

Es por ello que muchos sitios precisan realizar backups de sus tablas por separado. Para ello se puede obtener un listado de las tablas de la base de datos con la sentencia «list tables» y al ir recorriendo hacer un backup.

La manera de obtener un listado de la base de datos es la siguiente:

mysql_connect(«HOST», «USUARIO», «CONTRASEÑA») or die(mysql_error());
mysql_select_db(«BASE_DE_DATOS») or die(mysql_error());
$result = mysql_query(‘show tables’);
while($row = mysql_fetch_array($result)){echo $row[0].»<br>»;}
mysql_close();

Recordemos que el «mysql_connect y mysql_select_db» solo hay que utilizarlo al principio, y «mysql_close()» al final de todas las operaciones.

Ahora bien, a continuación te mostraremos la forma de ejecutar un «mysqldump» de una tabla:

$ejecutar = ‘mysqldump –user=USUARIO –password=CONTRASEÑA –host=HOST BASE_DE_DATOS TABLA –skip-add-locks –skip-add-drop-table | sed «s/CREATE TABLE IF NOT EXISTS/CREATE TABLE IF NOT EXISTS IF NOT EXISTS/g» | gzip> CARPETA/TABLA.sql.gz’;

exec($ejecutar);

Esta sentencia realizará un backup de la tabla y lo comprimirá en un archivo .gz en la carpeta especificada. Si queremos obtener el directorio actual podemos usar la sentencia «getcwd()».

Con el parámetro –skip-add-loks evitamos bloqueos en las tablas, y con el parámetro –skip-add-drop-table evitamos que al hacer el restore, elimine los datos de la tabla. Esto es muy útil en el caso de que precisemos realizar un backup parcial de una tabla. Con | sed «s/CREATE TABLE IF NOT EXISTS/CREATE TABLE IF NOT EXISTS IF NOT EXISTS/g» se especifica que solo se cree la tabla en el caso de que no exista, y de existir, solo se realice la restauración de los datos.

En el caso de que una tabla sea muy grande, podemos realizar un backup particionado de la misma, obteniendo así archivos más pequeños para poder utilizarlos en PHPMyAdmin. Para ello utilizaremos –where «1 Limit INICIO, CANTIDAD_DE_REGISTROS». A continuación detallamos un ejemplo:

Supongamos que la tabla wp_posts de WordPress tiene 450.000 registros, por lo que queremos particionarla en bakcups de 100.000 registros cada uno.

$scantidad = 100000; // SE GUARDA DE A CIEN MIL REGISTROS.
$sinicio = 0; // Desde qué registro se backupea, se incrementa de a $scantidad registos.
$result = mysql_query(«SELECT count(*) from `wp_posts`»); //obtenemos cantidad de registros.
$row = mysql_fetch_row($result);
$cantidad = $row[0];
$saltos = ceil($cantidad / $scantidad); // Dividimos la cantidad de registros por la cantidad de registros que queremos hacer bakup. Con «ceil» obtenemos el número redondeado siempre hacia arriba (1,1 = 2, 2,8 = 3).

$dirbk = getcwd().»/bk/»; // Directorio del Backup.

for ($i = 1; $i <= $saltos; $i++) {
$ejecutar = ‘mysqldump –user=USUARIO –password=CONTRASEÑA –host=HOST BASE_DE_DATOS wp_posts –where «1 Limit ‘.$sinicio.’, ‘.$scantidad.'» –skip-add-locks –skip-add-drop-table | sed «s/CREATE TABLE IF NOT EXISTS/CREATE TABLE IF NOT EXISTS IF NOT EXISTS/g» | gzip> ‘.$dirbk.’wp_posts’.$i.’.sql.gz’;
exec($ejecutar);
$sinicio += $scantidad;
}

Con esta opción tendremos el backup de una tabla partido en varios archivos que se pueden restaurar por separado. Para decidir en cuantos archivos partirlo, debes ver cuanto ocupa cada uno y el máximo permitido por phpMyAdmin en tu servidor, sea este GoDaddy, HostGator, Serverloft, BlueHost, El Server o cualquiera que este sea.