Logo Google Cloud con Eduardo

Google Cloud con Eduardo

Recibe el código de la lección en tu correo
Te enviaremos el enlace directo al archivo (.zip) y te sumaremos a nuestra newsletter de Google Cloud.

Información básica de protección de datos: Responsable: Eduardo Martínez Agrelo. Finalidad: Facilitar el recurso solicitado y enviar comunicaciones periódicas de valor sobre Google Cloud. Legitimación: Consentimiento del interesado (Art. 6.1.a RGPD). Destinatarios: Plataforma Odoo y proveedores de infraestructura técnica (Google Cloud / Firebase). Derechos: Acceso, rectificación y supresión en eduardomartinezagrelo@gmail.com.
✦ Guía Técnica & Runbook de Operaciones

Cómo Recuperar Bases de Datos y Tablas Borradas en Producción con Point-in-Time Recovery (PITR) en Google Cloud SQL

El temido DROP TABLE en horario punta no tiene por qué costarte el puesto. Descubre cómo funciona la mecánica de logs transaccionales en Cloud SQL y cómo ejecutar una recuperación quirúrgica al milisegundo exacto sin provocar un rollback masivo de tu facturación.

Lo que Aprenderás en esta Guía de Arquitectura

✓ Mecánica interna de PITR: Cómo interactúan las instantáneas base con WAL (Postgres) y binlogs (MySQL).
✓ Aislamiento forense: Localización del microsegundo exacto del desastre en Cloud Audit Logs sin conjeturas.
✓ Extracción quirúrgica: Rescate selectivo de la tabla dañada sin destruir las transacciones vivas concurrentes.
✓ Automatización & FinOps: Código modular en Terraform y checklists de prevención para evitar clones zombie.
Google Cloud SQL Point-in-Time Recovery (PITR) PostgreSQL & MySQL Write-Ahead Logging (WAL) gcloud CLI Terraform (IaC) Cloud Logging Disaster Recovery (RTO / RPO) FinOps Governance

El Incidente: Cuando un DROP TABLE Rutinario Destruye la Aplicación en Producción

Cualquier ingeniero o administrador de sistemas que lleve años operando en entornos empresariales conoce esa sensación física de sudor frío: estás ejecutando una limpieza rutinaria de esquemas heredados, eliminando tablas temporales de migraciones que supuestamente nadie utilizaba, y pulsas Enter. Una fracción de segundo después, te das cuenta de que la sintaxis o el autocompletado te ha jugado una mala pasada: acabas de ejecutar un DROP TABLE sobre una tabla nuclear para el backend de tu aplicación de delivery y pedidos en plena hora punta de facturación.

En menos de un minuto, los canales de guardia en Slack arden con excepciones HTTP 500. El frontend de la aplicación móvil no puede listar los repartos en curso, los repartidores quedan ciegos operativamente y el negocio pierde miles de euros por minuto. En este instante, la peor decisión posible que puede tomar un ingeniero novato es entrar en pánico o acudir al típico respaldo diario nocturno ejecutado a las 03:00 AM.

⚠️ La Trampa Mortal del Backup Diario Tradicional

Si restauras una instantánea completa de la noche anterior para recuperar una tabla borrada a las 14:15, estarás solucionando un problema destruyendo 11 horas de nuevos clientes registrados, cobros procesados por Stripe y transacciones válidas en todas las demás tablas del sistema. El impacto financiero y legal de ese rollback masivo suele ser infinitamente superior al error humano inicial.

Aquí es donde entra en juego Point-in-Time Recovery (PITR) con Cloud SQL. A diferencia de un snapshot estático, PITR no es una fotografía congelada en el tiempo: es un vídeo continuo que nos permite rebobinar la base de datos al microsegundo inmediatamente anterior a la ejecución de la sentencia destructiva ($T_{incidente} - 1s$), reduciendo el RPO (Recovery Point Objective) a cero pérdidas de datos.

La Mecánica Interna de PITR: Instantáneas Base, Write-Ahead Logs (WAL) y Binary Logs

Para gobernar una recuperación ante desastres con criterio de Staff Cloud Architect, es obligatorio comprender cómo implementa Google Cloud esta tecnología bajo el capó de las instancias gestionadas.

