签到成功

知道了

CNDBA社区CNDBA社区

openGauss 闪回恢复 操作示例

2023-04-13 10:34 814 0 原创 openGauss
作者: dave

1 闪回恢复 说明

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

闪回恢复包括:http://www.cndba.cn/dave/article/116546

  1. 闪回查询
  2. 闪回表
  3. 闪回DROP/TRUNCATE

注:

  1. 官方文档虽然说只有ASTORE引擎暂不支持闪回DROP/TRUNCATE。实际测试看,整个闪回恢复功能都不支持AStore,只有UStore的表才支持闪回功能。
  2. OpenGaus 默认不开启闪回恢复功能,需要手工配置参数启用。

闪回恢复主要利用了2个技术:http://www.cndba.cn/dave/article/116546http://www.cndba.cn/dave/article/116546http://www.cndba.cn/dave/article/116546

  1. 基于MVCC多版本的数据恢复:适用于误删除、误更新、误插入数据的查询和恢复,用户通过配置旧版本保留时间,并执行相应的查询或恢复命令,查询或恢复到指定的时间点或CSN(commit sequence number)点。Astore和Ustore 引擎都支持。
  2. 基于回收站的恢复:适用于误DROP、误TRUNCATE的表的恢复。用户通过配置回收站开关,并执行相应的恢复命令,可以将误DROP、误TRUNCATE的表找回。 仅Ustore 引擎支持。

关于Astore和Ustore 参考之前的博客:

openGauss Astore(Append Update)和 Ustore(In-place Update)数据引擎 说明
https://www.cndba.cn/dave/article/116545

2 操作示例

2.1 闪回查询

2.1.1 配置undo_retention_time参数

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

因此在使用闪回查询之前需要先配置undo_retention_time参数用于设置undo旧版本的保留时间。

http://www.cndba.cn/dave/article/116546

该参数默认值为0,单位为s,取值范围:最小值为0,最大值为2147483647。 并且该参数是SIGHUP参数,修改后需要重启才能生效。 因此也就是说,opengauss 默认是不支持闪回恢复功能的。

openGauss 5.0.0 参数 查看 与 修改
https://www.cndba.cn/dave/article/116536http://www.cndba.cn/dave/article/116546

http://www.cndba.cn/dave/article/116546
http://www.cndba.cn/dave/article/116546

[dave@www.cndba.cn ~]$ gsql -d postgres -p 15500 -r
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# /c cndba
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "cndba" as user "omm".
cndba=# show undo_retention_time;
 undo_retention_time 
---------------------
 0
(1 row)

cndba=# 

[dave@www.cndba.cn ~]$ gs_guc set -N all -I all -c "undo_retention_time=900"
The gs_guc run with the following arguments: [gs_guc -N all -I all -c undo_retention_time=900 set ].
NOTICE: Sets the maximum retention time of undo
Begin to perform the total nodes: 3.
Popen count is 3, Popen success count is 3, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 3, Command success count is 3, Command failure count is 0.

Total instances: 3. Failed instances: 0.
ALL: Success to perform gs_guc!


[dave@www.cndba.cn ~]$ gs_ctl restart -D /data/openGauss/install/data/dn

cndba=# show undo_retention_time;
 undo_retention_time 
---------------------
 15min
(1 row)

2.1.2 闪回查询示例

cndba=# create table cndba(id int,website varchar(50)) with (storage_type=ustore);
CREATE TABLE
cndba=# select current_timestamp;
        pg_systimestamp        
-------------------------------
 2023-04-13 09:41:21.622962+08
(1 row)

cndba=# insert into cndba values(1,'https://www.cndba.cn');
INSERT 0 1
cndba=# select * from cndba;
 id |       website        
----+----------------------
  1 | https://www.cndba.cn
(1 row)

cndba=# select * from cndba timecapsule timestamp to_timestamp(' 2023-04-13 09:41:21.622962','YYYY-MM-DD HH24:MI:SS.FF');
 id | website 
----+---------
(0 rows)

cndba=#  select * from cndba timecapsule  timestamp '2023-04-13 09:41:21';
 id | website 
----+---------
(0 rows)

