ORA-00600: 内部错误代码, 参数: [32695], [hash aggregation can't be done]

本文探讨了在Oracle 10.2.03版本中遇到的ORA-00600错误,该错误发生在使用大量临时表空间进行GROUP BY操作时。文章详细介绍了错误的症状、原因及两种解决方法。

今天查看周报过程时 发现了它:

ORA-00600: 内部错误代码, 参数: [32695], [hash aggregation can't be done], [], [], [], [], [], []

其过程

P_PROD_WEEK_I_NEWANDLOST_USER 新增用户和流失分析。

以前它用很大的TEMP,32G才满足它的需求。 

ORACLE 版本: 10.2.03

 

Google:

 http://space6212.itpub.net/post/12157/399059

 

 It say:

  oracle的优化器使用了hash group by来进行数据分组。
hash group by是10gR2新引入的一个优化方式,它使group by时使用hash的方式进行分组,避免了排序操作。
在执行这个sql前我考虑到用大量用到temp表空间,而TEMP_CITI表非常大,因此我分配了足够大的临时表空间(至少是2倍TEMP_CITI表的大小),本以为不会出错,结果还是出错了。
上metalink查看一下,发现这是一个bug:
Applies to:
Oracle Server - Enterprise Edition - Version: 10.2.0.1 to 10.2.0.2
This problem can occur on any platform.
Symptoms
1). The following errors are encountered:

ORA-00600: internal error code, arguments: [32695], [hash aggregation can't be done]
ORA-1652 on TEMP tablespace

2). The error is occurring on a SELECT statement with a GROUP BY clause.
3). The call stack may resemble:

ksfdmp kgeriv kgesiv ksesic1 qeshPartitionBuildHD qeshGBYOpenScan2 qeshGBYOpenScan qerghFetch qertqoFetch qerpxSlaveFetch qerpxFetch insdlexe insExecStmtExecIniEngine insexe

Cause
The problem here is not the hash join, but the group by hash. Hash aggregation is new to 10.2. The GROUP BY hash clause can cause the statement to consume temporary tablespace resources and eventually fail with the error ORA-00600: internal error code, arguments: [32695], [hash aggregation can't be done].

安全吻合metalink的描述。metalink上也给出了两种解决方法:

1). set _gby_hash_aggregation_enabled = false e.g.:

alter system set "_gby_hash_aggregation_enabled"=false;
alter session set "_gby_hash_aggregation_enabled"=false;

2). Disable the use of hash group by changing the parameter "optimizer_features_enable":

set optimizer_features_enable to "10.1.0"

### ORA-00600 错误代码参数 [17059] 的解决方案 ORA-00600Oracle 数据库中的内部错误,通常表明数据库遇到了无法处理的异常情况。对于参数为 [17059] 的 ORA-00600 错误,以下是可能的原因和解决方案: #### 1. **错误原因分析** ORA-00600 参数 [17059] 通常与重做日志文件(Redo Log Files)或控制文件(Control Files)的损坏有关。此错误可能由以下原因之一引起: - 重做日志文件或控制文件的物理损坏。 - 数据库实例意外关闭后未正确恢复。 - 硬件故障或存储系统问题导致数据丢失或损坏[^1]。 #### 2. **解决方案** 以下是针对 ORA-00600 [17059] 的常见解决步骤: #### (1)检查告警日志和跟踪文件 首先,检查数据库的告警日志(alert log)和相关的跟踪文件(trace files),以获取更多关于错误的具体信息。这些文件通常位于 `$ORACLE_BASE/diag/rdbms/<dbname>/<instance>/trace` 目录下。通过分析这些文件,可以确定问题的根本原因[^2]。 #### (2)验证重做日志文件的状态 使用以下查询检查重做日志文件的状态: ```sql SELECT GROUP#, THREAD#, SEQUENCE#, STATUS, MEMBER FROM V$LOGFILE JOIN V$LOG USING(GROUP#); ``` 如果发现某些重做日志文件状态为 `INACTIVE` 或 `CURRENT`,但实际文件已损坏,则需要进行修复或重建。 #### (3)尝试清理损坏的重做日志文件 如果确认某个重做日志文件损坏,可以尝试以下方法: - 将数据库置于 `MOUNT` 状态。 - 删除损坏的重做日志组: ```sql ALTER DATABASE DROP LOGFILE GROUP <group_number>; ``` - 添加新的重做日志组: ```sql ALTER DATABASE ADD LOGFILE GROUP <group_number> ('<new_log_file_path>') SIZE <size>; ``` #### (4)检查控制文件的完整性 控制文件的损坏也可能导致 ORA-00600 [17059]。可以通过以下命令检查控制文件的状态: ```sql ALTER DATABASE BACKUP CONTROLFILE TO TRACE; ``` 如果控制文件损坏,可以尝试从备份中恢复控制文件,或者使用 `CREATE CONTROLFILE` 命令重新创建控制文件[^3]。 #### (5)启用隐藏参数进行诊断 在某些情况下,可以通过启用隐藏参数来进一步诊断问题。例如,启用 `_allow_resetlogs_corruption` 参数可能会帮助强制打开数据库,但这可能导致数据丢失或不一致性。因此,仅在极端情况下使用此方法,并确保有完整的备份[^1]。 #### (6)联系 Oracle 支持 如果上述方法均无法解决问题,建议收集以下信息并联系 Oracle 支持团队: - 完整的告警日志和跟踪文件。 - 数据库版本、操作系统版本及硬件配置。 - 导致错误的具体操作或场景。 #### 3. **预防措施** 为了减少类似错误的发生,可以采取以下措施: - 定期备份数据库,包括数据文件、控制文件和重做日志文件。 - 配置冗余存储系统以防止单点故障。 - 监控数据库的告警日志和性能指标,及时发现潜在问题。 ### 示例代码 以下是一个简单的脚本,用于检查重做日志文件的状态: ```sql SET SERVEROUTPUT ON; BEGIN FOR rec IN (SELECT GROUP#, THREAD#, SEQUENCE#, STATUS FROM V$LOG) LOOP DBMS_OUTPUT.PUT_LINE('Group: ' || rec.GROUP# || ', Thread: ' || rec.THREAD# || ', Sequence: ' || rec.SEQUENCE# || ', Status: ' || rec.STATUS); END LOOP; END; / ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值