冷數(shù)據(jù)分層存儲(chǔ)的開啟和使用
本文介紹如何開啟冷數(shù)據(jù)分層存儲(chǔ)功能,以及開啟功能后的使用方式。
使用限制
僅PolarDB PostgreSQL版(Oracle語(yǔ)法兼容 2.0)且內(nèi)核小版本為2.0.14.21.0及以上支持冷數(shù)據(jù)分層存儲(chǔ)功能。
開啟冷數(shù)據(jù)分層存儲(chǔ)功能后,無(wú)法關(guān)閉該功能,只能刪除冷數(shù)據(jù)。如果沒有存儲(chǔ)數(shù)據(jù),開啟該功能本身不會(huì)產(chǎn)生費(fèi)用。
開啟熱備的PolarDB PostgreSQL版(兼容Oracle)集群不支持開啟冷數(shù)據(jù)分層存儲(chǔ)功能。
說(shuō)明如以上場(chǎng)景您需要開啟冷數(shù)據(jù)分層存儲(chǔ)功能,請(qǐng)聯(lián)系我們處理。
開啟冷數(shù)據(jù)分層存儲(chǔ)功能后,如果您的PolarDB PostgreSQL版(兼容Oracle)集群已經(jīng)開啟熱備,不支持更換主可用區(qū)。
說(shuō)明如以上場(chǎng)景您存在更換主可用區(qū)需求,請(qǐng)聯(lián)系我們處理。
暫不支持的DDL:
暫不支持在OSS表空間中創(chuàng)建數(shù)據(jù)庫(kù):
CREATE DATABASE dbname TABLESPACE OSS;
暫不支持將已有數(shù)據(jù)庫(kù)一次性轉(zhuǎn)入OSS表空間:
ALTER DATABASE dbname SET TABLESPACE OSS;
開啟方式
單擊目標(biāo)集群ID,進(jìn)入集群基本信息頁(yè)。
在左側(cè)導(dǎo)航欄選擇配置與管理 > 冷數(shù)據(jù)分層存儲(chǔ),進(jìn)入PolarDB冷數(shù)據(jù)分層存儲(chǔ)頁(yè)面。
單擊一鍵開啟,進(jìn)入數(shù)據(jù)歸檔列表頁(yè)面。
在頁(yè)面上可以查看實(shí)例基本信息和數(shù)據(jù)歸檔列表,在數(shù)據(jù)歸檔列表一欄,可以分別查看整表歸檔列表和分區(qū)表歸檔列表。
如果當(dāng)前還沒有存入任何冷數(shù)據(jù),數(shù)據(jù)歸檔列表會(huì)呈現(xiàn)空白狀態(tài)。
開啟之后,數(shù)據(jù)默認(rèn)存儲(chǔ)在自帶的云盤高速存儲(chǔ)介質(zhì)上,需要通過簡(jiǎn)單的處理才能將數(shù)據(jù)冷存,即轉(zhuǎn)存入OSS。具體操作步驟請(qǐng)參考數(shù)據(jù)冷存的幾種模式。
數(shù)據(jù)冷存的幾種模式
數(shù)據(jù)冷存是指將數(shù)據(jù)表/索引/物化視圖轉(zhuǎn)存入OSS,轉(zhuǎn)存后不再占用或者極少量占用數(shù)據(jù)庫(kù)云盤存儲(chǔ)空間,從而大大降低數(shù)據(jù)庫(kù)的存儲(chǔ)成本。數(shù)據(jù)冷存后,所有的增刪改查SQL都透明,無(wú)需做任何修改。
普通表/索引/物化視圖冷存
將已有數(shù)據(jù)表/索引/物化視圖冷存。
ALTER TABLE tblname SET TABLESPACE OSS; ALTER INDEX idxname SET TABLESPACE OSS; ALTER Materialized View mvname SET TABLESPACE OSS;
說(shuō)明在對(duì)表執(zhí)行
ALTER TABLE tblname SET TABLESPACE OSS
時(shí),默認(rèn)只會(huì)將表本身的數(shù)據(jù)轉(zhuǎn)存至OSS,表上建立的索引需要單獨(dú)再執(zhí)行ALTER INDEX
才能將索引數(shù)據(jù)也轉(zhuǎn)存至OSS。直接在OSS存儲(chǔ)中新建數(shù)據(jù)表/索引/物化視圖。
方式一:CREATE時(shí)指定TABLESPACE OSS。
CREATE TABLE tblname (...) TABLESPACE OSS; CREATE TABLE tblname(...) TABLESPACE OSS as SELECT ...; CREATE INDEX idxname ON tblname(columnname) TABLESPACE OSS; CREAE INDEX idxname ON tblename USING GiST(columnname) TABLESPACE OSS; CREATE MATERIALIZED VIEW table_name TABLESPACE OSS AS query [ WITH [ NO ] DATA ];
方式二:設(shè)置默認(rèn)表空間為OSS表空間。
SET default_tablespace = 'oss'; CREATE TABLE tblname (...) ; CREATE INDEX idxname ON tblname(columnname); CREAE INDEX idxname ON tblename USING GiST(columnname); CREATE MATERIALIZED VIEW table_name AS query [ WITH [ NO ] DATA ];
說(shuō)明這種方式設(shè)置默認(rèn)表空間為OSS后,所有的創(chuàng)建表、索引、物化視圖操作都會(huì)直接將對(duì)象建立在OSS存儲(chǔ)上。如果不需要?jiǎng)?chuàng)建冷存對(duì)象時(shí),需要將默認(rèn)表空間進(jìn)行重置:
RESET default_tablespace;
LOB字段獨(dú)立冷存
LOB字段是指PolarDB PostgreSQL版(兼容Oracle)中的blob、text、json、jsonb、array類型以及時(shí)空類型字段,這些類型往往單個(gè)對(duì)象較大,占用的存儲(chǔ)空間較多,但更新頻率不高。為了支持這類場(chǎng)景的降本需求,PolarDB PostgreSQL版(兼容Oracle)冷數(shù)據(jù)分層存儲(chǔ)功能支持將大對(duì)象字段單獨(dú)進(jìn)行冷存,其余字段的存儲(chǔ)保持不變。LOB字段支持SQL一鍵冷存,具體使用方式如下:
--創(chuàng)建帶有大對(duì)象字段的表
CREATE TABLE test_large_object(id serial, val text);
--將大對(duì)象字段獨(dú)立冷存
ALTER TABLE test_large_object alter column val set (storage_type='oss');
--寫入大對(duì)象數(shù)據(jù),此時(shí)寫入的text字段內(nèi)容存儲(chǔ)在OSS上
INSERT INTO test_large_object(val) VALUES((SELECT string_agg(random()::text, ':') FROM generate_series(1, 10000)));
需要提前設(shè)置大對(duì)象字段的存儲(chǔ)為OSS,之后寫入的數(shù)據(jù)才會(huì)存入OSS。
分區(qū)表冷存
分區(qū)表是一種比較常見的冷存對(duì)象,在冷存功能使用上有一些特殊的方式。
全部分區(qū)表冷存。
方式一:依次將已經(jīng)存在的分區(qū)子表轉(zhuǎn)為冷存。
--prt1為分區(qū)表(父表) --prt1_p1為prt1的子表 --prt2_p2為prt1的另一張子表 --對(duì)所有的子表執(zhí)行alter操作 ALTER TABLE prt1_p1 SET TABLESPACE OSS; ALTER TABLE prt1_p2 SET TABLESPACE OSS;
方式二:將分區(qū)表主表直接創(chuàng)建在OSS tablespace上。
CREATE TABLE prt1 (a int, b int) PARTITION BY RANGE(a) TABLESPACE OSS; --分區(qū)子表默認(rèn)都繼承了父親tablespace屬性,直接將表創(chuàng)建在oss tablespace上 CREATE TABLE prt1_p1 PARTITION OF prt1 FOR VALUES FROM (0) TO (250); CREATE TABLE prt1_p2 PARTITION OF prt1 FOR VALUES FROM (250) TO (500);
方式三:設(shè)置默認(rèn)表空間為OSS表空間后再創(chuàng)建分區(qū)表。
SET default_tablespace = 'oss'; CREATE TABLE prt1 (a int, b int) PARTITION BY RANGE(a); CREATE TABLE prt1_p1 PARTITION OF prt1 FOR VALUES FROM (0) TO (250); CREATE TABLE prt1_p2 PARTITION OF prt1 FOR VALUES FROM (250) TO (500);
部分分區(qū)子表冷存:
當(dāng)只需要將已過期(低頻訪問)的分區(qū)子表轉(zhuǎn)為冷數(shù)據(jù)時(shí),可以直接對(duì)子表進(jìn)行更換表空間操作。未過期(高頻訪問)的分區(qū)子表無(wú)需任何改變,仍存儲(chǔ)在數(shù)據(jù)庫(kù)云盤中,這樣既不影響分區(qū)表的訪問性能,又降低了存儲(chǔ)成本。
--prt1為分區(qū)表(父表) --prt1_p1為prt1的未過期子表 --prt2_p2為prt1的已過期子表 --對(duì)已過期子表執(zhí)行alter操作 ALTER TABLE prt1_p2 SET TABLESPACE OSS;
數(shù)據(jù)冷熱分層
冷數(shù)據(jù)物化緩存
您可以通過修改polar_smgrcache_size參數(shù)來(lái)設(shè)置冷數(shù)據(jù)物化緩存的大小。
單擊目標(biāo)集群ID,進(jìn)入集群基本信息頁(yè)。
在左側(cè)導(dǎo)航欄選擇配置與管理 > 參數(shù)配置,找到polar_smgrcache_size參數(shù),單擊修改參數(shù)。
參考以下示例設(shè)置polar_smgrcache_size參數(shù)。
設(shè)置值
緩存大小
0
0(緩存被關(guān)閉)
1
1 GB
2
2 GB
128
128 GB(當(dāng)前支持的最大值)
單擊左上角的提交修改,在彈出的保存改動(dòng)對(duì)話框中,單擊確定。修改該參數(shù)后,集群會(huì)重啟。
PolarDB PostgreSQL版(兼容Oracle)在開啟冷數(shù)據(jù)分層存儲(chǔ)功能時(shí),默認(rèn)會(huì)在云盤上開辟很小量的物化緩存空間,用于存儲(chǔ)元數(shù)據(jù)及一些IO合并。如果要追求更高的性能,可根據(jù)數(shù)據(jù)量及使用場(chǎng)景在控制臺(tái)將物化緩存做調(diào)整,調(diào)整后重啟數(shù)據(jù)庫(kù)立即生效。
開啟并使用了冷數(shù)據(jù)分層存儲(chǔ)功能后,如果將polar_smgrcache_size參數(shù)調(diào)整為0,則會(huì)關(guān)閉緩存功能,這可能會(huì)導(dǎo)致崩潰恢復(fù)變得非常慢,且重啟期間無(wú)法重新打開該參數(shù)。如果出現(xiàn)這種情況,可以聯(lián)系我們申請(qǐng)重新打開緩存功能,加速崩潰恢復(fù)。
開啟冷數(shù)據(jù)物化緩存后,您可以通過如下方式查詢緩存使用情況:
-- 創(chuàng)建擴(kuò)展
CREATE extension polar_monitor;
-- 查詢物化緩存基本使用情況
SELECT * FROM polar_smgrcaches;
-- 字段說(shuō)明:
-- smgrcache:緩存id
-- relfilenode:該緩存對(duì)應(yīng)的表文件
-- relchunknumber:該緩存在表文件中的位置
-- nblocks:該緩存的大小
-- dirty:是否為臟
-- usagecount:使用計(jì)數(shù)
-- pinning_backends:引用計(jì)數(shù)
-- 強(qiáng)制將物化緩存刷到OSS中
SELECT polar_flush_smgrcache();
-- 強(qiáng)制淘汰物化緩存
SELECT polar_evict_smgrcache();
冷數(shù)據(jù)的訪問
冷數(shù)據(jù)增刪改查
冷存數(shù)據(jù)(即已經(jīng)存儲(chǔ)在OSS表空間中的對(duì)象)做增刪改查的SQL都是透明的,無(wú)需進(jìn)行任何改動(dòng)。
冷數(shù)據(jù)恢復(fù)
數(shù)據(jù)轉(zhuǎn)存至OSS時(shí)會(huì)進(jìn)行壓縮處理,如果要將已經(jīng)存儲(chǔ)在OSS中的數(shù)據(jù)恢復(fù)至云盤存儲(chǔ),需確保云盤上有足夠的存儲(chǔ)空間,通常要比OSS上的存儲(chǔ)空間增大約1.4~4倍。
冷數(shù)據(jù)清除
刪除冷存表/索引/物化視圖的SQL也是透明的,無(wú)需進(jìn)行任何改動(dòng)。
DELETE FROM tblname WHERE ...;
TRUNCATE TABLE tblname;
DROP TABLE tblname;
...