一、诡异的“断线”:问题初现
在一次常规的数据库操作中,我们遇到了一个非常棘手的现象。当尝试为某个表创建索引时,SQL*Plus 会话被意外中断,并抛出了经典的“掉线”错误:ORA-03113。故障操作:
SQL> CREATE INDEX idx_guojiaybypmlbz ON siim.SYB_XYZCY (guojiaybypmlbz); CREATE INDEX idx_guojiaybypmlbz ON siim.SYB_XYZCY (guojiaybypmlbz) * ERROR at line 1: ORA-03113: end-of-file on communication channel
更奇怪的是,不仅创建索引失败,就连对这个特定字段进行查询,也会触发同样的问题,这表明问题并非偶然。
二、深入追踪:Alert 日志中的蛛丝马迹
ORA-03113 通常只是表面现象,真正的“元凶”隐藏在后端的 alert.log 文件中。通过检查告警日志,我们发现了两条关键的错误信息:
ORA-00600: internal error code, arguments: [17114], [0x7F7F0CAFBB80], [], [], [], [], [], [], [], [], [], [] ORA-07445: exception encountered: core dump [smboKb2Qb()+21] [SIGSEGV] [ADDR:0x0] [PC:0x96B901D] [SI_KERNEL(general_protection)] []
ORA-00600 内部错误和 ORA-07445 核心转储同时出现,这强烈暗示我们可能遇到了一个 Oracle 的 BUG。
三、揭开真相:MOS 上的“官方答案”
带着 ORA-00600 [17114] 这个关键线索,我们在 My Oracle Support (MOS) 上进行了搜索,很快就定位到了相关的技术文档:
(Doc ID 1941167.1)
根据文档描述,这个问题与 Oracle 12.2.0.1 版本中引入的一种新排序算法(New Sort Algorithm) 有关。在特定场景下,这个新算法的缺陷会导致内部错误和进程崩溃。
四、临时解决方案:禁用新排序算法
既然是新特性引发的 BUG,那么最直接的临时解决方案就是“回到过去”——禁用这个新特性。Oracle 提供了一个隐含参数 _newsort_enabled 来控制是否启用新的排序算法。我们可以通过在会话级别将其设置为 FALSE 来规避这个问题。解决方法:
ALTER SESSION SET "_newsort_enabled" = FALSE;
重要提示:这是一个会话级别的临时处理方案。因为禁用新排序算法可能会导致某些 SQL 的执行计划发生改变,从而影响性能。在生产环境中全面实施前,务必进行充分的性能测试。在执行了上述 ALTER SESSION 命令后,我们再次尝试创建索引,操作顺利完成,问题得到解决。