Point-in-Time Recovery no almacena miles de copias de seguridad completas de tu base de datos, lo cual sería financieramente inviable e ineficiente en términos de I/O. En su lugar, Cloud SQL combina dos pilares arquitectónicos:

  1. Backups Base Automatizados: Instantáneas consistentes a nivel de disco tomadas periódicamente durante la ventana de mantenimiento configurada en la instancia.
  2. Registro Transaccional Continuo: La captura y archivado ininterrumpido de todos los cambios de mutación ejecutados en el motor:
    • En PostgreSQL, Cloud SQL gestiona el archivado de los archivos WAL (Write-Ahead Logging), asegurando que cada commit quede persistido secuencialmente en almacenamiento durable.
    • En MySQL, se habilitan y custodian los Binary Logs (binlogs), registrando cada instrucción DDL y DML ejecutada en el cluster.

Cuando solicitas una recuperación puntual hacia un timestamp concreto (por ejemplo, 2026-10-25T14:15:22.000000Z), el plano de control de Cloud SQL localiza el snapshot base previo más cercano y reproduce secuencialmente los registros de transacciones hasta detenerse con precisión quirúrgica en el microsegundo exacto especificado.

Para profundizar en cómo encaja esta capa de persistencia dentro de un diseño de resiliencia global, revisa nuestra guía sobre arquitectura enterprise y alta disponibilidad en Google Cloud SQL, donde analizamos los trade-offs entre replicación regional y failover automático.

Demostración en Vídeo: Restauración Quirúrgica Paso a Paso en Cloud SQL

En el siguiente vídeo de mi canal oficial, puedes ver en tiempo real cómo recreo un borrado destructivo en producción y cómo ejecuto el flujo completo de recuperación con Cloud SQL, demostrando la coordinación entre la consola web y los comandos de terminal:

Asegúrate de suscribirte al canal de YouTube de Eduardo Martínez Agrelo para más entrenamientos de arquitectura cloud y fiabilidad.

Matriz de Decisión: Restauración In-Place vs Clonado Quirúrgico con PITR

Uno de los mayores errores cometidos por equipos de infraestructura es creer que recuperar una base de datos significa sustituir de inmediato la instancia primaria. En un sistema transaccional activo, esta decisión debe basarse en una rigurosa evaluación de impacto:

Criterio Técnico Restauración In-Place (Rollback Total) Clonado Quirúrgico con PITR (Recomendado)
Objetivo Principal Recuperar toda la instancia ante una corrupción catastrófica total del cluster. Rescatar una o varias tablas específicas eliminadas por error humano.
Riesgo de Pérdida de Datos Crítico: Se destruyen todas las escrituras posteriores al timestamp del restore. Cero: La producción sigue operando y absorbiendo transacciones en vivo.
Downtime de Producción Alto (la instancia primaria se reinicia y reconstruye durante minutos u horas). Mínimo o nulo (el clon se genera en paralelo en la misma VPC sin tocar la instancia viva).
Complejidad Operativa Baja en ejecución, pero devastadora en resolución de inconsistencias de datos. Media (requiere exportar la tabla rescatada e inyectarla selectivamente).
Impacto FinOps Sin coste de almacenamiento temporal extra, pero con alto coste de negocio por parada. Coste efímero de una instancia clonada durante 1 o 2 horas (céntimos de euro).

Runbook de Producción: Comandos gcloud para Clonar la Instancia al Milisegundo Exacto

A continuación tienes el protocolo de actuación de emergencia probado en entornos bancarios y de comercio electrónico de alta concurrencia:

1. Identificar el Timestamp del Desastre en Cloud Audit Logs

No supongas la hora a ojo. Abre Cloud Logging en la consola de Google Cloud o ejecuta una consulta por CLI para localizar el momento exacto en el que se emitió el DROP TABLE:

# Buscar eventos de auditoría sobre la instancia de base de datos
gcloud logging read 'resource.type="cloudsql_database" 
  AND textPayload:"DROP TABLE" 
  AND timestamp >= "2026-10-25T14:00:00Z"' \
  --project="tu-proyecto-prod" \
  --limit=5 \
  --format="table(timestamp, textPayload)"

