ALTER sem bloqueio em uma tabela grande com pt-online-schema-change
MySQLOperações onlineComando
# 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-runO 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.