OceanBase回收站机制需通过`setglobalrecyclebin=on`开启。执行`droptenant`后租户进入回收站,用`flashbacktenant`命令可恢复。该机制同样适用于表、索引等对象,防止误删,提供统一的数据安全兜底方案。
数据安全是企业级数据库的底线,这一点毋庸置疑。在运维过程中,误操作删除租户这类“手滑”事件并不少见。为避免此类事故导致数据彻底丢失,OceanBase 数据库内置了一个非常实用的机制——回收站。换言之,当执行 drop tenant 之后,数据并不会立刻消失,而是被“暂存”起来,为快速恢复留下余地。
恢复操作主要依靠一条 SQL 语句:flashback tenant。下面我们将整个流程拆解说明。
开启回收站功能
回收站功能并非默认开启。因此,第一步需要确认其状态。使用 root 用户登录集群的 sys 租户,执行命令查看当前情况:
登录后,查询系统变量:
show variables like 'recyclebin';n# 输出信息如下:n+---------------+-------+n| Variable_name | Value |n+---------------+-------+n| recyclebin | OFF |n+---------------+-------+n1 row in set (0.012 sec)","id":"z8ZMD"}">看到 OFF 了吗?这表示回收站尚未开启。接下来,需要在租户级别全局打开:
set global recyclebin = on;","id":"FIRmz"}">注意,global 设置生效后,当前 Session 并不会立即感知。必须退出当前会话并重新登录,新设置才会加载。重新登录后再次检查状态:
show variables like 'recyclebin';n# 输出信息如下:n+---------------+-------+n| Variable_name | Value |n+---------------+-------+n| recyclebin | ON |n+---------------+-------+n1 row in set (0.005 sec)","id":"zZHLH"}">如果仅需在当前会话临时开启,也可单独设置 @@recyclebin。但在生产环境下,全局开启通常是更稳妥的选择。
模拟删除与快速恢复
回收站开启后,我们来模拟一次“事故”。先创建一个测试租户 mytenant02,然后直接将其删除:
create tenant if not exists mytenant02 n primary_zone='zone1', n resource_pool_list=('rp1')n set ob_tcp_invited_nodes='%';nob> drop tenant mytenant02;","id":"sGKub"}">此时,数据实际上进入了回收站。查看回收站中的内容:
show recyclebin;n# 输出的信息如下:n+-------------------+---------------+--------+----------------------------+n| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |n+-------------------+---------------+--------+----------------------------+n| __recycle_$_1_1744| mytenant02 | TENANT | 2025-04-09 17:44:17.213979 |n+-------------------+---------------+--------+----------------------------+n1 row in set (0.006 sec)","id":"qBgNx"}">可以看到,被删除的租户以特殊名称 __recycle_$_1_1744 存在。恢复操作非常简单,使用 flashback 命令找回原始名称:
flashback tenant mytenant02 to before drop;","id":"QgXMW"}">执行恢复后,可再次查询回收站和系统视图,确认数据已完整恢复:
show recyclebin;nEmpty set (0.010 sec)nob> use oceanbase;nob> select tenant_id, tenant_name,tenant_type,create_time from dba_ob_tenants;n+-----------+-------------+-------------+----------------------------+n| tenant_id | tenant_name | tenant_type | create_time |n+-----------+-------------+-------------+----------------------------+n| 1 | sys | SYS | 2025-04-09 14:50:06.117812 |n| 1003 | META$1004 | META | 2025-04-09 17:42:27.521615 |n| 1004 | mytenant02 | USER | 2025-04-09 17:42:27.521615 |n+-----------+-------------+-------------+----------------------------+n3 rows in set (0.102 sec)","id":"PFdpm"}">不止于租户
回收站机制并非租户专属,对于表、索引等数据库对象同样适用。具体操作流程如下:切换到用户租户 mysqltenant,确认回收站已开启,然后删除一张表:
show variables like '%recyclebin%';n+---------------+-------+n| Variable_name | Value |n+---------------+-------+n| recyclebin | ON |n+---------------+-------+n1 row in set (0.002 sec)n# 确定表的信息nob> use demo;nob> show tables;n+----------------+n| Tables_in_demo |n+----------------+n| table01 |n+----------------+n# 删除一张表nob> drop table table01;n# 查看回收站nob> show recyclebin;n+--------------------------------+---------------+-------+----------------------------+n| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |n+--------------------------------+---------------+-------+----------------------------+n| __recycle_$_1_1745401735728152 | table01 | TABLE | 2025-04-23 17:48:55.748140 |n+--------------------------------+---------------+-------+----------------------------+n1 row in set (0.017 sec)n# 执行闪回操作nob> flashback table table01 to before drop;","id":"W48tC"}">从租户到表,回收站提供了统一的数据安全兜底方案。理解这一机制后,日常运维便多了一份保障,遇到误操作也能从容应对。