O Hologres permite modificar algumas estruturas, propriedades de tabela e propriedades de coluna por meio da sintaxe ALTER TABLE. No entanto, essa sintaxe não oferece suporte a propriedades que afetam o armazenamento da tabela. A partir do Hologres V3.1, há suporte para a sintaxe REBUILD, que possibilita a modificação flexível de diversos parâmetros de uma tabela. Este tópico descreve como usar o REBUILD no Hologres.
Sintaxe
Formato da instrução
ASYNC REBUILD TABLE [ IF EXISTS ] <table_name>
[ WITH ( <rebuild_parameter> [= <value>] [, ... ] )]
<action> [, ... ];
WHERE action IS ONE OF:
ADD [ COLUMN ] <column_name> <data_type> [ column_constraint [ ... ] ]
ALTER [ COLUMN ] <column_name> [ SET DATA ] TYPE <data_type> [ USING <expression> ]
ALTER [ COLUMN ] <column_name> SET DEFAULT <expression>
ALTER [ COLUMN ] <column_name> DROP DEFAULT
ALTER [ COLUMN ] <column_name> { SET | DROP } NOT NULL
ALTER PRIMARY KEY (<column_name> [, ...])
TO [LOGICAL] PARTITION [BY LIST(<column_name> [, <column_name>])]
SET ( <parameter> [= <value>] [, ... ] )
WHERE rebuild_parameter IS ONE OF:
keep_source
binlog_mode
rebuild_guc_<guc_name> = '<guc_value>'
Parâmetros
Parâmetro | Subitem | Descrição |
ASYNC |
A tarefa REBUILD executa de forma assíncrona. Após a execução, retorna um |
|
table_name | Nome da tabela de destino a reconstruir. | |
column_name | Nome da coluna da tabela de destino. | |
data_type | Tipo de dados da coluna. | |
action | ADD COLUMN | Adiciona uma coluna. Permite adicionar colunas NOT NULL e definir valores padrão. |
ALTER COLUMN TYPE | Modifica o tipo de dados de uma coluna. | |
ALTER COLUMN SET/DROP DEFAULT | Define ou remove o valor padrão de uma coluna. Valores NULL nos dados existentes permanecem inalterados. | |
ALTER COLUMN SET/DROP NOT NULL | Define ou remove a restrição NOT NULL de uma coluna. | |
ALTER PRIMARY KEY | Modifica a chave primária da tabela. Em caso de conflito de dados com a nova chave primária, o sistema reportará um erro durante a execução assíncrona. Monitore o status de execução da tarefa regularmente. | |
TO [LOGICAL] PARTITION |
Converte a tabela em uma tabela particionada lógica ou física. Cenários suportados:
|
|
SET ( <parameter> [= <value>]) |
Modifica propriedades da tabela. Cenários comuns:
|
|
WITH (<rebuild_parameter> [= <value>]) |
Defina parâmetros relacionados à tarefa REBUILD. Parâmetros comuns:
|
|
Precauções
Há suporte apenas para execução assíncrona (ASYNC), que não exige ocupação prolongada da conexão.
Após o envio de uma tarefa REBUILD, a execução ocorre rapidamente e retorna o
query_idda tarefa. Use essequery_idpara visualizar o status de execução de uma tarefa REBUILD. Se a tarefa não for concluída com sucesso algum tempo após o envio, pode haver um grande volume de tarefas de agendamento assíncrono em execução na instância atual. Recomendamos aguardar e verificar novamente o status de execução após o retorno doquery_id.O uso do recurso REBUILD para modificar parâmetros de tabela envolve redistribuição subjacente de dados, o que consome recursos computacionais. Por isso, execute tarefas REBUILD fora dos horários de pico ou utilize recursos de computação serverless para garantir a estabilidade do negócio.
-
Durante uma tarefa
REBUILD, a tabela fica somente leitura e não aceita gravações. A partir do Hologres V4.1, oREBUILDutiliza a tecnologiaDynamic Tablepara atualizações incrementais, reduzindo significativamente a janela de somente leitura. Para evitar indisponibilidade prolongada de gravação, a tabela de destino deve atender aos seguintes requisitos:A tabela deve possuir uma chave primária antes da operação
REBUILD, e a nova chave primária deve incluir todas as colunas da chave primária original.Antes da operação
REBUILD, a tabela deve usar armazenamento orientado a colunas ou armazenamento híbrido (linha-coluna).Após a operação
REBUILD, a tabela não deve conter colunas geradas.Se a tabela for uma tabela particionada física antes da operação
REBUILD, sua chave de partição deve permanecer inalterada.Caso a tabela se torne uma tabela particionada lógica após a operação
REBUILD, ela poderá ter apenas uma chave de partição.
Para reduzir sobrecarga, modifique vários parâmetros em uma única tarefa
REBUILD.-
Após a reconstrução de uma tabela particionada física, suas propriedades de gerenciamento dinâmico de partições não são herdadas. Defina manualmente as seguintes propriedades após a conclusão da reconstrução:
Propriedade
auto_partitioningda tabela pai.Atributo
keep_alivee outros atributos da tabela filha.Ao reconstruir uma tabela particionada física, quaisquer propriedades definidas independentemente nas tabelas filhas não são herdadas e retornam às configurações da tabela pai, como
bitmap_columnsedictionary_encoding_columns.
-
Não há suporte para
REBUILDnas seguintes tabelas:Tabelas com configurações especiais de propriedades de coluna, como otimização de armazenamento colunar para colunas JSONB, ou restrições de coluna, como colunas vetoriais.
Tabelas com índice de texto completo ou índice secundário global.
Tabelas que contêm colunas do tipo de dados
SerialouBigserial.Tabelas referenciadas por uma
Dynamic Tableou por uma view materializada. Tabelas referenciadas por views comuns têm suporte.
Exemplos
Reconstruir uma tabela sem Binlog
-- Create a table and import data.
CREATE TABLE rebuild_test (
a TEXT,
b TEXT,
ds TEXT
);
INSERT INTO rebuild_test VALUES ('1', '1', '2025-04-01'), ('2', '2', '2025-04-02'), ('3', '3', '2025-04-03');
-- Add a non-null column with a default value.
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';
-- Change the primary key to column a.
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);
-- Use a serverless resource to run the REBUILD task, set the distribution_key and clustering_key for the table, and change the storage to row-column hybrid.
ASYNC REBUILD TABLE rebuild_test
WITH (
rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
distribution_key = 'a',
clustering_key = 'a',
orientation = 'row,column'
);
-- Convert a non-partitioned table to a logical partitioned table, set the partition key to ds, and add a NOT NULL constraint to the ds column.
ASYNC REBUILD TABLE rebuild_test
ALTER COLUMN ds SET NOT NULL,
TO LOGICAL PARTITION BY LIST(ds);
Reconstruir uma tabela com Binlog
O comando REBUILD não preserva dados históricos do Binlog. Por esse motivo, não há suporte padrão para REBUILD em tabelas com Binlog ativado. Especifique o parâmetro binlog_mode e siga as etapas abaixo para garantir que os sistemas downstream tenham consumido totalmente os dados históricos do Binlog.
-
Execute o comando
REBUILD.ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <YOUR_ACTION>; -
Quando o parâmetro
binlog_modeestiver definido para uma tarefa REBUILD, a tarefa pausará automaticamente após a conclusão da etapaset_readonly. Execute uma consulta SQL para verificar o progresso. Nesse ponto, o sistema definiu a tabela como somente leitura, impedindo novas gravações e a geração de novos dados no Binlog.postgres=# SELECT step, status, progress FROM hologres.rebuild_progress('<query_id>'); step | status | progress -------------------------------+--------+---------- prepare | done | 1/1 create_tmp_table | done | 1/1 get_src_table_snapshot | done | 1/1 insert | done | 1/1 set_readonly | done | 1/1 check_snapshot | | 0/1 re-insert | | - check_additional_child_table | | - create_additional_child_table | | - insert_additional_child_table | | - swap | | 0/1 (11 rows) -
Aguarde até que o cliente downstream termine de consumir todos os dados existentes do Binlog. Em seguida, retome manualmente a tarefa
REBUILDexecutando a seguinte instrução SQL. Durante esse processo, a tabela de source permanece no modo somente leitura e não gera novos dados no Binlog.RESUME '<query_id>';Após a conclusão da tarefa
REBUILD, o Binlog é ativado automaticamente para a nova tabela. Reinicie a tarefa de consumo de Binlog downstream e comece a consumir a partir delsn = 0.
Monitoramento e O&M
Visualize o status de execução de uma tarefa REBUILD
A tarefa REBUILD executa de forma assíncrona. Após o envio bem-sucedido, ela retorna um status de sucesso e um query_id. Consulte a tabela de sistema hologres.rebuild_progress para visualizar o status das subtarefas assíncronas. A operação REBUILD na tabela só é considerada concluída quando todas as subtarefas forem bem-sucedidas. Comando:
SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');
A tabela a seguir descreve as colunas da tabela de sistema.
Nome da coluna | Descrição |
job_name | O query_id da tarefa REBUILD. |
step_id | ID da etapa. As subtarefas do REBUILD executam sequencialmente conforme os IDs de etapa. |
step |
Nome da etapa:
|
status | Status da subtarefa.
|
progress |
Progresso da subtarefa: |
start_time | Horário de início da subtarefa. |
end_time | Horário de término da subtarefa. |
queryid | O query_id da subtarefa. |
pid | ID do processo de serviço. |
message | Mensagem da subtarefa. Se a subtarefa reportar um erro, o sistema registrará a mensagem de erro neste campo. |
A figura a seguir mostra um exemplo de resultado.

Parar e reiniciar tarefas REBUILD
-
Pare a tarefa assíncrona
REBUILD.SUSPEND '<query_id>'; -
Retome a tarefa assíncrona definida como
CANCEL.RESUME '<query_id>';
Tratar exceções de tarefas REBUILD
Se uma tarefa REBUILD for interrompida por um erro ou parada manualmente pelo comando SUSPEND, retome-a com o comando RESUME ou siga estas etapas para encerrar a tarefa e restaurar a tabela de source.
-
Execute o comando a seguir para limpar as tabelas temporárias criadas durante o processo
REBUILD.CALL hg_clean_rebuild_tmp_tables('<query_id>'); -
Caso a tarefa tenha sido interrompida após a tabela de source tornar-se somente leitura, execute o comando apropriado para reativar as gravações.
-
Para versões do Hologres anteriores à V4.1:
ALTER TABLE <table_name> SET (readonly = false); -
Para Hologres V4.1 e posteriores:
ALTER TABLE <table_name> SET RESET (ddl_options,write_options);
-