Configuración de copias de seguridad incrementales de MySQL con Percona XtraBackup
Percona XtraBackup (PXB) es el estándar de la industria para realizar copias de seguridad en caliente y sin bloqueo de instancias de MySQL, MariaDB y Percona Server. Si bien las copias de seguridad completas son esenciales, las bases de datos grandes requieren una estrategia eficiente para minimizar el tiempo de inactividad y el uso del almacenamiento. Las copias de seguridad incrementales proporcionan esta eficiencia al capturar solo los cambios de datos que han ocurrido desde la última copia de seguridad exitosa.
Esta guía explora cómo aprovechar PXB para implementar una estrategia robusta de copia de seguridad incremental. Cubriremos los conceptos centrales, los comandos necesarios para realizar instantáneas incrementales secuenciales y el proceso de varios pasos requerido para una restauración exitosa.
Entendiendo el mecanismo incremental de Percona XtraBackup
PXB se basa en el funcionamiento interno del motor de almacenamiento InnoDB, específicamente rastreando los cambios usando el Número de Secuencia de Registro (LSN). Cada página de InnoDB está etiquetada con un LSN. Cuando PXB realiza una copia de seguridad incremental, registra solo aquellas páginas cuyo LSN es mayor que el LSN registrado en el momento de la copia de seguridad anterior.
Crucialmente, las copias de seguridad incrementales requieren una copia de seguridad base completa para establecer el punto de partida. Todas las copias de seguridad incrementales subsiguientes están encadenadas, haciendo referencia a la copia de seguridad inmediatamente anterior (que puede ser la copia de seguridad base u otra incremental).
Archivos y conceptos clave
- LSN (Log Sequence Number): El marcador utilizado para determinar dónde comienzan y terminan los cambios.
- xtrabackup_checkpoints: Un archivo creado durante cada copia de seguridad que contiene el
to_lsn(el LSN alcanzado al final de la copia de seguridad) y, para las copias de seguridad incrementales, elfrom_lsn(el LSN de inicio). --incremental-basedir: La bandera esencial utilizada durante las ejecuciones incrementales, que apunta a PXB al directorio de la copia de seguridad anterior (que determina el LSN de inicio).
Paso 1: Realización de la copia de seguridad base completa
Antes de tomar cualquier instantánea incremental, debe crearse una copia de seguridad base completa y consistente. Esto establece la base para toda la cadena de copias de seguridad.
Primero definiremos nuestra estructura de directorios:
# Define el directorio base para la copia de seguridad completa
BASE_DIR="/data/backups/2023-10-01_FULL"
# Crea el directorio
mkdir -p $BASE_DIR
# Ejecuta la copia de seguridad completa
xtrabackup --backup \n --target-dir=$BASE_DIR \n --user=root --password=secret_password \n --datadir=/var/lib/mysql
# Verifica el LSN de la copia de seguridad completa
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'
Nota: El
target-dirdebe estar vacío o no existir al iniciar el proceso de copia de seguridad. Siempre use credenciales con los permisos apropiados (por ejemplo, privilegiosRELOAD,LOCK TABLES,PROCESS,SUPER).
Paso 2: Tomando la primera copia de seguridad incremental
Para realizar la primera copia de seguridad incremental, debemos hacer referencia al directorio de la copia de seguridad base completa utilizando la bandera --incremental-basedir. PXB leerá el to_lsn de la copia de seguridad base y solo copiará las páginas que hayan cambiado desde ese punto.
# Define el directorio para la primera copia de seguridad incremental
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"
# Ejecuta la copia de seguridad incremental, haciendo referencia a la base completa
xtrabackup --backup \n --target-dir=$INCREMENTAL_1_DIR \n --incremental-basedir=/data/backups/2023-10-01_FULL \n --user=root --password=secret_password
Paso 3: Encadenando copias de seguridad incrementales subsiguientes
Para cualquier copia de seguridad incremental subsiguiente (INC2, INC3, etc.), el --incremental-basedir debe apuntar al directorio de la copia de seguridad incremental inmediatamente anterior.
Si queremos crear INC2 basándonos en los cambios desde INC1:
# Define el directorio para la segunda copia de seguridad incremental
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"
# Ejecuta la copia de seguridad incremental, haciendo referencia a la incremental anterior (INC1)
xtrabackup --backup \n --target-dir=$INCREMENTAL_2_DIR \n --incremental-basedir=/data/backups/2023-10-02_INC1 \n --user=root --password=secret_password
Este encadenamiento continúa mientras mantenga la secuencia. Si algún enlace de la cadena se rompe (es decir, falta un directorio), el proceso de restauración fallará.
Restauración: Aplicación de cambios incrementales
Restaurar un conjunto de copias de seguridad incrementales es un proceso de varios pasos que implica aplicar los cambios secuencialmente a la copia de seguridad base. A diferencia de una copia de seguridad completa, las copias de seguridad incrementales no se pueden copiar directamente al directorio de datos.
Fase de restauración 1: Preparación de la copia de seguridad base
Primero, debe prepararse la copia de seguridad base. Esto se hace típicamente en un área de almacenamiento temporal para garantizar la seguridad de los datos.
Al preparar la copia de seguridad base, PXB realiza dos acciones esenciales:
1. Aplica las transacciones confirmadas (el registro de rehacer).
2. Revierte las transacciones no confirmadas.
Usamos la bandera --prepare, pero de manera crítica, agregamos la bandera --apply-log-only. Esto evita que PXB revierta las transacciones no confirmadas, lo cual es necesario porque los registros incrementales subsiguientes necesitan esos fragmentos de transacción para completar la restauración.
# Define el directorio de almacenamiento temporal
RESTORE_TARGET="/data/restore_staging"
# Copia los archivos de la copia de seguridad base completa al área de almacenamiento temporal
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET
# Prepara la copia de seguridad base, manteniéndola lista para incrementos
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only
# Busca confirmación: 'completed OK!'
Fase de restauración 2: Aplicación secuencial de copias de seguridad incrementales
Luego, aplique cada copia de seguridad incremental en el orden cronológico exacto en que fueron tomadas. Cada comando debe hacer referencia al directorio de almacenamiento temporal (la copia de seguridad base que se está modificando actualmente) y usar la bandera --incremental-dir apuntando a la instantánea incremental específica.
# Aplica la incremental 1
xtrabackup --prepare --target-dir=$RESTORE_TARGET \n --incremental-dir=/data/backups/2023-10-02_INC1 \n --apply-log-only
# Aplica la incremental 2
xtrabackup --prepare --target-dir=$RESTORE_TARGET \n --incremental-dir=/data/backups/2023-10-03_INC2 \n --apply-log-only
# ... continuar para todos los incrementos requeridos ...
Fase de restauración 3: Finalización de la preparación
Una vez que se haya aplicado la última instantánea incremental deseada, ejecute el paso de preparación final sin la bandera --apply-log-only. Esto permite que PXB realice la limpieza final, revirtiendo cualquier transacción que aún estuviera sin confirmar en toda la secuencia de copia de seguridad, lo que resulta en un estado consistente.
# Finaliza la preparación (sin --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET
# IMPORTANTE: Busca la confirmación final que indica 'xtrabackup: Recovery completed OK!'
Fase de restauración 4: Copia de datos de vuelta a MySQL
Después de una preparación exitosa, los datos en el directorio de almacenamiento temporal ($RESTORE_TARGET) son consistentes y están listos para ser utilizados por el servidor MySQL.
- Detén el servicio de MySQL.
- Asegúrate de que el directorio de datos de MySQL esté vacío o respaldado (opcional: usa la opción
--move-backsi está permitido, pero--copy-backes más seguro para la recuperación). - Usa
xtrabackup --copy-backpara mover los archivos. - Repara los permisos.
- Reinicia MySQL.
# Detén el servicio de MySQL
service mysql stop
# Copia los archivos preparados de vuelta al directorio de datos de MySQL
xtrabackup --copy-back --target-dir=$RESTORE_TARGET
# Asegura la propiedad correcta para los archivos
chown -R mysql:mysql /var/lib/mysql
# Inicia MySQL
service mysql start
Mejores prácticas para la gestión de copias de seguridad incrementales
Automatización y scripting
Las estrategias de copia de seguridad incremental son más efectivas cuando están completamente automatizadas. Los scripts deben gestionar el encadenamiento de LSN automáticamente, identificando dinámicamente el directorio de copia de seguridad más reciente a utilizar para la bandera --incremental-basedir.
Política de retención
Las cadenas incrementales pueden volverse muy largas, lo que ralentiza la restauración. Una buena práctica común es la estrategia Abuelo-Padre-Hijo (GFS) o las copias de seguridad incrementales diferenciales (donde todos los incrementos hacen referencia a la base completa). Periódicamente, se debe renovar la cadena realizando una nueva copia de seguridad completa para iniciar una cadena fresca y corta.
Compresión y Limitación (Throttling)
Para servidores muy ocupados, considera usar la opción --throttle durante la fase de copia de seguridad para limitar las operaciones de E/S. Usa --compress para reducir el tamaño de la copia de seguridad, lo cual es muy beneficioso para los conjuntos de datos más pequeños generados por las copias de seguridad incrementales.
# Ejemplo con compresión y limitación
xtrabackup --backup \n --target-dir=$INCREMENTAL_3_DIR \n --incremental-basedir=$INCREMENTAL_2_DIR \n --compress \n --throttle=100
Verificación y monitorización
Siempre prueba tus procedimientos de restauración regularmente. Una copia de seguridad que no se puede restaurar es inútil. Monitoriza el espacio en disco consumido por tu cadena incremental, especialmente antes de iniciar una nueva copia de seguridad base completa.