记一次ORA-00257 实战:归档失败排查修复全流程

一、问题描述
11月28日晚上财务月底结账,前台应用报错:ORA-00257(归档相关错误,数据库会限制会话/需要处理归档问题后才能继续)。初步直觉:归档空间满 / 磁盘空间不足。
ORA-00257 是“归档出问题”的表象,常见两条路:
- 空间类问题:FRA/归档目录满、FRA 回收失败
- 链路类问题:归档目的地不可写、权限、IO/存储异常、redo 无法读取(本次属于这类)
二、排查过程
2.1 排除:操作系统与目录空间
先在 OS 侧确认磁盘空间、备份盘、数据盘占用都正常
#排除:操作系统与目录空间
[root@cmscqtmdb ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 59G 0 59G 0% /dev
tmpfs 59G 0 59G 0% /dev/shm
tmpfs 59G 18M 59G 1% /run
tmpfs 59G 0 59G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 8.8G 42G 18% /
/dev/sdb1 1.6T 959G 536G 65% /data
/dev/sda1 1014M 185M 830M 19% /boot
/dev/mapper/vg_backup-lv_backup 3.5T 1.4T 2.1T 41% /backup
/dev/mapper/centos-home 145G 5.6G 140G 4% /home
tmpfs 12G 0 12G 0% /run/user/1001
tmpfs 12G 12K 12G 1% /run/user/42
tmpfs 12G 0 12G 0% /run/user/0
[root@cmscqtmdb ~]# su - oracle
上一次登录:五 11月 28 18:35:42 CST 2025pts/1 上
[oracle@cmscqtmdb ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Fri Nov 28 18:36:32 2025
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
#归档模式与 FRA 配置确认
SQL> archive log lost
SP2-0718: illegal ARCHIVE LOG option
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 235878
Next log sequence to archive 235878
Current log sequence 235963
SQL> show parameter recover
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /data/app/oracle/fast_recovery
_area
db_recovery_file_dest_size big integer 400G
db_unrecoverable_scn_tracking boolean TRUE
recovery_parallelism integer 0
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@cmscqtmdb ~]$ cd /data/app/oracle/fast_recovery_area/CQTMDB/archvielog
[oracle@cmscqtmdb archivelog]$ ls
2025_11_22 2025_11_23 2025_11_24 2025_11_25 2025_11_26 2025_11_27 2025_11_28
#没有出现“磁盘满 / FRA 满”的直接证据。
[oracle@cmscqtmdb archivelog]$ du -h .
4.0K ./2025_11_22
4.0K ./2025_11_25
4.0K ./2025_11_23
4.0K ./2025_11_27
4.0K ./2025_11_24
4.0K ./2025_11_26
17G ./2025_11_28
17G .
[oracle@cmscqtmdb archivelog]$
2.2 关键证据 1:RMAN 日志直接指向 redo04.log
归档模式开启,每天都有定时任务做Rman备份、同时清理归档。怀疑是Rman备份后没有清理归档日志。结果发现不是“没清理归档”导致满,是 log group 4 的某个序列(235878)无法归档。ORA-00742 lost write → redo 文件读到了异常写入(存储/IO 层面风险)
[oracle@cmscqtmdb archivelog]$ cd /backup/
[oracle@cmscqtmdb backup]$ ll -h *.bak
-rw-r----- 1 oracle oinstall 709G 11月 27 04:07 cmscqtm_full_2280_20251127.bak
-rw-r----- 1 oracle oinstall 54M 11月 27 04:07 cmscqtm_full_2281_20251127.bak
-rw-r----- 1 oracle oinstall 710G 11月 28 04:06 cmscqtm_full_2282_20251128.bak
-rw-r----- 1 oracle oinstall 54M 11月 28 04:07 cmscqtm_full_2283_20251128.bak
[oracle@cmscqtmdb backup]$ vi Rmanbackup20251128.log
#查看 RMAN 备份日志尾部,备份本体完成,但在执行归档切换时失败:
[oracle@cmscqtmdb backup]$ tail -20 Rmanbackup20251128.log
channel c1: starting piece 1 at 2025-11-28 04:07:06
channel c1: finished piece 1 at 2025-11-28 04:07:08
piece handle=/backup/cmscqtm_full_2283_20251128.bak tag=TAG20251128T030016 comment=NONE
channel c1: backup set complete, elapsed time: 00:00:02
Finished backup at 2025-11-28 04:07:08
sql statement: alter system archive log current
released channel: c1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of sql command on default channel at 11/28/2025 04:07:13
RMAN-11003: failure during parse/execution of SQL statement: alter system archive log current
ORA-16038: log 4 sequence# 235878 cannot be archived
ORA-00742: Log read detects lost write in thread %d sequence %d block %d
ORA-00312: online log 4 thread 1: '/data/app/oracle/oradata/cqtmdb/redo04.log'
RMAN>
Recovery Manager complete.
[oracle@cmscqtmdb backup]$
2.3 关键证据 2:alert 日志显示 11/25 起持续归档失败
检查alter告警日志文件,找到11月25日下午14:38就开始报错无法归档。
在 alert_cqtmdb.log 中可见从 11 月 25 日 14:38 起反复出现:
All Archive destinations made inactive due to error 742Archival stopped, error occurred. Will continue retrying- 同样的错误栈:
ORA-16038 + ORA-00742 + ORA-00312 redo04.log
结论:归档从 11/25 就卡住,只是到 11/28 前台才集中爆出 ORA-00257。
[oracle@cmscqtmdb backup]$ vi /data/app/oracle/diag/rdbms/cqtmdb/cqtmdb/trace/alert_cqtmdb.log
Tue Nov 25 13:53:49 2025
Archived Log entry 124910 added for thread 1 sequence 235877 ID 0x70ed81a5 dest 1:
Tue Nov 25 14:38:54 2025
Thread 1 advanced to log sequence 235879 (LGWR switch)
Current log# 6 seq# 235879 mem# 0: /data/app/oracle/oradata/cqtmdb/redo06.log
Tue Nov 25 14:38:55 2025
ARC2: All Archive destinations made inactive due to error 742
ARC2: Closing local archive destination LOG_ARCHIVE_DEST_1: '/data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmqy3q_.arc' (error 742) (cqtmdb)
Committing creation of archivelog '/data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmqy3q_.arc' (error 742)
Deleted Oracle managed file /data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmqy3q_.arc
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance cqtmdb - Archival Error
ORA-16038: log 4 sequence# 235878 cannot be archived
ORA-00742: Log read detects lost write in thread %d sequence %d block %d
ORA-00312: online log 4 thread 1: '/data/app/oracle/oradata/cqtmdb/redo04.log'
Tue Nov 25 14:38:56 2025
ARC3: All Archive destinations made inactive due to error 742
ARC3: Closing local archive destination LOG_ARCHIVE_DEST_1: '/data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr0dq_.arc' (error 742) (cqtmdb)
Committing creation of archivelog '/data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr0dq_.arc' (error 742)
Deleted Oracle managed file /data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr0dq_.arc
Tue Nov 25 14:38:58 2025
ARC0: All Archive destinations made inactive due to error 742
ARC0: Closing local archive destination LOG_ARCHIVE_DEST_1: '/data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr1ql_.arc' (error 742) (cqtmdb)
Committing creation of archivelog '/data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr1ql_.arc' (error 742)
Deleted Oracle managed file /data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr1ql_.arc
ARC2: All Archive destinations made inactive due to error 742
ARC2: Closing local archive destination LOG_ARCHIVE_DEST_1: '/data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr3ns_.arc' (error 742) (cqtmdb)
Committing creation of archivelog '/data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr3ns_.arc' (error 742)
Deleted Oracle managed file /data/app/oracle/fast_recovery_area/CQTMDB/archivelog/2025_11_25/o1_mf_1_235878_nlbmr3ns_.arc
ARC3: All Archive destinations made inactive due to error 742
至此,问题已经清晰如下:
根因:online redo log 4(/data/…/redo04.log)损坏/出现 lost write,导致 sequence 235878 无法归档。
→ ARCn 持续失败并将归档目的地置 inactive
→ redo 无法顺利归档/切换
→ 最终前台报 ORA-00257
三、修复方案与操作步骤
3.1 风险命令提示
alter database clear unarchived logfile group 4;
这条命令的含义是:强制清除并重建该日志组,即便它未归档。
风险与前提:
- ✅ 前提:日志组必须是 INACTIVE(已查询确认)
- ⚠️ 风险:会导致该序列对应的 redo 无法再通过归档用于介质恢复;如果有 Data Guard/备库,更要谨慎评估(否则备库可能断链)
由于你在操作前确认 group 4 状态为 INACTIVE,且系统已无法归档该组,不是Data Guard环境,这是典型可用场景。
3.2 操作步骤
3.2.1 确认日志组状态
确认 group 4 状态为 INACTIVE,且 archived=NO。确认在线重做日志大小
[oracle@cmscqtmdb backup]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Fri Nov 28 18:53:09 2025
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
4 235878 NO INACTIVE
5 235966 NO CURRENT
6 235965 YES INACTIVE
SQL> select group#, member from v$logfile;
GROUP#
----------
MEMBER
--------------------------------------------------------------------------------
4
/data/app/oracle/oradata/cqtmdb/redo04.log
5
/data/app/oracle/oradata/cqtmdb/redo05.log
6
/data/app/oracle/oradata/cqtmdb/redo06.log
SQL> select group#, bytes, status from v$log;
GROUP# BYTES STATUS
---------- ---------- ----------------
4 1073741824 INACTIVE
5 1073741824 CURRENT
6 1073741824 INACTIVE
SQL>
3.2.2 先新增日志组(避免日志组数量不足导致更难切换)
先扩了两组:
SQL> alter database add logfile group 7 '/data/app/oracle/oradata/cqtmdb/redo07.log' size 1g;
Database altered.
SQL> alter database add logfile group 8 '/data/app/oracle/oradata/cqtmdb/redo08.log' size 1g;
Database altered.
SQL> select group#, bytes, status from v$log;
GROUP# BYTES STATUS
---------- ---------- ----------------
4 1073741824 INACTIVE
5 1073741824 CURRENT
6 1073741824 INACTIVE
7 1073741824 UNUSED
8 1073741824 UNUSED
SQL>
3.2.3 尝试 drop 失败
这一步失败是正常的:Oracle 不允许直接 drop “需要归档”的日志组。
SQL> alter database drop logfile group 4;
alter database drop logfile group 4
*
ERROR at line 1:
ORA-00350: log 4 of instance cqtmdb (thread 1) needs to be archived
ORA-00312: online log 4 thread 1: '/data/app/oracle/oradata/cqtmdb/redo04.log'
SQL>
3.2.4 清除未归档日志组(核心修复)
清理后我们可以查询group 4 状态为UNUSED。
SQL> alter database clear unarchived logfile group 4;
Database altered.
SQL> select group#, bytes, status from v$log;
GROUP# BYTES STATUS
---------- ---------- ----------------
4 1073741824 UNUSED
5 1073741824 INACTIVE
6 1073741824 INACTIVE
7 1073741824 CURRENT
8 1073741824 UNUSED
SQL>
3.2.5 drop 损坏日志组
SQL> alter database drop logfile group 4;
Database altered.
SQL> select group#, bytes, status from v$log;
GROUP# BYTES STATUS
---------- ---------- ----------------
5 1073741824 INACTIVE
6 1073741824 INACTIVE
7 1073741824 CURRENT
8 1073741824 UNUSED
SQL>
3.2.6 切换与 checkpoint 验证恢复正常
alter system switch logfile;能成功select * from v$log;日志可轮转,未再卡在某个序列- alert 日志不再出现:
All Archive destinations made inactive due to error 742ORA-16038/ORA-00742/ORA-00312
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> alter system checkpoint;
System altered.
SQL> select group#, bytes, status from v$log;
GROUP# BYTES STATUS
---------- ---------- ----------------
5 1073741824 INACTIVE
6 1073741824 CURRENT
7 1073741824 INACTIVE
8 1073741824 INACTIVE
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
5 236026 NO CURRENT
6 236025 YES INACTIVE
7 236023 YES INACTIVE
8 236024 YES INACTIVE
SQL>
四、复盘与预防
4.1 预防建议
- redo 多成员 multiplexing:同一组 redo 配置多个 member,放不同磁盘/存储路径(降低单文件损坏风险)
- 监控归档失败:对
ORA-16038/ORA-00257、v$archive_dest_status的 error 状态做告警 - 存储侧排查:
lost write往往指向 IO/存储/文件系统层问题,建议同步存储团队做底层健康检查
4.2 本次经验
ORA-00257 不要只盯“空间”,一定要沿着 RMAN/alert 的错误栈 把归档链路追到 具体日志组/具体文件。
五、总结
本次 ORA-00257 的根因并非归档空间不足,而是 redo04.log 出现 ORA-00742 lost write 导致归档无法推进;通过新增日志组、clear unarchived logfile 清除损坏组并 drop,最终恢复日志切换和归档。该操作有效但存在“丢失未归档 redo”风险,操作前需确认日志组状态、备份与(如有)备库影响。




