Todos sabemos que las copias de seguridad deben programarse
periodicamente. Las copias completos (una captura del estado
de los datos en un momento del tiempo) puede hacerse con
diferentes herramientas, en MySQL. Por ejemplo,
InnoDB Hot Backup
nos provee con una copia
de seguridad en línea sin bloqueos de los archivos de datos
de InnoDB
, y con
mysqldump obtenemos copias de seguridad
lógicas online. En esta explicación utilizaremos
mysqldump.
Supongamos que hacemos una copia de seguridad el domingo, a
las 1 PM, cuando la carga es baja. El siguiente comando hace
un hace una copia de seguridad completa de todas nuestras
tablas InnoDB
de todas las bases de datos:
shell> mysqldump --single-transaction --all-databases > backup_sunday_1_PM.sql
Esto es una copia de seguridad en línea, sin bloqueos, que no
molesta a las lecturas y escrituras de las tablas. Hemos
supuesto antes que nuestras tablas son
InnoDB
, así que
--single-transaction
hace una lectura
consistente y garantiza que los datos vistos por
mysqldump no cambian. (Los cambios hechos
por otros clientes a las tablas InnoDB
no
son vistas por el proceso mysqldump.) Si
también tenemos otros tipos de tablas, debemos suponer que no
han sido cambiadas durante la copia de seguridad. Por ejemplo,
para las tablas MyISAM
en la base de datos
mysql
, debemos suponer que no se estaban
haciendo cambios administrativos a las cuentas MySQL durante
la copia de seguridad.
El archivo .sql
resultante producido por
el comando mysqldump contiene una serie de
sentencias SQL INSERT
que se pueden
utilizar para recargar las tablas volcadas más tarde.
Las copias de seguridad completas son necesarias, pero no son siempre convenientes. Producen ficheros muy grandes y llevan tiempo generarse. No son óptimos en el sentido de que cada copia completa sucesiva incluye todos los datos, incluidas las partes que no han cambiado desde el último. Después de realizar una copia de seguridad completa inicial, es más eficiente hacer copias incrementales. Son más pequeñas, y llevan menos tiempo de realización. A cambio, en el momento de la recuperación, no podrá restaurarlo únicamente recargando la copia completa. También deberá procesar las copias incrementales para recuperar los cambios incrementales.
Para hacer copias de seguridad incrementales, necesitamos
guardar los cambios incrementales. El servidor MySQL debería
ser iniciado siempre con la opción
--log-bin
para que almacene estos cambios
en un archivo mientras actualiza los datos. Esta opción
activa el registro binario, así que el servidor escribe cada
sentencia SQL que actualiza datos en un archivo lllamado
registro binario de MySQL. Miremos al directorio de datos de
un servidor MySQL que fue iniciado con la opción
--log-bin
y que se ha estado ejecutando
durante algunos días. Encontramos estos archivos de registro
binario:
-rw-rw---- 1 guilhem guilhem 1277324 Nov 10 23:59 gbichot2-bin.000001 -rw-rw---- 1 guilhem guilhem 4 Nov 10 23:59 gbichot2-bin.000002 -rw-rw---- 1 guilhem guilhem 79 Nov 11 11:06 gbichot2-bin.000003 -rw-rw---- 1 guilhem guilhem 508 Nov 11 11:08 gbichot2-bin.000004 -rw-rw---- 1 guilhem guilhem 220047446 Nov 12 16:47 gbichot2-bin.000005 -rw-rw---- 1 guilhem guilhem 998412 Nov 14 10:08 gbichot2-bin.000006 -rw-rw---- 1 guilhem guilhem 361 Nov 14 10:07 gbichot2-bin.index
Cada vez que se reinicia, el servidor MySQL crea un nuevo
archivo de registro binario utilizando el siguiente número en
la secuencia. Mientras el servidor se está ejecutando,
podemos comunicarle manualmente que cierre el archivo de
registro binario actual y comience otro nuevo, ejecutando la
sentencia SQL FLUSH LOGS
o con el comando
mysqladmin flush-logs.
mysqldump también tiene una opción para
volcar los logs. El archivo .index
en el
directorio de datos contiene la lista de todos los archivos de
registro binario de MySQL en el directorio. Este archivo se
utiliza para replicación.
El registro binario de MySQL es importante para la restauración, porque son copias incrementales de datos. Si se asegura de volcar los registros cuando hace su copia de seguridad completa, entonces cualquier registro binario creado tras esa copia contiene todos los cambios hechos desde entonces. Modifiquemos el comando mysqldump previo un poco para que vuelque los registros binarios de MySQL en el momento de la copia de seguridad completa, y para que el archivo de volcado contenga el nombre del registro binario actual:
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > backup_sunday_1_PM.sql
Tras ejecutar este comando, el directorio de datos contiene un
nuevo archivo de registro binario,
gbichot2-bin.000007
. El archivo
.sql
resultante contiene estas líneas:
-- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;
Como el comando mysqldump ha hecho una copia de seguridad completa, estas líneas significan dos cosas:
El archivo .sql
contiene todos los
cambios hechos antes de cualquier cambio escrito al
registro binario gbichot2-bin.000007
o posterior.
Todos los cambios registrados tras la copia de seguridad
no están presentes en el archivo
.sql
, pero lo están en el registro
binario gbichot2-bin.000007
o
posterior.
El lunes, a las 1 PM, podemos crear una copia de seguridad
incremental volcando los registros para comenzar un nuevo
registro binario. Por ejemplo, ejecutando un comando
mysqladmin flush-logs creamos
gbichot2-bin.000008
. Todos los cambios
producidos entre el domingo a la 1 PM cuando se hizo la copia
completa, y el lunes a la 1 PM están en el archivo
gbichot2-bin.000007
. Esta copia
incremental es importante, así que es una buena idea copiarla
a un lugar seguro. (Por ejemplo, en cinta o DVD, o copiándolo
a otra máquina.) El martes a la 1 PM, ejecute otro comando
mysqladmin flush-logs. Todos los cambios
desde el lunes a la 1 PM hasta el martes a la 1 PM están en
el archivo gbichot2-bin.000008
(que
también debería ser copiado a un lugar seguro).
Los registros binarios de MySQL ocupan espacio de disco. Para ligerar espacio, púrguelos de vez en cuando. Una manera de hacerlo es borrar los registros binarios que no se necesiten, como cuando hacemos una copia de seguridad completa:
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > backup_sunday_1_PM.sql
Tenga en cuenta que: Borrar los registros binarios de MySQL con mysqldump --delete-master-logs puede ser peligroso si su servidor es un servidor maestro de replicación, porque los servidores esclavos pueden no haber procesado completamente los contenidos del registro binario.
La descripción de la sentencia PURGE MASTER
LOGS
explica lo que debe ser verificado antes de
borrar los registros binarios de MySQL. Consulte
Sección 13.6.1.1, “Sintaxis de PURGE MASTER LOGS
”.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.