闪回恢复其实是利用回收站的闪回恢复删除的表。利用MVCC机制闪回恢复到指定时间点或者CSN点(commit sequence number)。
闪回技术能够有选择性的高效撤销一个已提交事务的影响,从人为错误中恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。
闪回恢复适用于:
• 误删除表的场景;
• 需要将表中的数据恢复到指定时间点或者CSN。
闪回支持两种恢复模式:
• 基于MVCC多版本的数据恢复:适用于误删除、误更新、误插入数据的查询和恢复,用户通过配置旧版本保留时间,并执行相应的查询或恢复命令,查询或恢复到指定的时间点或CSN点。
• 基于类似windows系统回收站的恢复:适用于误DROP、误TRUNCATE的表的恢复。用户通过配置回收站开关,并执行相应的恢复命令,可以将误DROP、误TRUNCATE的表找回。
Astore引擎暂不支持闪回功能。
备机不支持闪回操作。
一、 设置参数
1.1 开启相关参数
原始参数
show enable_default_ustore_table; show version_retention_age; show enable_recyclebin; show recyclebin_retention_time; show undo_retention_time;
复制
gs_guc set -N all -I all -c "enable_default_ustore_table=on" ## 开启默认支持Ustore存储引擎 gs_guc set -N all -I all -c "version_retention_age=10000" ## 旧版本保留的事务数,超过该事务数的旧版本将被回收清理 gs_guc set -N all -I all -c "enable_recyclebin=on" ## 打开回收站 gs_guc set -N all -I all -c "recyclebin_retention_time=15min" ## 置回收站对象保留时间,超过该时间的回收站对象将被自动清理 gs_guc set -N all -I all -c " undo_retention_time=86400" ## 该参数表示回滚段中旧版本数据的保留时间,等同于允许闪回查询的时间跨度, 该参数单位是秒,86400 表示是 24 小时。
复制
1.2 重启数据库
cm_ctl stop && cm_ctl start
1.3 修改后参数
二、 创造测试数据
create table t1 (id int not null default nextval('td'),name varchar2(10),etl_date date)with (STORAGE_TYPE = USTORE ); insert into t1(etl_date) SELECT current_date + s.a AS dates FROM generate_series(0,10) AS s(a) ;
复制
三、 闪回查询
闪回查询可以查询过去某个时间点表的某个snapshot数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据。
示例:
- 创造数据,删除元组
create table accounts (name varchar2, amount int) with (storage_type=ustore); insert into accounts values ('A',100),('B',100),('C',100),('D',99); select * from accounts; select current_timestamp; delete from accounts where amount<>99; select * from accounts; select current_timestamp;
复制
2. 查询 timestamp 对应的 CSN
where snptime between '2023-07-03 14:48:00.095038+08' and '2023-07-03 14:48:42.095038+08';
复制
- 执行闪回查询命令,查看闪回结果
2.1 基于 timestamp 的闪回查询
select * from accounts timecapsule timestamp to_timestamp('2023-07-03 14:48:37.03414','YYYY-MM-DD HH24:MI:SS.FF');
复制
2.2 基于 CSN 的闪回查询
select * from accounts timecapsule csn 36375;
复制
说明:
TIMESTAMP 参数:指要查询某个表在 TIMESTAMP 这个时间点上的数据,TIMESTAMP 指一个具体的历史时间。
CSN 参数:CSN 是一个逻辑提交时间点,数据库中的 CSN 是一个写一致性点,查询某个 CSN 下的数据代表 SQL 查询数据库在该一致性点的相关数据。
四、 删除找回
闪回drop: 可以恢复意外删除的表,从回收站(recyclebin)中恢复被删除的表及其附属结构如索引、表约束等。闪回drop是基于回收站机制,通过还原回收站中记录的表的物理文件,实现已drop表的恢复。
闪回truncate: 可以恢复误操作或意外被进行truncate的表,从回收站中恢复被truncate的表及索引的物理数据。闪回truncate基于回收站机制,通过还原回收站中记录的表的物理文件,实现已truncate表的恢复。
用户通过该功能可以从回收站中闪回TRUNCATE或DROP的表对象,将数据恢复到错误操作前,大大提高了用户数据的可靠性。
- Drop 恢复
gaussdb=# select * from t2; id | name | etl_date ----+------+--------------------- 1 | | 2021-01-01 00:00:00 2 | | 2023-06-30 00:00:00 4 | | 2023-07-02 00:00:00 5 | | 2023-07-03 00:00:00 6 | | 2023-07-04 00:00:00 7 | | 2023-07-05 00:00:00 8 | | 2023-07-06 00:00:00 9 | | 2023-07-07 00:00:00 10 | | 2023-07-08 00:00:00 11 | | 2023-07-09 00:00:00 (10 rows) gaussdb=# drop table t2; DROP TABLE gaussdb=# gaussdb=# select * from t2; ERROR: relation "t2" does not exist on dn_6001_6002_6003 LINE 1: select * from t2; ^ gaussdb=# gaussdb=# TIMECAPSULE TABLE t2 TO BEFORE DROP ; TimeCapsule Table gaussdb=# gaussdb=# select * from t2; id | name | etl_date ----+------+--------------------- 1 | | 2021-01-01 00:00:00 2 | | 2023-06-30 00:00:00 4 | | 2023-07-02 00:00:00 5 | | 2023-07-03 00:00:00 6 | | 2023-07-04 00:00:00 7 | | 2023-07-05 00:00:00 8 | | 2023-07-06 00:00:00 9 | | 2023-07-07 00:00:00 10 | | 2023-07-08 00:00:00 11 | | 2023-07-09 00:00:00 (10 rows)
复制
- TRUNCATE 恢复
gaussdb=# truncate table t1; TRUNCATE TABLE gaussdb=# gaussdb=# TIMECAPSULE TABLE t1 TO BEFORE TRUNCATE; TimeCapsule Table gaussdb=# gaussdb=# select * from t1; id | name | etl_date ----+------+--------------------- 1 | | 2021-01-01 00:00:00 2 | | 2023-06-30 00:00:00 4 | | 2023-07-02 00:00:00 5 | | 2023-07-03 00:00:00 6 | | 2023-07-04 00:00:00 7 | | 2023-07-05 00:00:00 8 | | 2023-07-06 00:00:00 9 | | 2023-07-07 00:00:00 10 | | 2023-07-08 00:00:00 11 | | 2023-07-09 00:00:00 (10 rows)
复制
- 垃圾桶
Drop 和truncate 后的表会存放于垃圾桶,垃圾桶的自动清理时间由recyclebin_retention_time参数设置,默认是15分钟,超过该时长,则永久性丢失数据。
select * from gs_recyclebin; select rcyoriginname from gs_recyclebin;
复制
清理垃圾桶
gaussdb=# purge recyclebin; PURGE RECYCLEBIN gaussdb=#
复制
以上是本人对 GaussDB 330 版本闪回特性的基本测试,希望能帮助到有需要的小伙伴。
总结:
正如开头所讲闪回技术能够有选择性的高效撤销一个已提交事务的影响,从人为错误中恢复,但是这里有限制,就是在数据库部署后,如未进行相关参数的设置,则闪回特性技术无法使用,误删除的数据将会丢,无法找回。
undo_zone_count;
enable_default_ustore_table;
version_retention_age;
enable_recyclebin;
recyclebin_retention_time;
undo_retention_time;
所有参数都配置成功后,还是建议着重注意下undo_retention_time (undo旧版本保留时间)和 recyclebin_retention_time(回收站对象保留时间,超过该时间的回收站对象将被自动清理)两个参数的时间设置,一般建议设置为7day(与客户老师沟通),因为TP类的业务增删改操作较为频繁,如若回收站保存时间过长,将会保留过于冗余的数据,占用磁盘空间。
评论

