DBAtlas · Atlas de operações de banco de dados

DDL online: ALGORITHM=INSTANT / INPLACE, LOCK=NONE e acompanhamento do progresso

MySQLOperações online

Comando

-- 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%';

O que faz

INSTANT altera apenas o data dictionary e termina imediatamente, independentemente do tamanho da tabela. INPLACE + LOCK=NONE processa a tabela no próprio local permitindo leituras e gravações concorrentes. A última consulta mostra em que estágio está um ALTER em execução e seu percentual.

Quando usar

Antes de mudanças de schema em tabelas de produção; para saber quais operações podem rodar sem downtime e estimar quando um ALTER longo vai terminar.

Atenção

INSTANT e INPLACE ainda obtêm um breve metadata lock exclusivo no início e no fim; se uma transação longa estiver segurando a tabela, o ALTER espera e toda consulta atrás dele entra na fila (veja o diagnóstico de metadata lock). Reduza lock_wait_timeout na sessão (SET SESSION lock_wait_timeout = 5). O DML que chega durante o INPLACE é registrado até innodb_online_alter_log_max_size; se excedido, o ALTER sofre rollback no final. Mudanças de tipo de coluna, conversão de charset e mudanças de PK precisam de COPY e bloqueiam gravações; em tabelas grandes use gh-ost / pt-online-schema-change. Em uma réplica o ALTER roda single-threaded pela mesma duração; um ALTER INPLACE grande causa lag na réplica, o INSTANT não.

Abrir no DBAtlas →

Relacionados