openGauss/MogDB 3.0 闪回恢复测试

本文出处:https://www.modb.pro/db/411368

介绍

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

闪回支持两种恢复模式:

基于 MVCC 多版本的数据恢复(仅支持 Ustore):适用于误删除、误更新、误插入数据的查询和恢复,用户通过配置旧版本保留时间,并执行相应的查询或恢复命令,查询或恢复到指定的时间点或 CSN 点。

基于数据库回收站的恢复(仅支持 Ustore):适用于误 DROP、误 TRUNCATE 的表的恢复。用户通过配置回收站开关,并执行相应的恢复命令,可以将误 DROP、误 TRUNCATE 的表找回。 说明: 回收站暂不支持 Astore 引擎(闪回 DROP/TRUNCATE)。

测试环境

操作系统:centos7.6 x86

数据库版本:openGauss 3.0

数据库环境:单机

(在这里数据库安装过程省略),根据上述提到的两种恢复模式下面分别进行测试。

闪回查询和表

闪回查询可以查询过去某个时间点表的某个 snapshot 数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于 MVCC 多版本机制,通过检索查询旧版本,获取指定老版本数据。

前置条件

数据库配置文件 postgresql.conf 参数配置

enable_default_ustore_table=on ###开启默认支持Ustore存储引擎

undo_zone_count=16384 ###内存中可分配的undo zone数量,0代表禁用undo和Ustore表,建议取值为max_connections*4

undo_retention_time=2000 ###用于设置undo旧版本的保留时间,默认为0,单位s。

测试过程

---创建测试表并插入两条数据

openGauss=# create table u_tb (id int,c1 varchar(10));

CREATE TABLE

openGauss=# insert into u_tb values (1,'Aso'),(2,'Hocx');

INSERT 0 2

openGauss=# select clock_timestamp();

clock_timestamp

2022-06-02 16:21:38.123874+08

(1 row)

---再插入新数据

openGauss=# insert into u_tb values (3,'Ysad');

INSERT 0 1

openGauss=# select clock_timestamp();

clock_timestamp

2022-06-02 16:21:52.773089+08

(1 row)

---基于timestamp的闪回查询

openGauss=# SELECT * FROM u_tb TIMECAPSULE TIMESTAMP to_timestamp ('2022-06-02 16:21:38.123874', 'YYYY-MM-DD HH24:MI:SS.FF');

id | c1

----+------

1 | Aso

2 | Hocx

(2 rows)

openGauss=# select clock_timestamp();

clock_timestamp

2022-06-02 16:22:36.596661+08

(1 row)

---修改一行数据

openGauss=# update u_tb set id = 4 where id =3;

UPDATE 1

openGauss=# select * from u_tb;

id | c1

----+------

1 | Aso

2 | Hocx

4 | Ysad

(3 rows)

---查询timestamp对应的CSN

openGauss=# select snptime,snpcsn from gs_txn_snapshot where snptime between '2022-06-02 16:21:52.773089' and '2022-06-02 16:22:36.596661';

snptime | snpcsn

-------------------------------+--------

2022-06-02 16:22:36.330093+08 | 45012

2022-06-02 16:22:33.306022+08 | 45011

2022-06-02 16:22:30.279709+08 | 45010

2022-06-02 16:22:27.256441+08 | 45009

2022-06-02 16:22:24.232027+08 | 45008

2022-06-02 16:22:21.208859+08 | 45007

2022-06-02 16:22:18.181382+08 | 45006

2022-06-02 16:22:15.15771+08 | 45005

2022-06-02 16:22:12.132989+08 | 45004

2022-06-02 16:22:09.109973+08 | 45003

2022-06-02 16:22:06.086961+08 | 45002

2022-06-02 16:22:03.064702+08 | 45001

2022-06-02 16:22:00.042871+08 | 45000

2022-06-02 16:21:57.009696+08 | 44999

2022-06-02 16:21:53.985716+08 | 44998

(15 rows)

---基于CSN的闪回查询

openGauss=# SELECT * FROM u_tb TIMECAPSULE CSN 45009;

id | c1

----+------

1 | Aso

2 | Hocx

3 | Ysad

(3 rows)

---基于CSN的闪回表

