如何解决Oracle 19c备份ORA-19809错误?扩大FRA闪回恢复区空间?
- 内容介绍
- 文章标签
- 相关推荐
本文共计997个文字,预计阅读时间需要4分钟。
相关专题:
ora-19809 错误本质是 fra 空间配额被突破,不是磁盘真满了,而是 db_recovery_file_dest_size 设置值被写满后 oracle 拒绝继续写入——哪怕物理磁盘还有几十 gb 剩余空间。
ORA-19809 报错时最该先查什么
别急着扩大小,先确认真实瓶颈在哪:
- 查 FRA 实际占用:
SELECT * FROM V$RECOVERY_FILE_DEST;—— 关注SPACE_LIMIT(配额)、SPACE_USED(已用)、NUMBER_OF_FILES - 查哪些文件占大头:
SELECT FILE_TYPE, PERCENT_SPACE_USED FROM V$FLASH_RECOVERY_AREA_USAGE;—— 重点关注FLASHBACK LOG和ARCHIVED LOG是否长期堆积 - 查最近归档是否卡住:
SELECT ARCHIVED_THREAD#, ARCHIVED_SEQUENCE#, DELETED FROM V$ARCHIVED_LOG WHERE FIRST_TIME > SYSDATE - 1 ORDER BY FIRST_TIME DESC;—— 如果大量DELETED='NO'且未被 RMAN 清理,说明归档日志没被策略回收
扩大 DB_RECOVERY_FILE_DEST_SIZE 的实操要点
扩大小本身很简单,但顺序和范围必须严格:
-
DB_RECOVERY_FILE_DEST_SIZE必须先于DB_RECOVERY_FILE_DEST设置;如果后者已设而前者为空,会直接报ORA-19802 - 扩大小可在线执行:
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 30G SCOPE=BOTH;(注意单位必须带G或M,不能只写数字) - RAC 环境下需加
SID='*':例如ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 30G SCOPE=BOTH SID='*'; - 扩完不等于立刻释放空间——FRA 中已有文件不会被自动删,只是允许新文件写入;真正释放靠 RMAN 清理或空间压力触发自动回收
为什么扩了还是报 ORA-19809?常见陷阱
很多 DBA 扩完大小立即重跑 RMAN 备份,结果照样失败。原因往往在这些地方:
- 归档日志没进 FRA:检查
LOG_ARCHIVE_DEST_1是否仍指向非 FRA 路径,比如'LOCATION=/arch';必须设为'LOCATION=USE_DB_RECOVERY_FILE_DEST',否则归档日志绕过 FRA,RMAN 备份时找不到它们,又会因“找不到归档”转而尝试生成更多临时备份块,间接撑爆 FRA - 闪回日志失控:开启
FLASHBACK DATABASE后,FLASHBACK LOG不受 RMAN 保留策略控制;若 FRA 空间紧张,Oracle 会优先清理归档日志而非闪回日志,导致闪回能力下降甚至中断;可通过V$FLASHBACK_DATABASE_LOG查看最早可闪回时间,判断是否已被截断 - 备份未启用控制文件自动备份:如果
CONFIGURE CONTROLFILE AUTOBACKUP ON关闭,RMAN 可能临时生成大量未命名的控制文件副本塞满 FRA
扩完之后必须验证的三件事
改完参数只是开始,以下验证缺一不可:
- 执行一次手动归档:
ALTER SYSTEM ARCHIVE LOG CURRENT;,再查V$ARCHIVED_LOG.NAME,确认路径落在DB_RECOVERY_FILE_DEST下 - 运行一次最小化 RMAN 备份:
RUN { BACKUP AS COPY CURRENT CONTROLFILE; },观察是否成功写入 FRA 目录 - 检查
V$FLASH_RECOVERY_AREA_USAGE中各类型占比,确保FLASHBACK LOG不长期高于 70%——否则说明闪回日志积累太快,可能需要调低_flashback_max_log_size(不推荐轻易动隐式参数)或缩短闪回保留窗口
FRA 空间问题从来不是单点扩容就能闭环的事,它串联着归档路径、闪回开关、RMAN 策略和底层存储可用性。最容易被忽略的是:即使你只用 RMAN 做备份,DB_RECOVERY_FILE_DEST 也必须设且生效——否则归档日志位置失控,后续所有恢复动作都会在关键时刻掉链子。
本文共计997个文字,预计阅读时间需要4分钟。
相关专题:
ora-19809 错误本质是 fra 空间配额被突破,不是磁盘真满了,而是 db_recovery_file_dest_size 设置值被写满后 oracle 拒绝继续写入——哪怕物理磁盘还有几十 gb 剩余空间。
ORA-19809 报错时最该先查什么
别急着扩大小,先确认真实瓶颈在哪:
- 查 FRA 实际占用:
SELECT * FROM V$RECOVERY_FILE_DEST;—— 关注SPACE_LIMIT(配额)、SPACE_USED(已用)、NUMBER_OF_FILES - 查哪些文件占大头:
SELECT FILE_TYPE, PERCENT_SPACE_USED FROM V$FLASH_RECOVERY_AREA_USAGE;—— 重点关注FLASHBACK LOG和ARCHIVED LOG是否长期堆积 - 查最近归档是否卡住:
SELECT ARCHIVED_THREAD#, ARCHIVED_SEQUENCE#, DELETED FROM V$ARCHIVED_LOG WHERE FIRST_TIME > SYSDATE - 1 ORDER BY FIRST_TIME DESC;—— 如果大量DELETED='NO'且未被 RMAN 清理,说明归档日志没被策略回收
扩大 DB_RECOVERY_FILE_DEST_SIZE 的实操要点
扩大小本身很简单,但顺序和范围必须严格:
-
DB_RECOVERY_FILE_DEST_SIZE必须先于DB_RECOVERY_FILE_DEST设置;如果后者已设而前者为空,会直接报ORA-19802 - 扩大小可在线执行:
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 30G SCOPE=BOTH;(注意单位必须带G或M,不能只写数字) - RAC 环境下需加
SID='*':例如ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 30G SCOPE=BOTH SID='*'; - 扩完不等于立刻释放空间——FRA 中已有文件不会被自动删,只是允许新文件写入;真正释放靠 RMAN 清理或空间压力触发自动回收
为什么扩了还是报 ORA-19809?常见陷阱
很多 DBA 扩完大小立即重跑 RMAN 备份,结果照样失败。原因往往在这些地方:
- 归档日志没进 FRA:检查
LOG_ARCHIVE_DEST_1是否仍指向非 FRA 路径,比如'LOCATION=/arch';必须设为'LOCATION=USE_DB_RECOVERY_FILE_DEST',否则归档日志绕过 FRA,RMAN 备份时找不到它们,又会因“找不到归档”转而尝试生成更多临时备份块,间接撑爆 FRA - 闪回日志失控:开启
FLASHBACK DATABASE后,FLASHBACK LOG不受 RMAN 保留策略控制;若 FRA 空间紧张,Oracle 会优先清理归档日志而非闪回日志,导致闪回能力下降甚至中断;可通过V$FLASHBACK_DATABASE_LOG查看最早可闪回时间,判断是否已被截断 - 备份未启用控制文件自动备份:如果
CONFIGURE CONTROLFILE AUTOBACKUP ON关闭,RMAN 可能临时生成大量未命名的控制文件副本塞满 FRA
扩完之后必须验证的三件事
改完参数只是开始,以下验证缺一不可:
- 执行一次手动归档:
ALTER SYSTEM ARCHIVE LOG CURRENT;,再查V$ARCHIVED_LOG.NAME,确认路径落在DB_RECOVERY_FILE_DEST下 - 运行一次最小化 RMAN 备份:
RUN { BACKUP AS COPY CURRENT CONTROLFILE; },观察是否成功写入 FRA 目录 - 检查
V$FLASH_RECOVERY_AREA_USAGE中各类型占比,确保FLASHBACK LOG不长期高于 70%——否则说明闪回日志积累太快,可能需要调低_flashback_max_log_size(不推荐轻易动隐式参数)或缩短闪回保留窗口
FRA 空间问题从来不是单点扩容就能闭环的事,它串联着归档路径、闪回开关、RMAN 策略和底层存储可用性。最容易被忽略的是:即使你只用 RMAN 做备份,DB_RECOVERY_FILE_DEST 也必须设且生效——否则归档日志位置失控,后续所有恢复动作都会在关键时刻掉链子。

