Tüm Ürünler
Search
Belge Merkezi

Hologres:REBUILD

Son Güncelleme:Oct 06, 2026

Hologres, ALTER TABLE sözdizimiyle bazı tablo yapılarını, tablo özelliklerini ve sütun özelliklerini değiştirmeyi destekler. Ancak tablo depolamayı etkileyen özellikler için ALTER TABLE sözdizimi desteklenmez. Hologres V3.1 sürümünden itibaren REBUILD sözdizimi desteklenir. REBUILD sözdizimiyle bir tablonun çeşitli parametrelerini esnek biçimde değiştirebilirsiniz. Bu konuda Hologres'te REBUILD kullanımı açıklanır.

Sözdizimi

İfade biçimi

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>'

Parametreler

Parameter

Sub-item

Description

ASYNC

Bu ifade, REBUILD görevinin eşzamanlı olmayan şekilde çalıştırıldığını belirtir. Görev tamamlandığında bir query_id döner. Görevin yürütme durumunu izlemek için bu query_id değerini kullanabilirsiniz. Eşzamanlı yürütme şu anda desteklenmez.

table_name

Yeniden oluşturulacak hedef tablonun adı.

column_name

Hedef tablonun sütun adı.

data_type

Sütunun veri türü.

action

ADD COLUMN

Bir sütun ekler. NOT NULL sütunlar ekleyebilir ve varsayılan değerler ayarlayabilirsiniz.

ALTER COLUMN TYPE

Bir sütunun veri türünü değiştirir.

ALTER COLUMN SET/DROP DEFAULT

Bir sütun için varsayılan değeri ayarlar veya kaldırır. Mevcut verilerdeki NULL değerler değişmez.

ALTER COLUMN SET/DROP NOT NULL

Bir sütun için NOT NULL kısıtlamasını ayarlar veya kaldırır.

ALTER PRIMARY KEY

Tablonun birincil anahtarını değiştirir. Yeni birincil anahtarla veri çakışması varsa eşzamanlı olmayan yürütme sırasında hata oluşur. Görevin yürütme durumunu zamanında izleyin.

TO [LOGICAL] PARTITION

Tabloyu mantıksal/fiziksel bölümlenmiş tabloya dönüştürür ve aşağıdaki senaryoları destekler:

  • Standart bir tabloyu fiziksel bölümlenmiş tabloya dönüştürün. Bir bölümleme anahtarı belirtmeniz gerekir.

  • Standart bir tabloyu mantıksal bölümlenmiş tabloya dönüştürün. Bir bölümleme anahtarı belirtmeniz gerekir.

  • Fiziksel bölümlenmiş bir tablonun bölümleme anahtarını değiştirin.

  • Fiziksel bölümlenmiş bir tabloyu mantıksal bölümlenmiş tabloya dönüştürün. Bölümleme anahtarını değiştirip değiştirmeyeceğinize karar verebilirsiniz.

  • Mantıksal bölümlenmiş bir tabloyu fiziksel bölümlenmiş tabloya dönüştüremezsiniz.

SET ( <parameter> [= <value>])

Tablo özelliklerini değiştirir. Yaygın senaryolar:

  • Dağıtım anahtarını (distribution_key) değiştirin.

  • Segment anahtarını (event_time_column) değiştirin.

  • Kümeleme dizinini (clustering_key) değiştirin.

  • Tablo depolama biçimini (orientation) değiştirin. Satır yönelimli depolama, sütun yönelimli depolama ve satır-sütun hibrit depolama arasında dönüşüm yapabilirsiniz.

  • Tablonun ait olduğu table_group öğesini değiştirin.

  • Diğer tüm tablo özelliklerinin değiştirilmesi desteklenir.

  • Bitmap dizinlerini (bitmap_columns) veya sözlük kodlama sütunlarını (dictionary_encoding_columns) değiştirmek için ALTER TABLE ifadesini kullanın. REBUILD gerekmez.

WITH (<rebuild_parameter> [= <value>])

