Oracle数据库的归档日志(Archive Log)是重做日志文件在被覆盖之前的完整副本,它是数据恢复的最后一道防线。而归档日志文件叫什么名字、放在哪个目录,很大程度上由初始化参数LOG_ARCHIVE_FORMAT决定。这个参数的作用就是定义归档日志文件的命名模板,Oracle会按照模板中的格式变量生成实际的文件名。如果这个参数配置不当,轻则日志文件难以辨认,重则出现归档进程报错、日志无法写入的问题,尤其在RAC集群环境下还可能引发节点之间文件名冲突。本文将围绕LOG_ARCHIVE_FORMAT的格式变量、配置方法和实际使用中的注意事项展开详细说明。

LOG_ARCHIVE_FORMAT参数的基本原理
LOG_ARCHIVE_FORMAT是一个静态初始化参数,定义在参数文件(spfile或pfile)中,修改后需要重启数据库实例才能生效。它的默认值与操作系统有关,在Linux平台下通常是%t_%s_%r.dbf,在Windows平台下则类似ARC%S_%R.%T这样的形式。这个参数只有在数据库处于归档模式(ARCHIVELOG MODE)下才有实际意义,非归档模式下设置它不会产生任何效果。
Oracle在生成归档文件时,会把格式串中的变量替换成真实数值。理解每个变量的含义是正确配置的前提,下面是官方支持的全部格式变量:
| 变量 | 含义 | 取值特点 |
|---|---|---|
| %s | 日志序列号(log sequence number) | 从数据库创建起连续递增,不会重复 |
| %S | 日志序列号,固定长度 | 左侧补零,例如0000000123 |
| %t | 线程号(thread number) | 单实例恒为1,RAC环境下为节点实例号 |
| %T | 线程号,固定长度 | 左侧补零 |
| %r | 数据库incarnation的resetlogs ID | 执行RESETLOGS后会变化 |
| %R | resetlogs ID,固定长度 | 左侧补零 |
| %d | 数据库ID(DBID) | 同一数据库的所有副本相同 |
| %D | 数据库ID,固定长度 | 左侧补零 |
其中%s、%t、%r这三个变量最常用,也是Oracle官方明确建议必须包含的组合。原因在于:%s保证序列号不重复,%t区分RAC不同线程产生的日志,%r则用于区分数据库经历RESETLOGS操作前后的不同生命周期。少了任何一个,都可能出现归档文件同名覆盖的风险。
单实例与RAC环境下的配置方法
查看当前参数值很简单,通过SQL查询即可:
-- 查看归档相关参数 SHOW PARAMETER LOG_ARCHIVE_FORMAT; -- 修改归档文件名格式(静态参数,需要scope=spfile并重启) ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='arch_%t_%s_%r.arc' SCOPE=SPFILE; -- 重启实例后生效 SHUTDOWN IMMEDIATE; STARTUP;
对于单实例数据库,配置相对随意,只要保证文件名唯一即可。比如arch_%s.arc在单实例下也能正常工作,因为序列号本身就不会重复。但并不推荐这么写,一旦日后数据库执行过RESETLOGS,或者单实例升级为RAC,旧的命名规则就可能带来隐患。养成都写全三个变量的习惯,可以省去后续很多麻烦。
RAC环境下要求则严格得多。Oracle明确规定,如果数据库启用了集群(cluster_database=true),LOG_ARCHIVE_FORMAT中必须包含%s或%S、%t或%T、%r或%R中的各至少一个,否则实例启动时会直接报ORA-19905错误,提示归档格式中缺少必要的变量。这是因为多个节点并行产生归档日志,如果不通过线程号区分,两个节点很可能对同一个日志序列写出同名文件,互相覆盖导致日志丢失。例如以下配置在RAC中是合规的:
-- RAC环境推荐的归档命名格式 ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='arc_%t_%s_%r.arc' SCOPE=SPFILE;
另外需要注意的是,LOG_ARCHIVE_FORMAT只定义文件名,不定义路径。归档路径由LOG_ARCHIVE_DEST_n系列参数控制,两个参数配合使用。文件名中的变量在写入时会根据实际值展开,所以建议在格式串中使用下划线或点号分隔变量,便于人工识别,例如1_1234_1142345678.arc一眼就能看出线程1、序列1234。
常见问题排查与最佳实践
配置归档格式时最常见的报错是ORA-19905,通常发生在将单实例数据库转成RAC,或者克隆数据库后参数文件没有同步修改的场景。解决方法就是确认格式串中包含全部必需变量,修改后重启实例。另一个常见问题是大小写变量混用导致的困惑:%s和%S生成的序列号数值相同,区别仅在于是否补零对齐。补零格式的优势是文件名按名称排序时与按时间排序一致,方便脚本批量处理,所以在自动化归档备份脚本中很多人偏好大写形式。
还有一个容易忽视的细节是incarnation与%r的关系。数据库每次执行不完全恢复后的ALTER DATABASE OPEN RESETLOGS,incarnation就会递增,%r的值随之改变。如果不包含%r,RESETLOGS之后新产生的归档文件序列号会从1重新计数,与旧的归档文件同名,造成覆盖。这也解释了为什么Oracle从10g开始强制要求包含%r,早期版本中这个问题曾导致大量数据丢失事故。
日常运维中可以结合以下方式检查归档情况:
-- 查看归档日志的生成情况 SELECT THREAD#, SEQUENCE#, FIRST_TIME, NAME FROM V$ARCHIVED_LOG WHERE DEST_ID = 1 ORDER BY SEQUENCE# DESC; -- 检查归档目录空间 SELECT * FROM V$RECOVERY_FILE_DEST;
总结几条实践建议:第一,无论单实例还是RAC,统一使用包含%t、%s、%r(或其大写补零版本)的格式,保持命名规范一致;第二,归档目录要与其他数据文件分开存放,最好挂在独立磁盘上,避免归档写满影响数据库运行;第三,修改该参数前先确认当前使用的是spfile还是pfile,pfile环境下直接编辑init文件即可;第四,在DG(Data Guard)环境中,主库和备库的归档格式可以不同,但备库接收的归档文件名由FAL参数和主库格式共同决定,排查日志应用问题时要把这一点考虑进去。掌握这些细节,归档日志的管理就会变得清晰有序。
LOG_ARCHIVE_FORMAT归档日志Oracle数据库修改时间:2026-09-04 09:20:48