问题描述
执行一些应用变更后,应用突然报 -4016 异常,如下报错信息。
ERROR 4016 (HY000): Internal error
对应 OBServer 日志关于 -4016 的异常信息显示 user info is null,详细信息如下。
WARN [SHARE.SCHEMA] check_db_priv (ob_schema_getter_guard.cpp:3598) [6241][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=4] [dc=0] invalid arguments((__builtin_expect(!!(__null != (user_info)),!!1))=0)
WARN [SHARE.SCHEMA] check_single_table_priv (ob_schema_getter_guard.cpp:3502) [6241][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=14] [dc=0] user info is null(ret=-4016, session_priv.user_id_=1178676464976976)
问题原因
该问题是因为 session 所使用的 user 被删除重建导致,触发场景如下。
用测试用户,建立一个会话 s1。
用 root 用户,打开一个新会话 s2,删除测试用户。
s1 执行查询,报 -4016 错误。
通过 user_id 值作为过滤条件查询 __all_user 表,若 user_id 为空则说明是这个问题导致的。查询结果如下。
obclient [oceanbase]> select * from __all_user where user_id='1178676464976976';
Empty set (0.007 sec)
用户是新建的,之前的 user_id 不存在了,基本可以确定这个问题的原因就是老会话没断开的情况下,用户删除了,老会话执行 SQL 就会报错。
注意
Oracle 租户的处理逻辑与 MySQL 不同,同样的场景下 Oracle 租户会报 ORA-01918: user does not exist。
适用版本
OceanBase 数据库 V2.x、V3.x 版本。
解决方法
重建链接或者重启应用。