No ecossistema MySQL, alterar o tipo de uma coluna exige o algoritmo COPY para reconstruir toda a tabela. Durante essa reconstrução, a tabela de destino aceita apenas consultas de leitura e não lida com gravações simultâneas. Além disso, o algoritmo COPY reconstrói a tabela inteira em uma única thread, o que resulta em baixa eficiência. Por isso, a alteração de tipos de colunas sempre foi um ponto crítico no ecossistema MySQL. Para resolver esse problema, o PolarDB for MySQL oferece o recurso de modificação instantânea de colunas (Instant Modify Column). Ao alterar o tipo de uma coluna, apenas a definição da tabela é atualizada, sem modificar os dados existentes. Assim, você altera rapidamente o tipo de coluna em tabelas de qualquer tamanho. Este tópico descreve como utilizar o recurso de modificação instantânea de colunas.
Pré-requisitos
O cluster deve executar o PolarDB for MySQL 8.0.2 com versão de revisão 8.0.2.2.28 ou posterior. Consulte o número da versão para confirmar a versão do cluster.
Parâmetros
Parâmetro | Nível | Descrição |
| Global | Define se o recurso de modificação instantânea de colunas está ativado. Valores válidos:
|
| Global | Especifica o número máximo de modificações instantâneas de colunas permitidas em uma única tabela. Valores válidos: 1 a 64. Valor padrão: 16. |
O recurso de modificação instantânea de colunas do PolarDB for MySQL está em lançamento canário. Para utilizá-lo, acesse o Quota Center, localize o nome da cota pelo ID da cota polarm_82_instant_modify_column e clique em Apply na coluna Actions correspondente para ativar o recurso.
Limites de uso
-
A modificação instantânea de colunas serve apenas para aumentar o comprimento dos seguintes tipos de dados. Outros atributos de coluna não podem ser modificados instantaneamente. As alterações suportadas são:
-
Tipos inteiros: é possível modificar instantaneamente entre os tipos
TINYINT,SMALLINT,MEDIUMINT,INTeBIGINT. A modificação instantânea suporta apenas o aumento do comprimento, não a redução.Por exemplo,
INTpode ser modificado instantaneamente para o tipoBIGINT, mas não é possível modificarBIGINTparaINTinstantaneamente. -
Tipos string:
-
Use a modificação instantânea para alterar um tipo VARCHAR(N) para VARCHAR(N+M), onde N e M são números inteiros positivos maiores que 0.
Por exemplo,
VARCHAR(50)pode ser modificado instantaneamente para o tipoVARCHAR(300), mas o tipoVARCHAR(300)não pode ser modificado instantaneamente paraVARCHAR(50). -
Use a modificação instantânea para mudar um tipo CHAR(N) para CHAR(N+M), onde N e M são números inteiros positivos maiores que 0.
Por exemplo,
CHAR(30)pode ser modificado instantaneamente para o tipoCHAR(50), mas o tipoCHAR(50)não pode ser modificado instantaneamente paraCHAR(30).
-
-
Somente tabelas com formato de linha
COMPACTouDYNAMICsão suportadas.A coluna a ser modificada não pode ser uma coluna de índice.
Não há suporte para modificação instantânea de colunas em tabelas particionadas.
Tabelas que utilizam índices de texto completo ou índices espaciais não são suportadas.
Não execute outras operações DDL juntamente com a modificação instantânea de colunas na mesma instrução SQL.
Antes de executar uma operação DDL, utilize o recurso EXPLAIN DDL para verificar se a operação suporta INSTANT. Para mais informações, consulte EXPLAIN DDL.
Uso
Especificar ALGORITHM=INSTANT para forçar a modificação instantânea de colunas (recomendado)
CREATE TABLE t(a int);
SHOW CREATE TABLE t;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- Specify the INSTANT algorithm to quickly modify the column type
ALTER TABLE t modify COLUMN a bigint DEFAULT NULL,algorithm=INSTANT;
Ao usar a instrução anterior, se o sistema retornar ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY/INPLACE., a modificação atual do tipo de coluna não pode ser realizada com o algoritmo INSTANT. Recomendamos verificar se o parâmetro loose_innodb_polar_instant_modify_column_enable está ativado e revisar cuidadosamente os Limites de uso.
Não especificar ALGORITHM ou definir ALGORITHM=DEFAULT para permitir que o PolarDB for MySQL escolha o método ideal
Se você não especificar ALGORITHM ou defini-lo como ALGORITHM=DEFAULT, o sistema seleciona o algoritmo ideal para a modificação do tipo de coluna seguindo esta ordem de prioridade.
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 utiliza a seguinte ordem de prioridade ao selecionar um algoritmo:
Preferência pelo INSTANT: ao executar uma operação DDL, o INSTANT modifica apenas os metadados no dicionário de dados, sem alterar os dados da tabela. Portanto, o tamanho da tabela não afeta o processo, e toda a operação DDL pode ser concluída em segundos.
Uso subsequente do INPLACE: a maioria das operações DDL INPLACE suporta leituras e gravações simultâneas durante a execução e pode ser acelerada via DDL paralelo, resultando em baixo impacto nos negócios.
Uso do COPY como última opção: o COPY reconstrói a tabela inteira, não permite gravações simultâneas durante a reconstrução e causa impacto significativo nos negócios.
Visualizar informações sobre colunas modificadas instantaneamente
No banco de dados INFORMATION_SCHEMA, foi adicionada uma nova tabela chamada INNODB_INSTANT_COLUMNS. Essa tabela registra informações sobre todas as colunas que foram modificadas instantaneamente no cluster (apenas colunas modificadas instantaneamente aparecem nesta tabela). O esquema da tabela é o seguinte:
SHOW CREATE TABLE INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
***************************[ 1. row ]***************************
Table | INNODB_INSTANT_COLUMNS
Create Table | 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
Os campos são descritos da seguinte forma:
|
Campo |
Descrição |
|
TABLE_ID |
O ID da tabela. |
|
TABLE_NAME |
O nome da tabela. |
|
SCHEMA_NAME |
O nome do banco de dados. |
|
COLUMN_NAME |
O nome da coluna. |
|
MTYPE |
As informações de tipo da coluna: MYSQL_TYPE_XXX. |
|
PRTYPE |
As informações PRTYPE da coluna. |
|
LEN |
As informações de comprimento da coluna. |
|
HAS_DEFAULT |
Indica se a coluna possui um valor padrão. O valor é 1 para colunas adicionadas instantaneamente e 0 caso contrário. |
|
DEFAULT_VALUE |
O valor padrão. |
|
CURRENT_VERSION |
As informações de versão da coluna atual. |
|
OLD_VERSION_INFO |
Todas as informações históricas de tipo da coluna. |
Com a tabela INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS, execute a seguinte instrução para visualizar as colunas que foram modificadas instantaneamente no cluster:
SELECT * FROM INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
Se uma tabela tiver sido modificada usando o algoritmo INSTANT e, em seguida, for executada uma operação DDL que reconstrua a tabela (como DROP COLUMN), o sistema exclui as informações de coluna relacionadas a essa tabela da tabela INNODB_INSTANT_COLUMNS.