O MySQL padrão utiliza o algoritmo COPY para modificar o tipo de dados de uma coluna. Esse processo reconstrói toda a tabela em uma única thread e bloqueia todas as operações de escrita. Em tabelas grandes, isso pode levar de minutos a horas. O recurso Instant Modify Column do PolarDB for MySQL evita esse problema ao atualizar apenas os metadados da tabela, concluindo a operação em segundos, independentemente do tamanho da tabela.
O Instant Modify Column está em versão canary. Para utilizá-lo, acesse o Quota Center , localize a cota polarm_82_instant_modify_column e clique em Apply .
Versões suportadas
PolarDB for MySQL 8.0.2, versão de revisão 8.0.2.2.28 ou posterior. Verifique a versão do mecanismo de banco de dados antes de começar.
Parâmetros
|
Parâmetro |
Nível |
Descrição |
Padrão |
|
|
Global |
Ativa ou desativa o Instant Modify Column. Valores válidos: |
|
|
|
Global |
Número máximo de vezes que o recurso pode modificar tipos de coluna em uma única tabela. Intervalo: 1–64 |
|
Operações suportadas
O Instant Modify Column suporta apenas o aumento do comprimento da coluna para os seguintes tipos de dados. Consulte esta tabela para verificar se a sua operação é suportada antes de executá-la.
|
Tipo de coluna |
Alteração suportada |
Exemplo suportado |
Exemplo não suportado |
|
|
Aumento para um tipo inteiro mais amplo |
|
|
|
|
Aumento de comprimento ( |
|
|
|
|
Aumento de comprimento ( |
|
|
As seguintes restrições adicionais se aplicam:
|
Restrição |
Detalhes |
|
Formato de linha |
Apenas formato de linha |
|
Colunas indexadas |
Não é possível modificar colunas com índice |
|
Tabelas particionadas |
Não é possível modificar colunas em tabelas particionadas |
|
Índices full-text ou espaciais |
Não é possível modificar colunas em tabelas com índices full-text ou espaciais |
|
DDL combinado |
O Instant Modify Column não pode ser combinado com outras operações DDL na mesma instrução |
Se a sua operação não atender a essas condições e você especificar ALGORITHM=INSTANT, o seguinte erro será retornado:
ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY/INPLACE
Dica: Antes de executar uma instrução DDL, use o EXPLAIN DDL para verificar se o algoritmo INSTANT é suportado para essa operação.
Modificar instantaneamente o tipo de uma coluna
Forçar o algoritmo INSTANT (recomendado)
Especifique ALGORITHM=INSTANT para impor o uso do Instant Modify Column. Caso a operação não possa utilizar o modo INSTANT, um erro será retornado imediatamente, em vez de haver uma queda silenciosa para um algoritmo mais lento.
CREATE TABLE t(a int);
-- Verify the current table structure
SHOW CREATE TABLE t;
-- Output:
-- CREATE TABLE `t` (
-- `a` int(11) DEFAULT NULL
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- Modify the column type using the INSTANT algorithm
ALTER TABLE t MODIFY COLUMN a bigint DEFAULT NULL, ALGORITHM=INSTANT;
Permitir que o PolarDB escolha o algoritmo automaticamente
Omita a cláusula de algoritmo ou especifique ALGORITHM=DEFAULT para permitir que o PolarDB for MySQL selecione automaticamente o algoritmo mais eficiente.
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint, ALGORITHM=DEFAULT;
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint;
O PolarDB for MySQL avalia os algoritmos na seguinte ordem de prioridade:
|
Prioridade |
Algoritmo |
Comportamento |
|
1 (mais alta) |
INSTANT |
Atualiza apenas metadados. Conclui em segundos, independentemente do tamanho da tabela. Não reconstrói a tabela. |
|
2 |
INPLACE |
Permite leituras e escritas simultâneas durante a operação DDL. O DDL paralelo pode acelerar ainda mais o processo. |
|
3 (mais baixa) |
COPY |
Reconstrói toda a tabela. A tabela permanece somente leitura durante a operação. |
Visualizar colunas modificadas instantaneamente
A tabela INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS registra todas as colunas do cluster atual que foram modificadas usando o Instant Modify Column. Apenas colunas alteradas por esse recurso aparecem na tabela.
SELECT * FROM INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
Schema da tabela:
SHOW CREATE TABLE INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
-- CREATE TEMPORARY TABLE `INNODB_INSTANT_COLUMNS` (
-- `TABLE_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
-- `TABLE_NAME` varchar(193) NOT NULL DEFAULT '',
-- `SCHEMA_NAME` varchar(193) NOT NULL DEFAULT '',
-- `COLUMN_NAME` varchar(193) NOT NULL DEFAULT '',
-- `MTYPE` int(11) NOT NULL DEFAULT '0',
-- `PRTYPE` int(11) NOT NULL DEFAULT '0',
-- `LEN` int(11) NOT NULL DEFAULT '0',
-- `HAS_DEFAULT` int(1) NOT NULL DEFAULT '0',
-- `DEFAULT_VALUE` mediumblob,
-- `CURRENT_VERSION` int(11) NOT NULL DEFAULT '0',
-- `OLD_VERSION_INFO` blob
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
Descrição dos campos:
|
Campo |
Descrição |
|
|
ID da tabela |
|
|
Nome da tabela |
|
|
Nome do schema |
|
|
Nome da coluna |
|
|
Tipo da coluna |
|
|
Tipo preciso da coluna ou atributos |
|
|
Comprimento da coluna |
|
|
Indica se a coluna possui um valor padrão |
|
|
Valor padrão da coluna |
|
|
Informações de versão da coluna |
|
|
Informações históricas de tipo da coluna |
Se uma operação DDL que exige reconstrução completa da tabela (comoDROP COLUMN) for executada em uma coluna previamente modificada pelo Instant Modify Column, o registro dessa coluna será removido deINNODB_INSTANT_COLUMNS.