cndba=# select snptime,snpcsn from gs_txn_snapshot where snptime between '2023-04-13 09:41:20.622962' and '2023-04-13 09:41:22.622962';
            snptime            | snpcsn 
-------------------------------+--------
 2023-04-13 09:41:22.068791+08 |   3806
(1 row)

cndba=#  select * from cndba timecapsule csn 3806;
 id | website 
----+---------
(0 rows)

2.2 闪回表

闪回查询是查询表在某个时间点的数据,实际并未对表的数据进行修改,而闪回表则是将表恢复至特定时间点,此特性可以快速恢复表的数据,当然也可以利用闪回查询重新进行insert 操作。

闪回表基于MVCC多版本机制,通过删除指定时间点和该时间点之后的增量数据,并找回指定时间点和当前时间点删除的数据,实现表级数据还原。

闪回表的前提条件也是设置undo_retention_time参数,我们在上节配置过了,所以这里不再配置,直接操作。

cndba=# select current_timestamp;
        pg_systimestamp        
-------------------------------
 2023-04-13 10:00:42.108673+08
(1 row)

cndba=# select * from cndba;
 id |       website        
----+----------------------
  1 | https://www.cndba.cn
(1 row)

cndba=# insert into cndba values(2,'https://www.cndba.cn');
INSERT 0 1
cndba=# select * from cndba;
 id |       website        
----+----------------------
  1 | https://www.cndba.cn
  2 | https://www.cndba.cn
(2 rows)

现在表中有2条记录,我们恢复到只有一条的时间点:

http://www.cndba.cn/dave/article/116546

cndba=# timecapsule table cndba to timestamp '2023-04-13 10:00:42';
TimeCapsule Table
cndba=# select * from cndba;
 id |       website        
----+----------------------
  1 | https://www.cndba.cn
(1 row)

cndba=#timecapsule table cndba to  timestamp to_timestamp('2023-04-13 10:00:42.108673','YYYY-MM-DD HH24:MI:SS.FF');
TimeCapsule Table
cndba=# select * from cndba;
 id |       website        
----+----------------------
  1 | https://www.cndba.cn
(1 row)

2.3 闪回DROP/TRUNCATE

2.3.1 配置参数

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

因此在使用之前,需要先启用回收站:

  1. 开启enable_recyclebin参数,该参数默认为off, 修改需要重启示例。
  2. recyclebin_retention_time参数用于设置回收站对象保留时间,超过该时间的回收站对象将被自动清理。默认是900s,即15分钟。
cndba=# show enable_recyclebin;
 enable_recyclebin 
-------------------
 off
(1 row)

cndba=# show recyclebin_retention_time;
 recyclebin_retention_time 
---------------------------
 15min
(1 row)

cndba=# 

[dave@www.cndba.cn ~]$ gs_guc set -N all -I all -c "enable_recyclebin=on"
[dave@www.cndba.cn ~]$ gs_guc set -N all -I all -c "recyclebin_retention_time=30min"
[dave@www.cndba.cn ~]$ gs_ctl restart -D /data/openGauss/install/data/dn

2.3.2 操作示例

注意: 回收站只支持Ustore 表。Astore 的表被删除是不会放入回收站。

cndba=# create table dave(id int);
CREATE TABLE
cndba=# /dt+ dave
                                    List of relations
 Schema | Name | Type  | Owner |  Size   |             Storage              | Description 
--------+------+-------+-------+---------+----------------------------------+-------------
 public | dave | table | omm   | 0 bytes | {orientation=row,compression=no} | 
(1 row)

cndba=# drop table dave;
DROP TABLE
cndba=# select rcyname,rcyoriginname,rcytablespace from gs_recyclebin;
 rcyname | rcyoriginname | rcytablespace 
---------+---------------+---------------
(0 rows)


DROP Ustore 表:
cndba=# /dt
                                          List of relations
 Schema |         Name         | Type  | Owner |                       Storage                        
