这篇论坛(赛迪网技术社区)根据一个实际案例讲解了crosscheck长时间运行后未见结果的解决方法,详细内容请参考下文:
客户数据库的备份坏了,同事采取的策略是每天定期的用脚本删除归档。于是,当备份恢复的时候,需要做一次crosscheck,以便验证那些归档是validate的,于是可怕的事情发生了:crosscheck运行了1小时,还是没动静——需要crosscheck的日志太多了!!
查了一下文档,原来crosscheck archivelog all,除了all参数,还是有很多选项可以添加的:
like参数:
RMAN> crosscheck archivelog like '%22%';
释放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00022.001 记录 ID=8 时间戳 =654901749
已交叉检验的 1 对象
范围参数-until time:
RMAN> crosscheck archivelog until time="to_date('2008-5-20','yyyy-mm-dd')";
释放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00020.001 记录 ID=6 时间戳 =654686206
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00021.001 记录 ID=7 时间戳 =654827494
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00022.001 记录 ID=8 时间戳 =654901749
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00023.001 记录 ID=9 时间戳 =654916924
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00024.001 记录 ID=10 时间戳 =654980270
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00025.001 记录 ID=11 时间戳 =654985482
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00026.001 记录 ID=12 时间戳 =654986264
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00027.001 记录 ID=13 时间戳 =655157701
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00028.001 记录 ID=14 时间戳 =655406579
已交叉检验的 9 对象
范围参数-from time:
RMAN> crosscheck archivelog from time="to_date('2008-5-20','yyyy-mm-dd')";
释放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00028.001 记录 ID=14 时间戳 =655406579
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00029.001 记录 ID=15 时间戳 =655472860
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00030.001 记录 ID=16 时间戳 =655478738
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00031.001 记录 ID=17 时间戳 =655479620
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00032.001 记录 ID=18 时间戳 =655479984
已交叉检验的 5 对象
范围参数-from time until time:
RMAN> crosscheck archivelog from time="to_date('2008-5-20','yyyy-mm-dd')" until time="to_date('2008-5-23','yyyy-mm-dd')";
释放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00028.001 记录 ID=14 时间戳 =655406579
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00029.001 记录 ID=15 时间戳 =655472860
已交叉检验的 2 对象
范围参数-time between and:
RMAN> crosscheck archivelog time between "to_date('2008-5-20','yyyy-mm-dd')" and "to_date('2008-5-23','yyyy-mm-dd')";
释放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00028.001 记录 ID=14 时间戳 =655406579
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00029.001 记录 ID=15 时间戳 =655472860
已交叉检验的 2 对象
范围参数-time between and:
RMAN> crosscheck archivelog time between "to_date('2008-5-20','yyyy-mm-dd')" and "to_date('2008-5-23','yyyy-mm-dd')";
释放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00028.001 记录 ID=14 时间戳 =655406579
对归档日志的验证失败
存档日志文件名 =D:\ORACLE\ARCH\ARC00029.001 记录 ID=15 时间戳 =655472860
已交叉检验的 2 对象
以上的例子把time换成scn或者sequence也行。
最后,用time between and 的方法慢慢删除,终于把8万多个归档日志删除了……看来手册还是要多看,不然一下子就忘记了语法。