当前位置: 首页 > news >正文

【Oracle数据库指南】第32篇:Oracle归档日志管理与LogMiner日志分析

上一篇【第31篇】Oracle重做日志文件管理操作详解
下一篇【第33篇】Oracle表管理与分区表详解


摘要

归档日志(Archive Log)是Oracle数据库实现时间点恢复的核心机制,也是数据库备份恢复策略的重要组成部分。本文详细讲解归档模式的开启与配置、归档目标的设置、归档日志的监控与管理,以及Oracle内置的日志挖掘工具 LogMiner(DBMS_LOGMNR)的使用方法——通过分析重做/归档日志来追踪历史SQL操作,是DBA审计、排错和数据恢复的利器。


一、归档模式概述

1.1 非归档模式 vs 归档模式

特性非归档模式(NOARCHIVELOG)归档模式(ARCHIVELOG)
数据安全性只能恢复到最近一次完整备份可以恢复到任意时间点
在线热备份不支持支持
日志使用循环覆盖(旧日志被覆盖)旧日志在归档后才能覆盖
磁盘要求较低较高(需要存储归档文件)
适用场景开发/测试环境生产环境(必须)

结论:生产数据库必须开启归档模式。

1.2 检查当前模式

-- 查看当前日志模式SELECTname,log_modeFROMv$database;-- LOG_MODE = 'ARCHIVELOG' 或 'NOARCHIVELOG'-- 也可以查看参数SHOWPARAMETER log_archive_dest_1;

二、切换归档模式

2.1 从非归档切换到归档模式

-- 步骤1:关闭数据库(需要正常关闭)SHUTDOWNIMMEDIATE;-- 步骤2:启动到 MOUNT 状态(不打开数据文件)STARTUP MOUNT;-- 步骤3:切换到归档模式ALTERDATABASEARCHIVELOG;-- 步骤4:打开数据库ALTERDATABASEOPEN;-- 步骤5:验证SELECTlog_modeFROMv$database;-- LOG_MODE = ARCHIVELOG-- 步骤6:手动切换一次日志,测试归档是否正常工作ALTERSYSTEM SWITCH LOGFILE;ALTERSYSTEM ARCHIVE LOGALL;-- 步骤7:查看归档日志是否生成SELECTname,sequence#, archived, appliedFROMv$archived_logORDERBYsequence# DESCFETCHFIRST5ROWSONLY;

2.2 从归档模式切换回非归档模式(不推荐)

SHUTDOWNIMMEDIATE;STARTUP MOUNT;ALTERDATABASENOARCHIVELOG;ALTERDATABASEOPEN;

三、归档目标配置

3.1 本地归档目标

-- 设置本地归档目标ALTERSYSTEMSETLOG_ARCHIVE_DEST_1='LOCATION=/u03/archive/testdb'SCOPE=BOTH;-- 设置归档文件命名格式ALTERSYSTEMSETLOG_ARCHIVE_FORMAT='testdb_%t_%s_%r.arc'SCOPE=SPFILE;-- %t = 线程号, %s = 序列号, %r = 重置日志ID-- 设置并行归档进程数ALTERSYSTEMSETLOG_ARCHIVE_MAX_PROCESSES=4SCOPE=BOTH;

3.2 使用快速恢复区(FRA)作为归档目标

-- 配置FRA作为归档目标(推荐,Oracle自动管理文件)ALTERSYSTEMSETDB_RECOVERY_FILE_DEST='/u04/fast_recovery_area'SCOPE=BOTH;ALTERSYSTEMSETDB_RECOVERY_FILE_DEST_SIZE=50G SCOPE=BOTH;-- 将LOG_ARCHIVE_DEST_1设置为USE_DB_RECOVERY_FILE_DESTALTERSYSTEMSETLOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST'SCOPE=BOTH;

3.3 多个归档目标

