如何使用 lightdb 回收站功能
背景
在 Oracle 中用户在 drop table 的时候,表文件并不会从磁盘上移除,而是表被重命名为一个特殊的名字,然后用系统表记录。该功能被称为回收站功能。和 Windows 回收站类似,用户可以从回收站中恢复删除的表。
在 Lightdb 24.2 中支持了该功能。
参考:
- Oracle Drop Table
- What is The Recycle Bin
- LightDB Drop Table
- LightDB Flashback Table
- LightDB Purge
- USER_RECYCLEBIN
- LT_RECYCLEBIN
用例
在 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; -- 查看用户的回收站内容
用户也可以查 USER_RECYCLEBIN
或 DBA_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;
可以看到和表相关的几个对象,都被放入回收站中,在恢复表 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 2024-12-02 11:24 winter-loo 阅读(10) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!