概述
闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务的影响,将数据从人为不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、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/





