DBAtlas · Atlas de operaciones de bases de datos

ALTER sin bloqueos sobre una tabla grande con pt-online-schema-change

MySQLOperaciones en línea

Comando

# First --dry-run, then the same command with --execute; throttles on replica lag
pt-online-schema-change --alter "ADD COLUMN region CHAR(2) NULL, ADD INDEX ix_region (region)" \
  D=shop,t=orders,h=db1,u=osc,p='Osc#2024',s=1 \
  --max-lag=5 --check-replica-lag h=db2,u=osc,p='Osc#2024',s=1 \
  --max-load Threads_running=50 --critical-load Threads_running=200 \
  --set-vars lock_wait_timeout=5 --noversion-check --dry-run

Qué hace

Crea una copia vacía con la nueva estructura, copia las filas en chunks, replica los cambios durante la copia con triggers y finalmente intercambia las tablas con un RENAME atómico. Se ralentiza / pausa por sí solo cuando la carga o el lag de las réplicas superan los umbrales.

Cuándo usarlo

Para ALTER que necesitan COPY (tipo de columna, charset, cambio de PK) o que causarían un lag largo en las réplicas.

Precaución

La tabla necesita una PK o una unique key. Los triggers añaden sobrecarga a cada escritura durante la migración; en tablas con muchísimas escrituras gh-ost tiene menos impacto. Si hay tablas hijas que referencian esta tabla mediante foreign keys, se requiere --alter-foreign-keys-method=auto. Para cuentas caching_sha2_password añada s=1 (TLS) al DSN; de lo contrario la conexión a la réplica falla con 'Authentication requires secure connection'. El DSN de --check-replica-lag no hereda usuario / contraseña del DSN principal; indíquelos. El intercambio toma un breve metadata lock; mantenga bajo lock_wait_timeout, reintenta si no consigue el bloqueo.

Abrir en DBAtlas →

Relacionado