暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

磐维数据库闪回查询的实现

roman 2024-09-12
99

概述

闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务的影响,将数据从人为不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。

CSN机制

CSN(Commit Sequence Number)原理如下图:

如上图,xmin=6,xmax=7,CSN=3~4之间。想知道CSN多少,可以查GS_TXN_SNAPSHOT表,见下个章节。

TX1、TX3、TX5是已完成事务;TX2、TX6、TX4正在执行;TX7、TX8是未来事务。注意,对于快照线左边的都是可见的,右边的都是不可见的。

openGauss在MVCC机制下,每个事务都有一个单独的事务状态存储区域,记录了该事务的状态信息和CSN信息。

每个非只读操作都会取得一个事务号(xid),当事务提交的时候openGauss会向前推进CSN,同时,会将当前的CSN与事务的xid映射关系保存在CSN log中。

选择所有活跃事务中最小的TransactionID,记录在xmin中,选择所有已提交事务中最大的TransactionID,加1后记录在xmax中,如下,txid_current_snapshot()函数:

select * from txid_current_snapshot();

--表示为“xmin:xmax:xip_list”:

GS_TXN_SNAPSHOT表

介绍GS_TXN_SNAPSHOT表,表结构如下:

--字段分别是:快照捕获时间、快照xmin、快照csn、快照序列化文本。

如果undo_retention_time参数设置为0,则GS_TXN_SNAPSHOT表没有任何信息,本次设置为15分钟:

select * from gs_txn_snapshot where snptime between '2024-09-09 05:28:15.142237' and '2024-09-09 05:28:35.014746';

闪回查询

1、准备条件:

1、首先undo_retention_time是必须要设置的,本次设置为900秒

gs_guc reload -I all -N all -c "recyclebin_retention_time=15" ## 即时生效

2、enable_default_ustore_table和enable_ustore必须为on

否则会报:ERROR: timecapsule feature does not support heap table

gs_guc set -N all -I all -c "enable_default_ustore_table=on"; ##需要重启

gs_guc set -N all -I all -c "enable_ustore=on"; ##需要重启

cm_ctl stop && cm_ctl start

gs_ssh -c 'gsql -c "show undo_retention_time"';

gs_ssh -c 'gsql -c "show enable_default_ustore_table"';

gs_ssh -c 'gsql -c "show enable_ustore"';

## 闪回drop、闪回truncate,建议开启如下参数

enable_recyclebin、recyclebin_retention_time、version_retention_age

2、测试案例:

drop table crw;

create table crw(id int);

insert into crw values(1);

select * from crw;

select current_timestamp;

insert into crw values(999);

select current_timestamp;

select * from gs_txn_snapshot where snptime between '2024-09-09 05:40:50.213215' and '2024-09-09 05:41:03.224376'; --查询时前后时间放宽几秒

已知插入999这行数据的大致时间是“2024-09-09 05:41:00.224376”,即41分00秒。

所以40分58秒的这个CSN:11183,肯定是还没有插入999这行数据。

SELECT * FROM crw TIMECAPSULE CSN 11183;

所以41分02秒的这个CSN:11187,肯定已经插入999这行数据了。

用时间戳的方式,结果同理:

select * from crw timecapsule timestamp '2024-09-09 05:40:58.893807';

select * from crw timecapsule timestamp '2024-09-09 05:41:02.062352';

闪回drop、闪回truncate,更是可以从回收站恢复数据或者误truncate的数据,有兴趣可以自行研究。

文章参考:

openguass官方文档链接https://docs-opengauss.osinfra.cn/zh/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论