OceanBase Oracle模式下的回收站功能17认证网

正规官方授权
更专业・更权威

OceanBase Oracle模式下的回收站功能

回收站支持的对象

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

想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

未经允许不得转载:17认证网 » OceanBase Oracle模式下的回收站功能
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师