PolarDB PostgreSQL版(兼容Oracle)中没有undo日志,开发或运维人员如果误操作(例如DROP TABLE)可能会导致数据丢失。PolarDB PostgreSQL版(兼容Oracle)支持闪回删除功能,用于快速恢复已经删除的表,以及查看和清理回收站等,方便您找回数据。
注意事项
- 建议在删除重要表时打开闪回删除功能,日常业务操作请谨慎使用。
- 闪回删除是将已删除的表转存到回收站模式空间下,并非真正意义上的删除表,所以表所占用的空间并没有被释放。因此,数据长期积累可能会导致磁盘空间占用较大,建议定期清理回收站。
- 闪回删除功能开启状态下,表被删除后,在执行表的相关依赖项删除操作时可能会失败(因为表并未被真正删除,表依旧依赖这些依赖项)。
- 由于删除的表转存在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)
- 恢复删除的表。