修改LOG_ARCHIVE_FORMAT前必须停用归档模式,因其为静态参数,需先执行ALTER DATABASE NOARCHIVELOG,再重启并修改;合法占位符仅%t、%s、%r、%d;旧归档文件名不会自动更新,需人工处理。
修改 LOG_ARCHIVE_FORMAT 前必须停用归档模式
oracle 不允许在数据库处于 archivelog 模式下直接修改 log_archive_format。这不是权限或语法问题,而是内核限制:该参数属于静态初始化参数(static),修改后必须重启实例才生效,且重启前必须先切出归档模式,否则 alter system set log_archive_format=... 会报错 ora-02095: specified initialization parameter cannot be modified。
- 先执行
SHUTDOWN IMMEDIATE - 启动到
MOUNT状态:STARTUP MOUNT - 关闭归档:
ALTER DATABASE NOARCHIVELOG - 再
SHUTDOWN IMMEDIATE,才能编辑spfile或pfile
LOG_ARCHIVE_FORMAT 的合法占位符只有四个
很多人试过 %t、%d、%r、%s 以外的符号(比如 %Y、%H、%i),结果归档失败,ARCH 进程挂起,v$archive_dest 显示 ERROR 状态。Oracle 只认这四个:
-
%t:数据库线程号(thread#),单机库通常是1 -
%s:归档日志序列号(log sequence#),每次切换日志递增 -
%r:RESETLOGS ID,防止不同 incarnation 的归档日志文件名冲突 -
%d:数据库唯一名(db_unique_name),不是db_name
示例合法值:'arch_%t_%s_%r.dbf';错误写法:'arch_%Y%m%d_%s.log' —— %Y 会被原样保留,导致生成的路径含非法字符,归档写入失败。
改完参数后,归档路径里旧格式文件不会自动重命名
修改 LOG_ARCHIVE_FORMAT 并重启进 ARCHIVELOG 模式后,新生成的归档日志按新格式命名,但之前已存在的老归档文件仍保持旧名。RMAN 不会因此报错,但如果你依赖文件名解析做清理或同步(比如用 shell 脚本按日期或序列号删旧归档),逻辑可能突然失效。
- RMAN 备份时只看
CONTROLFILE记录的归档信息,不依赖文件名,所以备份不受影响 - 但
LIST ARCHIVELOG ALL输出的文件路径,和磁盘上实际文件名不一致时,人工核对容易漏掉或误删 - 如果用了 Data Guard,备库的
LOG_ARCHIVE_DEST_n路径若硬编码了旧格式,需同步调整,否则传输中断
使用 spfile 修改时,注意引号和大小写敏感性
通过 ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='arch_%t_%s_%r.dbf' SCOPE=SPFILE; 设置时,单引号必须存在,且内容区分大小写(尤其扩展名)。Oracle 会原样保存字符串,不自动补 .dbf 或转小写。
- 写成
'ARCH_%T_%S_%R.DBF'会导致归档文件全大写,某些脚本或 NFS 挂载点(如 Linux ext4 默认大小写敏感)可能无法匹配 - 漏掉单引号,语句直接报错
ORA-00922: missing or invalid option - 改完别忘了
CREATE PFILE FROM SPFILE;备份当前配置,避免重启失败后无法回退
最麻烦的是:改完没清空 DB_RECOVERY_FILE_DEST 里的旧归档,又没关自动删除策略,新旧混杂下,FLASHBACK 或 RESTORE 时控制文件可能引用不到正确文件——这事没法靠参数修复,得靠归档生命周期管理意识。










