Clonar una web: la base de datos

Clonar una web se divide básicamente en clonar los archivos y clonar la base de datos. Y si como en nuestro caso además queremos mantener una copia actualizada con relativa frecuencia deberemos automatizar este proceso. En esta entrada veremos cómo de sencillo es hacerlo intentando mantener la máxima compatibilidad con cualquier tipo de hosting.

Conar Web

Esta entrada pertenece a la serie Clonar una web en un servidor local. Por ese motivo te recomiendo que leas dicho artículo para darle perspectiva a este. Sea como sea, este artículo puede ser leído sin la referencia anterior, pero perderemos ciertos matices que quizás resulten interesantes.

Backup de la base de datos remota

En función del hosting que tengamos contratado dispondremos de una serie de funcionalidades. Por norma general si has contratado un VPS o servidor dedicado tendrás la posibilidad de ejecutar scripts de consola, lo cual ofrece muchas posibilidades para la tarea que queremos realizar.

Si por el contrario dispones de un hosting compartido no sueles tener acceso a esta opción, así que para dar respuesta a la mayor cantidad de situaciones posibles realizaremos el backup con PHP, más concretamente haremos uso de la clase MySql Backup Lite que introducimos en la entrada Backup de base de datos MySQL con PHP. Y para programar la ejecución de esta tarea nos ayudaremos de nuestro servidor local, dónde programaremos la ejecución de un script que acceda a la url que realiza el respaldo.

Para no extendernos demasiado y no repetirnos, no copiaremos la clase en esta entrada, puedes encontrarla en los enlaces del párrafo anterior.

Así que crearemos un script en PHP en nuestro servidor remoto que llamaremos backUpDb.php en el directorio scripts que tras ser ejecutado generará una copia de la base de datos en el archivo backups/wordpressBackUp.sql.

include('MySqlBackup.php');

$arrayDbConf['host'] = 'dbHost';
$arrayDbConf['user'] = 'dbUser';
$arrayDbConf['pass'] = 'dbPassword';
$arrayDbConf['name'] = 'wordpressDbName';

try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck->backUp();
  $bck->setFileDir('../backups/');
  $bck->setFileName('wordpressBackUp.sql');
  $bck->saveToFile();

}
catch(Exception $e) {

  die($e);

}

Si nuestro hosting tiene habilitada la conexión remota a la base de datos este paso podríamos ejecutarlo en el servidor local. Como no siempre tendremos esta opción, nos hemos decantado por la alternativa más universal.

Y puesto que en este ejemplo el backup es de una plataforma WordPress, y que por ese motivo los datos de conexión a la base de datos ya están especificados en un archivo de configuración escrito en PHP, sería más interesante hacer un include del archivo wp-config.php y obtenerlos desde ahí. De nuevo, en pro de mantener esta entrada lo más genérica posible hemos decidido hacerlo así.

Programar la ejecución del backup de la base de datos

Una vez más existen múltiples opciones para programar esta tarea, unas más elegantes que otras. En un VPS programar una tarea con Cron sería lo más lógico y eficiente, pero tal y como hemos comentado, tomaremos la opción que podemos aplicar independientemente del hosting que tengamos: utilizaremos Cron en nuestro servidor local para programar una tarea que ejecute el script de backup de base de datos que acabamos de crear en el host remoto.

Para ello creamos un script de consola y le asignamos los permisos necesarios:

mkdir ~/scripts
vim ~/scripts/cloneWebDb.sh
chmod 0755 ~/scripts/clonWebDb.sh

Con el siguiente contenido:

#!/bin/bash

curl -Is https://url.com/scripts/backUpDb.php

Y programamos la ejecución del script con Cron:

crontab -e

E incluimos la siguiente línea en el archivo crontab:

0 1 * * 5 ~/scripts/clonWebDb.sh

Asegurándonos de que el script se ejecuta cada Viernes a la 1 de la madrugada. Evidentemente puedes programar la periodicidad que más te convenga. Puedes visitar la entrada Programar tareas en Ubuntu con Cron para profundizar en la programación de tareas con Cron.

Descargar el backup de la base de datos

Lo siguiente es descargar el backup que acabamos de realizar. Lo haremos mediante el protocolo ftp, sirviéndonos del comando wget. Para ello agregamos una línea más a nuestro script clonWeb.sh, de forma que quede así:

#!/bin/bash

curl -Is https://url.com/scrpts/backUpDb.php
wget -q --user=user --password='password' --directory-prefix=~/webBackUp fttp://ftp.url.com/backups/wordpressBackUp.sql

Dónde:

  • -q, oculta los mensajes de salida del comando
  • –user=user, es el usuario ftp
  • –password=’password’, es la contraseña del ftp
  • –directory-prefix=~/webBackUp, es el directorio dónde copiaremos los archivos
  • fttp://ftp.url.com/backups/wordpressBackUp.sql, es el ftp con el path del que queremos descargar los archivos

Con esto ya habremos descargado nuestra base de datos en el directorio ~/webBackUp/ftp.url.com/backups/wordpressBackUp.sql. El siguiente paso será restaurarla.

Restauración de la base de datos

Y para restaurar la base de datos en nuestro servidor local la estrategia que seguiremos será:

  1. Eliminamos la base de datos.
  2. Volvemos a crear base de datos vacía.
  3. Restauramos la base de datos desde el backup.

Como puedes ver el proceso es bastante crítico pues elimina completamente la copia existente. Además hará que durante el tiempo que toma el proceso nuestro clon local no esté accesible. En mi caso el uso que le voy a dar es disponer de una réplica de una web en productivo en un servidor local para realizar pruebas. Para este uso el riesgo es perfectamente asumible, y en todo el tiempo que llevo utilizándola no he tenido ningún tipo de problema. Evidentemente, tú deberás evaluar si este riego y esta parada de servicio son asumibles para ti.

Así que crearemos un script SQL que elimine completamente la base de datos y vuelva a crearla. De nuevo lo haremos dentro de la carpeta ~/scripts y lo llamaremos dropAndCreateDb.sql. El contenido será el siguiente:

DROP DATABASE localDbName;
CREATE DATABASE localDbName;

Y agregamos dos líneas más a nuestro script de consola para ejecutar

#!/bin/bash

curl -Is https://urlToScript.com/backUpDb.php
wget -N -q --user=user --password='password' --directory-prefix=~/webBackUp ftp://ftp.miweb.com/path/backups/wordpressBackUp.sql
mysql -u localDbUserName -plocalDbPassword localDbName < ~/scripts/dropAndCreateDb.sql
mysql -u localDbUserName -plocalDbPassword localDbName < ~/webBackUp/ftp.url.com/backups/wordpressBackUp.sql

Actualización de los datos relativos al entorno

El último paso para dar por completado el proceso de clonación de nuestra base de datos será reemplazar todos los datos datos necesarios para que nuestro clon funcione perfectamente. Este paso es el que más puede variar de un entorno a otro, a continuación os dejo un ejemplo bastante básico para un blog realizado en wordpress:

update wp_options set option_value='http://192.168.1.10' where option_name='siteurl';
update wp_options set option_value='http://192.168.1.10' where option_name='home';
update wp_posts set guid=REPLACE(guid, 'blog.ahierro.es', '192.168.1.146:8085') where guid like '%blog.ahierro.es%';

Vosotros tendréis que localizar las tablas, campos y registro a modificar en vuestras plataformas. En el ejemplo expuesto las dos primeras líneas hacen referencia a datos de configuración y son imprescindible, pues de no actualizar estos campos nuestro wordpress local siempre redirigiría al remoto.

Créditos y Referencias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *