误删除不用怕,openGauss闪回恢复帮你搞定

下面主要从闪回查询、闪回表、闪回 DROP/TRUNCATE 方面进行演示。
闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务的影响,将数据 从人为不正确的操作中进行恢复。

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

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

说明:回收站暂不支持 Astore 引擎(闪回 DROP/TRUNCATE)。

1 闪回查询表

闪回查询可以查询过去某个时间点表的某个快照数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。

闪回查询基于 MVCC 多版本机制,通过检索查询旧版本,获取指定老版本数据。

1.1 根据库配置文件 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。

[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

1.2 查看修改后的参数值。

[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=# 

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

openGauss=# create table test (id int,name varchar(10));
CREATE TABLE
openGauss=# insert into test values (1,'trex'),(2,'hankey');
INSERT 0 2

1.4 查看当前时间戳 t1。

openGauss=# select clock_timestamp();
        clock_timestamp        
-------------------------------
 2024-09-01 15:21:35.822563+08
(1 row)

1.5 再插入新数据。

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=# 

1.6 查看当前时间戳 t2。

openGauss=# select clock_timestamp();
        clock_timestamp        
-------------------------------
 2024-09-01 15:23:34.342875+08
(1 row)

1.7 基于 timestamp 的闪回查询。 查询 t1 时刻时,test 表数据。

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=# 

1.8 基于 CSN 的闪回查询。

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;

1.9 查询 timestamp 对应的 CSN。

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)

2 闪回 drop/truncate

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

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

2.1 根据库配置文件 postgresql.conf 参数配置。

  • 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=# 

2.2 创建测试表

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)

2.3 truncate 表。

openGauss=# truncate test2; 
TRUNCATE TABLE
openGauss=# select * from test2;
id | c1
----+----
(0 rows)

2.4 闪回 truncate 操作。

openGauss=# timecapsule table test2 to before truncate;
TimeCapsule Table
openGauss=# select * from test2;
 id | name  
----+-------
  1 | sam
  2 | allen
(2 rows)

openGauss=# 

2.5 误 drop 表

openGauss=# drop table test2;

2.6 查看回收站。

openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;
           rcyname           | rcyoriginname | rcytablespace 
-----------------------------+---------------+---------------
 BIN$3D724EB4003$24BC308==$0 | test2         |             0

2.7 闪回 drop 表并且 rename。

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=# 

2.8 删除表时不放到回收站。

如果需要在彻底删除表,不放到回收站,可操作如下

openGauss=# drop table test2_bak purge;
DROP TABLE

openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;
           rcyname           | rcyoriginname | rcytablespace 
-----------------------------+---------------+---------------
(0 row)

3 总结

openGauss=# drop table test2_bak purge;
DROP TABLE

openGauss=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;
           rcyname           | rcyoriginname | rcytablespace 
-----------------------------+---------------+---------------
(0 row)

3 总结

闪回恢复可以有选择性的撤销一个已提交事务的影响,对于误操作数据后恢复十分有效。采用闪回技术后,恢复已提交的数据库修改前的数据,只需要秒级,而且恢复时间和数据库大小无关。可以快速有效的进行数据的恢复。

本文作者:马涛

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