南大通用GBase 8c闪回技术介绍——闪回查询

原文链接:https://www.gbase.cn/community/post/4170
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

南大通用GBase 8c数据库设计并使用了闪回技术,在数据库开发和运维场景中均发挥着重要作用。闪回查询基于MVCC多版本并发控制实现。

MVCC多版本并发控制原理

南大通用GBase 8c采用行级MVCC机制,解决读写并发冲突问题。当更新数据的时候,原位更新,旧版本放到历史版本区(undo),同时维护新版本元组到老元组的指针。当读取数据的时候,根据快照snapshot.CSN判断应该读取哪个版本。其优势在于对历史版本集中存储,垃圾清理代价低。每个事务有一个单独的事务状态存储区域,记录了该事务的状态信息和CSN号。在GBase 8c中,CSN是一个全局自增长的长整数,作为全局逻辑时间戳模拟数据库内部的时序。GBase 8c数据库中的CSN为写一致性点,每个CSN代表整个数据库的一个一致性点,查询某个CSN下的数据表示SQL查询数据库在该一致性点的相关数据。

1、闪回查询概述

闪回查询可以查询过去某个时间点数据表的某个快照(snapshot)数据,这一特性可用于查询和恢复意外删除或更改的受损数据。

目前不支持闪回查询的表:系统表、列存表、内存表、DFS表、全局临时表、本地临时表、UNLOGGED表、分区表、视图、序列表、Hbkt表、共享表、继承表、带有PARTIAL CLUSTER KEY约束的表。

2、闪回查询使用说明

语法格式
SELECT [/*+ plan_hint */] [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
{ * | {expression [ [ AS ] output_name ]} [, ...] }
[ FROM from_item [, ...] ]
......;

其中指定查询源from_item为:

{[ ONLY ] table_name [ * ] [ partition_clause ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
[ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ]
[TIMECAPSULE {TIMESTAMP|CSN} expression]
|( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
|with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
|function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]
|function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )
|from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]}

语法树中“TIMECAPSULE {TIMESTAMP | CSN} expression”为闪回功能新增表达方式,其中TIMECAPSULE表示使用闪回功能,TIMESTAMP以及CSN表示闪回功能使用具体时间点信息或使用CSN(commit sequence number)信息。

参数说明

TIMECAPSULE TIMESTAMP

关键字,闪回查询的标识,根据date日期,闪回查找指定时间点的结果集。date日期必须是一个过去有效的时间戳。

TIMECAPSULE CSN

关键字,闪回查询的标识,根据表的CSN闪回查询指定CSN点的结果集。其中CSN可从gs_txn_snapshot记录的snpcsn号查得。

说明:

  • 闪回查询不能跨越影响表结构或物理存储的语句,否则会报错。即闪回点和当前点之间,如果执行过修改表结构或影响物理存储的语句(DDL、DCL、VACUUM FULL),则闪回失败,报错:ERROR: The table definition of T1 has been changed。

  • 闪回点过旧时,因闪回版本被回收等导致无法获取旧版本会导致闪回失败,报错:Restore point too old。可通过将version_retention_age和vacuum_defer_cleanup_age设置成同值,配置闪回功能旧版本保留期限,取值范围是0~1000000,值为0表示VACUUM不会延迟清除无效的行存记录。

  • 通过时间方式指定闪回点,闪回数据和实际时间点最多偏差为3秒。

3、使用示例

开启快照和回收站,重启数据库生效:

[gbase@gbase ~]$ gs_guc reload -N all -I all -c "enable_wdr_snapshot=on"
[gbase@gbase ~]$ gs_guc reload -N all -I all -c "enable_recyclebin=on"
[gbase@gbase ~]$ gs_om -t restart

登录数据库:

[gbase@gbase ~]$ gsql -d postgres -p 15400

创建模式和数据表:

CREATE SCHEMA tpcds;
-- 注意指定ustore引擎(默认为astore)。ustore即原位更新,将追加的新数据和历史版本的老数据分离存储。
CREATE TABLE tpcds.time_table(idx integer, snaptime timestamp, snapcsn bigint, timeDesc character(100)) with(STORAGE_TYPE=USTORE);

向表tpcds.time_table中插入记录:

INSERT INTO tpcds.time_table select 1, now(),int8in(xidout(next_csn)), 'time1' from gs_get_next_xid_csn();
INSERT INTO tpcds.time_table select 2, now(),int8in(xidout(next_csn)), 'time2' from gs_get_next_xid_csn();
INSERT INTO tpcds.time_table select 3, now(),int8in(xidout(next_csn)), 'time3' from gs_get_next_xid_csn();
INSERT INTO tpcds.time_table select 4, now(),int8in(xidout(next_csn)), 'time4' from gs_get_next_xid_csn();

查询数据表记录:

select * from tpcds.time_table;

返回如下信息

 idx |          snaptime          | snapcsn |                                               timedesc
-----+----------------------------+---------+-----------------------------------------------------------------------
-------------------------------
  1 | 2024-08-01 17:54:48.951076 |    2527 | time1
  2 | 2024-08-01 17:54:48.955186 |    2528 | time2
  3 | 2024-08-01 17:54:48.955967 |    2529 | time3
  4 | 2024-08-01 17:54:49.958552 |    2530 | time4
(4 rows)

删除数据,视为“误删”操作:

delete tpcds.time_table;

执行闪回查询,返回到time4时间对应的快照点:

--指定时间:
SELECT * FROM tpcds.time_table TIMECAPSULE TIMESTAMP to_timestamp('2024-08-01 17:54:49.958552','YYYY-MM-DD HH24:MI:SS.FF');
--或通过指定CSN:
SELECT * FROM tpcds.time_table TIMECAPSULE CSN 2530 ;

应返还如下信息:

idx |          snaptime          | snapcsn |                                               timedesc
-----+----------------------------+---------+------------------------------------------------------------------------------------------------------
  1 | 2024-08-01 17:54:48.951076 |    2527 | time1
  2 | 2024-08-01 17:54:48.955186 |    2528 | time2
  3 | 2024-08-01 17:54:48.955967 |    2529 | time3
(3 rows)

注:根据csn判断,只查询当前时间或csn号之前的记录,因此在time4时间但是应该看不到time4记录,只返回前三条记录。

原文链接:https://www.gbase.cn/community/post/4170
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值