REBUILD göreviyle ilgili parametreleri ayarlar. Yaygın parametreler:

  • keep_source: Değer belirtilmesine gerek yoktur. Belirtilirse orijinal tablo silinmez. Bunun yerine tmp_rebuild_old_<query_id>_<unique_id>_<table_name> olarak yeniden adlandırılır.

  • binlog_mode: Değer belirtilmesine gerek yoktur. Binlog etkinleştirilmiş bir tabloyu yeniden oluşturmanıza olanak tanır. Binlog veri kaybını önlemek için Örnekler bölümündeki adımları uygulamanız gerekir.

  • rebuild_guc_hg_computing_resource='serverless': REBUILD görevini yürütmek için Serverless kaynaklarını kullanır. Bu, örnek kaynaklarınızın tüketilmesini önler ve görev kararlılığını artırır.

  • rebuild_guc_<guc_name>='<guc_value>': Diğer GUC parametreleri burada ayarlanabilir. Daha fazla bilgi için bkz. GUC parametreleri.

Dikkat edilecek noktalar

  • Yalnızca uzun süreli bağlantı işgalini gerektirmeyen eşzamanlı olmayan yürütme (ASYNC) desteklenir.

  • REBUILD görevini gönderdikten sonra ifade bir query_id döndürür. REBUILD görevinin yürütme durumunu görüntülemek için bu query_id değerini kullanabilirsiniz. Gönderim işlemi kısa sürede bir query_id döndürmüyorsa örnekte birçok eşzamanlı olmayan görev çalışıyor olabilir. Görev durumunu kontrol etmeden önce query_id değerinin döndürülmesini beklemenizi öneririz.

  • Tablo parametrelerini değiştirmek için REBUILD özelliğini kullanmak, temel düzeyde veri yeniden dağıtımını içerir ve bu işlem hesaplama kaynakları tüketir. Bu nedenle REBUILD görevlerini iş saatleri dışında veya iş kararlılığını sağlamak amacıyla bu işlem için serverless hesaplama kaynaklarını kullanarak çalıştırmanız önerilir.

  • REBUILD görevi sırasında tablo geçici olarak salt okunur duruma getirilir ve yazma işlemleri engellenir. Hologres V4.1 sürümünden itibaren REBUILD, artımlı güncellemeler için Dynamic Table teknolojisini kullanır ve bu sayede salt okunur süresi önemli ölçüde azaltılabilir. Bu iyileştirme yalnızca tablo aşağıdaki koşulları karşıladığında geçerlidir. Aksi takdirde tablo, görev süresince salt okunur kalır.

    • Hedef tabloda yeniden oluşturma işleminden önce bir birincil anahtar bulunmalıdır ve yeni birincil anahtar, orijinal birincil anahtarın tüm sütunlarını içermelidir.

    • Hedef tablo, yeniden oluşturma işleminden önce sütun yönelimli depolama veya satır-sütun hibrit depolama kullanmalıdır.

    • Hedef tabloda yeniden oluşturma işleminden sonra üretilen sütunlar bulunmamalıdır.

    • Hedef tablo yeniden oluşturma işleminden önce fiziksel bölümlenmiş bir tabloysa bölümleme anahtarı yeniden oluşturma sonrasında değişmemelidir.

    • Hedef tablo yeniden oluşturma sonrasında mantıksal bölümlenmiş bir tabloya dönüşüyorsa yalnızca bir bölümleme anahtarı bulunabilir.

  • Ek yükü azaltmak için birden çok değişikliği tek bir REBUILD görevinde birleştirin.

  • Fiziksel bölümlenmiş bir tablo yeniden oluşturulduktan sonra dinamik bölüm yönetimi özellikleri devralınmaz. Görev tamamlandıktan sonra bunları yeniden yapılandırmanız gerekir. Bu özellikler şunları içerir:

    • Üst bölümlenmiş tablonun auto_partitioning özelliği.

    • keep_alive gibi alt bölümlerin özellikleri.

    • Fiziksel bölümlenmiş bir tablo yeniden oluşturulduktan sonra alt bölümlerinde bağımsız olarak ayarlanan özellikler devralınmaz. Alt bölümler, bitmap_columns ve dictionary_encoding_columns gibi üst tablodaki tüm özellikleri devralır.

  • Aşağıdaki tablo türleri için REBUILD desteklenmez:

    • Belirli sütun özelliklerine (JSONB sütunları için sütun deposu optimizasyonu gibi) veya sütun kısıtlamalarına (vektör sütunları gibi) sahip tablolar.

    • Tam metin dizinine veya global ikincil dizine sahip tablolar.

    • Serial veya Bigserial veri türünde sütunlar içeren tablolar.

    • Dynamic Table veya materialized view bağımlılıklarına sahip tablolar. Standart view bağımlılıklarına sahip tablolar desteklenir.

