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

ALTER sem bloqueio em uma tabela grande com pt-online-schema-change

MySQLOperações online

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

O que faz

Cria uma cópia vazia com a nova estrutura, copia as linhas em chunks, espelha as mudanças durante a cópia com triggers e por fim troca as tabelas com um RENAME atômico. Desacelera / pausa sozinho quando a carga ou o lag das réplicas passam dos limites.

Quando usar

Para ALTERs que precisam de COPY (tipo de coluna, charset, mudança de PK) ou que causariam um lag longo nas réplicas.

Atenção

A tabela precisa de uma PK ou unique key. Os triggers adicionam overhead a toda gravação durante a migração; em tabelas com gravações muito intensas o gh-ost tem menos impacto. Se tabelas filhas referenciam esta tabela via foreign keys, é necessário --alter-foreign-keys-method=auto. Para contas caching_sha2_password adicione s=1 (TLS) ao DSN; caso contrário a conexão com a réplica falha com 'Authentication requires secure connection'. O DSN de --check-replica-lag não herda usuário / senha do DSN principal; especifique-os. A troca obtém um breve metadata lock; mantenha lock_wait_timeout baixo, ele tenta de novo se o lock não puder ser obtido.

Abrir no DBAtlas →

Relacionados