如何使用RMAN命令同步更新Oracle 19c控制文件,以手动清除过期备份记录?
- 内容介绍
- 文章标签
- 相关推荐
本文共计849个文字,预计阅读时间需要4分钟。
简单修改伪原创开头内容,不试图解问题,不啰嗦,不超过100字,直接输出结果:
delete expired backup 不生效,不是命令写错了,而是 rman 根本没机会删——它只清理控制文件里已标记为 expired 的记录,而这些标记得靠 crosscheck 扫出来。
为什么 DELETE EXPIRED BACKUP 显示 “0 objects deleted”
常见现象是执行完命令后返回 0 objects deleted,但磁盘空间没释放、LIST BACKUP 仍显示大量旧备份。这不是 bug,是 RMAN 的元数据清理机制依赖状态标记:
-
CROSSCHECK BACKUP才是真正“扫描磁盘并比对”的动作;不执行它,控制文件里那些物理文件早已被 rm 或移走的备份,依然保持AVAILABLE状态 -
DELETE EXPIRED BACKUP只删状态为EXPIRED的记录,不会主动触发扫描 - 如果用了恢复目录(recovery catalog),但没运行
RESYNC CATALOG,主库控制文件和目录元数据不一致,CROSSCHECK结果可能不准
CROSSCHECK 必须带 ALL 且注意执行范围
只输 CROSSCHECK BACKUP 默认只查最近一次备份集,漏掉大量历史条目。生产环境必须用:
CROSSCHECK BACKUPSET ALL; CROSSCHECK COPY ALL; CROSSCHECK ARCHIVELOG ALL;
在 Data Guard 环境下还要加限定:
- 主库上操作:直接执行即可
- 备库上执行(不推荐):必须加
FOR DB_UNIQUE_NAME <primary_name>,否则可能误标主库还在用的归档为EXPIRED - 共享恢复目录场景:确保各数据库注册时
DB_UNIQUE_NAME不重复,否则CROSSCHECK可能跨库匹配
删完 EXPIRED 后,控制文件里还剩 STATUS = DELETED 记录怎么办
这是正常行为:DELETE EXPIRED BACKUP 只删备份集(BACKUPSET)和映像副本(COPY)主记录,不自动清理关联碎片,比如:
-
RC_BACKUP_PIECE表中残留的备份片(piece)条目 - 归档日志与备份的关联关系未解绑,导致
LIST EXPIRED ARCHIVELOG还有输出 - 某些备份片因权限问题被
CROSSCHECK跳过,没打上EXPIRED标签
此时不能直接改控制文件。安全做法是:
- 先确认物理路径是否真无文件:
ls -l对照LIST BACKUP输出的HANDLE - 对确认丢失且无法
CROSSCHECK的单个备份,用CHANGE BACKUPSET <BS_KEY> UNCATALOG显式注销 - 归档日志顽固残留?补一句
CHANGE ARCHIVELOG ALL CROSSCHECK再跑DELETE EXPIRED ARCHIVELOG ALL
最易被忽略的一点:CROSSCHECK 是 I/O 密集型操作,尤其当备份分散在多个挂载点或 NFS 上时,超时或部分跳过很常见。别只看命令返回 “completed”,务必跟一句 LIST EXPIRED BACKUP 确认有没有新条目出现——没有,说明扫描根本没到位。
本文共计849个文字,预计阅读时间需要4分钟。
简单修改伪原创开头内容,不试图解问题,不啰嗦,不超过100字,直接输出结果:
delete expired backup 不生效,不是命令写错了,而是 rman 根本没机会删——它只清理控制文件里已标记为 expired 的记录,而这些标记得靠 crosscheck 扫出来。
为什么 DELETE EXPIRED BACKUP 显示 “0 objects deleted”
常见现象是执行完命令后返回 0 objects deleted,但磁盘空间没释放、LIST BACKUP 仍显示大量旧备份。这不是 bug,是 RMAN 的元数据清理机制依赖状态标记:
-
CROSSCHECK BACKUP才是真正“扫描磁盘并比对”的动作;不执行它,控制文件里那些物理文件早已被 rm 或移走的备份,依然保持AVAILABLE状态 -
DELETE EXPIRED BACKUP只删状态为EXPIRED的记录,不会主动触发扫描 - 如果用了恢复目录(recovery catalog),但没运行
RESYNC CATALOG,主库控制文件和目录元数据不一致,CROSSCHECK结果可能不准
CROSSCHECK 必须带 ALL 且注意执行范围
只输 CROSSCHECK BACKUP 默认只查最近一次备份集,漏掉大量历史条目。生产环境必须用:
CROSSCHECK BACKUPSET ALL; CROSSCHECK COPY ALL; CROSSCHECK ARCHIVELOG ALL;
在 Data Guard 环境下还要加限定:
- 主库上操作:直接执行即可
- 备库上执行(不推荐):必须加
FOR DB_UNIQUE_NAME <primary_name>,否则可能误标主库还在用的归档为EXPIRED - 共享恢复目录场景:确保各数据库注册时
DB_UNIQUE_NAME不重复,否则CROSSCHECK可能跨库匹配
删完 EXPIRED 后,控制文件里还剩 STATUS = DELETED 记录怎么办
这是正常行为:DELETE EXPIRED BACKUP 只删备份集(BACKUPSET)和映像副本(COPY)主记录,不自动清理关联碎片,比如:
-
RC_BACKUP_PIECE表中残留的备份片(piece)条目 - 归档日志与备份的关联关系未解绑,导致
LIST EXPIRED ARCHIVELOG还有输出 - 某些备份片因权限问题被
CROSSCHECK跳过,没打上EXPIRED标签
此时不能直接改控制文件。安全做法是:
- 先确认物理路径是否真无文件:
ls -l对照LIST BACKUP输出的HANDLE - 对确认丢失且无法
CROSSCHECK的单个备份,用CHANGE BACKUPSET <BS_KEY> UNCATALOG显式注销 - 归档日志顽固残留?补一句
CHANGE ARCHIVELOG ALL CROSSCHECK再跑DELETE EXPIRED ARCHIVELOG ALL
最易被忽略的一点:CROSSCHECK 是 I/O 密集型操作,尤其当备份分散在多个挂载点或 NFS 上时,超时或部分跳过很常见。别只看命令返回 “completed”,务必跟一句 LIST EXPIRED BACKUP 确认有没有新条目出现——没有,说明扫描根本没到位。

