【Oracle数据库指南】第31篇:Oracle重做日志文件管理操作详解

张开发
2026/5/13 16:00:21 15 分钟阅读

分享文章

【Oracle数据库指南】第31篇:Oracle重做日志文件管理操作详解
上一篇【第30篇】Oracle重做日志规划与配置详解下一篇【第32篇】Oracle归档日志管理与LogMiner日志分析摘要在Oracle数据库的日常运维中DBA经常需要对重做日志文件进行维护操作包括调整日志文件大小需删除旧组、创建新组、移动日志文件到新路径、清除损坏的日志文件、以及处理日志文件相关的各种故障。本文以操作流程为核心讲解重做日志文件的完整管理操作并附带常见问题的处理方案。一、查看当前日志配置-- 查看日志组状态SELECTgroup#, thread#, sequence#, bytes/1024/1024 AS size_mb,members,archived,statusFROMv$logORDERBYgroup#;-- 查看日志文件成员SELECTgroup#, status, member, is_recovery_dest_fileFROMv$logfileORDERBYgroup#, member;-- 查看日志切换历史SELECTsequence#, first_time, next_time,ROUND((next_time-first_time)*24*60,2)ASduration_minFROMv$log_historyORDERBYsequence# DESCFETCHFIRST10ROWSONLY;二、调整日志文件大小Oracle不支持直接修改现有日志文件的大小只能通过新增大日志组→删除旧小日志组的方式来完成大小调整。2.1 调整流程概述当前配置3个日志组每组100MB太小 目标配置3个日志组每组300MB 操作步骤 1. 添加3个新的300MB日志组GROUP 4/5/6 2. 切换日志让当前使用新日志组 3. 等待旧日志组变为INACTIVE 4. 删除旧日志组GROUP 1/2/32.2 完整操作步骤-- 步骤1查看当前配置SELECTgroup#, bytes/1024/1024 AS mb, status FROM v$log;-- 步骤2添加新日志组300MBALTERDATABASEADDLOGFILEGROUP4(/u01/redo1/redo04a.log,/u02/redo2/redo04b.log)SIZE300M;ALTERDATABASEADDLOGFILEGROUP5(/u01/redo1/redo05a.log,/u02/redo2/redo05b.log)SIZE300M;ALTERDATABASEADDLOGFILEGROUP6(/u01/redo1/redo06a.log,/u02/redo2/redo06b.log)SIZE300M;-- 步骤3手动切换日志让 CURRENT 依次切换到新日志组ALTERSYSTEM SWITCH LOGFILE;-- 切换到下一个组ALTERSYSTEM SWITCH LOGFILE;ALTERSYSTEM SWITCH LOGFILE;-- 多切换几次确保旧日志组都变为 INACTIVE-- 步骤4确认旧日志组状态必须为 INACTIVESELECTgroup#, status FROM v$log;-- 若有 ACTIVE 状态等待归档完成后再检查-- 强制归档归档模式下ALTER SYSTEM ARCHIVE LOG ALL;-- 步骤5删除旧日志组INACTIVE 状态才能删除ALTERDATABASEDROPLOGFILEGROUP1;ALTERDATABASEDROPLOGFILEGROUP2;ALTERDATABASEDROPLOGFILEGROUP3;-- 步骤6在操作系统中删除物理文件-- rm /u01/redo1/redo01a.log /u02/redo2/redo01b.log-- rm /u01/redo1/redo02a.log /u02/redo2/redo02b.log-- rm /u01/redo1/redo03a.log /u02/redo2/redo03b.log-- 步骤7验证最终配置SELECTgroup#, bytes/1024/1024 AS mb, status FROM v$log;三、移动日志文件改变路径3.1 在线状态下移动成员-- 先为需要移动的日志组添加新位置的成员ALTERDATABASEADDLOGFILE MEMBER/u03/redo3/redo01c.logTOGROUP1;-- 等待新成员状态从 INVALID 变为正常同步后自动变为空SELECTgroup#, member, status FROM v$logfile;-- 删除旧位置的成员ALTERDATABASEDROPLOGFILE MEMBER/u01/redo1/redo01a.log;-- 删除操作系统文件-- rm /u01/redo1/redo01a.log3.2 通过MOUNT状态移动整体迁移-- 步骤1关闭数据库SHUTDOWNIMMEDIATE;-- 步骤2在操作系统中移动文件-- mv /u01/redo1/redo01a.log /u03/redo_new/redo01a.log-- mv /u02/redo2/redo01b.log /u04/redo_new/redo01b.log-- 移动所有日志文件-- 步骤3启动到MOUNT状态STARTUP MOUNT;-- 步骤4重命名日志文件路径ALTERDATABASERENAMEFILE/u01/redo1/redo01a.logTO/u03/redo_new/redo01a.log;ALTERDATABASERENAMEFILE/u02/redo2/redo01b.logTO/u04/redo_new/redo01b.log;-- 对每个成员逐一执行-- 步骤5打开数据库ALTERDATABASEOPEN;-- 步骤6验证SELECTgroup#, member FROM v$logfile ORDER BY group#, member;四、清除日志文件CLEAR LOGFILE当日志文件损坏导致数据库无法启动时可以使用ALTER DATABASE CLEAR LOGFILE清除重置日志文件-- 清除指定日志组重置日志内容该组日志不再可用-- 数据库处于 MOUNT 状态时执行-- 非归档模式或已归档ALTERDATABASECLEAR LOGFILEGROUP2;-- 归档模式但未归档跳过归档可能丢失数据ALTERDATABASECLEAR UNARCHIVED LOGFILEGROUP2;⚠️警告CLEAR UNARCHIVED LOGFILE会丢失该日志组中尚未归档的数据清除后应立即做全库备份此操作是非标准恢复只在无法正常归档时使用五、日志文件故障处理5.1 日志文件丢失INACTIVE 状态INACTIVE 状态的日志文件丢失影响最小-- 确认是 INACTIVE 状态SELECTgroup#, status, archived FROM v$log;-- 方案1直接清除该日志组安全ALTERDATABASECLEAR LOGFILEGROUP3;-- 方案2强制切换跳过该组ALTERSYSTEM SWITCH LOGFILE;5.2 日志文件丢失ACTIVE 状态ACTIVE 状态的日志文件丢失较危险需要数据库恢复# 需要从备份中恢复rman target /EOF STARTUP FORCE MOUNT; RESTORE DATABASE; RECOVER DATABASE; ALTER DATABASE OPEN RESETLOGS; EOF5.3 日志文件丢失CURRENT 状态最危险的情况必须进行恢复-- 尝试清除可能会丢失最近的事务数据ALTERDATABASECLEAR UNARCHIVED LOGFILEGROUP1;ALTERDATABASEOPENRESETLOGS;六、日志文件相关常见错误6.1 ORA-00313打开日志组错误ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: /u01/redo1/redo01a.log排查步骤# 检查文件是否存在、权限是否正确ls-la/u01/redo1/redo01a.log# 检查磁盘空间df-h/u01/redo1/6.2 ORA-16014归档失败日志无法清除ORA-16014: log 2 sequence# 100 not archived, no available destinations解决方案-- 检查归档目标SELECTdest_id,status,target,archiverFROMv$archive_dest_status;-- 临时切换归档目标ALTERSYSTEMSETLOG_ARCHIVE_DEST_1LOCATION/backup/archive_temp;ALTERSYSTEM ARCHIVE LOGALL;七、自动化脚本日志健康检查-- 日志状态巡检脚本SELECT 日志组状态 ASinfoFROMDUALUNIONALLSELECTgroup# || | || status || | ||bytes/1024/1024||MB | ||members||个成员FROMv$logUNIONALLSELECT 切换频率最近24小时 FROMDUALUNIONALLSELECTTO_CHAR(FIRST_TIME,HH24)||时 切换 ||cnt|| 次FROM(SELECTTO_CHAR(FIRST_TIME,YYYY-MM-DD HH24)ASFIRST_TIME,COUNT(*)AScntFROMv$log_historyWHEREFIRST_TIMESYSDATE-1GROUPBYTO_CHAR(FIRST_TIME,YYYY-MM-DD HH24)ORDERBY1DESCFETCHFIRST5ROWSONLY);八、总结重做日志文件管理的核心操作调整大小不能直接修改需添加新大组 → 切换日志 → 删除旧小组移动文件在线添加新成员 删除旧成员或 MOUNT 状态 RENAME清除日志CLEAR LOGFILE 用于损坏的 INACTIVE 日志CLEAR UNARCHIVED 慎用故障处理根据日志组状态INACTIVE/ACTIVE/CURRENT选择不同策略日常维护定期检查切换频率和日志等待事件上一篇【第30篇】Oracle重做日志规划与配置详解下一篇【第32篇】Oracle归档日志管理与LogMiner日志分析参考资料《Oracle 11g数据库管理员指南》— 刘宪军著Oracle官方文档Database Administrator’s Guide - Managing the Redo Log

更多文章