简介:这份文档面向 Oracle 数据库运维人员与 DBA 初学者,聚焦归档日志写满引发的 ORA-00257 报错,提供一套可落地的排障与空间释放思路。内容围绕删除物理归档文件与登录 RMAN 释放逻辑空间两条主线展开,涵盖查看闪回恢复区占用比例、确认日志存放路径与空间大小、选择性清理归档日志、crosscheck 标识过期文件以及 delete expired 释放空间等关键环节,并提示删除时避免全量清空以保留可恢复性。资源包共 1 个 doc 文件,约 76KB,篇幅精炼,适合作为故障现场快速查阅的操作参考。已有 581 人学习,说明该问题在实际运维中较为常见,读者可从中获得从定位占用到释放空间的完整处理脉络与注意事项,减少因归档满导致数据抽取任务中断的风险。
1. ORA-00257 报错:归档日志把空间吃满,数据抽取任务突然停摆
凌晨两点,数据抽取任务突然停了,日志里只有一行冷冰冰的ORA-00257: archiver error. Connect internal only, until freed。这不是数据库崩了,而是归档日志把闪回恢复区撑满了,Oracle 直接拒绝新的连接,业务侧所有写入和抽取全部卡死。这类故障在跑批量任务的库上特别常见,尤其是归档没做定期清理、监控又只看表空间不看归档区的环境。新手看到这行报错容易慌,熟手知道它其实是个“空间账没算清”的问题。这篇笔记把当时从定位到释放空间的完整过程拆开讲,包括物理文件怎么删、RMAN 里怎么把逻辑空间收回来,以及几个我踩过的坑。如果你正被 ORA-00257 卡住,照着下面的顺序走一遍,大概率能在一小时内恢复。
2. 先看清是谁吃满了空间:归档区占用查询与路径确认
遇到 ORA-00257,第一反应不应该是删文件,而是先确认到底是谁把空间吃满了。Oracle 的闪回恢复区(Flash Recovery Area)里可能同时放着归档日志、备份片、控制文件自动备份,盲目删物理文件很容易把还能恢复的备份一起干掉。我一般会先用两个查询把账算清楚:归档占了多少、归档放在哪、总配额多大。
2.1 用 v$flash_recovery_area_usage 看占用比例
以 sysdba 身份登录后,第一条命令就是查恢复区使用情况。这个视图按文件类型分组,能直接看到 ARCHIVELOG 那一行占了多少百分比。
-- 切换到 oracle 用户后登录数据库 -- su - oracle -- sqlplus /nolog -- conn /as sysdba -- 查看闪回恢复区各类文件占用比例 SELECT file_type, percent_space_used, percent_space_reclaimable, number_of_files FROM v$flash_recovery_area_usage;执行后重点看FILE_TYPE = ARCHIVELOG那一行。当时环境里这个值到了 89.78%,离 100% 只差一点,而数据抽取任务恰好在这个节点停了。PERCENT_SPACE_RECLAIMABLE表示可以通过删除过期归档回收的比例,如果它很低而PERCENT_SPACE_USED很高,说明大部分归档还在保留策略内,不能随便删。NUMBER_OF_FILES是当前归档文件个数,文件数特别多的时候,物理删除和 crosscheck 都会变慢,要有心理准备。
提示:这个视图查的是“逻辑占用”,也就是 Oracle 自己记账的空间。物理文件被手工删掉后,这里不会立刻下降,必须走 RMAN 的 crosscheck 才能对上账,这是后面最容易误解的地方。
2.2 用 show parameter 确认归档路径和配额
知道占用高了,下一步是找到归档到底写在哪个目录、配额多大。show parameter recover能一次性把相关参数列出来,比逐个查v$parameter快。
-- 查看恢复区相关参数:路径、大小、是否启用 SHOW PARAMETER recover;输出里重点看三个:db_recovery_file_dest是归档和备份的根路径,当时是/backup/flash_recovery_area;db_recovery_file_dest_size是配额上限,当时配的是 160G;log_archive_dest或log_archive_dest_1指向具体的归档目录。配额和实际磁盘容量是两回事,配额满了 Oracle 就报 ORA-00257,哪怕磁盘还有剩余空间。这一点很多人会误判,以为df -h看着有空间就没事,其实卡的是 Oracle 自己的配额账。
确认路径后,再到操作系统层面看一眼目录结构和文件分布:
# 登录数据库服务器,查看归档目录占用 du -sh /backup/flash_recovery_area/archivelog/* # 按日期列出归档子目录,确认哪些天占用最大 ls -lh /backup/flash_recovery_area/archivelog/当时目录下按天分了2012_06_10、2012_06_11这样的子目录,每个子目录里是一批.arc归档文件。du -sh能快速看出哪一天的量异常大,ls -lh则用来确认文件命名和大小,为后面选择性删除做准备。到这一步,空间账就算清楚了:配额 160G,归档占了将近九成,路径明确,可以进入释放环节。
3. 释放空间的两步走:物理删除与 RMAN 逻辑回收
确认归档区快满之后,释放空间要分两步:先在操作系统层面删掉不再需要的物理归档文件,再进 RMAN 做 crosscheck 和 delete expired,让 Oracle 的记账同步过来。只做第一步,v$flash_recovery_area_usage不会降;只做第二步而不删物理文件,空间也收不回来。两步缺一不可,顺序也不能反。
3.1 物理删除归档文件:选择性删,别一把梭
物理删除是整个操作里风险最高的一步。归档日志是数据库可恢复性的基础,删错了会影响按时间点恢复的能力。当时那台是新建的数据库服务器,没有其他业务操作记录,所以文档里直接删了整个目录;但在生产库上,绝对不能这么干。
安全的做法是按保留策略选择性删除,比如只删几天前、已经确认备份过的归档。先确认备份情况,再按日期删:
# 进入归档根目录 cd /backup/flash_recovery_area/archivelog # 先列出待删除目录的内容,确认没有误伤 ls -lh 2012_06_10/ # 删除指定日期的归档文件(示例:只删 06_10 这一天) rm -rf 2012_06_10 # 删除后确认剩余空间 du -sh /backup/flash_recovery_area/archivelog/rm -rf后面跟的是具体日期目录,不要写成通配符一把清空。删除前用ls -lh看一眼内容,确认这些归档确实已经备份或者不再需要。如果库上有 Data Guard 或者依赖归档做增量恢复,删之前必须确认备库已经应用过这些日志,否则备库会断档。删除完成后du -sh会立刻下降,但数据库里的逻辑占用还没变,这就是下一步要处理的。
注意:物理删除只影响磁盘文件,Oracle 控制文件里仍然记着这些归档的存在。此时如果直接查恢复区使用率,数字可能不降反升或者纹丝不动,别慌,这是正常现象,走完 RMAN 就对齐了。
3.2 RMAN crosscheck 与 delete expired:把逻辑空间收回来
物理文件删掉后,进 RMAN 让控制文件重新核对归档的实际存在状态。crosscheck archivelog all会逐个检查控制文件里记录的归档文件是否还在磁盘上,不在的标记为EXPIRED;delete expired archivelog all则把这些失效记录从控制文件里清掉,逻辑空间随之释放。
# 登录 RMAN,不指定目标库时默认连本地实例 rman target / # 核对所有归档的物理存在状态,缺失的标记为 EXPIRED RMAN> crosscheck archivelog all; # 删除所有已标记为 EXPIRED 的归档记录,释放逻辑空间 RMAN> delete expired archivelog all;执行crosscheck时会列出每个归档的检查结果,被删掉的文件显示EXPIRED,还在的显示OK。接着delete expired会提示确认,输入YES即可。这里有个细节:delete expired只删“控制文件里有记录但物理文件已不存在”的条目,不会碰还在磁盘上的归档,所以它是安全的。真正危险的是delete archivelog all,那会把物理文件也一起删掉,别敲错。
操作完成后回到 SQL*Plus 再查一次占用比例:
-- 回到 sysdba 会话,确认归档占用已下降 SELECT file_type, percent_space_used FROM v$flash_recovery_area_usage WHERE file_type = 'ARCHIVELOG';正常情况下这个百分比会明显回落。如果没降,说明 crosscheck 没覆盖到,或者还有别的文件类型占着空间,需要回到 2.1 的查询重新看一遍。整个流程走完,数据库恢复可连接状态,数据抽取任务重新跑起来,故障解除。
4. 避坑清单:ORA-00257 处理中最容易翻车的五个点
这套流程看着不复杂,但每一步都有翻车的可能。下面五条是当时处理过程中真实遇到或者事后复盘发现的坑,按“现象 → 原因 → 解决”记下来,下次遇到可以直接对照。
4.1 删完物理文件,占用率不降反升
现象:rm删掉归档目录后,再查v$flash_recovery_area_usage,ARCHIVELOG 的百分比没降,甚至看起来更高了。原因:Oracle 的逻辑记账还停留在删除前,控制文件里仍然认为这些文件存在,配额账没更新。解决:必须进 RMAN 执行crosscheck archivelog all再delete expired archivelog all,让控制文件重新对账。只删物理文件不做 RMAN 这一步,等于白删。
4.2 误用 delete archivelog all 把有效归档删光
现象:在 RMAN 里想清理空间,顺手敲了delete archivelog all,结果连还在保留期内的归档一起没了,后续恢复直接断档。原因:delete archivelog all会删除物理文件加控制文件记录,和delete expired完全是两回事。解决:清理失效记录只用delete expired archivelog all;确实要删有效归档,先确认备份完成,再用delete archivelog until time '...'按时间范围删,别用 all。
4.3 配额满了但磁盘还有空间,误判为磁盘故障
现象:df -h显示磁盘还有几十 G,ORA-00257 却一直报,怀疑是磁盘或挂载出了问题。原因:卡的是db_recovery_file_dest_size这个 Oracle 配额,不是文件系统容量。解决:查show parameter db_recovery_file_dest_size,确认配额值;要么清理归档,要么在评估后适当调大配额(ALTER SYSTEM SET db_recovery_file_dest_size = 200G;),但调大只是缓兵之计,根子还是归档清理策略。
4.4 删归档前没确认备库应用进度
现象:主库清理归档后,备库告警日志出现归档缺失,同步中断。原因:删掉的归档还没被备库应用,主库单方面删除导致备库拿不到日志。解决:删之前查备库的归档应用状态,确认v$archive_gap无缺口、备库已应用到目标 SCN 之后再删;有 Data Guard 的环境,归档删除策略要和备库保留策略对齐。
4.5 只清一次不建机制,过几天又满
现象:手工清理后恢复正常,一周后同样的 ORA-00257 再次出现。原因:归档持续产生,没有定期清理任务,也没有监控告警,纯粹靠人肉救火。解决:配置 RMAN 的归档删除策略(CONFIGURE ARCHIVELOG DELETION POLICY),配合定时任务定期 crosscheck 和 delete expired;同时对v$flash_recovery_area_usage做阈值监控,到 80% 就告警,别等 100% 才动手。
5. 快速定位这类问题的排查顺序与验证方法
ORA-00257 的排查其实有一条很固定的路径,按顺序走能少绕很多弯。我一般先看报错原文确认是归档问题,再查占用比例定位到具体文件类型,然后确认路径和配额,最后才动手清理。这个顺序的核心逻辑是:先算账,再动手,动完手必须对账。
| 步骤 | 操作 | 看什么 | 判断标准 |
|---|---|---|---|
| 1 | 查v$flash_recovery_area_usage | ARCHIVELOG 的PERCENT_SPACE_USED | 超过 80% 就要处理,接近 100% 已触发报错 |
| 2 | SHOW PARAMETER recover | db_recovery_file_dest、db_recovery_file_dest_size | 确认路径和配额,排除磁盘容量误判 |
| 3 | du -sh归档目录 | 各日期子目录大小 | 找出占用最大的时间段,确定删除范围 |
| 4 | 选择性rm物理文件 | 删除前后的目录大小 | 只删确认不再需要的归档 |
| 5 | RMANcrosscheck+delete expired | 输出中的 EXPIRED 条目 | 逻辑空间回收,占用率下降 |
| 6 | 复查v$flash_recovery_area_usage | ARCHIVELOG 百分比 | 回落到安全水位,连接恢复 |
验证环节有两个容易忽略的点。一是清理后不要只看占用率,还要实际测试新连接能否建立,sqlplus用普通业务账号连一次,确认 ORA-00257 不再出现。二是检查告警日志里有没有残留的归档相关错误,tail -f观察几分钟,确认归档进程正常切换。如果环境里有备库,还要确认备库同步没有因为删除归档而中断。
预防上,我现在的习惯是给每个库配两条线:一条是 RMAN 的归档删除策略,让过期归档自动清理;另一条是监控阈值,v$flash_recovery_area_usage到 80% 就发告警。两条线都配上,基本不会再被 ORA-00257 半夜叫醒。从那以后我每次上库做归档清理,都强制先跑一遍 crosscheck 再删,删完必查占用率,这个习惯救过我好几次。希望这套流程能帮到正被这个报错卡住的你,资源里的操作文档可以对照着一步步执行。
本文还有配套的精品资源,点击获取