Tabelas particionadas físicas podem apresentar dois problemas de estabilidade em grande escala: aumento excessivo de metadados quando um grupo de tabelas ultrapassa 10.000 tabelas filhas (partições) e degradação de desempenho devido a operações DDL frequentes causadas pela adição diária de novas partições. O Hologres V3.1 introduziu tabelas particionadas lógicas para resolver ambas as questões. Este tópico descreve como migrar uma tabela particionada física existente para uma tabela particionada lógica.
Quando migrar
Migre para uma tabela particionada lógica se sua tabela particionada física atender a qualquer uma das condições abaixo:
Um grupo de tabelas contém mais de 10.000 tabelas filhas, resultando em grande volume de metadados.
Novas partições são adicionadas diariamente, gerando operações DDL frequentes.
Escolha uma abordagem de migração
|
Abordagem |
Quando usar |
Tempo de inatividade |
Risco |
|
Verificação com escrita dupla (recomendado) |
Qualquer migração em que a continuidade dos negócios seja importante |
Mínimo — as tabelas antiga e nova operam em paralelo |
Baixo |
|
REBUILD (não recomendado) |
Quando é aceitável ter uma janela de mudança maior e tolerar algumas falhas de leitura/escrita |
Maior — tarefas de escrita param durante a migração |
Alto — tarefas podem falhar antes da conclusão da adaptação |
Migrar usando verificação com escrita dupla (recomendado)
Essa abordagem mantém as tabelas antiga e nova operando em paralelo durante a migração, minimizando o impacto nos negócios.
Visão geral
Interrompa as tarefas de escrita na tabela particionada física, crie uma nova tabela particionada lógica e copie os dados existentes.
Crie uma tarefa de escrita para a nova tabela e ative a escrita dupla em ambas as tabelas.
Verifique a nova tabela particionada lógica.
Direcione as consultas e tarefas de escrita dos negócios para a nova tabela.
Adapte as tarefas de O&M para a nova tabela.
Etapa 1: Criar uma tabela particionada lógica e carregar dados existentes
Escolha um dos métodos a seguir conforme sua situação.
Método 1: CLONE (recomendado para volumes moderados de dados sem alterações de schema)
hg_clone_to_logical_partition cria automaticamente uma nova tabela particionada lógica e copia todos os dados da tabela original. A tabela particionada física original não é excluída.
Interrompa as tarefas de escrita em tempo real antes de executar o CLONE. Após a conclusão do CLONE, crie novas tarefas de escrita que gravem simultaneamente nas tabelas antiga e nova para manter os dados sincronizados. Depois de concluir a migração, verifique minuciosamente ambas as tabelas, finalize a adaptação das tarefas de importação, consulta e O&M e, em seguida, limpe a tabela particionada física original.
CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');
Para grandes volumes de dados, execute o CLONE de forma assíncrona para evitar timeout. Após o envio, use o query_id retornado para verificar o progresso em Obter insights de consulta.
SET statement_timeout = 0;
ASYNC CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');
Método 2: Migração manual (para alterações de schema ou grandes volumes de dados)
A migração manual permite otimizar o schema da tabela e controlar o ritmo da migração.
Interrompa as tarefas de escrita em tempo real antes de importar os dados. Após a conclusão da importação, crie novas tarefas de escrita que gravem simultaneamente em ambas as tabelas. Depois de concluir a migração, verifique minuciosamente ambas as tabelas, finalize a adaptação das tarefas de importação, consulta e O&M e, em seguida, limpe a tabela particionada física original.
Crie a tabela particionada lógica. Consulte Conversão de schema de tabela para ver as alterações de DDL necessárias.
-
Importe os dados históricos usando
hg_insert_overwrite:CALL hg_insert_overwrite('logical_partition_table', '{20250601, 20250602}'::text[], 'SELECT * FROM tb');
Etapa 2: Ativar escrita dupla
Crie uma nova tarefa de escrita para a tabela particionada lógica e execute-a junto com a tarefa de escrita existente da tabela particionada física. Isso garante que ambas as tabelas permaneçam sincronizadas durante o período de verificação.
Etapa 3: Verificar a nova tabela
Execute suas consultas de negócios na tabela particionada lógica e confirme se os dados e o comportamento correspondem aos da tabela particionada física.
Etapa 4: Direcionar os negócios para a nova tabela
Utilize um dos métodos a seguir:
Opção A (recomendada): Atualize o nome da tabela nas tarefas de consulta para apontar para a nova tabela particionada lógica e adicione condições de filtro de partição onde necessário.
Opção B: Use RENAME para trocar os nomes das tabelas atomicamente:
Esta operação renomeia as tabelas existentes. Certifique-se de que suas tarefas de escrita e consulta estejam prontas para acessar a tabela pai antes de executar.
BEGIN;
ALTER TABLE <source_table_name> RENAME TO <source_table_name_archive>;
ALTER TABLE <target_table_name> RENAME TO <source_table_name>;
COMMIT;
Após a troca, atualize as tarefas de escrita e consulta que anteriormente acessavam tabelas filhas para usar a tabela pai e adicione condições de filtro de partição.
Etapa 5: Adaptar tarefas de O&M
Atualize todas as tarefas de O&M que diferem entre tabelas particionadas físicas e lógicas. Consulte Adaptação de tarefas de O&M para mais detalhes.
Migrar usando REBUILD (não recomendado)
Durante a migração via REBUILD, algumas tarefas de leitura e escrita podem falhar. Utilize esta abordagem apenas se uma janela de mudança prolongada for aceitável e falhas breves nas tarefas forem toleráveis. Este método não é recomendado para migrar tabelas particionadas.
Quando o REBUILD é concluído, a tabela particionada física é renomeada para tmp_rebuild_old_<query_id>_<unique_id>_<table_name>. As tarefas relacionadas podem gerar erros até que você conclua a adaptação das tarefas.
Interrompa as tarefas de escrita da tabela particionada física.
-
Execute o REBUILD para converter a tabela:
-- Add the NOT NULL constraint to the partition field. ASYNC REBUILD TABLE user_profile ALTER ds SET NOT NULL; -- Convert the physical partitioned table to a logical partitioned table (retains the original). ASYNC REBUILD TABLE user_profile WITH (keep_source) TO logical partition;Para mais informações, consulte REBUILD.
Atualize as tarefas de escrita e reinicie-as.
Adapte as tarefas de consulta para a nova tabela particionada lógica.
Adapte as tarefas de O&M para a nova tabela particionada lógica.
Conversão de schema de tabela
Ao criar uma tabela particionada lógica a partir do DDL de uma tabela particionada física existente, faça as seguintes alterações:
Adicione a palavra-chave
LOGICALantes dePARTITION BY.Adicione
NOT NULLà coluna da chave de partição.(Opcional) Adicione uma segunda chave de partição. Tabelas particionadas físicas suportam uma chave de partição; tabelas particionadas lógicas suportam até duas.
Tabela particionada física:
BEGIN;
CREATE TABLE user_profile (
a TEXT,
b TEXT,
ds TEXT
)
PARTITION BY LIST (ds);
CREATE TABLE user_profile_202503 PARTITION OF user_profile FOR VALUES IN ('202503');
CREATE TABLE user_profile_202504 PARTITION OF user_profile FOR VALUES IN ('202504');
COMMIT;
Tabela particionada lógica — uma chave de partição:
CREATE TABLE user_profile_lp_1 (
a TEXT,
b TEXT,
ds TEXT NOT NULL)
LOGICAL PARTITION BY LIST (ds);
Tabela particionada lógica — duas chaves de partição (dividindo ds em yy para ano e mm para mês):
CREATE TABLE user_profile_lp_2 (
a TEXT,
b TEXT,
yy TEXT NOT NULL,
mm TEXT NOT NULL)
LOGICAL PARTITION BY LIST (yy, mm);
Adaptação de tarefas de importação
Se sua tarefa de importação grava na tabela particionada física via Fixed Plan: nenhuma alteração é necessária.
Caso sua tarefa de importação grave em tabelas filhas (partições), faça as seguintes alterações:
Remova instruções que criam tabelas filhas. Tabelas particionadas lógicas não possuem partições físicas.
Altere o nome da tabela de destino do nome da tabela filha para o nome da tabela pai.
Cenário 1: Criar uma tabela filha e importar dados
-- Original task: import data to physical partitioned table
CREATE TABLE user_profile_202505 PARTITION OF user_profile FOR VALUES IN ('202505');
INSERT INTO user_profile_202505 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
-- Updated task: import data to logical partitioned table
INSERT INTO user_profile_lp_1 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
Cenário 2: Sobrescrever uma partição com insert overwrite
Se a tarefa original usa hg_insert_overwrite para sobrescrever várias partições de uma vez, divida as sobrescritas por partição, execute-as serialmente e utilize a sintaxe nativa INSERT OVERWRITE após migrar para uma tabela particionada lógica.
-- Original: physical partitioned table (temporary table method)
CREATE TABLE tmp_user_profile_202505(a text, b text, ds text);
INSERT INTO tmp_user_profile_202505 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
BEGIN;
DROP TABLE IF EXISTS user_profile_202505;
ALTER TABLE tmp_user_profile_202505 RENAME TO user_profile_202505;
ALTER TABLE user_profile ATTACH PARTITION user_profile_202505 FOR VALUES IN ('202505');
COMMIT;
-- Original: physical partitioned table (hg_insert_overwrite method)
CALL hg_insert_overwrite('user_profile', '202505', $$SELECT a, b, mm FROM <source_table> WHERE ds='202505'$$);
-- Updated: logical partitioned table (native INSERT OVERWRITE)
INSERT OVERWRITE user_profile_lp_1 PARTITION (ds = '202505') SELECT a, b, ds FROM <source_table> WHERE ds='202505';
Adaptação de tarefas de consulta
Se sua consulta acessa a tabela pai: nenhuma alteração é necessária.
Se sua consulta acessa uma tabela filha: altere-a para consultar a tabela pai e adicione uma condição de filtro de partição.
-- Original: physical partitioned table
SELECT * FROM user_profile_202504;
-- Updated: logical partitioned table
SELECT * FROM user_profile_lp_1 WHERE ds = '202504';
Adaptação de tarefas de O&M
Algumas operações de O&M utilizam tabelas de sistema ou funções diferentes para tabelas particionadas lógicas.
|
Operação |
Tabela particionada física |
Tabela particionada lógica |
|
Consultar DDL da tabela pai |
Função |
Sem diferença |
|
Consultar propriedades da tabela pai |
|
Sem diferença |
|
Consultar lista de partições |
|
|
|
Consultar propriedades da partição |
|
|
|
Consultar armazenamento da tabela pai |
|
|
Mapeamento de propriedades e parâmetros
A tabela a seguir mapeia parâmetros de particionamento automático e outras propriedades de tabela entre tabelas particionadas físicas e lógicas.
Se a tabela particionada física original usar um campo não temporal (como TEXT) como chave de partição e utilizar gerenciamento automático de partições, o Hologres V4.2 e versões posteriores suportam partition_expiration_time e partition_keep_hot_window na tabela particionada lógica. Você também deve definir partition_time_format para especificar o formato de hora. Versões anteriores à V4.2 não suportam essa configuração.
|
Módulo |
Recurso |
Tabela particionada física |
Tabela particionada lógica |
|
Particionamento automático |
Ativar |
|
Sem parâmetro equivalente |
|
Unidade de tempo |
|
Sem configuração separada; apenas partições temporais são suportadas |
|
|
Fuso horário |
|
Sem parâmetro equivalente |
|
|
Partições pré-criadas |
|
Sem parâmetro equivalente |
|
|
Partições a reter |
|
|
|
|
Partições quentes a reter |
|
|
|
|
Horário de agendamento |
|
Sem parâmetro equivalente |
|
|
Formato de data/hora da partição |
|
Sem parâmetro equivalente |
|
|
Gerenciamento de partições |
Reter partição |
|
|
|
Armazenamento quente/frio |
|
|
|
|
Binary log |
Ativar (tabela pai) |
|
|
|
Ciclo de vida (tabela pai) |
|
|
|
|
Binary log dinâmico por partição |
Não suportado |
|
|
|
Ativar (partições) |
Herdado da tabela pai; modificação não suportada |
|
|
|
Ciclo de vida (partições) |
Partições suportam modificação |
Herdado da tabela pai; modificação não suportada |
|
|
Índices e propriedades de tabela |
|
Partições suportam modificação |
Herdado da tabela pai; modificação não suportada |
|
|
Partições suportam modificação |
Herdado da tabela pai; modificação não suportada |
|
|
|
Herdado da tabela pai; modificação não suportada |
Herdado da tabela pai; modificação não suportada |
|
|
Chave primária, |
Herdado da tabela pai; modificação não suportada |
Herdado da tabela pai; modificação não suportada |