openGauss 2.1.0于2021年9月30日發(fā)布,是openGauss的一個(gè)Preview版本,該版本生命周期僅為半年。該版本的新增功能如下:
存儲過(guò)程兼容性增強
SQL引擎能力增強
支持Ustore存儲引擎
支持段頁(yè)式存儲
基于Paxos分布式一致性協(xié)議的高可用
AI4DB和DB4AI競爭力持續構筑
日志框架及錯誤碼整改
JDBC客戶(hù)端負載均衡及讀寫(xiě)分離
支持cmake腳本編譯
列存表支持主鍵唯一鍵約束
支持jsonb數據類(lèi)型
支持unique sql自動(dòng)淘汰
UCE故障感知
支持GB18030字符集
備機catch優(yōu)化
客戶(hù)端工具gsql支持readline命令自動(dòng)補齊
動(dòng)態(tài)數據脫敏· 支持國密算法
防篡改賬本數據庫
內置角色和權限管理機制
透明加密
全密態(tài)數據庫增強
支持dblink
支持Ubuntu系統
支持Hash索引
upsert支持子查詢(xún)
min/max函數支持ip地址類(lèi)型
增加array_remove/array_replace/first/last函數
Data Studio客戶(hù)端工具適配內核特性
雖然以上官方文檔中描述的新增特性中并沒(méi)有提及閃回特性,但在《管理員指南》中已經(jīng)明確提及該特性的使用方法。
閃回恢復其實(shí)是利用回收站的閃回恢復刪除的表。利用MVCC機制閃回恢復到指定時(shí)間點(diǎn)或者CSN點(diǎn)(commit sequence number)。
閃回技術(shù)能夠有選擇性的高效撤銷(xiāo)一個(gè)已提交事務(wù)的影響,從人為錯誤中恢復。在采用閃回技術(shù)之前,只能通過(guò)備份恢復、PITR等手段找回已提交的數據庫修改,恢復時(shí)長(cháng)需要數分鐘甚至數小時(shí)。采用閃回技術(shù)后,恢復已提交的數據庫修改前的數據,只需要秒級,而且恢復時(shí)間和數據庫大小無(wú)關(guān)。
閃回恢復適用于:
· 誤刪除表的場(chǎng)景;
· 需要將表中的數據恢復到指定時(shí)間點(diǎn)或者CSN。
閃回支持兩種恢復模式:
· 基于MVCC多版本的數據恢復:適用于誤刪除、誤更新、誤插入數據的查詢(xún)和恢復,用戶(hù)通過(guò)配置舊版本保留時(shí)間,并執行相應的查詢(xún)或恢復命令,查詢(xún)或恢復到指定的時(shí)間點(diǎn)或CSN點(diǎn)。
· 基于類(lèi)似windows系統回收站的恢復:適用于誤DROP、誤TRUNCATE的表的恢復。用戶(hù)通過(guò)配置回收站開(kāi)關(guān),并執行相應的恢復命令,可以將誤DROP、誤TRUNCATE的表找回。
重要提示:
遺憾的是,官方文檔關(guān)于閃回恢復的前提條件并沒(méi)有描述到位,導致初次接觸該功能的小伙伴有些茫然(我也是),無(wú)法復現閃回恢復的特性操作。這里,需要向大家明確的是:關(guān)于openGauss的閃回,僅支持Ustore存儲引擎(和Oracle一樣,閃回的數據存儲在UNDO表空間),也就是說(shuō),我們需要創(chuàng )建Ustore存儲引擎的表才可以使用openGauss的閃回功能。
下面我們來(lái)看看openGauss的閃回測試。
創(chuàng )建測試數據
gs_guc set -N all -I all -c "undo_zone_count=16384" ## 內存中可分配的undo zone數量,0代表禁用undo和Ustore表,建議取值為max_connections*4
gs_guc set -N all -I all -c "enable_default_ustore_table=on" ## 開(kāi)啟默認支持Ustore存儲引擎
gs_guc set -N all -I all -c "version_retention_age=10000" ## 舊版本保留的事務(wù)數,超過(guò)該事務(wù)數的舊版本將被回收清理
gs_guc set -N all -I all -c "enable_recyclebin=on" ## 打開(kāi)回收站
gs_guc set -N all -I all -c "recyclebin_retention_time=15min" ## 置回收站對象保留時(shí)間,超過(guò)該時(shí)間的回收站對象將被自動(dòng)清理
gs_om -t restartgsql -d postgres -p 26000 -r
openGauss=# create table t1(a int,b int,c int,d int);
openGauss=# insert into t1 values(1,2,3,4),(21,22,23,24),(31,32,33,34);
openGauss=# select * from t1;
a | b | c | d
----+----+----+----
1 | 2 | 3 | 4
21 | 22 | 23 | 24
31 | 32 | 33 | 34
openGauss=# \d+ t1
Table "public.t1"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
a | integer | | plain | |
b | integer | | plain | |
c | integer | | plain | |
d | integer | | plain | |
Has OIDs: no
Options: orientation=row, compression=no, storage_type=USTORE閃回查詢(xún)
閃回查詢(xún)可以查詢(xún)過(guò)去某個(gè)時(shí)間點(diǎn)表的某個(gè)snapshot數據,這一特性可用于查看和邏輯重建意外刪除或更改的受損數據。閃回查詢(xún)基于MVCC多版本機制,通過(guò)檢索查詢(xún)舊版本,獲取指定老版本數據。
示例:
openGauss=# select current_timestamp;
pg_systimestamp------------------------------
2021-10-12 10:03:08.272344+08
openGauss=# update t1 set a=99;
openGauss=# select * from t1;
a | b | c | d----+----+----+----
99 | 2 | 3 | 4
99 | 22 | 23 | 24
99 | 32 | 33 | 34openGauss=# select snptime,snpcsn from gs_txn_snapshot
where snptime between '2021-10-12 10:03:05.272344+08' and '2021-10-12 10:03:18.272344+08';
snptime | snpcsn-------------------------------+--------
2021-10-12 10:03:07.583368+08 | 2213
2021-10-12 10:03:10.595467+08 | 2214
2021-10-12 10:03:13.606675+08 | 2215
2021-10-12 10:03:16.619061+08 | 2216基于timestamp的閃回查詢(xún)
select * from t1 timecapsule timestamp to_timestamp('2021-10-12 10:03:08.272344','YYYY-MM-DD HH24:MI:SS.FF');
a | b | c | d----+----+----+----
1 | 2 | 3 | 4
21 | 22 | 23 | 24
31 | 32 | 33 | 34基于CSN的閃回查詢(xún)
select * from t1 timecapsule csn 2213;
a | b | c | d----+----+----+----
1 | 2 | 3 | 4
21 | 22 | 23 | 24
31 | 32 | 33 | 34說(shuō)明:
· TIMESTAMP參數:指要查詢(xún)某個(gè)表在TIMESTAMP這個(gè)時(shí)間點(diǎn)上的數據,TIMESTAMP指一個(gè)具體的歷史時(shí)間。
· CSN參數:CSN是一個(gè)邏輯提交時(shí)間點(diǎn),數據庫中的CSN是一個(gè)寫(xiě)一致性點(diǎn),查詢(xún)某個(gè)CSN下的數據代表SQL查詢(xún)數據庫在該一致性點(diǎn)的相關(guān)數據。
回收站
在擁有回收站之前,當用戶(hù)誤將表drop或truncate后,只能使用全庫備份恢復的方式來(lái)解決這種邏輯錯誤。
在openGauss 2.1.0版本中,引入了回收站功能,用戶(hù)通過(guò)該功能可以從回收站中閃回TRUNCATE或DROP的表對象,將數據恢復到錯誤操作前,大大提高了用戶(hù)數據的可靠性。
閃回drop: 可以恢復意外刪除的表,從回收站(recyclebin)中恢復被刪除的表及其附屬結構如索引、表約束等。閃回drop是基于回收站機制,通過(guò)還原回收站中記錄的表的物理文件,實(shí)現已drop表的恢復。
閃回truncate: 可以恢復誤操作或意外被進(jìn)行truncate的表,從回收站中恢復被truncate的表及索引的物理數據。閃回truncate基于回收站機制,通過(guò)還原回收站中記錄的表的物理文件,實(shí)現已truncate表的恢復。
官方文檔沒(méi)有強調到的坑需要注意:recyclebin不支持Ustore,只支持Astore[詳見(jiàn)下面測試示例] – 需要找開(kāi)發(fā)確認,更新官方文檔
示例:
-- 創(chuàng )建測試數據
openGauss=# create table t1(id int,name varchar(200)) with (STORAGE_TYPE=USTORE);
openGauss=# insert into t1 values(1,'t1_Tom'),(2,'t1_Jerry');
openGauss=# select * from t1;
id | name
----+----------
1 | t1_Tom
2 | t1_Jerry
openGauss=# create table t2(id int,name varchar(200)) with (STORAGE_TYPE=ASTORE);
openGauss=# insert into t2 values(1,'t2_Tom'),(2,'t2_Jerry');
openGauss=# select * from t2;
id | name
----+----------
1 | t2_Tom
2 | t2_Jerry
-- 模擬誤刪表
openGauss=# drop table t1;
openGauss=# drop table t2;
openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;
rcyname | rcyoriginname | rcytablespace
-----------------------------+---------------+---------------
BIN$3BFF4EB403B$4C71318==$0 | t2 | 0 -- 僅看見(jiàn)Astore存儲的t2表,并沒(méi)有看到Ustore存儲的t1表,注意??!
(1 row)openGauss=# timecapsule table t2 to before drop rename to t2_bak;
TimeCapsule Table
openGauss=# select * from t2_bak;
id | name
----+----------
1 | t2_Tom
2 | t2_Jerry
和Oracle一樣,也可以使用recyname恢復表,如“timecapsule table “BIN$3BFF4EB403B$4C71318==$0” to before drop rename to t2;”。
其他閃回操作詳見(jiàn)官方文檔。
openGauss=# purge recyclebin;以上是本人對openGauss 2.1.0版本閃回特性的基本測試,希望能幫助到有需要的小伙伴。
墨天輪原文鏈接:https://www.modb.pro/db/131041?sjhy(復制到瀏覽器或者點(diǎn)擊“閱讀原文”立即查看)
聯(lián)系客服