Oracle通过DG4ODBC连MySQL DBLINK后SQL Developer等报ORA-00600错误
错误原因
这个ORA-00600 [HO define: Long fetch] 是Oracle异构网关DG4ODBC的经典兼容问题,根因是网关对MySQL变长字符字段的元数据映射和Oracle客户端的行预取机制冲突:
- SQL*Plus默认预取行数仅为2,且不会对大长度字符串做提前内存分配,因此不会触发阈值;
- SQL Developer、cx_Oracle等客户端默认开启了更高的预取行数(通常为50~100),当查询返回多列变长字符串时,Oracle异构服务层计算的预估行宽超过内部限制,就会触发这个内部错误。
部分场景下也和MySQL ODBC驱动默认将超长varchar映射为Oracle LONG类型、网关字符集不匹配有关。
修复方案
1. 调整DG4ODBC网关配置
编辑网关对应的初始化配置文件$ORACLE_HOME/hs/admin/init<网关SID>.ora,新增以下参数:
修改完成后重启网关监听生效。HS_RPC_FETCH_SIZE = 65535 HS_LANGUAGE = AMERICAN_AMERICA.AL32UTF8 HS_NLS_NCHAR = AL32UTF8 HS_LONG_PIECE_TRANSFER = TRUE2. 调整MySQL ODBC驱动配置
编辑odbc.ini配置文件(Windows平台则打开ODBC数据源管理器修改对应数据源属性):- 新增配置项
NO_CACHE=1,关闭前向游标结果缓存 - 新增配置项
MAX_VARCHAR_SIZE=4000(Oracle开启32K varchar可设为32767),避免varchar字段被误识别为LONG类型
- 新增配置项
3. 客户端参数适配
- cx_Oracle连接时手动调低预取参数:
import cx_Oracle conn = cx_Oracle.connect("用户名/密码@TNS名称") conn.prefetchrows = 10 conn.prefetchmemory = 0 - SQL Developer在「工具 -> 首选项 -> 数据库 -> 高级」中,将「SQL预取计数」调整为10,取消勾选「预取LOB列」
- cx_Oracle连接时手动调低预取参数:
4. 临时查询规避
不需要改配置的场景下,查询时对所有MySQL侧的变长字符串字段加显式类型转换即可:select ID, HARDWARE_ID, cast("MANUFACTURER" as varchar2(255)) "MANUFACTURER", cast("NAME" as varchar2(255)) "NAME", cast("DESCRIPTION" as varchar2(255)) "DESCRIPTION" from "ocsweb"."sounds"@myodbc5;
内容的提问来源于stack exchange,提问作者Srikanth Lingala
相关产品推荐
相关产品推荐

