5.3. Copias de seguridad

5.3. Copias de seguridad Dataprix 13 October, 2009 - 22:40

Ningún sistema es perfecto ni está a salvo de errores humanos, cortes en el suministro de la corriente eléctrica, desperfectos en el hardware o errores de software; así que una labor más que recomendable del administrador del servidor de bases de datos es realizar copias de seguridad y diseñar un plan de contingencia. Se deben hacer ensayos del plan para asegurar su buen funcionamiento y, si se descubren anomalías, realizar los ajustes necesarios.

No existe una receta universal que nos indique cómo llevar nuestras copias de seguridad de datos. Cada administrador debe diseñar el de su sistema de acuerdo a sus necesidades, recursos, riesgos y el valor de la información.

MySQL ofrece varias alternativas de copia de seguridad de la información. La primera que podemos mencionar consiste simplemente en copiar los archivos de datos. Efectivamente, es una opción válida y sencilla.

En primera instancia son necesarios dos requisitos para llevarla a cabo:

•    Conocer la ubicación y estructura del directorio de datos.
•    Parar el servicio MySQL mientras se realiza la copia.

En cuanto a la ubicación y estructura del directorio, recordemos que la distribución de MySQL ubica el directorio de datos en /usr/local/mysql/var, las distribuciones GNU/Linux basadas en paquetes como DEB o RPM ubican, por lo general, los datos en /var/lib/mysql.

Si por algún motivo no encontramos el directorio de datos, podemos consultarlo a MySQL. El comando show variables nos muestra todas las variables disponibles, basta realizar un filtro con la clausula like:

mysql> show variables like ´datadir´;
+---------------+-----------------+
| Variable_name |     Value       |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

Una vez ubicados los archivos, detenemos la ejecución del servidor: un modo sencillo de asegurarnos de que la base de datos no será modificada mientras terminamos la copia:

$ mysqladmin -u root -p shutdown

Finalmente, copiamos el directorio completo con todas las bases de datos:

$ cp -r /var/lib/mysql/ /algun_dir/

Por supuesto podemos elegir otras formas de copiarlo o comprimirlo, de acuerdo a nuestras preferencias y necesidades.

$ tar czf mysql-backup.tar.gz /var/lib/mysql

Si queremos copiar sólo una base de datos, copiamos el directorio con el mismo nombre de la base de datos:

$ cp -r /var/lib/mysql/demo/ /algun_dir/respaldo_demo/

También es posible hacer copia de seguridad de una sola tabla.

$ cp -r /var/lib/mysql/demo/productos.* / algun_dir/backup_demo/

Como podemos observar, la organización de la base de datos en MySQL es muy simple:

•    Todas las bases de datos se almacenan en un directorio, llamado el directorio de datos(datadir).

•    Cada base de datos se almacena como un subdirectorio del directorio de datos.

•    Cada tabla se almacena en un archivo, acompañada de otros archivos auxiliares con el mismo nombre y diferente extensión.

El problema de este mecanismo es que debemos detener el servicio de bases de datos mientras realizamos el respaldo.

5.3.1. mysqlhotcopy

5.3.1. mysqlhotcopy Dataprix 13 October, 2009 - 22:47

Un mecanismo que permite realizar la copia de los archivos del servidor sin necesidad de detener el servicio es el script 'mysqlhotcopy'. El script está escrito en Perl y bloquea las tablas mientras realiza el respaldo para evitar su modificación. Se usa de la siguiente manera:

$ mysqlhotcopy demo /algun_directorio

En este caso, creará un directorio /algun_directorio/demo con todos los archivos de la base de datos.

El comando mysqlhotcopy puede recibir sólo el nombre de una base de datos como parámetro:

$ mysqlhotcopy demo

En este caso, creará un directorio /var/lib/mysql/demo_copy.

Este método no funciona para tablas con el mecanismo de almacenamiento tipo InnoDB.

5.3.2. mysqldump

5.3.2. mysqldump Dataprix 13 October, 2009 - 22:58

Las dos opciones anteriores representan copias binarias de la base de datos. El comando mysqldump, en cambio, realiza un volcado de las bases de datos pero traduciéndolas a SQL; es decir, entrega un archivo de texto con todos los comandos necesarios para volver a reconstruir las bases de datos, sus tablas y sus datos. Es el método más útil para copiar o distribuir una base de datos que deberá almacenarse en otros servidores.

$ mysqldump demo > demo.sql

El comando mysqldump ofrece multitud de parámetros para modificar su comportamiento  o  el  tipo  de  volcado  generado:  por  defecto,  genera  sentencias SQL, pero puede generar ficheros de datos tipo CSV u otros formatos. También podemos especificarle que haga el volcado de todas las bases de datos o que sólo vuelque los datos y no la creación de las tablas, etc.

Las primeras líneas del archivo demo.sql según el ejemplo anterior tendrían el siguiente aspecto:

~$ mysqldump demo | head -25
-- MySQL dump 8.21
--
-- Host: localhost Database: demo
---------------------------------------------------------
-- Server version 3.23.49-log
--
-- Table structure for table ´ganancia´
--
DROP TABLE IF EXISTS ganancia;
CREATE TABLE ganancia (
venta enum(´Por mayor´,´Por menor´) default NULL,
factor decimal(4,2) default NULL
) TYPE=MyISAM;
--
Dumping data for table ´ganancia´
--
INSERT INTO ganancia VALUES (´Por mayor´,1.05);
INSERT INTO ganancia VALUES (´Por menor´,1.12);--

La ventaja de utilizar mysqldump es que permite que los archivos puedan ser leídos (y modificados) en un simple editor de textos, y pueden ser utilizados para migrar la información a otro SGBD que soporte SQL. Además soporta todos los tipos de tablas. La desventaja es que su procesamiento es lento y los archivos que se obtienen son muy grandes.

5.3.3. Restaurar a partir de respaldos

5.3.3. Restaurar a partir de respaldos Dataprix 13 October, 2009 - 23:06

En algún momento, sea por el motivo que sea, necesitaremos realizar la restauración de nuestras bases de datos.

Si tenemos una copia binaria del directorio de datos, bastará con copiarla al directorio original y reiniciar el servidor:

# mysqladmin -u root -p shutdown
# cp /algun_dir/respaldo-mysql/* /var/lib/mysql
# chown -R mysql.mysql /var/lib/mysql
# mysql_safe

 

Es importante restaurar también el dueño y el grupo de los archivos de datos, para tener los accesos correctamente establecidos. En este ejemplo se adopta el supuesto que el usuario mysql es el que ejecuta el servidor mysqld.

La restauración de un archivo SQL obtenido con mysqldump, se realiza desde el cliente mysql, la base de datos debe existir, ya que el archivo demo.sql no la crea por defecto.

$ mysql demo -u root -p < demo.sql