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

MogDB5.0之 闪回查询/闪回表

由迪 2024-01-31
93

原作者;张晓娟

闪回恢复

  • 闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务的影响,将数据从人为不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。
  • 闪回支持两种恢复模式:
    • 基于MVCC多版本的数据恢复(仅支持Ustore):适用于误删除、误更新、误插入数据的查询和恢复,用户通过配置旧版本保留时间,并执行相应的查询或恢复命令,查询或恢复到指定的时间点或CSN点。
    • 基于数据库回收站的恢复(仅支持Ustore):适用于误DROP、误TRUNCATE的表的恢复。用户通过配置回收站开关,并执行相应的恢复命令,可以将误DROP、误TRUNCATE的表找回。
  • 相关参数:
    • enable_default_ustore_table=on
      开启默认支持Ustore存储引擎
    • undo_retention_time
      设置undo旧版本保留时间。等同于允许闪回查询的时间跨度,超过该时间闪回查询可能会报restore point not found错误。
    • enable_recyclebin=on
      打开回收站
    • recyclebin_retention_time=15min
      设置回收站对象保留时间,超过该时间的回收站对象将被自动清理

测试环境

  • 环境信息
    • 操作系统:CentOS7.6 x86_64
    • 数据库版本: 5.0
    • 数据库环境:单机,安装过程详见 https://www.modb.pro/db/654780

闪回查询

  • 闪回查询可以查询过去某个时间点表的某个snapshot数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据。
前提条件
  • 需要配置以下几个参数:
[omm@raca2 ~]$ gs_guc set -D /opt/mogdb/data/ -c "enable_default_ustore_table=on"
[omm@raca2 ~]$ gs_guc set -D /opt/mogdb/data/ -c "enable_ustore=on"
[omm@raca2 ~]$ gs_guc set -D /opt/mogdb/data/ -c "undo_zone_count=16384"
[omm@raca2 ~]$  gs_guc set -D /opt/mogdb/data/ -c "undo_retention_time=1800"

// 重启数据库,使参数生效
[omm@raca2 ~]$ gs_om -t restart
复制
  • 查看当前参数配置
MogDB=# select name,setting,context from pg_settings where name in ('enable_default_ustore_table','undo_retention_time','undo_zone_count','enable_ustore');
            name             | setting |  context   
-----------------------------+---------+------------
 enable_default_ustore_table | on      | user
 enable_ustore               | on      | postmaster
 undo_retention_time         | 1800    | sighup
 undo_zone_count             | 16384   | postmaster
(4 rows)
复制
模拟测试
  • 创建表及插入数据
MogDB=# create table t1(id int,name varchar(10));
CREATE TABLE
MogDB=# \d+ t1
                                 Table "public.t1"
 Column |         Type          | Modifiers | Storage  | Stats target | Description 
--------+-----------------------+-----------+----------+--------------+-------------
 id     | integer               |           | plain    |              | 
 name   | character varying(10) |           | extended |              | 
Has OIDs: no
Options: orientation=row, compression=no, storage_type=USTORE

MogDB=# insert into t1 values(1,'Apple'),(2,'Bear');
INSERT 0 2
MogDB=# select clock_timestamp();
        clock_timestamp        
-------------------------------
 2023-08-15 16:35:40.788785+08
(1 row)

MogDB=# insert into t1 values(3,'Car');
INSERT 0 1
MogDB=# select clock_timestamp();
        clock_timestamp        
-------------------------------
 2023-08-15 16:35:51.932852+08
(1 row)
复制
  • 基于timestamp的闪回查询
MogDB=# SELECT * FROM t1 TIMECAPSULE TIMESTAMP to_timestamp ('2023-08-15 16:35:40.788785', 'YYYY-MM-DD HH24:MI:SS.FF');
 id | name  
----+-------
  1 | Apple
  2 | Bear
(2 rows)
复制
  • 修改一行数据
MogDB=# select clock_timestamp();           
        clock_timestamp        
-------------------------------
 2023-08-15 16:44:10.124224+08
(1 row)

MogDB=# update t1 set name='Cup' where id=3;
UPDATE 1
MogDB=# select * from t1;
 id | name  
----+-------
  1 | Apple
  2 | Bear
  3 | Cup
(3 rows)
复制
  • 基于CSN的闪回查询
MogDB=# select snptime,snpcsn from gs_txn_snapshot where snptime between '2023-08-15 16:43:59.124224' and '2023-08-15 16:44:10.124224';
            snptime            | snpcsn 
-------------------------------+--------
 2023-08-15 16:44:04.411239+08 |   9598
 2023-08-15 16:44:07.423107+08 |   9599
 2023-08-15 16:44:01.397737+08 |   9597
(3 rows)

MogDB=# SELECT * FROM t1 TIMECAPSULE CSN 9598;
 id | name  
----+-------
  1 | Apple
  2 | Bear
  3 | Car
(3 rows)
复制

闪回表

  • 闪回表可以将表恢复至特定时间点,当逻辑损坏仅限于一个或一组表,而不是整个数据库时,此特性可以快速恢复表的数据。闪回表基于MVCC多版本机制,通过删除指定时间点和该时间点之后的增量数据,并找回指定时间点和当前时间点删除的数据,实现表级数据还原。
  • 基于CSN的闪回表
MogDB=# TIMECAPSULE TABLE t1 TO CSN 9598;
TimeCapsule Table
MogDB=# select * from t1;
 id | name  
----+-------
  1 | Apple
  2 | Bear
  3 | Car
(3 rows)
复制
  • 基于timestamp的闪回表
MogDB=# TIMECAPSULE TABLE t1 TO TIMESTAMP to_timestamp ('2023-08-15 16:35:40.788785', 'YYYY-MM-DD HH24:MI:SS.FF');
TimeCapsule Table
MogDB=# select * from t1;
 id | name  
----+-------
  1 | Apple
  2 | Bear
(2 rows)
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论