--------+----------------------+-------+-------+------------------------------------------------------
 public | anqing               | table | omm   | {orientation=row,compression=no,storage_type=USTORE}
 public | cndba                | table | omm   | {orientation=row,storage_type=ustore,compression=no}
 public | customer_address_p1  | table | omm   | {orientation=row,compression=no}
 public | employees_table      | table | omm   | {orientation=row,compression=no}
 public | graderecord          | table | omm   | {orientation=row,compression=no}
 public | hash_partition_table | table | omm   | {orientation=row,compression=no}
 public | metro_ride_record    | table | omm   | {orientation=row,compression=no}
 public | sales_table          | table | omm   | {orientation=row,compression=no}
 public | t2                   | table | omm   | {orientation=row,storage_type=astore,compression=no}
 public | ustc                 | table | omm   | {orientation=row,storage_type=ustore,compression=no}
(10 rows)

cndba=# drop table anqing;
DROP TABLE
cndba=# select rcyname,rcyoriginname,rcytablespace from gs_recyclebin;
           rcyname            | rcyoriginname | rcytablespace 
------------------------------+---------------+---------------
 BIN$40044EB6115$15D02EE0==$0 | anqing        |             0
 BIN$40044EB6119$15D03C40==$0 | ubt_idx2      |             0
 BIN$40044EB6118$15D04238==$0 | ubt_idx       |             0
(3 rows)

cndba=# timecapsule table anqing to before drop rename to anqing_bak;
TimeCapsule Table
cndba=# select rcyname,rcyoriginname,rcytablespace from gs_recyclebin;
 rcyname | rcyoriginname | rcytablespace 
---------+---------------+---------------
(0 rows)

这里也可以不加rename to,直接恢复成原名称:
cndba=# timecapsule table anqing to before drop;


cndba=# select * from anqing;
ERROR:  relation "anqing" does not exist on dn_6001_6002_6003
LINE 1: select * from anqing;
                      ^
cndba=# select * from anqing_bak;
 id | name 
----+------
(0 rows)

truncate ustore 表:
cndba=# select * from cndba;
 id |       website        
----+----------------------
  1 | https://www.cndba.cn
(1 row)

cndba=# truncate table cndba;
TRUNCATE TABLE
cndba=# select * from cndba;
 id | website 
----+---------
(0 rows)

cndba=# select rcyname,rcyoriginname,rcytablespace from gs_recyclebin;
           rcyname            | rcyoriginname | rcytablespace 
------------------------------+---------------+---------------
 BIN$40044EB6156$15D3AB88==$0 | cndba         |             0
(1 row)

cndba=# timecapsule table cndba to before truncate;
TimeCapsule Table
cndba=# select * from cndba;
 id |       website        
----+----------------------
  1 | https://www.cndba.cn
(1 row)

cndba=# select rcyname,rcyoriginname,rcytablespace from gs_recyclebin;
           rcyname            | rcyoriginname | rcytablespace 
------------------------------+---------------+---------------
 BIN$40044EB6156$15D40D08==$0 | cndba         |             0
(1 row)

cndba=# 

这里要注意一点,恢复truncate掉的数据之后,回收站中还有相应的记录。

需要注意一点:http://www.cndba.cn/dave/article/116546

闪回点和当前点之间,执行过修改表结构或影响物理结构的语句,闪回失败。涉及namespace、表名改变等操作的DDL执行闪回报错: ERROR: recycle object %s desired does not exis;增加/删除/切割/合成等分区改变等操作的DDL执行闪回报错: ERROR: relation %s does not exis;其他情况报错:“ERROR:The table definition of %s has been changed. ”。

最后,如果在DROP 表示加了purge,或者手工对回收站执行purge操作,那么也就无法进行闪回drop、truncate 操作了。

cndba=# drop table anqing_bak purge;
DROP TABLE
cndba=# select rcyname,rcyoriginname,rcytablespace from gs_recyclebin;
           rcyname            | rcyoriginname | rcytablespace 
------------------------------+---------------+---------------
 BIN$40044EB6156$15D40D08==$0 | cndba         |             0
(1 row)
cndba=# purge table cndba;
PURGE TABLE
cndba=# select rcyname,rcyoriginname,rcytablespace from gs_recyclebin;
 rcyname | rcyoriginname | rcytablespace 
---------+---------------+---------------
(0 rows)

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2239
    原创
  • 3
    翻译
  • 546
    转载
  • 186
    评论
  • 访问:6602838次
  • 积分:4248
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