Supongamos que el log confirma que la tabla pedidos_delivery fue eliminada exactamente a las 2026-10-25T14:15:23.450Z. Tu objetivo de recuperación temporal será un segundo antes: 2026-10-25T14:15:22.000Z.

2. Clonar la Instancia a $T - 1$ con gcloud sql instances clone

Generamos una nueva instancia efímera idéntica a la primaria conectada a la misma red privada, pero apuntando al timestamp previo al fallo:

# Clonar la instancia en paralelo usando Point-in-Time Recovery
gcloud sql instances clone prod-db-primary prod-db-recovery-clone \
  --point-in-time="2026-10-25T14:15:22.000000Z" \
  --project="tu-proyecto-prod"

Cloud SQL aprovisionará un clon independiente con el estado exacto de la base de datos antes del desastre. La instancia original continuará atendiendo tráfico sin verse afectada.

3. Extracción Quirúrgica y Reincorporación en Caliente

Una vez levantado el clon, nos conectamos a él de forma privada y volcamos únicamente la estructura y datos de la tabla que perdimos:

# Ejemplo para PostgreSQL (extracción aislada de la tabla crítica)
pg_dump -h 10.150.0.45 -U postgres -d ecommerce_db \
  -t pedidos_delivery --data-only --inserts > pedidos_delivery_restaurado.sql

# Inyección inmediata en la instancia de PRODUCCIÓN viva
psql -h 10.150.0.12 -U postgres -d ecommerce_db < pedidos_delivery_restaurado.sql

Para bases de datos MySQL, el proceso equivalente se realiza con mysqldump restringido a la tabla objetivo:

# Ejemplo para MySQL con mysqldump
mysqldump -h 10.150.0.45 -u root -p ecommerce_db pedidos_delivery \
  --single-transaction --quick > pedidos_delivery_mysql.sql

mysql -h 10.150.0.12 -u root -p ecommerce_db < pedidos_delivery_mysql.sql

4. Limpieza Inmediata del Entorno Efímero

Una vez verificado que los microservicios de delivery vuelven a responder con éxito y los datos se han reincorporado, destruye el clon de inmediato:

# Eliminar el clon temporal para detener el consumo de cómputo y disco
gcloud sql instances delete prod-db-recovery-clone \
  --project="tu-proyecto-prod" \
  --quiet

Código de Producción en Terraform: Automatización de Backups y PITR Resiliente

En la filosofía de un Cloud Engineer, la infraestructura manual en consola no existe en producción. PITR debe venir garantizado por código declarativo mediante Terraform, configurando los periodos de retención de logs y la protección contra borrado accidental de la propia instancia:

# ==============================================================================
# Aprovisionamiento Resiliente de Cloud SQL PostgreSQL con PITR Activo
# ==============================================================================

resource "google_sql_database_instance" "postgres_primary" {
  name             = "prod-postgres-primary"
  database_version = "POSTGRES_15"
  region           = "europe-west1"
  project          = var.project_id

  # Protección crítica contra borrado accidental de la infraestructura
  deletion_protection = true

  settings {
    tier              = "db-custom-4-16384"
    availability_type = "REGIONAL" # Alta disponibilidad multi-zona
    disk_type         = "PD_SSD"
    disk_size         = 100
    disk_autoresize   = true

    # Configuración Obligatoria para Point-in-Time Recovery
    backup_configuration {
      enabled                        = true
      start_time                     = "03:00" # Ventana UTC de snapshots base
      point_in_time_recovery_enabled = true   # Activa la retención de logs WAL
      transaction_log_retention_days = 7      # Ventana máxima de 7 días para rebobinar
      backup_retention_settings {
        retained_backups = 14
        retention_unit   = "COUNT"
      }
    }

    ip_configuration {
      ipv4_enabled    = false
      private_network = var.vpc_network_id
      require_ssl     = true
    }

    insights_config {
      query_insights_enabled  = true
      record_application_tags = true
    }
  }
}