Örnekler

Binlog içermeyen tabloda yeniden oluşturma

-- 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 NOT 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 Serverless resources to run the REBUILD task, set the distribution_key and clustering_key, and change to row-column hybrid storage.
ASYNC REBUILD TABLE rebuild_test 
WITH (
    rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
    distribution_key = 'a',
    clustering_key = 'a',
    orientation = 'row,column'
);
-- Convert the 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);

Binlog içeren tabloda yeniden oluşturma

REBUILD ifadesi geçmiş Binlog verilerini korumaz. Bu nedenle varsayılan olarak Binlog etkinleştirilmiş bir tabloda REBUILD çalıştıramazsınız. binlog_mode parametresini belirtmeniz ve aşağı akış tüketicisinin mevcut tüm Binlog verilerini tamamen işlemesini sağlamak için aşağıdaki adımları izlemeniz gerekir.

  1. REBUILD ifadesini çalıştırın.

    ASYNC REBUILD TABLE rebuild_test 
    WITH (
      binlog_mode
    )
    <YOUR_ACTION>;
  2. binlog_mode parametresine sahip bir REBUILD görevi için görev, set_readonly adımı tamamlandıktan sonra otomatik olarak duraklatılır. İlerlemesini aşağıdaki SQL ifadesini kullanarak sorgulayabilirsiniz. Bu noktada tablo salt okunurdur, bu nedenle daha fazla veri yazılamaz ve yeni Binlog verisi oluşturulmaz.

    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)
  3. Aşağı akış istemcilerinin mevcut Binlog verilerini tüketmeyi bitirmesini bekleyin ve bu tüketici görevlerini durdurun. Ardından REBUILD görevini devam ettirmek için aşağıdaki SQL ifadesini manuel olarak çalıştırın.

    RESUME '<query_id>';
  4. REBUILD görevi tamamlandıktan sonra Binlog yeni tablo için otomatik olarak etkinleştirilir. Aşağı akış Binlog tüketim görevini durumsuz bir şekilde yeniden başlatmanız ve yeni tablonun Binlog'unu lsn = 0 konumundan tüketmeye başlamanız gerekir.

Normal tabloyu liquid tabloya dönüştürme

Hologres V4.2 sürümünden itibaren REBUILD kullanarak normal bir tabloyu liquid tabloya veya bir liquid tabloyu tekrar normal tabloya dönüştürebilirsiniz.

--- Convert a regular table to a liquid table.
ASYNC REBUILD TABLE normal_table 
SET (
  liquid_table = 'true'
);

--- Convert a liquid table to a regular table.
ASYNC REBUILD TABLE liquid_table 
SET (
  liquid_table = 'false'
);

İzleme ve O&M

REBUILD görevinin yürütme durumunu görüntüleme

REBUILD görevleri eşzamanlı olmayan şekilde çalışır. Bir görev başarıyla gönderildiğinde ifade başarılı bir durum ve bir query_id döndürür. Eşzamanlı olmayan alt görevlerin durumunu izlemek için hologres.rebuild_progress sistem görünümünü sorgulayın. REBUILD işlemi yalnızca tüm alt görevler başarılı olduğunda tamamlanır. Aşağıdaki komutu çalıştırın:

SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');

Aşağıdaki tabloda sistem tablosunun sütunları açıklanmaktadır.

Column name

Description

job_name

REBUILD görevinin query_id değeri.

step_id

Adım kimliği. REBUILD alt görevleri adım kimliklerine göre sırayla yürütülür.

step

Adım adı:

  • prepare: Görev hazırlıklarını yapın.

  • create_tmp_table: Geçici bir tablo oluşturun.

  • get_src_table_snapshot: Orijinal tablonun bir veri anlık görüntüsünü alın.

  • insert: Geçmiş verileri geçici tabloya aktarın.

  • set_readonly: Yeniden oluşturulacak tabloyu salt okunur olarak ayarlayın. Bu işlem veri yazmayı durdurur.

  • check_snapshot: Mevcut veri anlık görüntüsünün get_src_table_snapshot adımındakiyle eşleşip eşleşmediğini denetler. Farklılık varsa re-insert adımı gerçekleştirilir.

  • re-insert: Artımlı verileri aktarın.

  • check_additional_child_table: REBUILD başlangıcından günümüze kadar kullanıcılar tarafından oluşturulan yeni alt tablolar olup olmadığını denetleyin. Bu adım yalnızca fiziksel bölümlenmiş tablolar içindir.

  • create_additional_child_table: Geçici tablo için potansiyel yeni alt tablolar oluşturun. Bu adım yalnızca fiziksel bölümlenmiş tablolar içindir.

  • insert_additional_child_table: Geçmiş verileri yeni geçici alt tablolara aktarın. Bu adım yalnızca fiziksel bölümlenmiş tablolar içindir.

  • swap: Orijinal tabloyu geçici tablo ile değiştirin.

status

Alt görevin durumu.

  • done: Tamamlandı.

  • doing: Devam ediyor.

  • NULL: Bu adımı yürütmenize gerek yok veya bu adımın yürütülmesi gerekip gerekmediği şu anda belirlenemiyor.

  • error: Yürütme başarısız oldu. message alanındaki hata mesajını kontrol edin.

progress

Alt görevin ilerleme durumu, m/n şeklinde gösterilir; burada m tamamlanan alt adım sayısı, n ise toplam sayıdır. Toplam sayı (n) genellikle tablo bölümlerinin sayısına karşılık gelir.

start_time

Alt görevin başlama zamanı.

end_time

Alt görevin bitiş zamanı.

queryid

Alt görevin query_id değeri.

pid

Hizmet işlem kimliği.

message

Alt görevin mesajı. Alt görev bir hata bildirirse hata mesajı bu alana kaydedilir.

REBUILD görevlerini durdurma ve yeniden başlatma

  • Bir REBUILD eşzamanlı olmayan görevini askıya alın.

    SUSPEND '<query_id>';
  • CANCEL olarak işaretlenen eşzamanlı olmayan görevi devam ettirin.

    RESUME '<query_id>';

Yeniden oluşturma görevi özel durumları

Bir REBUILD görevi bir hata nedeniyle kesintiye uğrarsa veya manuel olarak askıya alırsanız RESUME komutuyla devam ettirebilir veya aşağıdaki adımları izleyerek görevi sonlandırıp temizleyebilirsiniz:

  • REBUILD süreci sırasında oluşturulan geçici tabloları temizlemek için aşağıdaki komutu çalıştırın.

    CALL hg_clean_rebuild_tmp_tables('<query_id>');
  • Tablo salt okunur hale getirildiyse yazma erişimini geri yüklemek için uygun komutu çalıştırın.

    • V4.1 öncesi Hologres sürümleri için aşağıdaki komutu çalıştırın.

      ALTER TABLE <table_name> SET (readonly = false);
    • Hologres V4.1 ve sonraki sürümler için aşağıdaki komutu çalıştırın.

      ALTER TABLE <table_name> RESET (ddl_options,write_options);