绝对好使,但是代价较大,不仅之前备份统统无效,而且还需要停数据库服务,由于要操作的是一台较重要的生产服务器,因此这种
RMAN> report obsolete
直接delete会报这个错误:
RMAN> delete obsolete;
RMAN 保留策略将应用于该命令
将 RMAN 保留策略设置为冗余 1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=136 devtype=DISK
释放的通道: ORA_DISK_1
crosscheck也不行
RMAN> crosscheck backup;
a分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=136 devtype=DISK
释放的通道: ORA_DISK_1
解决方式:
1、重建控制文件。
绝对好使,但是代价较大,不仅之前备份统统无效,而且还需要停数据库服务,由于要操作的是一台较重要的生产服务器,因此这种方法不可行。
2、通过rman命令手工将备份集状态置为unavailable。
RMAN提供了一个change命令,可以修改备份集状态为AVAILABLE/UNAVAILABLE/UNCATALOG等等。手工使用该命令将所有不可访问的备份集置为unavailable,,修改完状态后等待控制文件自动更新覆盖失效记录即可。这种方式最大的问题是见效太慢。
注意,nocatalog模式才能使用这种方式。
3、借助dbms_backup_restore包直接删除备份片段。通过dbms_backup_restore.deleteBackupPiece过程删除无法访问的备份集。
dbms_backup_restore.deleteBackupPiece的定义如下:
前6项参数都需要我们指定,这些参数的参数值可以从v$backup_piece中获得。
SQL> select recid,stamp,set_stamp,set_count,handle,piece# from v$backup_piece;
RECID STAMP SET_STAMP SET_COUNT HANDLE PIECE#
---------- ---------- ---------- ---------- ------------------------------ ----------
11301 674167385 674167385 11411 c-1984618042-20081222-00 1
11304 674168006 674168005 11414 c-1984618042-20081222-01 1
11306 674168089 674168089 11416 c-1984618042-20081222-02 1
11312 674253707 674253707 11422 c-1984618042-20081223-00 1
11315 674254316 674254315 11425 c-1984618042-20081223-01 1
11317 674254397 674254397 11427 c-1984618042-20081223-02 1
执行删除RMAN过期备份
SQL> DECLARE
devtype varchar2(256);
BEGIN
devtype:=dbms_backup_restore.deviceAllocate (type=>'',ident=>'t1');
dbms_backup_restore.deleteBackupPiece(recid => 11301,stamp => 674167385,handle => 'c-1984618042-20081222-00',set_stamp => 674167385 ,set_count => 11411 ,pieceno => 1);
dbms_backup_restore.deviceDeallocate;
END;
/
SQL> select 'dbms_backup_restore.deleteBackupPiece(recid =>' || recid || ',stamp =>' || stamp || ',handle =>''' || HANDLE || ''',set_stamp =>' || SET_STAMP || ',set_count =>' || SET_COUNT || ',pieceno =>' || PIECE# || ');' sqlt
from v$backup_piece