RMAN-06059错误案例模拟-清理备份垃圾
某客户最近在实施数据库备份计划,在备份数据库时,遇到RMAN-06059错误导致备份失败,该客户备份的数据库数据量较大,由于在很长时间后RMAN才抛出这个错误,客户也很纠结。客户埋怨要是在开始备份时就抛出错误,就不会耽误他们这么长时间了。^_^
RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: backup 命令 (在 12/03/2013 11:55:24 上) 失败 RMAN-06059: 没有找到预期的归档日志, 归档日志的丢失将影响可恢复性 ORA-19625: 识别文件D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\ARCHIVELOG\2013_03_18\O1_MF_1_503_8NFRLPSC_.ARC时出错 ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 3) 系统找不到指定的路径。
客户环境:OEL 5.7 for 64bit,ORACLE 11.2.0.2.0
故障原因:由于该客户每天都在向数据库加载图片数据,归档日志生成量巨大,每天大概800G左右,存放归档的空间16TB,开发人员不定期通过ASMCMD客户端登录ASM直接rm掉几天前的归档,防止空间满影响数据库正常使用。可是这样删除归档,数据库是不知道的,在控制文件里依然记录着这些归档日志是正常状态,在RMAN备份归档日志时,找不到这些归档日志,就抛出RMAN-06059错误,然后备份中断。
以下是我在自己的测试环境进行的模拟。首先将数据库打开到归档模式。
SQL> archive log list 数据库日志模式 存档模式 自动存档 启用 存档终点 D:\ARCH 最早的联机日志序列 1034 下一个存档日志序列 1036 当前日志序列 1036
然后切换日志,生成归档。
SQL> alter system switch logfile; 系统已更改。 SQL> / 系统已更改。 SQL> / 系统已更改。 SQL> / 系统已更改。
在操作系统上可以看到归档已经产生。
C:\Windows\system32>d: D:\>cd arch D:\arch>dir/b SID0000001030_0782406866_0001.ARC SID0000001031_0782406866_0001.ARC SID0000001032_0782406866_0001.ARC SID0000001033_0782406866_0001.ARC SID0000001034_0782406866_0001.ARC SID0000001035_0782406866_0001.ARC
使用操作系统命令删除这些归档。
D:\arch>del * D:\arch\*, 是否确认(Y/N)? y D:\arch>dir/b
归档已经全表删掉,使用RMAN备份归档,就会抛出RMAN-06059错误。
C:\Windows\system32>rman target / 恢复管理器: Release 11.2.0.1.0 - Production on 星期二 12月 3 11:54:33 2013 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 连接到目标数据库: DBDREAM (DBID=2326242578) RMAN> backup archivelog all format 'D:\archive.bak'; 启动 backup 于 03-12月-13 当前日志已存档 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=72 设备类型=DISK RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: backup 命令 (在 12/03/2013 11:55:24 上) 失败 RMAN-06059: 没有找到预期的归档日志, 归档日志的丢失将影响可恢复性 ORA-19625: 识别文件D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\ARCHIVELOG\2013_03_18\O1_MF_1_503_8NFRLPSC_.ARC时出错 ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 3) 系统找不到指定的路径。
要解决这个问题很简单,只要更新下控制文件,告诉控制文件这些归档已经不存在就可以了。但怎么样才能更新控制文件的归档信息呢?难道需要重建控制文件?当然不是了,RMAN就可以完成这个任务。使用RMAN的CROSSCHECK命令检查下归档日志,RMAN就会发现这些归档已经不存在了。
RMAN> crosscheck archivelog all; 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=135 设备类型=DISK 对归档日志的验证失败 归档日志文件名=D:\ARCH\SID0000001030_0782406866_0001.ARC RECID=249 STAMP=833197926 对归档日志的验证失败 归档日志文件名=D:\ARCH\SID0000001031_0782406866_0001.ARC RECID=250 STAMP=833197928 对归档日志的验证失败 归档日志文件名=D:\ARCH\SID0000001032_0782406866_0001.ARC RECID=251 STAMP=833197929 对归档日志的验证失败 归档日志文件名=D:\ARCH\SID0000001033_0782406866_0001.ARC RECID=252 STAMP=833197929 对归档日志的验证失败 归档日志文件名=D:\ARCH\SID0000001034_0782406866_0001.ARC RECID=253 STAMP=833197931 对归档日志的验证失败 归档日志文件名=D:\ARCH\SID0000001035_0782406866_0001.ARC RECID=254 STAMP=833197949 对归档日志的验证成功 归档日志文件名=D:\ARCH\SID0000001036_0782406866_0001.ARC RECID=255 STAMP=833198123 已交叉检验的 7 对象
然后通过RMAN删除掉这些归档,RMAN就会把这些归档的信息同步到控制文件,再次备份归档日志时,就不会因为这些归档不存在而报错了。
RMAN> delete expired archivelog all; 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=135 设备类型=DISK db_unique_name 为 DBDREAM 的数据库的归档日志副本列表 ===================================================================== 关键字 线程序列 S 时间下限 ------- ---- ------- - ---------- 249 1 1030 X 03-12月-13 名称: D:\ARCH\SID0000001030_0782406866_0001.ARC 250 1 1031 X 03-12月-13 名称: D:\ARCH\SID0000001031_0782406866_0001.ARC 251 1 1032 X 03-12月-13 名称: D:\ARCH\SID0000001032_0782406866_0001.ARC 252 1 1033 X 03-12月-13 名称: D:\ARCH\SID0000001033_0782406866_0001.ARC 253 1 1034 X 03-12月-13 名称: D:\ARCH\SID0000001034_0782406866_0001.ARC 254 1 1035 X 03-12月-13 名称: D:\ARCH\SID0000001035_0782406866_0001.ARC 是否确定要删除以上对象 (输入 YES 或 NO)? yes 已删除的归档日志 归档日志文件名=D:\ARCH\SID0000001030_0782406866_0001.ARC RECID=249 STAMP=833197926 已删除的归档日志 归档日志文件名=D:\ARCH\SID0000001031_0782406866_0001.ARC RECID=250 STAMP=833197928 已删除的归档日志 归档日志文件名=D:\ARCH\SID0000001032_0782406866_0001.ARC RECID=251 STAMP=833197929 已删除的归档日志 归档日志文件名=D:\ARCH\SID0000001033_0782406866_0001.ARC RECID=252 STAMP=833197929 已删除的归档日志 归档日志文件名=D:\ARCH\SID0000001034_0782406866_0001.ARC RECID=253 STAMP=833197931 已删除的归档日志 归档日志文件名=D:\ARCH\SID0000001035_0782406866_0001.ARC RECID=254 STAMP=833197949 6 EXPIRED 对象已删除
在备份归档日志,就不会遇到之前的错误了。
RMAN> backup archivelog all format 'd:\archive.bak'; 启动 backup 于 03-12月-13 当前日志已存档 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在启动归档日志备份集 通道 ORA_DISK_1: 正在指定备份集内的归档日志 输入归档日志线程=1 序列=1036 RECID=255 STAMP=833198123 输入归档日志线程=1 序列=1037 RECID=256 STAMP=833199012 通道 ORA_DISK_1: 正在启动段 1 于 03-12月-13 通道 ORA_DISK_1: 已完成段 1 于 03-12月-13 段句柄=D:\ARCHIVE.BAK 标记=TAG20131203T121013 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01 完成 backup 于 03-12月-13 启动 Control File and SPFILE Autobackup 于 03-12月-13 段 handle=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_12_03\O1_MF_S_833199015_99TPF84Y_.BKP comment=NONE 完成 Control File and SPFILE Autobackup 于 03-12月-13
这里需要额外提一嘴标红部分,如果打开了控制文件的自动备份,默认情况下控制文件的自动备份不会备份到RMAN命令指定的format路径下,而是在闪回恢复区内,之前就有个客户在给数据库升级时,做完全备后,删除了ORACLE_HOME,并用dd命令擦除了ASM磁盘,重新安装数据库软件,然后发现控制文件丢了,虽然有备份,但是RMAN无法恢复,很纠结。这个恢复过程详见使用dbms_backup_restore包恢复丢失控制文件的RMAN备份以及ORA-06553 PLS-801错误。 既然这里说到用RMAN清理归档垃圾,那么也演示下怎么用RMAN清理备份垃圾吧。还拿这个测试环境,由于这个测试环境经常会做一些风险较大的测试,之前做过几次备份,但是后来关闭了归档模式,备份文件也就直接让我在操作系统上删掉了,但是RMAN是不知道这些备份已经被删的了。可以使用report obsolete命令来查看过期的备份,具体什么才算是过期的备份和备份保留策略有关,我的环境一切都是默认。
RMAN> report obsolete; RMAN 保留策略将应用于该命令 将 RMAN 保留策略设置为冗余 1 已废弃的备份和副本报表 类型 关键字 完成时间 文件名/句柄 -------------------- ------ ------------------ -------------------- 备份集 8 14-3月 -13 备份片段 8 14-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_14\O1_MF_NNSNF_TAG20130314T135853_8N2V7 PPM_.BKP 备份集 11 18-3月 -13 备份片段 11 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNNDF_TAG20130318T174316_8NFRF OWW_.BKP 备份集 10 18-3月 -13 备份片段 10 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNNDF_TAG20130318T174316_8NFRF Q4Z_.BKP 备份集 13 18-3月 -13 备份片段 13 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NCNNF_TAG20130318T174316_8NFRL MPJ_.BKP 备份集 12 18-3月 -13 备份片段 12 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNSNF_TAG20130318T174316_8NFRL LJT_.BKP 备份集 14 10-10月-13 备份片段 14 10-10月-13 D:\FULL.BAK 备份集 16 10-11月-13 备份片段 16 10-11月-13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_10\O1_MF_S_831144685_97YNMGJS_.BKP 数据文件副本 1 19-11月-13 D:\DATAF4.BAK 备份集 17 10-11月-13 备份片段 17 10-11月-13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_10\O1_MF_S_831145588_97YOHOO3_.BKP 备份集 18 19-11月-13 备份片段 18 19-11月-13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_19\O1_MF_S_831907608_98OXTL7S_.BKP 备份集 20 19-11月-13 备份片段 20 19-11月-13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_19\O1_MF_S_831926406_98PJ07OJ_.BKP
可以看到过期的备份还有有一些的,可以通过delete obsolete命令删除过期的备份。
RMAN> delete obsolete; RMAN 保留策略将应用于该命令 将 RMAN 保留策略设置为冗余 1 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=131 设备类型=DISK 删除以下已废弃的备份和副本: 类型 关键字 完成时间 文件名/句柄 -------------------- ------ ------------------ -------------------- 备份集 8 14-3月 -13 备份片段 8 14-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_14\O1_MF_NNSNF_TAG20130314T135853_8N2V7 PPM_.BKP 备份集 11 18-3月 -13 备份片段 11 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNNDF_TAG20130318T174316_8NFRF OWW_.BKP 备份集 10 18-3月 -13 备份片段 10 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNNDF_TAG20130318T174316_8NFRF Q4Z_.BKP 备份集 13 18-3月 -13 备份片段 13 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NCNNF_TAG20130318T174316_8NFRL MPJ_.BKP 备份集 12 18-3月 -13 备份片段 12 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNSNF_TAG20130318T174316_8NFRL LJT_.BKP 备份集 14 10-10月-13 备份片段 14 10-10月-13 D:\FULL.BAK 备份集 16 10-11月-13 备份片段 16 10-11月-13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_10\O1_MF_S_831144685_97YNMGJS_.BKP 数据文件副本 1 19-11月-13 D:\DATAF4.BAK 备份集 17 10-11月-13 备份片段 17 10-11月-13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_10\O1_MF_S_831145588_97YOHOO3_.BKP 备份集 18 19-11月-13 备份片段 18 19-11月-13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_19\O1_MF_S_831907608_98OXTL7S_.BKP 备份集 20 19-11月-13 备份片段 20 19-11月-13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_19\O1_MF_S_831926406_98PJ07OJ_.BKP 是否确定要删除以上对象 (输入 YES 或 NO)? yes 已删除备份片段 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_10\O1_MF_S_831144685_97YNMGJS_.BKP RECID=16 STAMP=831144686 已删除备份片段 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_10\O1_MF_S_831145588_97YOHOO3_.BKP RECID=17 STAMP=831145589 已删除备份片段 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_19\O1_MF_S_831907608_98OXTL7S_.BKP RECID=18 STAMP=831907794 已删除备份片段 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_11_19\O1_MF_S_831926406_98PJ07OJ_.BKP RECID=20 STAMP=831926407 4 对象已删除 RMAN-06207: 警告: 由于状态不匹配, 所以不能删除 7 对象 (对于 DISK 通道)。 RMAN-06208: 请用 CROSSCHECK 命令修正状态 RMAN-06210: 不匹配对象的列表 RMAN-06211: ========================== RMAN-06212: 对象类型 文件名/句柄 RMAN-06213: --------------- --------------------------------------------------- RMAN-06214: Backup Piece D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_14\O1_MF_NNSNF_TAG20130314T135853_8N2V7PPM_.BKP RMAN-06214: Backup Piece D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNNDF_TAG20130318T174316_8NFRFOWW_.BKP RMAN-06214: Backup Piece D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNNDF_TAG20130318T174316_8NFRFQ4Z_.BKP RMAN-06214: Backup Piece D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NCNNF_TAG20130318T174316_8NFRLMPJ_.BKP RMAN-06214: Backup Piece D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNSNF_TAG20130318T174316_8NFRLLJT_.BKP RMAN-06214: Backup Piece D:\FULL.BAK RMAN-06214: Datafile Copy D:\DATAF4.BAK
只成功删除掉 4个,为什么?因为没有被删除的7个已经被我从操作系统上删掉了,成功删掉的那4个我之前懒得去闪回恢复区去删,就幸免了,对于已经被删掉不存在的备份,直接delete obsolete是不允许的,还得像删除归档垃圾一样先使用CROSSCHECK命令检查确定这些备份是EXPIRED状态,然后才可以删除。
RMAN> crosscheck backup; 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=135 设备类型=DISK 交叉校验备份片段: 找到为 'EXPIRED' 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_14\O1_MF_NNSNF_TAG20130314T135853_8N2V7PPM_.BKP RECID=8 STAMP=81005 1830 交叉校验备份片段: 找到为 'EXPIRED' 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNNDF_TAG20130318T174316_8NFRFQ4Z_.BKP RECID=10 STAMP=8104 09398 交叉校验备份片段: 找到为 'EXPIRED' 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNNDF_TAG20130318T174316_8NFRFOWW_.BKP RECID=11 STAMP=8104 09397 交叉校验备份片段: 找到为 'EXPIRED' 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNSNF_TAG20130318T174316_8NFRLLJT_.BKP RECID=12 STAMP=8104 09554 交叉校验备份片段: 找到为 'EXPIRED' 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NCNNF_TAG20130318T174316_8NFRLMPJ_.BKP RECID=13 STAMP=8104 09555 交叉校验备份片段: 找到为 'EXPIRED' 备份片段句柄=D:\FULL.BAK RECID=14 STAMP=828443760 交叉校验备份片段: 找到为 'EXPIRED' 备份片段句柄=D:\FULL-BK.BAK RECID=15 STAMP=828443943 交叉校验备份片段: 找到为 'EXPIRED' 备份片段句柄=D:\USER-FULL.BAK RECID=19 STAMP=831926391 交叉校验备份片段: 找到为 'AVAILABLE' 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\AUTOBACKUP\2013_12_02\O1_MF_S_833110269_99QZQY8V_.BKP RECID=21 STAMP=833110270 已交叉检验的 9 对象
ORACLE这一点挺像现在的医生,必须先去挂号,并且确诊之后才给开药。然后再使用delete obsolete命令就可以清理这些垃圾备份了。
RMAN> delete obsolete; RMAN 保留策略将应用于该命令 将 RMAN 保留策略设置为冗余 1 使用通道 ORA_DISK_1 删除以下已废弃的备份和副本: 类型 关键字 完成时间 文件名/句柄 -------------------- ------ ------------------ -------------------- 备份集 8 14-3月 -13 备份片段 8 14-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_14\O1_MF_NNSNF_TAG20130314T135853_8N2V7 PPM_.BKP 备份集 13 18-3月 -13 备份片段 13 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NCNNF_TAG20130318T174316_8NFRL MPJ_.BKP 备份集 12 18-3月 -13 备份片段 12 18-3月 -13 D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNSNF_TAG20130318T174316_8NFRL LJT_.BKP 备份集 14 10-10月-13 备份片段 14 10-10月-13 D:\FULL.BAK 是否确定要删除以上对象 (输入 YES 或 NO)? yes 已删除备份片段 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_14\O1_MF_NNSNF_TAG20130314T135853_8N2V7PPM_.BKP RECID=8 STAMP=81005 1830 已删除备份片段 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NCNNF_TAG20130318T174316_8NFRLMPJ_.BKP RECID=13 STAMP=8104 09555 已删除备份片段 备份片段句柄=D:\APP\STREAM\FLASH_RECOVERY_AREA\DBDREAM\BACKUPSET\2013_03_18\O1_MF_NNSNF_TAG20130318T174316_8NFRLLJT_.BKP RECID=12 STAMP=8104 09554 已删除备份片段 备份片段句柄=D:\FULL.BAK RECID=14 STAMP=828443760 4 对象已删除