数据库版本 背景 客户那边数据库突然出现一个current日志文件坏了导致数据库crash了然后现场工程师使用_ALLOW_RESETLOGS_CORRUPTION = TRUE这个隐含参数做了不完全恢复后强行将数据库打开可是打开数据库后发现只能用internal用户连接进去别的用户连接都报错错误信息如下 ORA: internal error code arguments: [] [] [] [] [] [] [] [] 查询不了任何应用的表应用也没法使用于是想尝试全库的exp出来然后重新imp进去建库结果发现exp数据也不成功也是报同样的ORA的错误用户当时数据没有任何的备份过只能想办法尽量打开数据库导出数据了 处理过程 先检查了错误产生的trace文件 *** SESSION ID:() ksedmp: internal or fatal error ORA: internal error code arguments: [] [] [] [] [] [] [] [] Current SQL statement for this session: SELECT * FROM WHSBSB_BSBF 得到的信息有限只能看到是严重内部错误剩下的都是内存堆栈的一堆信息于是查找了一下这个错误的具体相关信息 ORA [] Block SCN is ahead of Current SCN说明当前数据库的数据块的SCN早于当前的SCN主要是和存储在UGA变量中的dependent SCN进行比较如果当前的SCN小于它数据库就会产生这个ORA []的错误了这个错误一共有五个参数分别代表不同的含义 ORA [] [a] [b] [c] [d] [e] Arg [a] Current SCN WRAP Arg [b] Current SCN BASE Arg [c] dependent SCN WRAP Arg [d] dependent SCN BASE Arg [e] Where present this is the DBA where the dependent SCN came from 我们分析错误中的提示它的参数b=d=表明当前的SCN确实是小于dependent SCN所以产生了这个的错误 通过查阅文档发现这个错误的产生原因主要有以下几条 使用隐含参数_ALLOW_RESETLOGS_CORRUPTION后resetlogs打开数据库 硬件错误引起数据库没法写控制文件和重做日志文件 错误的部分恢复数据库 恢复了控制文件但是没有使用recover database using backup controlfile进行恢复 数据库crash后设置了_DISABLE_LOGGING隐含参数 在并行服务器环境中DLM存在问题 仔细对比了一下发现问题可能是由于第一条产生的由于设置了_ALLOW_RESETLOGS_CORRUPTION这个隐含参数后虽然强制性的打开数据库但是数据库本身存在了corruption仍然存在严重的问题 于是想到使用ADJUST_SCN事件来调整当前的SCN使其大于dependent SCN然后保证数据库可以全库的导出然后重建数据库导入数据 用internal用户登陆数据库后连接别的用户还是失败报错执行 alter session set events IMMEDIATE trace name ADJUST_SCN level ; 然后尝试连接别的用户连接成功 最后exp整个数据库重建数据库后导入数据整个数据库恢复成功! 通过这个实例我们可以看到尽量的不要去使用那些隐含参数这些参数是oracle所不推荐使用的也不是万能的!如果使用了可能会存在一些遗留的问题如果非要使用建议使用后一定要exp/imp重建建立数据库 |