1背景信息
客户反馈一个存储过程从 Oracle 迁移到 OB Oracle 模式后,执行报语法错误。报错如下:
call pro_table_demo('t_cc_demo', to_char(sysdate, 'yyyy-mm-dd'));
报表库
报错信息在 p17_db_log 中,报错信息:
-5001 ; ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ') when matched then update set a.REMINDER_COUNT=b.REMINDER_COUNT,a.EXT_CUST_NO1' at line 1
2问题诊断
这类报语法错误的 SQL 通常的诊断方式是执行一遍,获取该 SQL 的 trace_id
,从日志中获取到实际传入变量后的真实 SQL 进行排查判断。
2.1 获取该存储过程的 trace 信息
具体给出操作步骤,获取方式如下:
-
执行
set ob_enable_trace_log=on;
-
执行问题 SQL
-
执行
show trace;
上面 show trace 后会有 trace_id
-
用这个 trace_id 去查
gv$sql_audit
表获取 svr_ip 值得到实际运行该 SQL 的 observer 服务器 IP -
去这台 IP 的主机执行
grep trace_id home/admin/oceanbase/log/observer.log
2.2 定位报错语句
基于获取到的 trace log 信息结合报错位点找到实际报错的 SQL 语句。
如用报错中 when matched then update set a.REMINDER_COUNT=b.REMINDER_COUNT
部分进行匹配,得到以下 SQL(SQL 做了字段精简)。
merge into t_cc_demo a using
(select REMINDER_COUNT,...,ELECTRICALPIN_EMPLOY_NAME
from t_cc_demo@dblink_demo
where lastupt_dttm >= to_date('2023-02-16','yyyy-mm-dd')
and lastupt_dttm= to_date('2023-02-16','yyyy-mm-dd')
and lastupt_dttm CONSTRAINT "PK_T_PARTKEY_NOT_PK" UNIQUE ("ACT_ID")
5结论
当 Oracle 侧的主键不包含分区键时,OMS 会将 Oracle 侧的主键改为唯一键,但保持约束名一致且 OMS 在做表结构迁移时,会给到存在转换的注释信息。
对于存储过程的报错或者 SQL 执行报错,均可使用以上方法获取到实际的 SQL 执行的 trace id
进行日志诊断,拿到具体的报错 SQL 进行分析。