PolarDB PostgreSQL版中没有undo日志,开发或运维人员如果误操作(例如DROP TABLE)可能会导致数据丢失。PolarDB PostgreSQL版支持闪回删除功能,用于快速恢复已经删除的表,以及查看和清理回收站等,方便您找回数据。
前提条件
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 11(内核小版本1.1.30及以上)
PostgreSQL 14(内核小版本14.9.15.0及以上)
您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:
PostgreSQL 11
show polar_version;
PostgreSQL 14
select version();
注意事项
建议在删除重要表时打开闪回删除功能,日常业务操作请谨慎使用。
闪回删除是将已删除的表转存到回收站模式空间下,并非真正意义上的删除表,所以表所占用的空间并没有被释放。因此,数据长期积累可能会导致磁盘空间占用较大,建议定期清理回收站。
闪回删除功能开启状态下,表被删除后,在执行表的相关依赖项删除操作时可能会失败(因为表并未被真正删除,表依旧依赖这些依赖项)。
由于删除的表转存在recyclebin(回收站)模式空间下,因此避免创建名称为recyclebin的模式,因为recyclebin模式下的表会被
purge recyclebin
语法清理掉。打开闪回删除功能后,不支持以下删除操作:
分区表和临时表不支持闪回删除,会被真正删除,无法恢复。
不支持
sql_drop
事件触发器。
参数说明
参数名称 | 数据类型 | 参数说明 |
polar_enable_flashback_drop | BOOL | 打开或者关闭闪回删除功能。取值:
|
语法
闪回删除功能支持以下SQL语法:
删除策略
drop table table_name; #放入回收站。 drop table table_name purge; #完全删除,无法恢复。
恢复删除的表
flashback table table_name to before drop; #恢复删除的表(重名的表则恢复最新的表)。 flashback table table_name to before drop rename to table_name_1; #恢复删除的表并重命名。
彻底删除回收站中的表
purge table table_name;
说明重名的表则删除最旧的表。
清空回收站
purge recyclebin;
说明清空回收站需要polar_super_user权限。
查看回收站信息
show recyclebin;
示例
准备测试数据:
创建表
test1
和表test2
,并插入数据。CREATE TABLE test1(id int primary key, name text); CREATE TABLE test2(id int primary key, name text); INSERT INTO test1 select t,repeat('test1',1024) from generate_series(1, 10000) as t; INSERT INTO test2 select t,repeat('test2',1024) from generate_series(1, 10000) as t; \dt
显示结果如下:
List of relations Schema | Name | Type | Owner --------+-------+-------+---------- public | test1 | table | postgres public | test2 | table | postgres (2 rows)
删除表并查看回收站。
删除表
test1
和表test2
。DROP TABLE test1; DROP TABLE test2; \dt
显示结果如下:
Did not find any relations.
查看回收站。
show recyclebin;
显示结果如下:
table_catalog | table_name | table_type ---------------+-----------------------------+------------ postgres | public$test1$69461331094004 | BASE TABLE postgres | public$test2$69461332967609 | BASE TABLE (2 rows)
闪回删除的表:
恢复删除的表。
FLASHBACK TABLE test1 TO BEFORE DROP; FLASHBACK TABLE test2 TO BEFORE DROP RENAME TO test3; \dt
显示结果如下:
List of relations Schema | Name | Type | Owner --------+-------+-------+---------- public | test1 | table | postgres public | test3 | table | postgres (2 rows)
说明其中表
test2
被重命名为test3
。查看恢复后的数据。
查看表
test1
的数据。SELECT count(*) FROM test1;
显示结果如下:
count ------- 10000 (1 row)
查看表
test3
的数据。SELECT count(*) FROM test3;
显示结果如下:
count ------- 10000 (1 row)