viernes, junio 27, 2014

MySQL - Backups Incrementales


Realizar backups incrementales en MySQL se pueden realizar utilizando los "binary logs", son los archivos donde se encuentran almacenadas todas las transacciones de la base de datos.
Activar los binary logs en MySQL
Editar archivo my.cnf nano /etc/mysql/my.cnf
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
La primera linea indica la ruta donde se guardaran los logs, y la segunda linea dice que se borraran los archivos log despues de 10 dias.
El directorio de logs se ve como sigue:
ls -al /var/log/mysql/
total 16
drwxr-s--- 2 mysql adm  4096 Sep  5 10:41 .
drwxr-xr-x 7 root  root 4096 Sep  5 09:52 ..
-rw-rw---- 1 mysql adm   106 Sep  5 10:41 mysql-bin.000001
-rw-rw---- 1 mysql adm    32 Sep  5 10:41 mysql-bin.index
El archivo mysql-bin.000001 es el log activo donde actualmente se estaran guardando todas las transacciones, y el archivo mysql-bin.index es donde estan todos los archivos bin logs.
Creacion de Base de Datos para prueba
Vamos a crear una base de datos de prueba para realizar los backups incrementales.
CREATE DATABASE `backup`;
USE backup;
CREATE TABLE `clientes`(
    `iCliente` INT NOT NULL AUTO_INCREMENT,
    `Cliente` VARCHAR(45) NOT NULL DEFAULT '',
    PRIMARY KEY(`iCliente`)
) ENGINE InnoDB;
Ahora insertamos unos registros
USE backup;
INSERT INTO clientes(Cliente)VALUES('Luis Gomez');
Hacemos el primer backup completo con mysqldump
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 backup > full_backup.sql
--single-transaction hara un dump de las tablas innoDB en un estado consistente,--flush-logs cerrara los logs actuales y abrira uno nuevo, --master-data=2 escribira comentarios en el archivo dump sobre las posiciones de los logs.
Si revisamos el directorio /var/log/mysql/ se abra creado un nuevo archivo mysql-bin.000002 y todos los cambios y transacciones se grabaran en ese archivo, y la siguiente vez que se ejecute un flush-logs o se reinicie el servidor de MySQL se creara el archivo mysql-bin.000003 y asi sucesivamente.
ls -al /var/log/mysql/
total 20
drwxr-s--- 2 mysql adm  4096 Sep  5 10:48 .
drwxr-xr-x 7 root  root 4096 Sep  5 09:52 ..
-rw-rw---- 1 mysql adm   149 Sep  5 10:48 mysql-bin.000001
-rw-rw---- 1 mysql adm   106 Sep  5 10:48 mysql-bin.000002
-rw-rw---- 1 mysql adm    64 Sep  5 10:48 mysql-bin.index
Ahora insertamos mas registros
USE backup;
INSERT INTO clientes(Cliente)VALUES('Jade Gomez');
INSERT INTO clientes(Cliente)VALUES('Victor Gomez');
Ya solo necesitamos hacer flush a los logs, con esto se creara un nuevo archivo mysql-bin.000003, es como un corte, a partir de este momento cualquier cambio se estara almacenando en mysql-bin.000003, pero los cambios anteriores al flush estaran en mysql-bin.000002.
Restarurar binary log
Primero vamos a borrar la base de datos y volverla a crear vacia.
DROP DATABASE backup;
CREATE DATABASE backup;
Ahora hacemos un restore con el primer dump que hicimos
mysql -uroot -p backup < full_backup.sql
La base de datos contiene solo los registros de cuando hicimos el respaldo, pero vamos a agregar lo que viene en el binary log.
mysqlbinlog mysql-bin.000002 | mysql -uroot -p backup
Con esto debemos tener actualizada la base de datos hasta el punto en que hicimos flush log y se comenzo a grabar en el nuevo mysql-bin.000003.