基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
备租户用户无法登录,报错:ERROR 1396 (HY000): Operation LOCK USER failed 的原因和解决方法
更新时间:2026-07-02 15:41
问题现象
OceanBase 备租户下的某个用户无法登录并报错,示例如下:
mysql -hxxx.xxx.xxx.xxx -P2881 -utestuser@obmysql2 -pxxxxxxxx -A -c -Doceanbase
ERROR 1396 (HY000): Operation LOCK USER failed for 'testuser'@'%'
显示用户无法锁定,实际上备租户的用户是无法独立执行锁定的,必须从主租户同步锁定操作,而主租户并没有执行过锁定操作。
查看 observer.log,能看到如下信息:
[2025-09-27 14:01:29.037191] WDIAG lock_user (ob_user_cmd_executor.cpp:535) [7215][T1002_MysqlQueu][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=23][errcode=-5155] Operation LOCK USER failed for 'testuser'@'%'
[2025-09-27 14:01:29.037199] WDIAG [SQL.ENG] execute (ob_user_cmd_executor.cpp:491) [7215][T1002_MysqlQueu][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=7][errcode=-5155] Rename user completely failed(arg={tenant_id:1002, users:["testuser"], hosts:["%"], locked:true}, ret=-5155)
[2025-09-27 14:01:29.037255] WDIAG [SERVER] do_query (ob_inner_sql_connection.cpp:799) [7215][T1002_MysqlQueu][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=4][errcode=-5155] result set open failed(ret=-5155, executor={ObIExecutor:, sql:"ALTER USER 'testuser'@'%' ACCOUNT LOCK"})
[2025-09-27 14:01:29.037346] WDIAG [SERVER] query (ob_inner_sql_connection.cpp:944) [7215][T1002_MysqlQueu][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=11][errcode=-5155] execute failed(ret=-5155, tenant_id=1002, executor={ObIExecutor:, sql:"ALTER USER 'testuser'@'%' ACCOUNT LOCK"}, retry_cnt=0, local_sys_schema_version=1758271726590016, local_tenant_schema_version=1758952223311288)
[2025-09-27 14:01:29.037396] WDIAG [SERVER] query (ob_inner_sql_connection.cpp:979) [7215][T1002_MysqlQueu][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=5][errcode=-5155] failed to process record(executor={ObIExecutor:, sql:"ALTER USER 'testuser'@'%' ACCOUNT LOCK"}, record_ret=-5155, ret=-5155)
[2025-09-27 14:01:29.037409] WDIAG [SERVER] query (ob_inner_sql_connection.cpp:1016) [7215][T1002_MysqlQueu][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=5][errcode=-5155] failed to process final(executor={ObIExecutor:, sql:"ALTER USER 'testuser'@'%' ACCOUNT LOCK"}, aret=-5155, ret=-5155)
[2025-09-27 14:01:29.037415] WDIAG [SERVER] execute_write_inner (ob_inner_sql_connection.cpp:1583) [7215][T1002_MysqlQueu][T1002][Y0-0000000000000000-0-0] [lt=5][errcode=-5155] execute sql failed(ret=-5155, tenant_id=1002, sql=ALTER USER 'testuser'@'%' ACCOUNT LOCK)
[2025-09-27 14:01:29.037438] WDIAG [SERVER] execute_write (ob_inner_sql_connection.cpp:1536) [7215][T1002_MysqlQueu][T1002][Y0-0000000000000000-0-0] [lt=6][errcode=-5155] execute_write failed(ret=-5155, tenant_id=1002, sql=ALTER USER 'testuser'@'%' ACCOUNT LOCK, is_user_sql=false)
[2025-09-27 14:01:29.037444] WDIAG [COMMON.MYSQLP] write (ob_mysql_proxy.cpp:240) [7215][T1002_MysqlQueu][T1002][Y0-0000000000000000-0-0] [lt=5][errcode=-5155] execute sql failed(ret=-5155, tenant_id=1002, conn=0x7fafdd0b2d90, start=1758952889032722, sql=ALTER USER 'testuser'@'%' ACCOUNT LOCK)
[2025-09-27 14:01:29.037516] INFO [SERVER] switch_lock_status_for_user (obmp_connect.cpp:1042) [7215][T1002_MysqlQueu][T1002][Y0-0000000000000000-0-0] [lt=6] user ddl has been sent, change user lock status to (tenant_id=1002, user_name_=testuser, host_name=%, do_lock=true)
[2025-09-27 14:01:29.038109] INFO [SERVER] process (obmp_connect.cpp:537) [7215][T1002_MysqlQueu][T1002][Y0-0000000000000000-0-0] [lt=4] MySQL LOGIN(direct_client_ip="xxx.xxx.xxx.xxx", client_ip=xxx.xxx.xxx.xxx, tenant_name=obmysql2, tenant_id=1002, user_name=testuser, host_name=xxx.xxx.xxx.xxx, sessid=3221589748, proxy_sessid=0, client_sessid=3221589748, from_proxy=false, from_java_client=false, from_oci_client=false, from_jdbc_client=false, capability=537896589, proxy_capability=0, use_ssl=false, c/s protocol="OB_MYSQL_CS_TYPE", autocommit=false, proc_ret=-5155, ret=-5155, conn->client_type_=3, conn->client_version_=0)
问题原因
首先,该用户无法登录的根本原因是备租户设置了安全策略,登录用户租户的 root 用户,执行如下语句。
-- 查看其值,若不为 0 就有可能是这个问题。若为 0 就不是这个问题,假设输出值为 5
show parameters like 'connection_control_failed_connections_threshold';
表示用户失败登录 5 次后会被锁定,而用户的确有 5 次登录密码输入错误,因此无法登录。但是备租户的用户无法独立执行锁定操作,所以执行这样的操作就会出现 Operation LOCK USER failed,也就是登录时提示的错误。
问题的风险及影响
备租户用户无法登录,报错信息不明显。登录成功后失败次数不清 0。
适用版本
OceanBase 数据库 V4.x 版本。
解决方法
临时将 connection_control_failed_connections_threshold 设为 0,使得用户可以成功登录。
# 登陆用户租户的 root 用户执行
alter system set connection_control_failed_connections_threshold=0;
# 也可以登陆系统租户执行,这里 xxx 是用户租户的租户名
alter system set connection_control_failed_connections_threshold=0 tenant=xxx;
此处由于备租户在当前版本下的一个限制(主租户不会有这个限制),即使成功登录后也不能重置之前的登录失败次数:
select tenant_id,user_id,user_name,failed_login_attempts from __ALL_virtual_TENANT_USER_FAILED_LOGIN_STAT;
+-----------+---------+-----------+-----------------------+
| tenant_id | user_id | user_name | failed_login_attempts |
+-----------+---------+-----------+-----------------------+
| 1002 | 500004 | testuser | 4 |
+-----------+---------+-----------+-----------------------+
1 row in set (0.00 sec)
因此需要通过手动重置登录失败次数,步骤如下:
-- 检查连接的 OBServer 上有租户资源,可以通过如下语句 -- 获取有租户资源的机器,其中 xxx 改为租户 id select a.svr_ip,b.sql_port from oceanbase.dba_ob_units a, oceanbase.dba_ob_servers b where tenant_id=xxx and a.svr_ip=b.svr_ip and a.svr_port=b.svr_port;
-- 以备租户所在集群的 root@sys 用户登录,直连 OBServer,不能通过 OBProxy 连接
mysql -hxxx.xxx.xxx.xxx -P2881 -utestuser@obmysql2 -pxxxxxxxx -A -c -Doceanbase
-- 切换到该租户的 Meta 租户
alter system change tenant tenant_id = 1001
-- 再次确认该用户的失败登录次数、tenant_id、user_id
select * from __ALL_TENANT_USER_FAILED_LOGIN_STAT where tenant_id=1002 and user_id=500004;
-- 进行清理,可以是 delete,也可以是 update
delete from __ALL_TENANT_USER_FAILED_LOGIN_STAT where tenant_id=1002 and user_id=500004;
update __ALL_TENANT_USER_FAILED_LOGIN_STAT set failed_login_attempts=0 where tenant_id=1002 and user_id=500004;
警告
修改内部表存在一定的风险,请勿自行操作。如果需要修改,请联系 OceanBase 技术支持团队。
规避方式
无。