openGauss=# TIMECAPSULE TABLE u_tb TO CSN 45009;

TimeCapsule Table

openGauss=# select * from u_tb;

id | c1

----+------

1 | Aso

2 | Hocx

3 | Ysad

(3 rows)

---基于timestamp的闪回表

openGauss=# TIMECAPSULE TABLE u_tb TO TIMESTAMP to_timestamp ('2022-06-02 16:21:38', 'YYYY-MM-DD HH24:MI:SS.FF');

TimeCapsule Table

openGauss=# SELECT * FROM u_tb;

id | c1

----+------

1 | Aso

2 | Hocx

(2 rows)

闪回 drop/truncate

闪回 DROP:可以恢复意外删除的表,从回收站(recycle bin)中恢复被删除的表及其附属结构如索引、表约束等。闪回 drop 是基于回收站机制,通过还原回收站中记录的表的物理文件,实现已 drop 表的恢复。

闪回 TRUNCATE:可以恢复误操作或意外被进行 truncate 的表,从回收站中恢复被 truncate 的表及索引的物理数据。闪回 truncate 基于回收站机制,通过还原回收站中记录的表的物理文件,实现已 truncate 表的恢复。

前置条件

enable_recyclebin=on ###启用回收站。 recyclebin_retention_time=30min ###参数用于设置回收站对象保留时间,超过该时间的回收站对象将被自动清理。

测试过程

---创建测试表

openGauss=# create table u_tb2 (id int,c1 varchar(10));

CREATE TABLE

openGauss=# insert into u_tb2 values (1,'Aso'),(2,'Hocx');

INSERT 0 2

openGauss=# select * from u_tb2;

id | c1

----+------

1 | Aso

2 | Hocx

(2 rows)

---truncate表

openGauss=# truncate u_tb2;

TRUNCATE TABLE

openGauss=# select * from u_tb2;

id | c1

----+----

(0 rows)

---闪回truncate操作

openGauss=# timecapsule table u_tb2 to before truncate;

TimeCapsule Table

openGauss=# select * from u_tb2;

id | c1

----+------

1 | Aso

2 | Hocx

(2 rows)

---误drop表

openGauss=# drop table u_tb2;

DROP TABLE

---查看回收站

openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;

rcyname | rcyoriginname | rcytablespace

-------------------------------+---------------+---------------

BIN$3C774EBC071$23FB27078==$0 | u_tb2 | 0

(1 row)

---闪回drop表并且rename

openGauss=# timecapsule table u_tb2 to before drop rename to u_tb2_bak;

TimeCapsule Table

openGauss=# select * from u_tb2_bak;

id | c1

----+------

1 | Aso

2 | Hocx

(2 rows)

---删除表时不放到回收站

openGauss=# drop table u_tb2_bak purge;

DROP TABLE

---检查回收站

openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;

rcyname | rcyoriginname | rcytablespace

---------+---------------+---------------

(0 rows)

总结 3.0 和 2.1 的区别

如果是 2.1 版本测试闪回查询和闪回表则需要配置参数 version_retention_age(设置旧版本保留的事务数,超过该事务数的旧版本将被回收清理),不是配置 undo_retention_time;在 3.0 版本中 version_retention_age 参数已被弃用,使用的参数就是 undo_retention_time(undo 旧版本保留时间)做闪回查询。回收站在 2.1 版本中对 Astore 表支持,在 3.0 中不再支持 Astore 表,而是 ustore 表才支持。

