回收站支持的对象
- 回收站在原理上说就是一个数据字典表,放置用户删除的数据库对象信息。用户删除的东西被放入回收站后,仍然占据着物理空间,除非您手动进行清除( PURGE )或者对象定期被数据库系统删除。
- 在 3.2.4 版本中,支持进入回收站的对象有索引、表、库和租户,各模式回收站对象的支持情况如下表所示:
| 模式 | 表(Table) | 索引(Index) | 数据库(Database) | 租户(Tenant) |
|---|---|---|---|---|
| MySQL | 支持 | 支持 | 支持 | 支持 |
| Oracle | 支持 | 支持 | 不支持 | 不支持 |
- 直接 DROP 索引不会进入回收站,删除表时,表上的索引会随主表一起进入回收站。
- 不能对回收站的对象做任何查询和 DML 操作,DDL 操作中也仅支持 Purge 和 Flashback 操作。
- 仅系统租户(sys 租户)支持租户回收站功能。
开启或关闭回收站
- 系统变量
recyclebin用于设置是否开启回收站功能,默认值是OFF,表示租户被创建后,默认回收站为关闭状态。 - 查看回收站的状态
obclient> SHOW VARIABLES LIKE 'recyclebin';
+---------------+-------+
| VARIABLE_NAME | VALUE |
+---------------+-------+
| recyclebin | OFF |
+---------------+-------+
1 row in set (0.002 sec)
- 开启或关闭回收站,区分 Global 级别和 Session 级别。Global 级别的回收站设置在整个租户内生效。同时,Global 级别的回收站设置后,对当前 Session 无效,需要重新登录建立新的 Session 才会生效。Session 级别的回收站设置仅对当前 Session 有效。
# 开启 Global 级别的回收站
obclient> SET GLOBAL recyclebin = on;
# 关闭 Global 级别的回收站
obclient> SET GLOBAL recyclebin = off;
# 开启 Session 级别的回收站
obclient> SET @@recyclebin = on;
# 关闭 Session 级别的回收站
obclient> SET @@recyclebin = off;
使用回收站闪回被 DROP 的表及其关联索引
obclient> FLASHBACK TABLE object_name TO BEFORE DROP RENAME to user_name.new_table_name;
- 创建测试表和索引,
drop table后查看回收站里的对象信息
obclient> create table dba_objects_bak as select * from dba_objects;
obclient> create index ind_dba_objects_bak_id on dba_objects_bak(object_id);
obclient> select * from dba_ind_columns where TABLE_NAME='DBA_OBJECTS_BAK';
obclient> select count(*) from dba_objects_bak;
obclient> drop table dba_objects_bak;
obclient> show recyclebin;

- 恢复回收站表为原表,索引也会自动恢复,但是会更改索引名
obclient> flashback table RECYCLE_$_1682391511_1692315555763728 to before drop;
obclient> show recyclebin;
obclient> select * from dba_ind_columns where TABLE_NAME='DBA_OBJECTS_BAK';
obclient> select count(*) from dba_objects_bak;

- 恢复回收站表并重命名,索引也会自动恢复
obclient> drop table dba_objects_bak;
obclient> show recyclebin;
obclient> flashback table RECYCLE_$_1682391511_1692316183737624 to before drop rename to DBA_OBJECTS_BAK2;
obclient> show recyclebin;
obclient> select * from dba_ind_columns where TABLE_NAME='DBA_OBJECTS_BAK2';
obclient> select count(*) from dba_objects_bak2;

使用回收站闪回被 TRUNCATE 的表及其关联索引
- 配置变量
ob_enable_truncate_flashback开启 truncate 闪回,默认是OFF关闭 truncate 闪回。
obclient> show variables like 'ob_enable_truncate_flashback';
obclient> SET GLOBAL ob_enable_truncate_flashback = on;
- Truncate 表并进行闪回
obclient> truncate table dba_objects_bak2;
obclient> show recyclebin;
obclient> flashback table RECYCLE_$_1682391511_1692318715946248 to before drop;
ORA-00600: internal error code, arguments: -5020, Table 'DBA_OBJECTS_BAK2' already exists
# 闪回truncate表需要重命名,因为原表已存在或可能在 truncate 后又写入新数据,导致冲突
obclient> flashback table RECYCLE_$_1682391511_1692318715946248 to before drop rename to dba_objects_bak2_bak;
obclient> show recyclebin;
obclient> select * from dba_ind_columns where TABLE_NAME='DBA_OBJECTS_BAK2_BAK';
obclient> select count(*) from DBA_OBJECTS_BAK2_BAK;

清理回收站
手动清理回收站
- Purge 操作会删除对象和从属于该对象的对象(即 Database->Table->Index)。例如,Purge 数据库会删除数据库和从属于该数据库的表和表索引。
- 从回收站中手动清理指定的表,表关联的索引对象也会自动清理。
obclient> drop table dba_objects_bak2_bak;
obclient> show recyclebin;
obclient> purge table RECYCLE_$_1682391511_1692319392885720;

- 清空整个回收站
obclient> PURGE RECYCLEBIN;
自动清理回收站
OceanBase 数据库当前支持通过集群级配置项 recyclebin_object_expire_time 自动清理收站中过期的 Schema 对象,其默认值为 0s。其中:
- 值为
0s时表示关闭自动 Purge 回收站功能。 - 值为
非 0s时,表示回收一段时间前进入回收站的 Schema 对象。
# 使用 root 用户登录数据库的 sys 租户修改此参数
mysql> show parameters like 'recyclebin_object_expire_time';
mysql> ALTER SYSTEM SET recyclebin_object_expire_time = '1d';
最后修改时间:2023-08-23 10:54:47
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




