Ao executar instruções DDL em tabelas de dados frios armazenadas no Object Storage Service (OSS), o PolarDB for MySQL seleciona automaticamente o algoritmo de execução mais eficiente. Este documento explica os dois algoritmos compatíveis — INSTANT e COPY —, descreve o requisito OSS META para DDL INSTANT e lista as operações que utilizam cada algoritmo, permitindo planejar alterações de DDL sem interromper a carga de trabalho.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster PolarDB for MySQL executando MySQL 8.0.2 com versão de revisão 8.0.2.2.23 ou posterior
Arquivamento de dados frios ativado no cluster. Consulte Ativar arquivamento de dados frios
Uma conexão ativa com o cluster. Consulte Conectar-se a um cluster
Dados frios no formato CSV (valores separados por vírgula) ou ORC (Optimized Row Columnar)
Como funciona
O PolarDB for MySQL oferece suporte a dois algoritmos de execução de DDL para dados frios:
Algoritmo INSTANT: Modifica apenas metadados no dicionário de dados. Os dados existentes não sofrem alteração, cópia ou reconstrução. A operação é concluída em segundos, independentemente do tamanho da tabela. Esse é o comportamento padrão; o PolarDB for MySQL aplica-o automaticamente quando há suporte.
COPY algorithm: Copia todos os dados da tabela para uma nova tabela. Durante a cópia, a tabela original fica sob um bloqueio SHARED_NO_WRITE (SNW): leituras são permitidas, mas gravações são bloqueadas. Utilize esse algoritmo apenas quando o INSTANT não for aplicável.
Para especificar um algoritmo explicitamente, use a cláusula ALGORITHM com DEFAULT, INSTANT ou COPY. Se o algoritmo especificado não oferecer suporte à operação, o sistema retornará um erro.
O PolarDB for MySQL seleciona INSTANT por padrão e recorre ao COPY apenas quando a operação exige a reconstrução da tabela.
Ative OSS META para usar DDL INSTANT
Uma tabela oferece suporte a DDL INSTANT somente se o OSS META estiver ativado. O OSS META é uma camada aprimorada de metadados disponível na revisão 8.0.2.2.23 e posteriores.
Verifique se o OSS META está ativado
Execute SHOW CREATE TABLE. Se OSS META=1 aparecer na saída, o OSS META estará ativado.
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)
Ative OSS META para novas tabelas
Defina o parâmetro use_oss_meta como ON. Essa configuração aplica-se aos três cenários de arquivamento: tabelas InnoDB não particionadas arquivadas em tabelas externas OSS, tabelas InnoDB particionadas arquivadas em tabelas externas OSS e tabelas InnoDB arquivadas em partições OSS.
Verifique se o parâmetro está ativo:
show variables like "use_oss_meta";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| use_oss_meta | ON |
+---------------+-------+
1 row in set (0.03 sec)
Quando use_oss_meta está definido como ON, as tabelas recém-arquivadas incluem automaticamente o marcador OSS META. Os exemplos a seguir mostram o marcador após o arquivamento de uma tabela não particionada e de uma tabela particionada:
alter table t engine = csv storage oss;
Query OK, 3 rows affected (2.13 sec)
Records: 3 Duplicates: 0 Warnings: 0
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)
alter table t1 change partition p0 engine = orc;
Query OK, 0 rows affected (1.95 sec)
Records: 0 Duplicates: 0 Warnings: 0
show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020223 OSS META=1 */ CONNECTION='default_oss_server'
/*!99990 800020205 PARTITION BY RANGE COLUMNS(id)
(PARTITION p0 VALUES LESS THAN (10) ENGINE = ORC,
PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (30) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (40) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (50) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN (60) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN (70) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN (80) ENGINE = InnoDB,
PARTITION p8 VALUES LESS THAN (90) ENGINE = InnoDB,
PARTITION p9 VALUES LESS THAN (100) ENGINE = InnoDB,
PARTITION p10 VALUES LESS THAN (110) ENGINE = InnoDB) */
1 row in set (0.00 sec)
Ative OSS META para tabelas existentes
Execute REPAIR TABLE para adicionar o OSS META a uma tabela existente:
repair table t;
+--------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------+--------+----------+----------+
| test.t | repair | status | OK |
+--------+--------+----------+----------+
1 row in set (0.84 sec)
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)
Durante a execução de REPAIR TABLE, a tabela fica bloqueada pelo bloqueio X. Não é possível consultar ou modificar a tabela. O tempo de execução aumenta proporcionalmente ao tamanho da tabela.
Desativar OSS META
Execute ALTER TABLE ... DISABLE OSS META para remover o marcador OSS META:
alter table t disable oss meta;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */
1 row in set (0.00 sec)
A alteração entra em vigor imediatamente, sem necessidade de reiniciar o serviço de banco de dados.
Operações DDL compatíveis
As tabelas abaixo indicam se cada operação utiliza INSTANT (apenas metadados) ou COPY (reconstrução da tabela).
Operações de coluna
|
Operação |
Reconstrói a tabela |
Modifica apenas metadados |
|
Adicionar uma coluna |
Não¹ |
Sim¹ |
|
Remover uma coluna |
Sim |
Não |
|
Renomear uma coluna |
Não |
Sim |
|
Ordenar colunas |
Sim |
Não |
|
Especifique o valor padrão de uma coluna |
Não |
Sim |
|
Modifique o comentário de uma coluna |
Não |
Sim |
|
Alterar o tipo de uma coluna |
Sim |
Não |
|
Estender o comprimento de uma coluna VARCHAR |
Não |
Sim |
|
Alterar o conjunto de caracteres utf8mb3 de uma coluna para utf8mb4 |
Não² |
Sim² |
|
Excluir o valor padrão de uma coluna |
Não |
Sim |
|
Alterar o valor de incremento automático de uma coluna |
Não |
Sim |
|
Alterar os valores de uma coluna para NULL |
Sim |
Não |
|
Alterar os valores de uma coluna para valores não NULL |
Sim |
Não |
|
Alterar a definição de uma coluna ENUM ou SET |
Não |
Sim³ |
Nota de rodapé 1 — Adicionar uma coluna: O recurso Instant ADD COLUMN adiciona colunas apenas ao final de uma tabela com OSS META ativado. Se a tabela não tiver chave primária, defina implicit_primary_key como OFF para evitar conflitos com uma coluna de chave primária implícita gerada automaticamente. Caso o cluster não ofereça suporte a Instant ADD COLUMN, utilize o algoritmo COPY. A reconstrução da tabela é necessária, embora leituras simultâneas sejam permitidas durante o processo.
Nota de rodapé 2 — Alterar utf8mb3 para utf8mb4: A alteração do conjunto de caracteres de uma coluna de utf8mb3 para utf8mb4 modifica apenas metadados quando as três condições seguintes são atendidas:
O tipo da coluna é CHAR, VARCHAR, ENUM ou TEXT
Não há índices criados na coluna
O comprimento máximo de armazenamento da coluna (antes e depois da conversão) permanece abaixo de 256 bytes ou acima de 255 bytes
Se alguma condição não for atendida, o sistema utilizará o algoritmo COPY. A tabela fica bloqueada e apenas leituras são permitidas durante a reconstrução. Para forçar o uso de INSTANT e receber um erro imediato caso não seja aplicável:
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = INSTANT;
ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
Nota de rodapé 3 — Coluna ENUM ou SET: A alteração apenas de metadados aplica-se somente quando novos elementos são adicionados ao final da coluna ENUM ou SET e o tamanho de armazenamento do tipo de dados permanece inalterado. Caso contrário, o sistema utiliza o algoritmo COPY com reconstrução completa da tabela.
Operações de tabela
|
Operação |
Reconstrói a tabela |
Modifica apenas metadados |
|
Ative META |
Sim |
Não |
|
Desativar META |
Não |
Sim |
|
Declarar um conjunto de caracteres |
Não |
Sim |
|
Converter um conjunto de caracteres |
Sim |
Não |
|
Renomear uma tabela |
Não |
Sim¹ |
|
Modifique o comentário de uma tabela |
Não |
Sim |
Nota de rodapé 1 — Renomear uma tabela: Ao renomear uma tabela armazenada no OSS, os arquivos de dados no OSS são renomeados em vez de reescritos. A velocidade é proporcional ao tamanho da tabela e ligeiramente menor do que em outras operações INSTANT que modificam apenas metadados.