首批通过分布式安全可靠测评,为关键业务系统打造
GET_LOCK 函数异常报错不支持的原因和解决方法
更新时间:2025-06-27 09:36
问题现象
在 OceanBase 数据库 V4.3.5 版本的集群中,通过 2883 端口连接 OceanBase 数据库使用 DBMS_LOCK(系统包提供了 OceanBase 数据库锁管理服务的接口),执行 select GET_LOCK 报错不支持该函数。
示例如下。
obclient [oceanbase]> select GET_LOCK('333',10);
ERROR 1235 (0A000): Not supported feature or function
obclient [oceanbase]> SELECT GET_LOCK('lock1',10);
ERROR 1235 (0A000): Not supported feature or function
obclient [oceanbase]> SELECT GET_LOCK('lock2',10);
ERROR 1235 (0A000): Not supported feature or function
obclient [oceanbase]> SELECT RELEASE_LOCK('lock2');
ERROR 1235 (0A000): Not supported feature or function
obclient [oceanbase]> SELECT RELEASE_LOCK('lock1');
ERROR 1235 (0A000): Not supported feature or function
问题原因
ODP 历史版本如果设置了
enable_single_leader_node_routing=true,会根据租户的副本位置来修改 OBProxy 到 OBServer 的协议(旧版本默认该参数为 true)。对于 primary_zone 集中的租户,OBProxy 使用了 mysql 协议;对于 primary_zone 分散的租户,OBProxy 使用 OB2.0 协议。
table_lock 需要 OBProxy 到 OBServer 使用 OB2.0 协议,如果 OBProxy 发过来的协议是 mysql,就会设置相应标记位,导致 OBServer 后续报错不支持。
当前 ODP 最新版本 V4.3.1.4 已默认为 false,但如果是热升级上来的 ODP 版本仍需手动修改该参数为 false。
适用版本
OceanBase 数据库 V4.3.x 版本。
解决方法
登录 ODP proxysys 租户修改成如下所示配置参数值。
## 用于控制 ODP 和 OceanBase 数据库之间是否开启 OceanBase 2.0 协议(OceanBase 自研的基于 MySQL 压缩协议的传输协议)进行传输 enable_ob_protocol_v2 = true; ## 用于设置生成 Client Session ID 的计算逻辑版本,需要设置版本为 2 以使用新的计算逻辑 client_session_id_version = 2;设置
enable_single_leader_node_routing(配置项用于控制当租户为主副本聚集部署形态时,是否使用更高效的路由规则)参数值,并查询确认参数值生效。
登录并执行
select GET_LOCK语句。