-- 同时归档到多个位置(本地 + 远程)ALTERSYSTEMSETLOG_ARCHIVE_DEST_1='LOCATION=/u03/archive/testdb MANDATORY'-- 本地,必须成功SCOPE=BOTH;ALTERSYSTEMSETLOG_ARCHIVE_DEST_2='SERVICE=standby_db ASYNC'-- 远程备库,异步SCOPE=BOTH;-- 设置归档最小成功数(至少1个目标成功归档才允许日志切换)ALTERSYSTEMSETLOG_ARCHIVE_MIN_SUCCEED_DEST=1SCOPE=BOTH;

四、归档日志监控

4.1 查看归档状态

-- 查看最近的归档日志SELECTsequence#, name, first_time, next_time,blocks*block_size/1024/1024ASsize_mb,archived,deletedFROMv$archived_logWHEREarchived='YES'ORDERBYsequence# DESCFETCHFIRST20ROWSONLY;-- 查看归档目标状态SELECTdest_id,dest_name,status,target,archiver,scheduleFROMv$archive_dest_statusWHEREstatus!='INACTIVE';-- 查看今日归档量SELECTTRUNC(completion_time,'HH')AShour,COUNT(*)ASfiles,SUM(blocks*block_size)/1024/1024AStotal_mbFROMv$archived_logWHEREcompletion_time>TRUNC(SYSDATE)ANDarchived='YES'GROUPBYTRUNC(completion_time,'HH')ORDERBY1;

4.2 归档目录空间监控

-- 查看FRA空间使用情况SELECTspace_limit/1024/1024/1024ASlimit_gb,space_used/1024/1024/1024ASused_gb,ROUND(space_used/space_limit*100,2)ASused_pct,space_reclaimable/1024/1024/1024ASreclaimable_gbFROMv$recovery_file_dest;-- 查看FRA中各类型文件占用SELECTfile_type,number_of_files,percent_space_used,percent_space_reclaimableFROMv$recovery_area_usage;

4.3 清理过期归档日志

# 使用RMAN删除过期归档(推荐方式)rman target /<<EOF -- 删除所有已备份的归档日志 DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK; -- 删除超过保留窗口的归档日志 DELETE NOPROMPT OBSOLETE; -- 删除7天前的归档日志 DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7'; EOF

五、LogMiner——日志挖掘工具

5.1 LogMiner 概述

LogMiner 是 Oracle 内置的日志分析工具(通过DBMS_LOGMNR包调用),可以从重做/归档日志中提取出历史 SQL 语句,用于:

  • 数据审计:追踪谁在什么时间修改了什么数据
  • 误操作恢复:找到误删/误改前的原始数据(生成 UNDO SQL)
  • 故障诊断:分析复制延迟、数据不一致等问题
  • 数据同步:基于日志的增量同步(OGG 等工具的底层原理)

5.2 LogMiner 使用前提

-- 前提1:启用附加日志(Supplemental Logging),以获取足够的信息-- 查看当前状态SELECTsupplemental_log_data_min,supplemental_log_data_pkFROMv$database;-- 启用最小附加日志(必须)ALTERDATABASEADDSUPPLEMENTAL LOGDATA;-- 启用主键附加日志(推荐,记录WHERE条件中的主键值)ALTERDATABASEADDSUPPLEMENTAL LOGDATA(PRIMARYKEY)COLUMNS;-- 前提2:需要对 V$LOGMNR_CONTENTS 有查询权限(DBA 用户默认有)GRANTSELECTONv_$logmnr_contentsTOlogminer_user;GRANTEXECUTEONDBMS_LOGMNRTOlogminer_user;GRANTEXECUTEONDBMS_LOGMNR_DTOlogminer_user;

5.3 提取数据字典

-- 方法1:将数据字典提取到日志文件(在线数据库)EXECUTEDBMS_LOGMNR_D.BUILD(DICTIONARY_FILENAME=>'logmnr_dict.ora',DICTIONARY_LOCATION=>'/tmp');-- 方法2:使用重做日志自带字典(ONLINE_CATALOG,最简单)-- 直接在 START_LOGMNR 时指定 DICT_FROM_ONLINE_CATALOG 选项

5.4 分析在线重做日志(实时查看)

