Herramienta de Respaldo para MySQL: Xtrabackup

Xtrabackup es una herramienta de respaldo en caliente de código abierto y gratuita. En el paquete de Xtrabackup se incluyen principalmente dos herramientas: Xtrabackup e innobackupex. La primera, Xtrabackup, solo puede respaldar los motores InnoDB y XtraDB, mientras que innobackupex es un envoltorio de Xtrabackup que añade la capacidad de respaldra el motor MyISAM.

Es importante destacar que Xtrabackup no respalda estructuras de tablas, disparadores, ni puede distinguir inteligentemente los archivos .idb de datos. Además, innobackupex no soporta completamente los respaldos incrementales, requiriendo combinarse con xtrabackup para lograr una copia completa.

(1). Instalación de xtrbackup

  1. Descarga de paquetes

La dirección de descarga es https://www.percona.com/downloads/, donde se debe buscar Xtrabackup y descargar la versión necesaria. La velocidad de descarga puede ser lenta. En este ejemplo, utilizaremos la versión 2.4.14.

También se necesita descargar el paquete dependiente desde http://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm.

Estos paquetes pueden ser descargados y subidos al servidor CentOS, o utilizarse wget para descargarlos directamente en el servidor.

  1. Extracción e instalación
[root@servidor1 ~]# ls
anaconda-ks.cfg              mysql-5.7.16-1.el7.x86_64.rpm-bundle.tar
libev-4.04-2.el6.x86_64.rpm  Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar
DirectorioMysql
[root@servidor1 ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm 
Advertencia: libev-4.04-2.el6.x86_64.rpm: cabecera V4 DSA/SHA1 Signature, ID de clave 66534c2b: NOKEY
Preparando...                          ################################# [100%]
Actualizando/Instalando...
   1:libev-4.04-2.el6                 ################################# [100%]
[root@servidor1 ~]# tar -xf Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar 
[root@servidor1 ~]# ls
anaconda-ks.cfg                           Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar
libev-4.04-2.el6.x86_64.rpm               percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm
DirectorioMysql                           percona-xtrabackup-24-debuginfo-2.4.14-1.el7.x86_64.rpm
mysql-5.7.16-1.el7.x86_64.rpm-bundle.tar  percona-xtrabackup-test-24-2.4.14-1.el7.x86_64.rpm
[root@servidor1 ~]# yum -y install percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm  // Utilizamos yum para instalar debido a otras dependencias

  1. Archivo de configuración

Se debe modificar el archivo de configuración /etc/my.cnf para asegurar que la sección [mysqld] contenga el parámetro datadir=/var/lib/mysql (que apunta al directorio de datos), ya que xtrbackup utiliza este archivo de configuración para determinar qué archivos respaldar. Luego, reiniciar mysqld.

(2). Uso de xtrbackup

Generalmente se utiliza el script innobackupex, ya que es un script en Perl que envuelve y extiende las funcionalidades de xtrbackup.

  1. Permisos de usuario

Durante el respaldo de bases de datos se involucran dos tipos de usuarios: el usuario del sistema y el usuario interno de la base de datos.

El usuario del sistema necesita tener permisos de lectura, escritura y ejecución (rwx) en el directorio datadir (definido en el archivo de configuración). Por otro lado, el usuario interno de la base de datos necesita los permisos: RELOAD y LOCK TABLES para ejecutar FLUSH TABLES WITH READ LOCK; REPLICATION CLIENT para obtener la posición del archivo de registro binario; CREATE TABLESPACE para la importación de tablas durante la restauración a nivel de tabla; y SUPER para iniciar y detener los hilos del slave en entornos de réplica.

  1. Formatos de comando comunes y parámetros

Formato del comando:

innobackupex [parámetros] [dirección_destino|dirección_origen]

Parámetros comunes:

--user=[usuario_base_datos]    Identidad del usuario para la operación
--password=[contraseña]        Contraseña del usuario de la base de datos
--port=[puerto]                Puerto de la base de datos, por defecto 3306
--stream=[tar|xbstream]       Empaquetado (flujo de datos)
--defaults-file=[archivo_conf] Especifica el archivo de configuración por defecto
--no-timestamp                 No crea directorio con marca de tiempo
--copy-back                   Opción principal para restauración
--incremental                 Utiliza respaldo incremental
--incremental-basedir=[ruta]   Se usa con --incremental, especifica la ruta del respaldo anterior para el incremental

  1. Respaldo completo y restauración

Respaldo completo

[root@servidor1 ~]# innobackupex --user=root --password=contraseña_segura ./respaldo_bd/  // Esto generará mucha información de salida
[root@servidor1 ~]# innobackupex --user=root --password=contraseña_segura ./respaldo_bd/ 2>>./respaldo_bd/registro_respaldo.log  // Para redirigir la salida a un archivo
[root@servidor1 ~]# ls ./respaldo_bd/
2019-06-16_15-49-44  2019-06-16_15-51-23  registro_respaldo.log
[root@servidor1 ~]# ls ./respaldo_bd/2019-06-16_15-49-44/
backup-my.cnf ibdata1 performance_schema xtrabackup_checkpoints xtrabackup_logfile
ib_buffer_pool mysql sys xtrabackup_info
[root@servidor1 ~]# innobackupex --user=root --password=contraseña_segura --no-timestamp ./respaldo_bd/prueba/ 2>>./respaldo_bd/registro_respaldo.log  // Sin marca de tiempo
[root@servidor1 ~]# ls ./respaldo_bd/
2019-06-16_15-49-44  2019-06-16_15-51-23  registro_respaldo.log  prueba
[root@servidor1 ~]# ls ./respaldo_bd/prueba/
backup-my.cnf   ibdata1  performance_schema  xtrabackup_checkpoints  xtrabackup_logfile
ib_buffer_pool  mysql    sys                 xtrabackup_info

Restauración, nota: innobackupex --copy-back no sobrescribirá archivos existentes. Además, durante la restauración es necesario detener el servicio, ya que no es posible restaurar en datadir mientras el servicio está activo.

[root@servidor1 ~]# systemctl stop mysqld
[root@servidor1 ~]# rm -rf /var/lib/mysql/*  // Operación peligrosa, probar en entorno de prueba
[root@servidor1 ~]# innobackupex --copy-back ./respaldo_bd/2019-06-16_15-49-44/ 2>>./respaldo_bd/registro_copia.log
[root@servidor1 ~]# ll /var/lib/mysql
total 12324
-rw-r----- 1 root root      292 6月  16 17:08 ib_buffer_pool
-rw-r----- 1 root root 12582912 6月  16 17:08 ibdata1
drwxr-x--- 2 root root     4096 6月  16 17:08 mysql
drwxr-x--- 2 root root     8192 6月  16 17:08 performance_schema
drwxr-x--- 2 root root     8192 6月  16 17:08 sys
-rw-r----- 1 root root      423 6月  16 17:08 xtrabackup_info
[root@servidor1 ~]# chown -R mysql:mysql /var/lib/mysql  // Reasignar permisos
[root@servidor1 ~]# systemctl start mysqld
[root@servidor1 ~]# mysql -uroot -pcontraseña_segura
mysql: [Advertencia] Usar una contraseña en la interfaz de línea de comandos puede no ser seguro.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle y/o sus empresas afiliadas. Todos los derechos reservados.

Oracle es una marca registrada de Oracle Corporation y/o sus
afiliadas. Otros nombres pueden ser marcas registradas de sus respectivos
propietarios.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

  1. Respaldo incremental y restauración

La implementación de respaldos incrementales depende del LSN (Log Sequence Number) en las páginas de InnoDB. Cada modificación en la base de datos hace que el LSN aumente. El respaldo incremental copiará todas las páginas de datos con un LSN superior al especificado.

Consulta del LSN del respaldo completo

[root@servidor1 ~]# cat ./respaldo_bd/2019-06-16_15-49-44/xtrabackup_checkpoints 
backup_type = full-backuped  // Indica respaldo completo
from_lsn = 0
to_lsn = 2525919
last_lsn = 2525928
compact = 0
recover_binlog_info = 0
flushed_lsn = 2525928

Creación de datos y primer respaldo incremental basado en 2019-06-16_15-49-44

[root@servidor1 ~]# mysql -uroot -pcontraseña_segura
mysql> create database prueba_db;
Query OK, 1 row affected (0.00 sec)

mysql> use prueba_db;
Database changed
mysql> create table empleados_tb(id int,nombre varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into empleados_tb values(1,'juan');
Query OK, 1 row affected (0.00 sec)

mysql> exit
Bye
[root@servidor1 ~]# innobackupex -uroot -pcontraseña_segura --incremental --incremental-basedir=./respaldo_bd/2019-06-16_15-49-44/ ./respaldo_bd/ 2>>./respaldo_bd/registro_respaldo.log
[root@servidor1 ~]# ls respaldo_bd/
2019-06-16_15-49-44  2019-06-16_15-51-23  2019-06-16_17-26-54  registro_respaldo.log  registro_copia.log  prueba
[root@servidor1 ~]# cat respaldo_bd/2019-06-16_17-26-54/xtrabackup_checkpoints 
backup_type = incremental  // Indica respaldo incremental
from_lsn = 2525919
to_lsn = 2530689
last_lsn = 2530698
compact = 0
recover_binlog_info = 0
flushed_lsn = 2530698

Adición de más datos y segundo respaldo incremental basado en el anterior

[root@servidor1 ~]# mysql -u root -pcontraseña_segura
mysql> use prueba_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into empleados_tb values(2,'maria');
Query OK, 1 row affected (0.00 sec)

mysql> exit
Bye
[root@servidor1 ~]# innobackupex --user=root --password=contraseña_segura --incremental --incremental-basedir=respaldo_bd/2019-06-16_17-26-54/ ./respaldo_bd/ 2>>./respaldo_bd/registro_respaldo.log
[root@servidor1 ~]# ls respaldo_bd/                        
2019-06-16_15-49-44  2019-06-16_17-26-54  registro_respaldo.log    prueba
2019-06-16_15-51-23  2019-06-16_17-40-13  registro_copia.log
[root@servidor1 ~]# cat respaldo_bd/2019-06-16_17-40-13/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2530689
to_lsn = 2530892
last_lsn = 2530901
compact = 0
recover_binlog_info = 0
flushed_lsn = 2530901

La restauración de respaldos incrementales es más compleja:

Primero, se deben aplicar los respaldos incrementales al respaldo completo en orden. Comienza con el respaldo completo: innobackupex --apply-log --redo-only [ruta_respaldo_completo]. Luego, para cada respaldo incremental excepto el último que se desea restaurar, ejecuta: innobackupex --apply-log --redo-only [ruta_respaldo_completo] --incremental-dir=[ruta_respaldo_incremental]. Para el último respaldo incremental que se desea restaurar, ejecuta: innobackupex --apply-log [ruta_respaldo_completo] --incremental-dir=[ruta_respaldo_incremental_final]. Finalmente, ejecuta innobackupex --apply-log [ruta_respaldo_completo] para aplicar los registros pendientes.

Segundo, detener mysqld, restaurar los datos, corregir permisos de directorios y archivos, iniciar mysqld y verificar si funciona correctamente.

Ejemplo de restauración:

[root@servidor1 ~]# innobackupex --apply-log --redo-only respaldo_bd/2019-06-16_15-49-44/ 2>>respaldo_bd/registro_copia.log
[root@servidor1 ~]# innobackupex --apply-log --redo-only respaldo_bd/2019-06-16_15-49-44/ --incremental-dir=respaldo_bd/2019-06-16_17-26-54/ 2>>respaldo_bd/registro_copia.log
[root@servidor1 ~]# innobackupex --apply-log respaldo_bd/2019-06-16_15-49-44/ --incremental-dir=respaldo_bd/2019-06-16_17-40-13/ 2>>respaldo_bd/registro_copia.log
[root@servidor1 ~]# innobackupex --apply-log respaldo_bd/2019-06-16_15-49-44/ 2>>respaldo_bd/registro_copia.log
[root@servidor1 ~]# systemctl stop mysqld
[root@servidor1 ~]# rm -rf /var/lib/mysql/*  // Operación peligrosa
[root@servidor1 ~]# innobackupex --copy-back respaldo_bd/2019-06-16_15-49-44/ 2>respaldo_bd/registro_copia.log
[root@servidor1 ~]# chown -R mysql:mysql /var/lib/mysql/
[root@servidor1 ~]# systemctl start mysqld
[root@servidor1 ~]# mysql -uroot -pcontraseña_segura
mysql> use prueba_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from empleados_tb;
+------+--------+
| id | nombre |
+------+--------+
| 1 | juan |
| 2 | maria |
+------+--------+
2 rows in set (0.00 sec)

  1. Opción --stream, flujo de datos comprimido

Es importante notar que al usar --stream, se genera un flujo de datos empaquetado, no un archivo empaquetado directamente. Se debe utilizar redirección u otros comandos para procesar este flujo.

Ejemplo 1: Generar archivo comprimido con redirección

[root@servidorBackup22 ~]# mkdir /respaldo_bd
// Redirigir salida estándar a archivo tar y error estándar a archivo de log
[root@servidorBackup22 ~]# innobackupex --databases=prueba_db --user=root --password=contraseña_segura --stream=tar /respaldo_bd/
 >/respaldo_bd/`date +%F`.tar 2> /respaldo_bd/registro_respaldo.log 
[root@servidorBackup22 ~]# ls /respaldo_bd/
2019-09-29.tar  registro_respaldo.log
[root@servidorBackup22 ~]# cd /respaldo_bd/
// Al descomprimir, los archivos están sueltos sin directorios
[root@servidorBackup22 respaldo_bd]# tar xf 2019-09-29.tar
[root@servidorBackup22 respaldo_bd]# ls
2019-09-29.tar  ib_buffer_pool  xtrabackup_binlog_info  xtrabackup_logfile
registro_respaldo.log  ibdata1         xtrabackup_checkpoints
backup-my.cnf   prueba_db         xtrabackup_info

Ejemplo 2: Usar ssh y cat para respaldar directamente en otro servidor

[root@servidorBackup22 ~]# ssh-keygen
[root@servidorBackup22 ~]# ssh-copy-id 192.168.5.70
[root@servidorBackup22 ~]# innobackupex --databases=prueba_db --user=root --password=contraseña_segura --stream=tar 2> /respaldo_bd/registro_respaldo.log
 | ssh 192.168.5.70 "cat - > /`date +%F`.tar "
[root@servidorBackup22 ~]# ssh 192.168.5.70
[root@servidorDestino70 ~]# ls /  // Se confirma la existencia del archivo empaquetado
2019-09-29.tar  boot  etc  lib   media  opt   root  sbin  sys  usr
bin             ceph  dev  home  lib64  mnt   proc  run   srv  tmp  var
[root@servidorDestino70 ~]# mkdir /respaldo
[root@servidorDestino70 /]# tar xf /2019-09-29.tar -C /respaldo/  // Descomprimir para verificar
[root@servidorDestino70 /]# ls /respaldo
backup-my.cnf   ibdata1  xtrabackup_binlog_info  xtrabackup_info
ib_buffer_pool  prueba_db  xtrabackup_checkpoints  xtrabackup_logfile
[root@servidorDestino70 ~]# exit
Cierre de sesión
Conexión a 192.168.5.70 cerrada.

Ejemplo 3: Compresión adicional con gzip

[root@servidorBackup22 ~]# rm -rf /respaldo_bd/*
[root@servidorBackup22 ~]# innobackupex --databases=prueba_db --user=root --password=contraseña_segura --stream=tar /respaldo_bd/
 2> /respaldo_bd/registro_respaldo.log | gzip > /respaldo_bd/`date +%F`.tar.gz
[root@servidorBackup22 ~]# ls /respaldo_bd/
2019-09-29.tar.gz  registro_respaldo.log
[root@servidorBackup22 ~]# tar zxf /respaldo_bd/2019-09-29.tar.gz -C /respaldo_bd/
[root@servidorBackup22 ~]# ls /respaldo_bd/  // Se puede descomprimir correctamente
2019-09-29.tar.gz  ib_buffer_pool  xtrabackup_binlog_info  xtrabackup_logfile
registro_respaldo.log  ibdata1         xtrabackup_checkpoints
backup-my.cnf   prueba_db         xtrabackup_info

Etiquetas: MySQL xtrabackup percona respaldo Base de Datos

Publicado el 6-5 23:14