账本机制
对防篡改账本表进行数据增、删、改操作,系统会在历史表和全局表中记录行级数据变化追溯信息,操作的追溯信息,并通过密码学算法生成校验信息。通过对校验信息的保护、比对、验证,起到对重要数据的完整性保护,识别、阻止未授权更改。
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类型的表才支持闪回
前提条件:
- 指定用户创建表时默认使用USTORE存储引擎(全局配置,enable_default_ustore_table=on),也可以在创建表时指定(作用于当前表,在建表语句后,with(storage_type=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;