5 min lectura • Guide 365 of 877
Gestión de Migraciones de Base de Datos
Las migraciones de base de datos son la parte más riesgosa del deployment. Tocan datos, no siempre pueden deshacerse, y afectan aplicaciones en ejecución. Buena gestión de migraciones mantiene los datos seguros mientras habilita la evolución.
Seguridad de Migraciones
| Riesgo | Mitigación |
|---|---|
| Pérdida de datos | Backups, rollback probado |
| Downtime | Patrones zero-downtime |
| Corrupción | Testing en staging |
| Performance | Análisis de índices |
Fundamentos de Migración
Control de Versiones
GESTIÓN DE MIGRACIONES
══════════════════════
VERSIONADO:
─────────────────────────────────────
migrations/
├── 001_create_users.sql
├── 002_add_email_to_users.sql
├── 003_create_orders.sql
├── 004_add_index_on_orders.sql
└── Secuencial, rastreado
ARCHIVO DE MIGRACIÓN:
─────────────────────────────────────
-- Migración: 002_add_email_to_users
-- Creada: 2024-01-15
-- Autor: developer@example.com
-- Up
ALTER TABLE users ADD COLUMN email VARCHAR(255);
-- Down
ALTER TABLE users DROP COLUMN email;
HERRAMIENTAS:
─────────────────────────────────────
├── Flyway (migraciones SQL)
├── Liquibase (XML/SQL)
├── Laravel Migrations (PHP)
├── Alembic (Python)
├── Knex (Node.js)
├── Rails Migrations (Ruby)
└── Herramientas específicas por framework
EJECUCIÓN:
─────────────────────────────────────
├── Ejecutar migraciones pendientes
├── Rastrear migraciones ejecutadas
├── Nunca modificar migraciones ejecutadas
├── Nuevos cambios = nueva migración
└── Historia inmutable
Patrones Zero-Downtime
Cambios Seguros
MIGRACIONES ZERO-DOWNTIME
═════════════════════════
OPERACIONES SEGURAS:
─────────────────────────────────────
Siempre seguras:
├── Agregar nueva tabla
├── Agregar columna nullable
├── Agregar índice (concurrent)
├── Agregar columna con default
└── Cambios aditivos
OPERACIONES PELIGROSAS:
─────────────────────────────────────
Necesitan manejo cuidadoso:
├── Remover columna
├── Renombrar columna
├── Cambiar tipo de columna
├── Agregar constraint NOT NULL
├── Requieren enfoque multi-paso
└── Nunca en una sola migración
PATRÓN RENOMBRAR COLUMNA:
─────────────────────────────────────
Objetivo: Renombrar 'name' a 'full_name'
Paso 1: Agregar nueva columna
ALTER TABLE users ADD COLUMN full_name VARCHAR(255);
Paso 2: Deploy código que escribe a ambas
columna_vieja y columna_nueva
Paso 3: Backfill datos
UPDATE users SET full_name = name WHERE full_name IS NULL;
Paso 4: Deploy código que lee de columna_nueva
Paso 5: Dejar de escribir a columna vieja
Paso 6: Remover columna vieja (más tarde)
ALTER TABLE users DROP COLUMN name;
Timeline:
├── Migración 1 (agregar columna)
├── Deploy 1 (escribir ambas)
├── Migración 2 (backfill)
├── Deploy 2 (leer nueva)
├── Deploy 3 (solo escribir nueva)
└── Migración 3 (remover vieja)
Tipos de Migración
Schema vs Datos
TIPOS DE MIGRACIÓN:
┌─────────────────────────────────────────────────────────────┐
│ │
│ MIGRACIÓN DE SCHEMA: │
│ ──────────────────── │
│ Cambia estructura de la base de datos │
│ • CREATE TABLE │
│ • ALTER TABLE ADD/DROP COLUMN │
│ • CREATE INDEX │
│ • ADD CONSTRAINT │
│ │
│ Características: │
│ • Generalmente rápidas │
│ • Fáciles de revertir │
│ • Pueden bloquear tablas │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ MIGRACIÓN DE DATOS: │
│ ─────────────────── │
│ Cambia contenido de la base de datos │
│ • UPDATE masivos │
│ • INSERT desde otra tabla │
│ • Transformaciones de datos │
│ • Backfills │
│ │
│ Características: │
│ • Pueden ser lentas (tablas grandes) │
│ • Difíciles de revertir │
│ • Considerar ejecutar en batches │
│ │
│ ─────────────────────────────────────────────────────────── │
│ │
│ MANTENER SEPARADAS: │
│ • Una migración = un tipo │
│ • Facilita rollback │
│ • Mejor visibilidad │
│ │
└─────────────────────────────────────────────────────────────┘
Ejecución de Migración
Orden de Operaciones
ORDEN DE EJECUCIÓN:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. BACKUP │
│ └── Siempre antes de cualquier migración │
│ │
│ 2. EJECUTAR EN STAGING │
│ ├── Con datos similares a producción │
│ └── Verificar tiempo de ejecución │
│ │
│ 3. PLANIFICAR VENTANA │
│ ├── Período de bajo tráfico │
│ └── Tiempo suficiente para rollback │
│ │
│ 4. COMUNICAR │
│ ├── Notificar stakeholders │
│ └── Alertar equipo de on-call │
│ │
│ 5. EJECUTAR │
│ ├── Monitorear durante ejecución │
│ └── Tener rollback listo │
│ │
│ 6. VERIFICAR │
│ ├── Probar aplicación │
│ ├── Revisar logs de errores │
│ └── Monitorear métricas │
│ │
│ 7. DOCUMENTAR │
│ ├── Registrar cambios │
│ └── Actualizar documentación │
│ │
└─────────────────────────────────────────────────────────────┘