Si deseas implementar la arquitectura de conectividad privada completa con Service Networking, consulta nuestra guía de despliegue privado de Cloud SQL con Terraform y VPC Peering, donde detallamos cómo estructurar el enrutamiento sin exponer jamás una IP pública a Internet.

Antipatrones Críticos, Gobernanza IAM y FinOps en Operaciones de Recuperación

💸 El Síndrome del "Clon Zombie" y Sobrecostes FinOps

En muchas organizaciones, tras superar el estrés de un incidente de datos en producción, el equipo celebra el éxito y olvida destruir la instancia prod-db-recovery-clone. Al tratarse de una réplica idéntica en CPU, memoria RAM y discos SSD de alta capacidad, ese clon continuará facturando cientos o miles de dólares al mes en silencio. Automatiza siempre una alerta de Cloud Monitoring o una Cloud Function que apague clones con más de 24 horas de vida.

🛡️ Gobernanza de Accesos: ¿Por Qué Tenía el Ingeniero Permisos DDL en Producción?

El mejor plan de recuperación ante desastres es el que nunca se tiene que ejecutar. Ningún desarrollador o administrador debe tener permisos de DROP TABLE directos sobre la base de datos de producción desde su cliente SQL habitual. Aplica el principio de mínimo privilegio mediante Service Accounts federadas e identidades administradas según explicamos en nuestro análisis de autenticación Zero Trust e identidades sin claves en Google Cloud.

Checklist Preventivo para Cloud Engineers

  • Valida el estado de PITR semanalmente: Verifica que backup_configuration.point_in_time_recovery_enabled devuelva true en todas las instancias de nivel 1.
  • Ensaya un simulacro de recuperación trimestral: Un runbook que no se prueba es un runbook que no funciona. Clona una base de datos con un timestamp aleatorio y mide el RTO real de tu equipo.
  • Protección contra eliminación de instancia activada: Mantén siempre deletion_protection = true en Terraform para impedir que un script o clic accidental destruya la instancia padre y sus logs asociados.

Preguntas Frecuentes sobre Point-in-Time Recovery en Cloud SQL (FAQ)

¿Puedo aplicar Point-in-Time Recovery directamente sobre la misma instancia de Cloud SQL sin crear un clon?
No de forma destructiva directa en caliente. En Google Cloud SQL, el mecanismo nativo para realizar PITR hacia un segundo específico antes de un incidente es mediante la clonación de la instancia (gcloud sql instances clone --point-in-time) o restaurando hacia una nueva instancia. Esta arquitectura es una ventaja de seguridad deliberada: te permite aislar los datos sin sobrescribir las escrituras legítimas que hayan continuado entrando a la base de datos de producción.
¿Qué ocurre si intento hacer PITR de una tabla borrada pero no tenía activados los backups automatizados?
PITR depende estrictamente de tener habilitados los backups automáticos diarios junto con el registro transaccional continuo (Write-Ahead Logs en PostgreSQL o Binary Logging en MySQL). Si los backups automatizados estaban apagados en el momento del desastre, Cloud SQL no dispone de la instantánea base de almacenamiento ni de la cadena de logs secuencial para reconstruir el estado anterior, lo que imposibilita la recuperación puntual.
¿Cuánto tiempo hacia atrás puedo retroceder con PITR y qué impacto tiene en la factura de Google Cloud?
En Google Cloud SQL puedes configurar un periodo de retención transaccional para PITR de entre 1 y 7 días. El impacto FinOps es muy bajo en comparación con el riesgo de negocio: solo pagas por el almacenamiento extra consumido por los logs de transacciones durante la ventana elegida. Sin embargo, debes asegurarte de destruir cualquier instancia clonada temporal una vez rescatadas las tablas, para evitar sobrecostes continuos de cómputo y disco.
Eduardo Martínez Agrelo - AI & Data Architect

Sobre el Autor: Eduardo Martínez Agrelo

AI & Data Architect

Especialista en arquitectura cloud empresarial, ingeniería de datos y sistemas multi-agente en Google Cloud Platform. Instructor oficial, ponente internacional y consultor estratégico para organizaciones que buscan escalar sus operaciones de datos e infraestructura con rigor técnico y eficiencia FinOps.