OB 运维 | 一则 Oracle 迁移到 OB 后存储过程语法报错问题诊断案例

2024年 2月 7日 28.1k 0

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 信息

具体给出操作步骤,获取方式如下:

  1. 执行 set ob_enable_trace_log=on;

  2. 执行问题 SQL

  3. 执行 show trace;

    上面 show trace 后会有 trace_id

  4. 用这个 trace_id 去查 gv$sql_audit
    表获取 svr_ip 值得到实际运行该 SQL 的 observer 服务器 IP

  5. 去这台 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 进行分析。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论