0Pricing
SQL Academy · Lección

Recuperación a un momento dado

Restaure cualquier momento mediante WAL

Recuperación a un momento dado es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué es la recuperación a un punto en el tiempo?

La recuperación a un punto en el tiempo (PITR) permite restaurar una base de datos a cualquier momento específico del pasado, no solo al momento de la última instantánea de copia de seguridad.

Esto es posible porque PostgreSQL escribe continuamente cada cambio en un flujo denominado Write-Ahead Log (WAL). Al reproducir los registros de WAL sobre una copia de seguridad base, puede llegar exactamente al punto que necesita.

El registro de escritura anticipada (WAL)

Cada sentencia INSERT, UPDATE, DELETE y DDL se escribe primero en el WAL antes de modificar los archivos de datos reales. Esto garantiza la durabilidad incluso si el servidor falla en mitad de una escritura.

Para PITR, los segmentos de WAL archivados son las cintas de la máquina del tiempo. La copia de seguridad base es el punto de partida; el WAL completa todo lo ocurrido después.

-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
       pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;

Habilitar el archivado de WAL

Antes de que sea posible realizar PITR, debe activarse el archivado de WAL en postgresql.conf. Los parámetros clave son wal_level, archive_mode y archive_command.

El comando de archivado copia cada segmento de WAL finalizado a una ubicación segura, como un directorio local, un montaje NFS o un bucket de almacenamiento en la nube.

-- View current WAL and archive settings
SELECT name, setting, unit
FROM   pg_settings
WHERE  name IN (
  'wal_level',
  'archive_mode',
  'archive_command',
  'archive_status'
)
ORDER  BY name;

Crear una copia de seguridad base

Una copia de seguridad base es una copia coherente de todo el directorio de datos que se realiza mientras el servidor está en ejecución. PostgreSQL proporciona la utilidad pg_basebackup y funciones SQL de bajo nivel para coordinar este proceso.

La copia de seguridad, combinada con los segmentos de WAL archivados a partir de la hora de inicio de la copia, constituye todo lo necesario para realizar PITR.

-- Check the latest base backup information
SELECT backup_start,
       backup_end,
       pg_size_pretty(backup_total) AS total_size
FROM   pg_stat_basebackup;

Marcar la hora objetivo de recuperación

Cuando ocurre un desastre, el primer paso es identificar la marca de tiempo exacta a la que desea restaurar. Un enfoque habitual consiste en buscar la marca de tiempo justo antes del evento perjudicial, como un DELETE masivo accidental.

Las tablas de registros de transacciones o los registros de la aplicación suelen contener esta marca de tiempo. El propio WAL registra las marcas de tiempo de confirmación cuando track_commit_timestamp está activado.

-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
       pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM   pg_stat_activity
WHERE  state = 'idle'
LIMIT  10;

Los parámetros de recovery.conf / recovery

El comportamiento de la recuperación se controla mediante parámetros incluidos en postgresql.conf (PostgreSQL 12+) o en el archivo antiguo recovery.conf. Los más importantes son:

  • restore_command — cómo obtener los segmentos de WAL archivados
  • recovery_target_time — la marca de tiempo exacta en la que detenerse
  • recovery_target_action — qué hacer cuando se alcanza el objetivo (promote, pause, shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM   pg_settings
WHERE  name IN (
  'restore_command',
  'recovery_target_time',
  'recovery_target_action',
  'recovery_target_inclusive'
)
ORDER  BY name;

Otros tipos de destinos de recuperación

El tiempo no es la única forma de fijar un destino de recuperación. PostgreSQL admite cuatro tipos de destino:

  • recovery_target_time — una cadena de marca de tiempo
  • recovery_target_xid — un identificador de transacción específico
  • recovery_target_lsn — un número de secuencia del registro WAL
  • recovery_target_name — un punto de restauración con nombre creado con pg_create_restore_point()
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;

Simulación del desastre

Para practicar PITR en un entorno de prueba, corrompa o elimine datos intencionadamente después de anotar la hora actual. Esto le permite verificar que la recuperación llega al momento correcto y que las filas eliminadas reaparecen.

-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;

-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';

-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;

Realización de la recuperación

La recuperación consta de tres pasos:

  1. Detenga la instancia de PostgreSQL que está en ejecución.
  2. Restaure la copia de seguridad base en el directorio de datos.
  3. Configure los parámetros de recuperación e inicie PostgreSQL en modo de recuperación; este reproduce WAL hasta alcanzar la hora de destino y, a continuación, se promueve a un servidor normal de lectura y escritura.

Los registros del servidor muestran cada archivo WAL que se aplica, lo que facilita el seguimiento del progreso.

-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
       pg_last_xact_replay_timestamp() AS last_replayed_txn;

Verificación de la recuperación

Una vez que el servidor se promueva, verifique que los datos se encuentren en el estado esperado. Compruebe los recuentos de filas, las marcas de tiempo de las filas más recientes y cualquier valor crítico para el negocio.

Es recomendable ejecutar estas consultas de verificación antes de volver a permitir el tráfico de la aplicación, para poder avanzar o ajustar la hora de destino si es necesario.

-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders'       AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items'  AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers'    AS tbl, COUNT(*) AS rows FROM customers
ORDER  BY tbl;

Buenas prácticas de PITR

Una configuración fiable de PITR requiere algo más que activar el archivado. Entre las prácticas clave se incluyen:

  • Pruebe las restauraciones con regularidad — una copia de seguridad no probada no es una copia de seguridad fiable.
  • Supervise el retraso del archivado de WAL — las brechas en el WAL archivado hacen imposible una recuperación completa.
  • Conserve suficiente historial de WAL — conserve segmentos que se remonten al menos hasta la copia de seguridad base válida más antigua.
  • Utilice una ubicación de almacenamiento independiente — si falla el disco principal, también se pierde el WAL archivado en ese mismo disco.
-- Check for any WAL archiving failures
SELECT archived_count,
       failed_count,
       last_archived_wal,
       last_archived_time,
       last_failed_wal,
       last_failed_time
FROM   pg_stat_archiver;

Comprobación rápida

Compruebe su comprensión de la recuperación a un momento dado.

Resumen: recuperación a un momento dado

En esta lección ha aprendido cómo el registro de escritura anticipada de PostgreSQL (WAL) permite recuperarse a cualquier momento del pasado:

  • El archivado de WAL captura todos los cambios posteriores a una copia de seguridad base.
  • Los destinos de recuperación pueden ser una marca de tiempo, un identificador de transacción, un LSN o un punto de restauración con nombre.
  • El proceso de recuperación restaura la copia de seguridad base, reproduce el WAL archivado y promueve el servidor cuando se alcanza el destino.
  • La verificación confirma la integridad de los datos antes de volver a aceptar tráfico.
  • Las buenas prácticas incluyen pruebas periódicas de restauración, supervisión del archivado y almacenamiento del WAL fuera del sitio.

PITR es su red de seguridad frente a errores humanos y corrupción de datos: domínelo y dominará la recuperación ante desastres.

Preguntas frecuentes

¿La lección «Recuperación a un momento dado» es gratis?

Sí — el texto completo de «Recuperación a un momento dado» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Recuperación a un momento dado»?

Restaure cualquier momento mediante WAL Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Academy?

No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Recuperación a un momento dado»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Academy?

Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Copias de seguridad lógicas y físicas
  2. Recuperación a un momento dado
  3. Prueba de las restauraciones
  4. Planificación de recuperación ante desastres
← Volver a SQL Academy