Todos os produtos
Search
Central de documentação

Hologres:Migrar de tabelas particionadas físicas para lógicas

Última atualização: Jun 28, 2026

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

  1. Interrompa as tarefas de escrita na tabela particionada física, crie uma nova tabela particionada lógica e copie os dados existentes.

  2. Crie uma tarefa de escrita para a nova tabela e ative a escrita dupla em ambas as tabelas.

  3. Verifique a nova tabela particionada lógica.

  4. Direcione as consultas e tarefas de escrita dos negócios para a nova tabela.

  5. 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.

Importante

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.

Importante

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.

  1. Crie a tabela particionada lógica. Consulte Conversão de schema de tabela para ver as alterações de DDL necessárias.

  2. 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:

Aviso

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)

Aviso

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.

  1. Interrompa as tarefas de escrita da tabela particionada física.

  2. 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.

  3. Atualize as tarefas de escrita e reinicie-as.

  4. Adapte as tarefas de consulta para a nova tabela particionada lógica.

  5. 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 LOGICAL antes de PARTITION 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

Nota

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 hg_dump_script

Sem diferença

Consultar propriedades da tabela pai

hologres.hg_table_properties

Sem diferença

Consultar lista de partições

Consultar todas as tabelas filhas

hologres.hg_list_logical_partition

Consultar propriedades da partição

hologres.hg_table_properties

hologres.hg_logical_partitioned_table_properties

Consultar armazenamento da tabela pai

hg_table_storage_status

hg_partition_file_status

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.

Nota

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

auto_partitioning_enable

Sem parâmetro equivalente

Unidade de tempo

auto_partitioning_time_unit

Sem configuração separada; apenas partições temporais são suportadas

Fuso horário

auto_partitioning_time_zone

Sem parâmetro equivalente

Partições pré-criadas

auto_partitioning_num_precreate

Sem parâmetro equivalente

Partições a reter

auto_partitioning_num_retention

partition_expiration_time

Partições quentes a reter

auto_partitioning_num_hot

partition_keep_hot_window

Horário de agendamento

auto_partitioning_schd_start_time

Sem parâmetro equivalente

Formato de data/hora da partição

auto_partitioning_time_format

Sem parâmetro equivalente

Gerenciamento de partições

Reter partição

keep_alive

keep_alive

Armazenamento quente/frio

storage_mode

storage_mode

Binary log

Ativar (tabela pai)

binlog_level

binlog_level

Ciclo de vida (tabela pai)

binlog_ttl

binlog_ttl

Binary log dinâmico por partição

Não suportado

partition_generate_binlog_window

Ativar (partições)

Herdado da tabela pai; modificação não suportada

generate_binlog

Ciclo de vida (partições)

Partições suportam modificação

Herdado da tabela pai; modificação não suportada

Índices e propriedades de tabela

bitmap_columns

Partições suportam modificação

Herdado da tabela pai; modificação não suportada

dictionary_encoding_columns

Partições suportam modificação

Herdado da tabela pai; modificação não suportada

orientation, table_group e outras propriedades

Herdado da tabela pai; modificação não suportada

Herdado da tabela pai; modificação não suportada

Chave primária, distribution_key, clustering_key e outros índices

Herdado da tabela pai; modificação não suportada

Herdado da tabela pai; modificação não suportada