【openGauss】账本机制与闪回特性使用
创始人
2025-06-01 18:00:50

账本机制

对防篡改账本表进行数据增、删、改操作,系统会在历史表和全局表中记录行级数据变化追溯信息,操作的追溯信息,并通过密码学算法生成校验信息。通过对校验信息的保护、比对、验证,起到对重要数据的完整性保护,识别、阻止未授权更改。

1. 核心价值:

  • 易用:使用SCHEMA级别隔离,创建SCHEMA时指定账本属性,在该SCHEMA中创建的用户表自动成为账本;
  • 无感:账本表支持增、删、改、查,与普通表语法一致;
  • 可追溯:对账本表的数据修改,均会以hash变迁的形式在历史表中记录数据的变迁记录,以SQL的形式在全局表中记录数据操作;
  • 融合:账本表可以和其他表关联进行事务或查询;
  • 高并发:账本表中数据行与行之间无关联,可以支持并发更改。

账本表使用与普通表一样,支持全量的增、删、改、查操作,在用户看来,仅仅是普通表多增加了一列hash列。用户可以显式的查询每行数据的hash。

校验信息的记录(历史表和全局表):

  • 账本表的数据增删改操作均会被记录到历史表和全局表。
  • 记录到历史表的形式为只记录hash摘要,不记录数据;
  • 记录到全局表的形式为记录操作的SQL语句和操作造成的摘要更改。

2. 账本表使用:

账本表的底层存储类型需要是ASTORE,系统默认存储类型就是ASTORE,如果为了实现闪回将存储类型更改为了USTORE,然后要完成账本的话需要将USTORE改回ASTORE

# 退出数据库连接,在linux shell中执行以下命令进行更改
gs_guc set -N all -I all -c "enable_default_ustore_table=off";
# 更改完之后需要重启数据库才生效
gs_om -t restart
(1)创建防篡改特性的Schema

创建于该schema中的表数据账本表,系统会自动根据表名创建历史表,以及指定全局表,每个账本表都会有一个hash字段,记录系统生成的hash摘要,所以创建账本表时不能有名称hash的列(账本表的hash字段生成以及hash摘要生成、hash摘要存储都是系统自动操作不需要人为参与)

create schema chain_demo with blockchain;

可以使用 \dn+ 查看schema信息,其中withblockchain属性为t,表示这个schema是账本模式
在这里插入图片描述

(2)创建账本表
create table chain_demo.t1(c1 int);
(3)往账本表中插入数据
insert into chain_demo.t1 values(1),(2);

将2改成3

update chain_demo.t1 set c1=3 where c1=2;
(4)查看账本表数据
select *,hash from chain_demo.t1;

在这里插入图片描述

(5)查看历史表与全局表
  • 历史表
select * from blockchain.chain_demo_t1_hist;

在这里插入图片描述
系统会为每个账本表生成一个历史表,记录该账本表的hash变更记录,历史表都是存放在blockchain模式中,历史表的命名方式:schema名称_表名_hist
update将插入的第二条记录,也就是c1=2的数据更改成了c1=3,所以在历史表中可以看到第三步操作将第二部操作的hash删除同时新增了一个新的hash。

  • 全局表
select * from gs_global_chain;

在这里插入图片描述
在全局表中可以看到操作记录,已经该操作记录的操作者,时间,操作对象等信息,因为openGauss服务只有一个全局表,所有的账本表的操作信息都存储在一个表中,可以记录操作者、操作对象进行区分。

闪回特性

闪回概念是Oracle最先提出来的,其本质是为了回退错误操作产生的,避免人为的“灾难”,并且要能够快速回退。

1. 闪回查询

基于MVCC多版本的数据恢复:适用于误删除、误更新、误插入数据的查询和恢复,用户通过配置旧版本保留时间,并执行相应的查询或恢复命令,查询或恢复到指定的时间点或CSN点。

只有存储类型为ustore类型的表才支持闪回
在这里插入图片描述

前提条件:

  • enable_default_ustore_table=on --指定用户创建表时使用USTORE存储引擎。
  • undo_retention_time=600 --用于设置undo旧版本的保留时间,单位是s。
# 退出数据库连接,在linux shell中执行以下命令进行更改
gs_guc set -N all -I all -c "enable_default_ustore_table=on";
# 设置旧版本保留时间
gs_guc set -N all -I all -c "undo_retention_time=600";
# # 不能用reload刷新,使用set更改完之后重启数据库生效
gs_om -t restart

查询旧版本数据有两种方式,可以基于timestamp或者csn查看,timestamp值和csn值可以通过gs_txn_snapshot系统表获取

select * from gs_txn_snapshot;

在这里插入图片描述

  • 使用timestamp查看
select * from classes timecapsule timestamp '2023-03-22 16:29:59';

在这里插入图片描述

  • 使用csn查看
select * from classes timecapsule csn 9114;

在这里插入图片描述

2. 闪回恢复

基于类似windows系统回收站的恢复:适用于误DROP、误TRUNCATE的表的恢复。用户通过配置回收站开关,并执行相应的恢复命令,可以将误DROP、误TRUNCATE的表找回。

前提条件:

  • enable_default_ustore_table=on --指定用户创建表时使用USTORE存储引擎。
  • enable_recyclebin=on --用于启动回收站。
# 已经更改过的配置就不需要重复更改了
gs_guc set -N all -I all -c "enable_default_ustore_table=on";
# 启动回收站
gs_guc set -N all -I all -c "enable_recyclebin=on";
# # 不能用reload刷新,使用set更改完之后重启数据库生效
gs_om -t restart

(1)闪回drop

timecapsule table classes to before drop;

在这里插入图片描述

(2)闪回truncte

timecapsule table classes to before truncate;

在这里插入图片描述

相关内容

热门资讯

成熟品类如何破局?卡士酸奶以联... 卡士酸奶 “餐后一小时” 与《世界之外》的跨界联名,不仅成为 2025 年消费市场的热门事件,更给竞...
原创 教... 标题:在家做干锅肥肠,香辣过瘾又不腻,清洗肥肠只需抓住这个窍门。 在忙碌的生活中,我们总是渴望一顿...
美食文化:不止于吃,更关乎获取... 餐饮文化并非仅仅局限于吃何种食物,它涉及我们怎样去获取食物,怎样对食物进行处理,并且这些食物又是凭借...
从饮食习惯看地域特色,领略不一... 流经漫漫光阴长河之后,不同地域的人们所形成的饮食习惯,往往特别深切明显地折射反映出当地的自然环境,以...
冬日推荐蔬菜有哪些?北京劲松中... 每年霜降之后,菜市场里总有几个摊位格外热闹——这边是堆成小山的青萝卜,那边是沾着泥土的红薯,还有大妈...