ORA-00600

本文介绍了ORA-600(16515)错误的两种情况及其解决方案,一是分区执行SPLIT操作后收集统计信息报错,二是表已存在统计信息导致收集列统计信息报错。文中详细描述了如何通过删除并重新收集统计信息来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询METALINK,发现ORA-600(16515)错误对应两种情况,一种是分区执行了SPLIT操作以后,再次收集统计信息报错。这种情况受影响的版本是9206和9207,在9208被fixed。

另一种是由于表中以及存在了统计,导致收集列的统计信息报错,可能发生这种情况的版本就包括9201。从版本上怀疑是第二种情况,下面登陆问题数据库具体检查一下。

Errors in file d:\oracle\admin\newzb\ ump\newzb_j000_772.trc:
ORA-00600:内部错误代码,参数: [16515], [D], [21], [39643], [5], [0], [], []
ORA-06512:在"SYS.DBMS_STATS", line 9136
ORA-06512:在"SYS.DBMS_STATS", line 9616
ORA-06512:在"SYS.DBMS_STATS", line 9800
ORA-06512:在"SYS.DBMS_STATS", line 9854
ORA-06512:在"SYS.DBMS_STATS", line 9831
ORA-06512:在line 1

从服务器上alert文件中发现上面的错误,从对应的TRACE文件中找到出现问题JOB用户NI_JL013和JOB语句:

DECLARE job BINARY_INTEGER := :job; next_date DATE := :mydate; broken BOOLEAN := FALSE; BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(USER, METHOD_OPT => 'FOR ALL INDEXED COLUMNS'); :mydate := next_date; IF broken THEN :b := 1; ELSE :b := 0; END IF; END;

用NI_JL013用户登陆,手工执行收集统计信息的操作:

SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS(USER, METHOD_OPT=>'FOR ALL INDEXED COLU
MNS');
BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(USER, METHOD_OPT=>'FOR ALL INDEXED COLUMNS'

); END;

 

现在问题已经定位到表上了,根据metalink文档Note 2252824.8的描述,删除统计信息,然后重新收集,可以解决这个问题:

SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE')

PL/SQL过程已成功完成。

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE', METHOD_OPT =>
'FOR ALL INDEXED COLUMNS')

PL/SQL过程已成功完成。

想要重现问题也很简单,只需要使用ANALYZE语法收集一下统计信息就可以了:

SQL> ANALYZE TABLE T_INVITE_M_DIVIDE COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;

表已分析。

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE', METHOD_OPT =>
'FOR ALL INDEXED COLUMNS')
BEGIN DBMS_STATS.GATHER_TABLE_STATS(USER, 'T_INVITE_M_DIVIDE', METHOD_OPT => 'FO
R ALL INDEXED COLUMNS'); END;

*
ERROR位于第1行:
ORA-00600:内部错误代码,参数: [16515], [D], [40], [39643], [10], [0], [], []
ORA-06512:在"SYS.DBMS_STATS", line 9136
ORA-06512:在"SYS.DBMS_STATS", line 9150
ORA-06512:在line 1

通过对问题的分析,除了将数据库版本升级到9202以上外,还可以通过修改统计信息脚本的方式来避免问题。

在每次收集统计信息前,可以先执行DBMS_STATS.DELETE_SCHEMA_STATS,这样随后的统计信息收集工作就不会报错了。

不过这要求统计信息统计的工作比较在夜里没有工作进行的时候运行,否则在DELETE_SCHEMA_STATS和GATHER_SCHEMA_STATS之间登陆的用户,很可能会使用RBO作为优化模式。

转载于:https://www.cnblogs.com/johnng/archive/2013/01/28/2880064.html

### ORA-00600 错误的解决方案及原因分析 ORA-00600Oracle 数据库中的一种内部错误,通常表明数据库遇到了不可预见的情况。这种错误可能是由多种因素引起的,包括但不限于数据库文件损坏、隐藏参数设置不当、硬件问题或软件缺陷等。 #### 1. 错误原因分析 ORA-00600 的错误信息通常包含一组参数,这些参数可以帮助进一步定位问题的具体来源。例如,在引用[1]中提到的 ORA-00600[4097] 错误,可能与数据库强制打开后对某些表的操作有关[^1]。此外,引用[2]中的 ORA-00600[25012] 错误则涉及核心转储和地址映射问题[^2]。 常见的导致 ORA-00600 错误的原因包括: - **数据库文件损坏**:如数据文件、控制文件或重做日志文件的损坏。 - **隐藏参数使用不当**:例如引用[1]中提到的 `_allow_resetlogs_corruption` 参数,可能导致数据一致性问题[^1]。 - **硬件故障**:硬盘或其他存储设备的故障可能引发此类错误。 - **Oracle 软件缺陷**:某些特定版本的 Oracle 数据库可能存在已知的 Bug[^3]。 - **统计信息不准确**:如引用[4]中提到的删除表统计信息可能导致执行计划错误[^4]。 #### 2. 解决方案 针对 ORA-00600 错误的解决方案需要根据具体情况进行调整,以下是一些通用的处理步骤: ##### 2.1 检查告警日志 首先查看数据库的告警日志(alert log),以获取更详细的错误信息。告警日志通常位于 `$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace` 目录下。通过分析日志中的错误代码和参数,可以更好地定位问题[^1]。 ##### 2.2 使用诊断工具 Oracle 提供了多种诊断工具来帮助解决 ORA-00600 错误: - **ADRCI(Automatic Diagnostic Repository Command Interpreter)**:用于分析 ADR(Automatic Diagnostic Repository)中的诊断数据。 - **DBMS_SUPPORT 包**:可以通过 `DUMP_ERRORSTACK` 和 `DUMP_SYSTEMSTATE` 等过程收集更多信息[^3]。 ##### 2.3 恢复数据库 如果数据库因断电或其他原因导致损坏,建议尝试以下恢复方法: - 使用备份和归档日志进行完整恢复。 - 如果无法正常恢复,可以考虑使用 `_allow_resetlogs_corruption` 参数强制打开数据库,但需谨慎操作,因为这可能导致数据丢失或损坏[^1]。 ##### 2.4 更新 Oracle 版本 确保使用的 Oracle 数据库版本是最新的,并应用所有相关的补丁集(Patch Set)。某些 ORA-00600 错误可能是由于已知的 Bug 引起的,而这些问题可能已在后续版本中修复[^2]。 ##### 2.5 调整优化器参数 在某些情况下,优化器参数的设置不当也可能引发 ORA-00600 错误。例如,引用[4]中提到的 `optimizer_dynamic_sampling` 参数,适当调大其值可能有助于避免错误[^4]。 ```sql ALTER SESSION SET optimizer_dynamic_sampling = 10; ``` #### 3. 预防措施 为了减少 ORA-00600 错误的发生概率,可以采取以下预防措施: - 定期备份数据库,确保能够快速恢复。 - 避免使用隐藏参数,除非明确了解其作用和风险。 - 定期检查硬件状态,及时更换故障设备。 - 使用最新的 Oracle 数据库版本,并定期应用补丁。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值