-- 步骤1:添加要分析的日志文件EXECUTEDBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME=>'/u01/redo1/redo01a.log',OPTIONS=>DBMS_LOGMNR.NEW);-- 步骤2:启动 LogMiner(使用在线数据字典,最方便)EXECUTEDBMS_LOGMNR.START_LOGMNR(OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);-- 步骤3:查询 LogMiner 内容SELECTSCN,TIMESTAMP,SEG_OWNER,SEG_NAME,OPERATION,SQL_REDO,SQL_UNDO,USERNAME,SESSION#FROMv$logmnr_contentsWHERESEG_OWNER='SCOTT'ANDSEG_NAME='EMP'ORDERBYSCN;-- 步骤4:关闭 LogMinerEXECUTEDBMS_LOGMNR.END_LOGMNR;

5.5 分析归档日志(历史数据分析)

-- 分析特定时间段内的历史操作EXECUTEDBMS_LOGMNR.START_LOGMNR(STARTTIME=>TO_DATE('2024-01-15 09:00:00','YYYY-MM-DD HH24:MI:SS'),ENDTIME=>TO_DATE('2024-01-15 10:30:00','YYYY-MM-DD HH24:MI:SS'),OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.CONTINUOUS_MINE+-- 自动追加归档日志DBMS_LOGMNR.COMMITTED_DATA_ONLY-- 只显示已提交的事务);-- 查询:找出指定时间段内对EMP表的所有DML操作SELECTTO_CHAR(TIMESTAMP,'HH24:MI:SS')AStime,USERNAME,OPERATION,SQL_REDO,SQL_UNDOFROMv$logmnr_contentsWHERESEG_OWNER='SCOTT'ANDSEG_NAME='EMP'ANDOPERATIONIN('INSERT','UPDATE','DELETE')ORDERBYSCN;EXECUTEDBMS_LOGMNR.END_LOGMNR;

5.6 实战案例:找回误删的数据

-- 场景:2024-01-15 10:00 有人执行了 DELETE FROM scott.emp WHERE deptno=20-- 需要恢复被删除的数据-- 步骤1:启动LogMiner,分析删除操作前后的时间段EXECUTEDBMS_LOGMNR.START_LOGMNR(STARTTIME=>TO_DATE('2024-01-15 09:50:00','YYYY-MM-DD HH24:MI:SS'),ENDTIME=>TO_DATE('2024-01-15 10:10:00','YYYY-MM-DD HH24:MI:SS'),OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.CONTINUOUS_MINE+DBMS_LOGMNR.COMMITTED_DATA_ONLY);-- 步骤2:提取被删除数据的 SQL_UNDO(即 INSERT 语句)SELECTSQL_UNDOFROMv$logmnr_contentsWHERESEG_OWNER='SCOTT'ANDSEG_NAME='EMP'ANDOPERATION='DELETE'ORDERBYSCN;-- 步骤3:SQL_UNDO 的内容就是 INSERT 语句,执行它恢复数据-- insert into "SCOTT"."EMP"("EMPNO","ENAME","JOB","SAL","DEPTNO")-- values ('7369','SMITH','CLERK',800,20);-- ...(逐行执行)EXECUTEDBMS_LOGMNR.END_LOGMNR;

六、LogMiner 输出字段说明

字段说明
SCN系统变更号,用于排序事务顺序
TIMESTAMP操作时间
OPERATIONDML操作类型(INSERT/UPDATE/DELETE/DDL等)
SEG_OWNER对象所属用户
SEG_NAME对象名(表名等)
SQL_REDO重做SQL(操作本身)
SQL_UNDO撤销SQL(操作的逆操作,用于恢复数据)
USERNAME执行操作的数据库用户
SESSION#会话号
COMMIT_SCN提交SCN

七、最佳实践

  1. 生产环境必须开启归档模式:无归档 = 无法做时间点恢复
  2. 配置多个归档目标:本地 + FRA,提高可靠性
  3. 监控归档目录空间:FRA 使用率超过80%时告警
  4. 定期清理归档日志:用RMAN DELETE,不要手工删除(会影响恢复目录)
  5. 提前开启附加日志:生产环境预先启用 SUPPLEMENTAL LOG DATA,方便事后分析
  6. LogMiner 使用完毕及时关闭:END_LOGMNR 释放资源

