0Pricing
SQL Academy · Lección

Migraciones en línea: por qué ALTER TABLE bloquea

Comprenda qué formas de ALTER TABLE adquieren un bloqueo ACCESS EXCLUSIVE y reescriben la tabla, y cuáles solo modifican metadatos.

Migraciones en línea: por qué ALTER TABLE bloquea es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 1 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.

El problema de las migraciones en producción

En una base de datos pequeña, ALTER TABLE es instantáneo. En una tabla activa de 500 GB, el mismo comando puede bloquear las escrituras durante 20 minutos. Es esencial saber qué operaciones ALTER son seguras y cuáles no.

Niveles de bloqueo

Los bloqueos de PostgreSQL se organizan por niveles:

  • ACCESS SHARE — consultas
  • ROW EXCLUSIVE — escrituras
  • SHARE / SHARE ROW EXCLUSIVE — DDL que coexiste con las lecturas
  • EXCLUSIVE — bloquea las consultas
  • ACCESS EXCLUSIVE — bloquea TODO

Qué bloqueo requiere ALTER TABLE

La mayoría de las variantes de ALTER adquieren ACCESS EXCLUSIVE: bloquean a lectores y escritores hasta que terminan.

ALTER rápidos (solo metadatos)

Algunas operaciones ALTER solo modifican el catálogo y terminan en milisegundos incluso en tablas enormes:

ALTER TABLE t RENAME COLUMN a TO b;
ALTER TABLE t ALTER COLUMN a SET DEFAULT ...;
ALTER TABLE t ADD COLUMN x INT;             -- nullable, no default: metadata only (PG 11+)
ALTER TABLE t ADD COLUMN x INT NOT NULL DEFAULT 0;  -- metadata only PG 11+ if default is constant

ALTER lentos (con reescritura)

Estas operaciones reescriben la tabla completa:

ALTER TABLE t ALTER COLUMN x TYPE BIGINT;     -- when types not binary-compatible
ALTER TABLE t SET LOGGED;
CLUSTER t USING idx;                          -- physically reorders rows
VACUUM FULL t;                                -- rewrites whole table

Añadir NOT NULL de forma segura

En una tabla grande:

-- BAD: full table scan + ACCESS EXCLUSIVE lock
ALTER TABLE t ALTER COLUMN x SET NOT NULL;

-- BETTER:
ALTER TABLE t ADD CONSTRAINT x_not_null CHECK (x IS NOT NULL) NOT VALID;
ALTER TABLE t VALIDATE CONSTRAINT x_not_null;     -- scans without exclusive lock
-- then drop the CHECK and add NOT NULL (still cheap because already validated):
ALTER TABLE t ALTER COLUMN x SET NOT NULL;
ALTER TABLE t DROP CONSTRAINT x_not_null;

Añadir claves foráneas sin bloquear

La misma técnica de NOT VALID:

ALTER TABLE orders
  ADD CONSTRAINT orders_user_fk FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;

Problemas al esperar bloqueos

Un ALTER que espera un bloqueo ACCESS EXCLUSIVE se pondrá en cola detrás de cada transacción de larga duración. Las transacciones nuevas también se pondrán en cola detrás del ALTER, lo que crea una cadena de consultas bloqueadas.

lock_timeout

No permita que las migraciones se queden bloqueadas indefinidamente:

SET lock_timeout = '5s';
ALTER TABLE t ...;
-- ERROR if it can't get the lock in 5s — retry.

Bucles de reintento

Las migraciones deben reintentarse cuando se produce un error de lock_timeout:

for (let i = 0; i < 20; i++) {
  try {
    await client.query('SET lock_timeout = 5000');
    await client.query('ALTER TABLE ...');
    break;
  } catch (e) {
    if (e.code === '55P03') continue;     // lock_not_available
    throw e;
  }
}

Seguridad con statement_timeout

Limite cuánto tiempo puede ejecutarse una sola instrucción dentro de una migración:

SET statement_timeout = '30s';

Herramientas útiles

  • strong_migrations (Rails)
  • django-migrate-zero-downtime
  • pg-osc (Postgres Online Schema Change)
  • pgRoll

Resumen

Las migraciones en línea requieren conocer:

  • Qué operaciones ALTER solo modifican metadatos y cuáles reescriben la tabla
  • Cómo usar NOT VALID + VALIDATE para las restricciones
  • Cómo establecer lock_timeout y reintentar
  • Cómo evitar transacciones de larga duración que bloqueen las migraciones

Comprobación rápida

Añade una restricción NOT NULL a una tabla de 500 GB mediante un único ALTER TABLE. ¿Qué ocurre con las escrituras?

Preguntas frecuentes

¿La lección «Migraciones en línea: por qué ALTER TABLE bloquea» es gratis?

Sí — el texto completo de «Migraciones en línea: por qué ALTER TABLE bloquea» 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 «Migraciones en línea: por qué ALTER TABLE bloquea»?

Comprenda qué formas de ALTER TABLE adquieren un bloqueo ACCESS EXCLUSIVE y reescriben la tabla, y cuáles solo modifican metadatos. 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 1 de 4.

¿Cuánto tiempo toma la lección «Migraciones en línea: por qué ALTER TABLE bloquea»?

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. Migraciones en línea: por qué ALTER TABLE bloquea
  2. Índices concurrentes (CREATE INDEX CONCURRENTLY)
  3. Renombrado de columnas sin tiempo de inactividad
  4. Herramientas: Flyway, Liquibase, Sqitch
← Volver a SQL Academy