问题现象
OceanBase 数据库 V4.3.2 BP1 版本中执行 PURGE RECYCLEBIN 超时,报错信息如下图所示。

在 OceanBase 数据库 V4.x 版本中执行 PURGE RECYCLEBIN 报超时错误。
MySQL [test]> PURGE RECYCLEBIN;
ERROR 4012 (HY000): Timeout
问题原因
执行 PURGE RECYCLEBIN 时,通过如下命令查看日志。
tail -f observer.log|grep 'purge recycle objects'
可以看到会一次 purge 10 个对象,如下图(此图仅演示正常情况下日志,与此问题报错无直接关系)。

在 OceanBase 数据库 V4.x 早期的版本中,一次 purge 10 个对象的超时时间固定是 rpc_timeout(默认 2s)的 10 倍,即 20s,也就是即使未达到 _ob_ddl_timeout 参数(默认 1000s)的设定的超时时间,如果耗时越过 20s 也有可能会超时。 OceanBase 数据库 V4.2.1/V4.2.5/V4.3.5 最新版本中, 会对一次 purge 10 个对象的超时时间进行估算,范围在 10 * rpc_timeout 和 _ob_ddl_timeout 之间,基本遇不到一次 purge 10 个对象超时的问题了。
问题的风险及影响
执行 PURGE RECYCLEBIN 超时。
适用版本
OceanBase 数据库 V4.x 版本。
解决方法
方法一:按对象逐个进行 PURGE
建议在业务低峰期按对象逐个进行 PURGE。 可以通过如下 SQL 批量生成指定数据库或 schema 的 PURGE 语句。
-- OceanBase 数据库 MySQL 租户
SELECT concat_ws(' ','PURGE',type ,object_name,';') stmt FROM oceanbase.dba_recyclebin WHERE owner = 'test' AND type IN ('TABLE');
-- OceanBase 数据库 Oracle 租户
SELECT 'PURGE '|| type ||' '||object_name||';' stmt FROM dba_recyclebin WHERE owner = user AND type IN ('TABLE');
如通过命令行批量生成 SQL 语句,可以指定 MySQL 或 OBClient 命令行参数 -s -N 以使输出只有 SQL。
方法二:超时后再次执行 PURGE 语句
当回收站的对象较多时,如 100000 以上个表时,由于 PURGE 语句内部是以 10 个对象为一批逐步进行的,虽然 PURGE RECYCLEBIN 执行时间达到 _ob_ddl_timeout 会超时,但回收站中的对象也在不断减少。 超时后可以再次执行如下 SQL:
PURGE RECYCLEBIN;
同时监测回收站中对象个数,直至 PURGE 完成。监测回收站中对象个数 SQL 如下:
-- OceanBase 数据库 MySQL 租户
SELECT count(1) FROM oceanbase.dba_recyclebin WHERE owner = 'test';
-- OceanBase 数据库 Oracle 租户
SELECT count(1) FROM dba_recyclebin WHERE owner = user;
方法三:临时调整 DDL 超时参数
当回收站的对象较多时,如 100000 以上个表时,PURGE RECYCLEBIN 执行时间达到 _ob_ddl_timeout 会超时。 如确定业务系统中无 DDL 执行或较少的 DDL 执行时,可以考虑临时调整 DDL 超时的集群参数 _ob_ddl_timeout,但需要注意此参数会影响正常的 DDL 超时,会存在 PURGE RECYCLEBIN 和正常 DDL 抢占 DDL 线程,所以建议优先使用本文档 解决方法 这节中的 方法一:按对象逐个进行 PURGE 或 方法二:超时后再次执行 PURGE 语句。
OceanBase 数据库 sys 租户下通过命令行临时修改集群参数:
ALTER SYSTEM SET _ob_ddl_timeout = '2000s';
完成后调整回默认参数:
ALTER SYSTEM SET _ob_ddl_timeout = '1000s';
警告
修改 _ob_ddl_timeout 参数存在一定的风险,请勿自行操作。如果需要修改,请联系 OceanBase 技术支持团队。
方法四:临时调整 RPC 超时参数
当一次 purge 10 个对象超时,在 OceanBase 数据库专业技术支持团队的指导下可以临时调整 RPC 超时参数 rpc_timeout,但需要注意此参数为全局参数,会影响所有与此参数相关的 SQL 等的超时时间,所以强烈建议优先使用本文档中 解决方法 这一节中的 方法一:按对象逐个进行 PURGE。
OceanBase 数据库 sys 租户下通过命令行或在 OCP 上临时修改集群参数:
ALTER SYSTEM SET rpc_timeout = '3s';
完成后调整回默认参数:
ALTER SYSTEM SET rpc_timeout = '2s';
警告
修改 rpc_timeout 参数存在一定的风险,请勿自行操作。如果需要修改,请联系 OceanBase 技术支持团队。
规避方式
按对象逐个进行 PURGE。