下面主要从闪回查询、闪回表、闪回 DROP/TRUNCATE 方面进行演示。
闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务的影响,将数据 从人为不正确的操作中进行恢复。
基于 MVCC 多版本的数据恢复(仅支持 Ustore):适用于误删除、误更新、误插入数据的查 询和恢复,用户通过配置旧版本保留时间,并执行相应的查询或恢复命令,查询或恢复到指定 的时间点或 CSN 点。
基于数据库回收站的恢复(仅支持 Ustore):适用于误 DROP、误 TRUNCATE 的表的恢复。 用户通过配置回收站开关,并执行相应的恢复命令,可以将误 DROP、误 TRUNCATE 的表找回。
说明:回收站暂不支持 Astore 引擎(闪回 DROP/TRUNCATE)。
闪回查询可以查询过去某个时间点表的某个快照数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。
闪回查询基于 MVCC 多版本机制,通过检索查询旧版本,获取指定老版本数据。
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。
[omm@trex ~]$ gs_guc set -N all -I all -c "enable_default_ustore_table=on"
[omm@trex ~]$ gs_guc set -N all -I all -c "undo_zone_count=16384"
[omm@trex ~]$ gs_guc set -N all -I all -c "undo_retention_time=2000"
重新启动数据库。
[omm@trex ~]$ gs_om -t restart
[omm@trex ~]$ gsql -d postgres -p 26000 -r
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:09:38 commit 0 last mr )
NOTICE : The password has been expired, please change the password.
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
openGauss=# show enable_default_ustore_table;
enable_default_ustore_table
-----------------------------
on
(1 row)
openGauss=# show undo_zone_count;
undo_zone_count
-----------------
16384
(1 row)
openGauss=# show undo_retention_time;
undo_retention_time
---------------------
2000s
(1 row)
openGauss=#
openGauss=# create table test (id int,name varchar(10));
CREATE TABLE
openGauss=# insert into test values (1,'trex'),(2,'hankey');
INSERT 0 2
openGauss=# select clock_timestamp();
clock_timestamp
-------------------------------
2024-09-01 15:21:35.822563+08
(1 row)
openGauss=# insert into test values (3,'Yema');
INSERT 0 1
openGauss=# select * from test;
id | name
----+--------
1 | trex
2 | hankey
3 | Yema
(3 rows)
openGauss=#
openGauss=# select clock_timestamp();
clock_timestamp
-------------------------------
2024-09-01 15:23:34.342875+08
(1 row)
openGauss=# SELECT * FROM test TIMECAPSULE TIMESTAMP to_timestamp ('2024-09-01 15:21:35', 'YYYY-MM-DD HH24:MI:SS');
id | name
----+--------
1 | trex
2 | hankey
(2 rows)
openGauss=#
openGauss=# select clock_timestamp();
clock_timestamp
-------------------------------
2024-09-01 15:34:59.319153+08
(1 row)
openGauss=# update test set id = 4 where id =3;
openGauss=# select snptime,snpcsn from gs_txn_snapshot where snptime between '2024-09-01 15:34:20' and '2024-09-01 15:35:10';
snptime | snpcsn
-------------------------------+--------
2024-09-01 15:35:09.84636+08 | 2482
2024-09-01 15:35:06.832097+08 | 2481
2024-09-01 15:35:03.818291+08 | 2479
2024-09-01 15:35:00.804564+08 | 2478
2024-09-01 15:34:57.78217+08 | 2477
2024-09-01 15:34:54.768029+08 | 2476
2024-09-01 15:34:51.754253+08 | 2475
2024-09-01 15:34:48.743976+08 | 2474
2024-09-01 15:34:45.73307+08 | 2473
2024-09-01 15:34:42.716385+08 | 2472
2024-09-01 15:34:39.7026+08 | 2471
2024-09-01 15:34:36.691232+08 | 2470
2024-09-01 15:34:33.67825+08 | 2469
2024-09-01 15:34:30.665279+08 | 2468
2024-09-01 15:34:27.654471+08 | 2467
2024-09-01 15:34:24.640947+08 | 2466
2024-09-01 15:34:21.630685+08 | 2465
(17 rows)
openGauss=#
openGauss=# SELECT * FROM test TIMECAPSULE CSN 2477;
id | name
----+--------
1 | trex
2 | hankey
3 | Yema
(3 rows)
闪回 DROP:可以恢复意外删除的表,从回收站(recycle bin)中恢复被删除的表及其附属结 构如索引、表约束等。闪回 drop 是基于回收站机制,通过还原回收站中记录的表的物理文 件,实现已 drop 表的恢复。
闪回 TRUNCATE:可以恢复误操作或意外被进行 truncate 的表,从回收站中恢复被 truncate 的表及索引的物理数据。闪回 truncate 基于回收站机制,通过还原回收站中记录的表的物理 文件,实现已 truncate 表的恢复。
enable_recyclebin=on ###启用回收站。
recyclebin_retention_time=30min ###参数用于设置回 收站对象保留时间,超过该时间的回收站对象将被 自动清理
[omm@trex ~]$ gs_guc set -N all -I all -c "enable_recyclebin=on"
[omm@trex ~]$ gs_guc set -N all -I all -c "recyclebin_retention_time=30min"
[omm@trex ~]$ gs_om -t restart
[omm@trex ~]$ gsql -d postgres -p 26000 -r
openGauss=# show enable_recyclebin;
enable_recyclebin
-------------------
on
(1 row)
openGauss=# show recyclebin_retention_time;
recyclebin_retention_time
---------------------------
30min
(1 row)
openGauss=#
openGauss=# create table test2 (id int,name varchar(10));
CREATE TABLE
openGauss=# insert into test2 values (1,'sam'),(2,'allen');
INSERT 0 2
openGauss=# select * from test2;
id | name
----+-------
1 | sam
2 | allen
(2 rows)
openGauss=# truncate test2;
TRUNCATE TABLE
openGauss=# select * from test2;
id | c1
----+----
(0 rows)
openGauss=# timecapsule table test2 to before truncate;
TimeCapsule Table
openGauss=# select * from test2;
id | name
----+-------
1 | sam
2 | allen
(2 rows)
openGauss=#
openGauss=# drop table test2;
openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;
rcyname | rcyoriginname | rcytablespace
-----------------------------+---------------+---------------
BIN$3D724EB4003$24BC308==$0 | test2 | 0
openGauss=# timecapsule table test2 to before drop rename to test2_bak;
TimeCapsule Table
openGauss=# select * from test2_bak;
id | name
----+-------
1 | sam
2 | allen
(2 rows)
openGauss=#
如果需要在彻底删除表,不放到回收站,可操作如下
openGauss=# drop table test2_bak purge;
DROP TABLE
openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;
rcyname | rcyoriginname | rcytablespace
-----------------------------+---------------+---------------
(0 row)
openGauss=# drop table test2_bak purge;
DROP TABLE
openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;
rcyname | rcyoriginname | rcytablespace
-----------------------------+---------------+---------------
(0 row)
闪回恢复可以有选择性的撤销一个已提交事务的影响,对于误操作数据后恢复十分有效。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。可以快速有效的进行数据的恢复。
本文作者:马涛