如何使用 lightdb 回收站功能

背景

在 Oracle 中用户在 drop table 的时候,表文件并不会从磁盘上移除,而是表被重命名为一个特殊的名字,然后用系统表记录。该功能被称为回收站功能。和 Windows 回收站类似,用户可以从回收站中恢复删除的表。
在 Lightdb 24.2 中支持了该功能。

参考:

用例

在 oracle 模式的数据库中,当 enable_recyclebin 参数开启后(默认行为),用户在 drop table 时,表会被放入回收站。当经过 recyclebin_clean_interval(默认值 2592000 秒,即 30 天) 后,该表会被物理删除,不能够再恢复。

检查回收站参数

create database test_trash lightdb_syntax_compatible_type oracle;
\c test_trash
show enable_recyclebin;
show recyclebin_clean_interval;
purge recyclebin; -- 清空回收站

删表并恢复

create table a(a int);
insert into a values (1);
drop table a;
show recyclebin; -- 查看用户的回收站内容

image

用户也可以查 USER_RECYCLEBINDBA_RECYCLEBIN 视图,

select * from user_recyclebin where original_name = 'A'; -- 和 Oracle 一样,表名必须使用大写字母

使用 flashback table 命令恢复表:

flashback table a to before drop; -- 恢复最近删除的表
select * from a;
drop table a purge; -- 使用 purge 选项可以彻底删除表,表不会进入回收站
show recyclebin;

当回收站里的内容过多时,用户可以使用 PURGE RECYCLEBIN 清空回收站。

PURGE RECYCLEBIN

以上是一个完整的回收站功能的演示。

类似与 Oracle, 对于有外键的表和有索引的表,恢复时表不会恢复成删除前完全一样的状态。

  • 删除带有外键的表
create table a(a int primary key, b int default 10);
create table b(a int, b int, constraint fk_a foreign key (b) references a(a));
drop table a cascade constraints; -- 删除表 a
--- 表 b 不会被删除,但外键约束会被删除
insert into b values (1, 1);
flashback table a to before drop; -- 恢复表 a
insert into b values (1, 2); -- 可以验证外键约束不会被删除
drop table a purge;
drop table b purge;
  • 删除带有索引的表
purge recyclebin;

create table a(a int primary key, b int);
insert into a values(1, 1);
drop table a;
show recyclebin;

-- 恢复表 a 时索引名不会被恢复
flashback table a to before drop;

-- 验证索引名没被恢复
select
  case
  when indexname = 'a_pkey' then 'impossible'
  else 'index original name not restored'
  end
from pg_indexes where tablename = 'a';

再验证下其他情况,

  • 有触发器的表
purge recyclebin;

create table a(a int);

-- 创建触发器
CREATE OR REPLACE TRIGGER log_inserts
AFTER INSERT ON a
FOR EACH ROW
BEGIN
dbms_output.put_line('inserted record ' || :NEW.a);
END;
/

drop table a;
show recyclebin;

image

可以看到和表相关的几个对象,都被放入回收站中,在恢复表 a 时,这些对象会被一起恢复。

flashback table a to before drop;
show recyclebin;

insert into a values (1); -- 会执行 log_inserts 触发器
  • 索引使用用户自定义的函数时也能够被恢复 (Oracle 不支持)
CREATE OR REPLACE FUNCTION myupper (input_value VARCHAR)
RETURNS VARCHAR
AS $$
DECLARE
  transformed_value VARCHAR(100);
BEGIN
  transformed_value := UPPER(input_value);
  RETURN transformed_value;
END;
$$ LANGUAGE plpgsql IMMUTABLE; -- 被用作索引的函数需要被标记为 immutable

create table a(a varchar(100), b int);
CREATE INDEX idx_functional_index ON a (myupper(a)); -- 函数索引

drop table a;

show recyclebin; -- 回收站里会有表和索引对象

drop function myupper; -- 会连带删除回收站里的索引

show recyclebin; -- 此时回收站里只有表

flashback table a to before drop;
\d+ a -- 看不到索引
drop table a purge; -- 彻底删除表
  • 被发布的表(Oracle 没有该功能)
CREATE TABLE my_table(a INT);
CREATE PUBLICATION mypub1 FOR TABLE my_table; -- 捕捉表 my_table 上的所有改变

drop table my_table; -- 此时针对表的 PUBLICATION 会被彻底删除

-- should be 0
select count(*) from pg_publication_tables where pubname = 'mypub1';

flashback table my_table to before drop; -- 恢复表

-- should be 0
select count(*) from pg_publication_tables where pubname = 'mypub1';

以上就是 LightDB 回收站的一些功能演示。回收站的基本原则是保证表结构即表的数据不会丢失。

posted on   winter-loo  阅读(10)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示