Online DDL: ALGORITHM=INSTANT / INPLACE, LOCK=NONE y seguimiento del progreso
MySQLOperaciones en líneaComando
-- Always state ALGORITHM/LOCK: unsupported operations fail immediately instead of silently falling back to COPY
ALTER TABLE shop.orders ADD COLUMN status TINYINT NOT NULL DEFAULT 0, ALGORITHM=INSTANT;
ALTER TABLE shop.orders RENAME COLUMN note TO remark, ALGORITHM=INSTANT;
ALTER TABLE shop.orders ADD INDEX ix_status (status), ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE shop.orders MODIFY remark VARCHAR(200), ALGORITHM=INPLACE, LOCK=NONE;
-- INSTANT row version counter (INSTANT is refused at 64, a rebuild resets it)
SELECT NAME, TOTAL_ROW_VERSIONS FROM information_schema.INNODB_TABLES WHERE NAME = 'shop/orders';
-- Progress of a long ALTER (enable the instruments once)
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'stage/innodb/alter%';
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_stages_%';
SELECT t.PROCESSLIST_ID, s.EVENT_NAME, s.WORK_COMPLETED, s.WORK_ESTIMATED,
ROUND(100 * s.WORK_COMPLETED / NULLIF(s.WORK_ESTIMATED, 0), 1) AS pct_done
FROM performance_schema.events_stages_current s
JOIN performance_schema.threads t ON t.THREAD_ID = s.THREAD_ID
WHERE s.EVENT_NAME LIKE 'stage/innodb/alter%';Qué hace
INSTANT solo cambia el data dictionary y termina de inmediato independientemente del tamaño de la tabla. INPLACE + LOCK=NONE procesa la tabla in situ permitiendo lecturas y escrituras concurrentes. La última consulta muestra en qué fase está un ALTER en ejecución y su porcentaje.
Cuándo usarlo
Antes de cambios de esquema en tablas de producción; para saber qué operaciones pueden ejecutarse sin tiempo de inactividad y estimar cuándo terminará un ALTER largo.
Precaución
INSTANT e INPLACE siguen tomando un breve metadata lock exclusivo al inicio y al final; si una transacción larga retiene la tabla, el ALTER espera y todas las consultas que vienen detrás se encolan (vea el diagnóstico de metadata locks). Reduzca lock_wait_timeout en la sesión (SET SESSION lock_wait_timeout = 5). El DML que llega durante INPLACE se registra hasta innodb_online_alter_log_max_size; si se supera, el ALTER se revierte al final. Los cambios de tipo de columna, la conversión de charset y los cambios de PK necesitan COPY y bloquean las escrituras; en tablas grandes use gh-ost / pt-online-schema-change. En una réplica el ALTER se ejecuta con un solo thread durante el mismo tiempo; un ALTER INPLACE grande causa lag en la réplica, INSTANT no.