问题现象
应用程序通过 DBLink 从一个 OceanBase 数据库 Oracle 模式租户跨租户连接到另外一个 OceanBase 数据库 Oracle 模式租户并执行数据导出操作,应用程序遇到了报错 -4153, out of resource,observer.log 日志中打印 [errcode=-4153] fail to acquire connection from server pool(free_conn_count_=0, busy_conn_count_=256, max_allowed_conn_count_=256, server_="0.0.0.0:0", ret=-4153) 报错信息。
问题原因
当前 OceanBase 数据库建立的任何一个 DBLink 在具体某个 OBServer 节点上可以同时并发打开的最大连接数是 256 个,多个 SESSION 共用这个上限为 256 个连接的连接池。如果应用通过单个 DBLink 建立的并发连接数较多,或者业务 SQL 的执行耗时过长,导致连接一直被占用着,总的 SESSION 连接数很容易就会到达单个 DBLink 的默认连接数上限 256,从而报错 OB_RESOURCE_OUT(ret=-4153)。
问题的风险及影响
通过 DBLink 连接 OceanBase 数据库失败报错。
适用版本
OceanBase 数据库 V4.2.1.x 系列: V4.2.1 BP10 Hotfix3(oceanbase-4.2.1.11-111030012025051713)及更高版本。
OceanBase 数据库 V4.2.5.x 系列: V4.2.5 BP2(oceanbase-4.2.5.2-102000122025011711)及更高版本。
OceanBase V4.3.x 系列: V4.3.5(oceanbase-4.3.5.0-100000122024123020)及更高版本。
解决方法
为解决上述问题,从 OceanBase 数据库 V4.2.1 BP10 Hotfix3、V4.2.5 BP2、V4.3.5 版本开始,OceanBase 数据库内核添加一个可配置的租户级隐藏配置项 _max_dblink_conn_per_observer,在遇到上述问题时可以通过修改该隐藏配置项来避免报错。
MySQL [oceanbase]> select * from gv$ob_parameters where name='_max_dblink_conn_per_observer'\G
*************************** 1. row ***************************
SVR_IP: xx.xxx.xxx.xxx
SVR_PORT: 2882
ZONE: zone1
SCOPE: TENANT
TENANT_ID: 1
NAME: _max_dblink_conn_per_observer
DATA_TYPE: INT
VALUE: 256
INFO: The maximum limit on the number of connections that can be opened simultaneously for a specific observer for any DBLink, default value is 256
SECTION: TENANT
EDIT_LEVEL: DYNAMIC_EFFECTIVE
DEFAULT_VALUE: 256
ISDEFAULT: YES
-- 对任一 DBLink,在任一 OBServer 上的已打开连接数上限配置为 1024 个
MySQL [oceanbase]> alter system set _max_dblink_conn_per_observer=1024 tenant=xxx;
规避方式
无。