本文介紹一鍵轉冷存的最佳實踐。
場景描述
通過ALTER TABLE tblname SET TABLESPACE oss
鎖表可以每次對單個對象進行轉存,當遇到表對象有多個索引、或者分區表有多個子分區都需要轉存至冷存中時,需要依次執行ALTER
命令,操作繁瑣且容易遺漏。為了解決這類問題,PolarDB PostgreSQL版提供了一系列一鍵轉冷存的輔助函數。
創建擴展
CREATE EXTENSION IF NOT EXISTS polar_osfs_toolkit;
函數介紹
polar_alter_relation_to_oss
該函數將對象(非分區表、子分區表、索引)轉為OSS存儲。
語法
void polar_alter_relation_to_oss(text relname);
參數
參數名稱 | 描述 |
relname | 對象(表\索引)名稱 |
如果是非分區表或子分區表,則會將表本身的數據轉為OSS存儲,索引數據存儲位置不變。
如果是分區表,請使用
polar_alter_partitioned_to_oss
。如果是索引,則會將該索引本身的數據轉為OSS存儲。
polar_alter_relation_to_oss_with_indexes
該函數將對象(非分區表、子分區表)及其建立的索引數據轉為OSS存儲。
語法
void polar_alter_relation_to_oss_with_indexes(text relname);
參數
參數名稱 | 描述 |
relname | 表\索引名稱 |
如果是非分區表或子分區表,會將表及其建立的所有索引數據轉為OSS存儲。
如果是分區表,請使用
polar_alter_partitioned_to_oss
。如果是索引,只會將該索引對應的數據轉為OSS存儲,執行效果與
polar_alter_relation_to_oss
相同。
polar_alter_relation_to_oss_cascade
該函數將對象(表\索引)及其附屬對象全部轉為OSS存儲。
語法
void polar_alter_relation_to_oss_cascade(text relname);
參數
參數名稱 | 描述 |
relname | 表\索引名稱 |
如果是非分區表或子分區表,會將表及其建立的所有索引數據轉為OSS存儲。
如果是分區表,會將分區表本身、全局索引、子分區表及其所有索引數據一并轉為OSS存儲。
如果是索引,會將該索引對應的數據轉為OSS存儲,執行效果與
polar_alter_relation_to_oss
相同。
polar_alter_partitioned_to_oss
該函數將分區表轉為OSS存儲。
語法
void polar_alter_partitioned_to_oss(text relname);
參數
參數名稱 | 描述 |
relname | 分區表(父表)名稱 |
該函數只用于分區表,同時只會將分區表數據轉為OSS存儲,子分區表及其索引數據存儲位置不變。由于分區表的數據實際存儲在各個子分區表中,所以本函數實際不改變數據存儲位置,只是設置分區表的默認存儲位置為OSS。
polar_alter_subpartition_to_oss
該函數將分區表的部分子分區表轉為OSS存儲,并指定保留存儲位置不變的子分區表數量。
語法
void polar_alter_subpartition_to_oss(text relname, int reserved_subparts_cnt);
參數
參數名稱 | 描述 |
relname | 分區表(父表)名稱 |
reserved_subparts_cnt | 存儲位置不變的子分區表數量 |
該函數只用于分區表,且只會將分區表子分區表數據轉為OSS存儲,子分區表上的索引數據存儲位置不變。
如果
reserved_subparts_cnt
為0,表示將所有子分區表都轉為OSS存儲。如果
reserved_subparts_cnt
大于0,則按照子分區分表建立的時間順序進行排序,保留時間最近的reserved_subparts_cnt
個子分區表數據存儲位置不變,其余子分區表數據轉為OSS存儲。
polar_alter_subpartition_to_oss_with_indexes
該函數將分區表的部分子分區表及其索引轉為OSS存儲,并指定保留存儲位置不變的子分區表數量。
語法
void polar_alter_subpartition_to_oss_with_indexes(text relname, int reserved_subparts_cnt);
參數
參數名稱 | 描述 |
relname | 分區表(父表)名稱 |
reserved_subparts_cnt | 存儲位置不變的子分區表數量 |
該函數只用于分區表,且會將子分區表及其所有索引數據轉為OSS存儲。
如果
reserved_subparts_cnt
為0,表示將所有子分區表及其索引都轉為OSS存儲。如果
reserved_subparts_cnt
大于0,則按照子分區分表建立的時間順序進行排序,保留時間最近的reserved_subparts_cnt
個子分區表數據存儲位置不變,其余子分區表及其索引數據轉為OSS存儲。
polar_alter_subpartition_to_oss_interval
該函數將分區表的歷史子分區表轉為OSS存儲。
語法
void polar_alter_subpartition_to_oss_interval(text relname, interval tm_inter_value, boolean by_db_time default false);
參數
參數名稱 | 描述 |
relname | 分區表(父表)名稱。 |
tm_inter_value | 時間間隔值,判斷為歷史子分區的依據,例如'1 day'、'1 mon'、'5 hours',interval類型介紹可參考Interval。 |
by_db_time | 與
|
只適用于按時間分區的分區表,將所有時間超過tm_inter_value的子分區表及索引全部轉入OSS存儲。
可結合pg_cron制定按時間線自動轉冷存的方案,請參考分區表按時間線自動冷存。
數據庫內一個月按30天、一年按365.25天計算,所以遇到大月31天、閏年的情況需要將時間間隔值留一定的buffer。
示例
--創建按天分區的表
CREATE TABLE partition_day (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
CREATE TABLE partition_day_y2024m06d01 PARTITION OF partition_day
FOR VALUES FROM ('2024-06-01') TO ('2024-06-02');
CREATE TABLE partition_day_y2024m06d02 PARTITION OF partition_day
FOR VALUES FROM ('2024-06-02') TO ('2024-06-03');
CREATE TABLE partition_day_y2024m06d03 PARTITION OF partition_day
FOR VALUES FROM ('2024-06-03') TO ('2024-06-04');
--設定時間間隔為1 day
select polar_alter_subpartition_to_oss_interval('partition_day', '1 day'::interval);
--partition_day_y2024m06d01、partition_day_y2024m06d02兩張子分區表及索引數據全部轉存至OSS