暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase Oracle模式下的回收站功能

原创 张玉龙 2023-08-18
647

回收站支持的对象

  • 回收站在原理上说就是一个数据字典表,放置用户删除的数据库对象信息。用户删除的东西被放入回收站后,仍然占据着物理空间,除非您手动进行清除( 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;

image.png

  • 恢复回收站表为原表,索引也会自动恢复,但是会更改索引名
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;

image.png

  • 恢复回收站表并重命名,索引也会自动恢复
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;

image.png

使用回收站闪回被 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;

image.png

清理回收站

手动清理回收站

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

image.png

  • 清空整个回收站
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论