八、总结

归档日志管理与LogMiner的核心要点:

  1. 归档模式:生产必须开启,支持热备和时间点恢复
  2. 切换方式:SHUTDOWN → STARTUP MOUNT → ALTER DATABASE ARCHIVELOG → OPEN
  3. 归档目标:本地目录或FRA,支持多个目标
  4. 监控:关注归档频率、FRA空间使用
  5. LogMiner:分析日志、找回误操作数据、生成 SQL_UNDO
  6. 附加日志:LogMiner 准确工作需开启 SUPPLEMENTAL LOG DATA

上一篇【第31篇】Oracle重做日志文件管理操作详解
下一篇【第33篇】Oracle表管理与分区表详解


参考资料

  • 《Oracle 11g数据库管理员指南》— 刘宪军著
  • Oracle官方文档:Database Administrator’s Guide - Managing Archived Redo Log Files
  • Oracle官方文档:Database Utilities - Using LogMiner to Analyze Redo Log Files
http://www.jsqmd.com/news/811693/

相关文章:

  • 5月13号
  • 告别裸机轮询:用STM32CubeMX+外部中断实现高效按键响应(附F072工程源码)
  • OLED内卷之王?微星MPG 271QR QD-OLED X50流光到底值不值得买
  • RAG系统落地秘籍:一张图看懂5大模块如何构建高效问答平台!
  • 第九届河北省大学生程序设计竞赛 L题思路分享(数学,三阶差分)
  • 【Oracle数据库指南】第35篇:Oracle特殊对象——簇与索引组织表(IOT)
  • 乌海豆包AI推广找哪家?宁夏壹山网络全域AI营销实力甄选 - 宁夏壹山网络
  • Confluence数据迁移踩坑实录:从物理机到K8s集群,我是如何无损迁移200G知识库的?
  • 深度解析:城通网盘直连地址获取技术方案
  • 告别裸奔MCU!手把手教你用OSAL调度器重构STM32项目(附看门狗实战)
  • GPT-4 Turbo访问权、优先响应、高级数据分析——ChatGPT Plus五大隐藏权益深度拆解,92%用户根本没用全
  • 2026实测|10款去AI痕迹工具红黑榜 - 殷念写论文
  • Taotoken在数据预处理与分析脚本中调用大模型的集成案例
  • Anthropic Claude Haiku 4.5 安全突破:勒索行为从96%降至0%
  • 基于MCP协议构建AI驱动的Upwork自动化工作流:从工具化接口到安全实践
  • 在虚拟机中快速部署大模型调用环境,使用Taotoken稳定接入OpenAI兼容API
  • 语义层不能只剩指标和维度:Data Agent 时代,企业到底该建什么?
  • 3D打印定制外壳:从设计到实战,为开源硬件打造专属保护方案
  • 如何3分钟彻底清理Zotero文献库重复条目:智能合并插件终极指南
  • 3个技巧快速掌握加密压缩包密码找回:ArchivePasswordTestTool新手指南
  • 3步搞定安卓应用Windows安装:告别臃肿模拟器的终极解决方案
  • 14602开源|黄大年茶思屋第146期第二题:支持采集内容运动的静态3DGS重建
  • 为AI编程助手构建本地知识库:YAP项目实战指南
  • 邀请有礼:把好用的 AI 工具分享出去,和朋友一起拿积分
  • Anthropic ARR突破440亿美元:Q1营收同比增长80倍深度分析
  • 微信聊天记录永久保存:免费开源工具WeChatExporter完整使用指南
  • EtherCAT PDO映射避坑指南:从XML到STM32代码,搞定那‘多出来’的16位变量
  • 三维风场可视化终极指南:用Cesium-Wind轻松创建动态气象展示
  • Cursor Pro破解工具:3分钟快速激活高级功能的终极方案
  • BK3633深度睡眠功耗实测:如何配置到1uA并保持定时器工作(避坑指南)