1 闪回恢复 说明
闪回恢复功能是openGauss 2.1.0 中引入的数据库恢复技术,可以有选择性的撤销一个已提交事务的影响,将数据从人为不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。
闪回恢复包括:
- 闪回查询
- 闪回表
- 闪回DROP/TRUNCATE
注:
- 官方文档虽然说只有ASTORE引擎暂不支持闪回DROP/TRUNCATE。实际测试看,整个闪回恢复功能都不支持AStore,只有UStore的表才支持闪回功能。
- OpenGaus 默认不开启闪回恢复功能,需要手工配置参数启用。
闪回恢复主要利用了2个技术:
- 基于MVCC多版本的数据恢复:适用于误删除、误更新、误插入数据的查询和恢复,用户通过配置旧版本保留时间,并执行相应的查询或恢复命令,查询或恢复到指定的时间点或CSN(commit sequence number)点。Astore和Ustore 引擎都支持。
- 基于回收站的恢复:适用于误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旧版本的保留时间。
该参数默认值为0,单位为s,取值范围:最小值为0,最大值为2147483647。 并且该参数是SIGHUP参数,修改后需要重启才能生效。 因此也就是说,opengauss 默认是不支持闪回恢复功能的。
openGauss 5.0.0 参数 查看 与 修改
https://www.cndba.cn/dave/article/116536
[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条记录,我们恢复到只有一条的时间点:
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表的恢复。
因此在使用之前,需要先启用回收站:
- 开启enable_recyclebin参数,该参数默认为off, 修改需要重启示例。
- 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掉的数据之后,回收站中还有相应的记录。
需要注意一点:
闪回点和当前点之间,执行过修改表结构或影响物理结构的语句,闪回失败。涉及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)
版权声明:本文为博主原创文章,未经博主允许不得转载。