mogdb里xlog相关的几个参数的更多相关文章

  1. react中关于create-react-app2里css相关配置

    先看 webpack.config.dev.js 里的相关代码: // style files regexes const cssRegex = /\.css$/; const cssModuleRe ...

  2. 从头说catalan数及笔试面试里那些相关的问题 (转)

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11938973. 声明:版权所有,转载请注明出处,谢谢 ...

  3. 解决kettle在两个mysql之间迁移数据时乱码的问题 和 相关报错 及参数调整, 速度优化

    1. 乱码问题 编辑目标数据库的链接: 配置编码参数即可. 2. 报错 No operations allowed after statement closed. 需要调整wait_timeout:  ...

  4. catalan数及笔试面试里那些相关的问题(转)

    一.catalan数由来和性质 1)由来 catalan数(卡塔兰数)取自组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项 ...

  5. 【前端童鞋看过来!】给大家分享网盘里前端相关书籍,主要是和网络通信(HTTP/TCP/IP)及javascript相关的

    百度云链接:https://pan.baidu.com/s/1kUPdf5H(无密码) 截图: <HTTP权威指南> [豆瓣书评]:此书第一部分是HTTP的概略,如果你没有时间,通读第一部 ...

  6. 掌握zigbee网络里的相关的重要概论

    1.zigbee无线通信,需要高频的载波来提供发射效率,zigbee模块之间要可以正常的收发,必须把接收频率设置和发射模块的载波频率一致. 2.zigbee有27个载波可以进行通信,载波叫做信道(无线 ...

  7. Swift里计数相关的小细节

    Swift里对于字符串这些引入了index型,相对其他语言而言字符操作更安全了,但是问题就是一不注意搞错范围就会有各种离奇的bug. 在讲主题前,先说个小细节. Swift里非常严密的定义了一大堆字符 ...

  8. 替换文件里的相关单词(一)之文件类型为txt

    首先说一下详细的实现思路: 第一步:我们须要获取要改动文件的信息,我们能够通过文件的路径来获取文件的FileInputStream,即文件的输入流,然后调用InputStreamReader读取文件输 ...

  9. AbstractQueuedSynchronizer的使用和juc里的相关类的解析

    对AQS进行解析后,先来实现两个简单的基于AQS的类,然后再解析juc里基于AQS构造的类. 1.基于AQS的类的示例 首先先看这个类,这个类是<Java并发编程实战>的一个示例,AQS源 ...

  10. NFS客户端访问行为相关的几个参数解释

    soft / hard Determines the recovery behavior of the NFS client after an NFS request times out. If ne ...

随机推荐

  1. 容器与 Pod

    现在 Docker 的流行程度越来越高,越来越多的公司使用 Docker 打包和部署项目.但是也有很多公司只是追求新技术,将以前的单体应用直接打包为镜像,代码.配置方式等各方面保持不变,使用 Dock ...

  2. C语言之牛必克拉斯 main() 函数

    C语言之main()函数 C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的 ...

  3. [.Net]使用Soa库+Abp搭建微服务项目框架(四):动态代理和RPC

    ​上一章我们完成了小项目的面向服务体系改造,你或许一直在思考一个问题.为什么要将业务独立成微服务? 微服务原理 以一个健康医疗系统为例, 这个系统包含了用户模块,问卷的发放与填写,图表显示,报表生成与 ...

  4. Error running 'Tomcat 8.5.27': Unable to open debugger port (127.0.0.1:2887): java.net.SocketException "Interrupted function call: accept failed"-火绒安全搞的鬼

    火绒安全-导致的tomcat8启动异常 一.问题由来 最近有个朋友在学习使用IDEA配置tomcat 8.5.99的时候,使用一切都正常,直到学习到使用Servlet实现文件 下载功能的时候,出现问题 ...

  5. 摆脱鼠标系列 Trigger Suggest 快捷键 改成 Shift + Space

    摆脱鼠标系列 Trigger Suggest 快捷键 改成 Shift + Space 看marp插件的时候,发现用ctrl + space 自动提示,但是我这里是输入法

  6. 基于恒玄WT250芯片的蓝牙辅听耳机方案调试总结

    前记 在蓝牙辅听领域卷了几年之后.各种型号的蓝牙辅听器都做过.这次,客户需要一款性价比超高的蓝牙辅听器.经过成本以及功能考量的筛选.最终定下来使用wt250来做一款低成本的蓝牙辅听器. 硬件部分 wt ...

  7. docker部署文件

  8. Android WebView获取html源码

    通过执行js语句来获取 val code = """ document.documentElement.outerHTML """.trim ...

  9. Java双重循环实现任意字符串中提取数字子串

    public class Test2{  public static void main(String[] args) {   String s = "211ahn678rh2kkk0731 ...

  10. 告别繁琐!1分钟带你构建RabbitMQ消息应用

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac. RabbitMQ作为一款主流的消息队列工具早已广受欢迎.相比于其它的 ...