As alterações DDL sem bloqueio evitam o travamento de tabelas durante mudanças de schema, prevenindo interrupções nos negócios e atrasos de replicação causados por operações DDL online nativas.
Contexto
Ao alterar o schema de uma tabela grande, é necessário considerar o risco de bloqueios de tabela impedirem operações de escrita.
-
No MySQL 5.5 e em versões anteriores, o DDL oferece suporte a dois algoritmos de execução: Table-Copy e In-Place.
Table-Copy: Copia os dados para uma tabela temporária, bloqueando a tabela source e impedindo escritas até que a alteração seja concluída.
In-Place (disponível desde o MySQL 5.5): Permite operações de leitura e escrita durante a execução, mas suporta apenas operações relacionadas a índices.
-
O MySQL 5.6 e versões posteriores também introduziram o Innodb-OnlineDDL. Para obter mais informações sobre o Innodb-OnlineDDL, consulte Innodb-OnlineDDL.
O Innodb-OnlineDDL abrange uma ampla variedade de tipos de DDL, como adicionar ou excluir colunas, renomear colunas e adicionar ou modificar índices. No entanto, ele não suporta alguns tipos comuns, como modificar tipos de coluna, alterar comprimentos de coluna ou mudar conjuntos de caracteres.
Casos de uso
Alterar o schema de uma tabela de banco de dados.
Modificar o conjunto de caracteres e a collation de uma tabela, ou ajustar seu fuso horário.
Evitar bloqueios de tabela decorrentes de operações
OPTIMIZE TABLEque recuperam espaço e reduzem a taxa de fragmentação. Para mais detalhes, veja Desfragmentar espaço usando alteração de schema sem bloqueio.
Tipos de banco de dados suportados
RDS MySQL, PolarDB for MySQL, MyBase for MySQL e outros bancos de dados compatíveis com MySQL.
Recursos
O recurso de alteração de schema sem bloqueio do DMS permite controlar a velocidade de execução, ajudando a prevenir atrasos de replicação e minimizando o impacto no desempenho do banco de dados. Ele também suporta alterações nas quais o DDL online nativo normalmente bloquearia a tabela.
Diferentemente do pt-online-schema-change e do OSC, o recurso de alteração de schema sem bloqueio do DMS não depende de triggers. Ele é executado de forma assíncrona, com impacto mínimo no banco de dados, e pode ser interrompido com segurança a qualquer momento.
-
Este recurso possui alta compatibilidade com o DTS e não interrompe links de replicação do DTS no nível de tabela.
NotaO link de replicação do DTS deve ter sido reiniciado após 14 de fevereiro de 2020.
-
A tabela a seguir compara as capacidades nativas de DDL online do MySQL com o recurso de alteração de schema sem bloqueio do DMS:
Operação
MySQL 5.5 e anteriores
MySQL 5.6 e posteriores
Alteração de schema sem bloqueio do DMS
Adicionar uma coluna
❌
✅
✅
Excluir uma coluna
❌
✅
✅
Renomear uma coluna
❌
✅
✅
Adicionar um índice
❌
✅
✅
Modificar um índice
❌
✅
✅
Desfragmentar uma tabela
❌
✅
✅
Modificar o tipo de uma coluna
❌
❌
✅
Modificar o comprimento de uma coluna
❌
❌
✅
Modificar um conjunto de caracteres
❌
❌
✅
Converter um conjunto de caracteres
❌
❌
✅
Ajustar um fuso horário
❌
❌
✅
Mitigar ou eliminar atraso de réplica de leitura
❌
❌
✅
Adicionar uma chave única
✅
✅
✅
Adicionar uma restrição
✅
✅
✅
ImportanteAo adicionar uma chave única ou uma restrição usando o recurso de alteração de schema sem bloqueio do DMS, observe que quaisquer dados na tabela source que violem a nova chave única ou restrição são descartados automaticamente pelo MySQL durante o processo de cópia para a tabela temporária.
Para comparar o recurso de alteração de schema sem bloqueio do DMS com outras soluções, consulte Comparação de soluções de alteração de schema sem bloqueio.
Observações de uso
O DMS suporta alterações de schema para tabelas particionadas existentes.
-
É possível usar um único ticket de alteração de schema sem bloqueio para modificar várias tabelas dentro do mesmo banco de dados.
Ao configurar as instruções SQL para o ticket, separe as instruções de tabelas diferentes com ponto e vírgula (;).
Não é possível atualizar a chave primária ou única de uma tabela durante uma alteração de schema sem bloqueio se ela for a única chave da tabela. Tentar essa operação causará falha na tarefa.
Como funciona
Ao enviar um ticket de alteração de schema sem bloqueio, o DMS executa automaticamente as etapas a seguir para concluir a mudança sem bloquear a tabela:
-
Crie uma tabela temporária. O DMS cria uma nova tabela que espelha o schema da tabela source.
A sintaxe SQL é
CREATE TABLE tmp_table_name LIKE table_name. -
Altere o schema da tabela temporária. O DMS aplica as alterações DDL solicitadas à tabela temporária.
A sintaxe SQL é
ALTER TABLE tmp_table_name XXXX. -
Copie todos os dados. O DMS copia todos os dados da tabela source para a tabela temporária.
A sintaxe SQL é
INSERT IGNORE INTO tmp_table_name (SELECT %s FROM table_name FORCE INDEX (%s) WHERE XXX LOCK IN SHARE MODE). -
Analise o binlog para sincronizar dados incrementais. O DMS aplica alterações contínuas do binlog da tabela source à tabela temporária.
A sintaxe SQL é
UPDATE/INSERT/DELETE tmp_table_name. -
Troque as tabelas. O DMS renomeia atomicamente a tabela source para um nome de backup e a tabela temporária para o nome da tabela original.
A sintaxe SQL é
RENAME TABLE table_name to old_tmp_table_name, tmp_table_name to table_name.
tmp_table_name é um exemplo de nome de tabela temporária. Você encontra o nome específico da tabela temporária na área de progresso da tarefa de alteração de schema sem bloqueio. Para mais informações, consulte Visualize o progresso da alteração de schema sem bloqueio.
O formato dos nomes das tabelas temporárias é o seguinte:
Tabela de dados: tp_{change_ID}_ogt_{original_table_name}, tp_{change_ID}_g_{original_table_name}
Tabela de heartbeat: tp_{change_ID}_ogl_{original_table_name}, tp_{change_ID}_l_{original_table_name}
Tabela auxiliar antes do switchover e tabela original após o switchover: tp_{change_ID}_del_{original_table_name}, tp_{change_ID}_d_{original_table_name}
Detecção de bloqueio de tabela: tpa_xxx_xxx
O ID de alteração é o ID de execução do mecanismo interno do DMS. Não corresponde ao ID do ticket ou ao ID da tarefa.
Documentos relacionados
-
Para começar a usar a alteração de schema sem bloqueio:
Ative o recurso de alteração de schema sem bloqueio para uma instância. Para mais informações, consulte Ativar alteração de schema sem bloqueio.
Envie um ticket para realizar uma alteração de schema sem bloqueio. Para mais informações, consulte Usar um ticket para realizar alteração de schema sem bloqueio.
(Opcional) Visualize o progresso de uma tarefa de alteração de schema sem bloqueio. Para mais informações, consulte Visualize o progresso da alteração de schema sem bloqueio.
-
Também é possível usar APIs para configurar e gerenciar tickets de alteração de schema sem bloqueio:
API
Descrição
Cria um ticket para alteração de schema sem bloqueio.
Obtém os detalhes de uma tarefa de ticket de alteração de schema sem bloqueio, incluindo o status de execução da tarefa e o número de linhas de dados afetadas.
Perguntas frequentes
-
P: Uma alteração de schema sem bloqueio afeta meus serviços?
R: Normalmente, uma alteração de schema sem bloqueio não afeta seus serviços. No entanto, o processo de cópia de dados pode impactar o desempenho da instância.
-
P: Recebi um erro ao tentar adicionar um índice com
CREATE_INDEXem um ticket de alteração de schema sem bloqueio. O DMS não suporta a adição de índices?R: Sim, o DMS suporta a adição de índices. Execute a seguinte instrução
ALTER TABLEpara adicionar um índice:ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) ; -
P: Recebi um erro ao tentar renomear uma coluna com
rename columnem um ticket de alteração de schema sem bloqueio. O DMS não suporta a renomeação de colunas?R: Sim, o DMS suporta a renomeação de colunas. Execute a seguinte instrução
ALTER TABLEpara renomear uma coluna:ALTER TABLE table_name CHANGE COLUMN old_column_name new_column_name datatype;