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 |
|
|
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:
|
|
|
SET ( <parameter> [= <value>]) |
Tablo özelliklerini değiştirir. Yaygın senaryolar:
|
|
|
WITH (<rebuild_parameter> [= <value>]) |
REBUILD göreviyle ilgili parametreleri ayarlar. Yaygın parametreler:
|
|
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_iddöndürür. REBUILD görevinin yürütme durumunu görüntülemek için buquery_iddeğerini kullanabilirsiniz. Gönderim işlemi kısa sürede birquery_iddöndürmüyorsa örnekte birçok eşzamanlı olmayan görev çalışıyor olabilir. Görev durumunu kontrol etmeden öncequery_iddeğ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_alivegibi 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_columnsvedictionary_encoding_columnsgibi ü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.
-
REBUILD ifadesini çalıştırın.
ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <YOUR_ACTION>; -
binlog_modeparametresine sahip bir REBUILD görevi için görev,set_readonlyadı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) -
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>'; 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 = 0konumundan 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ı:
|
|
status |
Alt görevin durumu.
|
|
progress |
Alt görevin ilerleme durumu, |
|
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
REBUILDeşzamanlı olmayan görevini askıya alın.SUSPEND '<query_id>'; -
CANCELolarak 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);
-