logminer

前两天发现评论表的在指定时间以前的数据都被删除,领导要知道是谁干的,但用户通过应用程序
删除也无法查到具体的人,因为数据库只记录和他直接相连的应用程序的信息,无法定位到客户端
的信息,但像我遇到的这样的情况,可能性大的就是个别人通过自己的pc机操作数据库,这时我们
就要靠oracle的logminer工具来分析日志了,下面我就来一起体验下logminer的威力吧,呵呵
步骤
1.数据库的supplemental的状态调整
2.创建数据库级别的触发器,用以记录客户的登录信息
3.安装logminer
4.创建logminer数据字典(如果没有创建数据自己,而是在线分析,看见的不是原始sql,而是
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>被oracle格式化的sql语句)<br> 5.添加需要分析的日志<br> 6.分析日志<br> 7.查看结果(v$logmnr_contents)<br><br> 一。<br> 前提准备:<br> 最好用sys用户,否则你要授权的<br> 要通过logminer查看到客户端的信息,我们就是查看v$database视图,看其supplemental_log_data_min的<br> 状态。<br> v$logmnr_contents中的客户端的信息。都是从v$session视图中读出的,要让v$session记录客户端的信息<br> 我们就要 设置<wbr><wbr>supplemental_log_data_min 为on<br> YES为打开状态,会记录session_info,username等信息<br> NO为关闭状态,不会记录sesion_info,username等信息<br><br> 1. 查看 supplemental 状态<br> SYS at skate&gt;<wbr><wbr>select name ,supplemental_log_data_min from v$database;<br> NAME<wbr><wbr><wbr><wbr><wbr><wbr>SUPPLEME<br> --------- --------<br> OMOVO<wbr><wbr><wbr><wbr>NO<br><br> 2. 修改supplemental的状态<br> SYS at skate&gt;<wbr><wbr>alter database add supplemental log data;<br> Database altered.<br><br> 3.确认supplemental的状态<br> SYS at skate&gt;<wbr><wbr>select<wbr><wbr>name,supplemental_log_data_min from v$database;<br> NAME<wbr><wbr><wbr><wbr><wbr><wbr>SUPPLEME<br> --------- --------<br> OMOVO<wbr><wbr><wbr><wbr>YES<br> 1 row selected.<br><br> 需要注意的是,这个参数信息是记录在控制文件的,所以10G数据库一旦被重建了控制文件,那么这个参数会再次恢复到缺省状态,也就是NO的状态。<br> 所以重建控制文件后,要记得修改这个参数<br><br> 二. 创建数据库级别的触发器<br> 若果要让v$logmnr_contents中的session_info记录客户端ip,但SESSION_INFO中我们并不能直接看到IP,<br> 不过我们还是有办法的,因为这个SESSION_INFO里面的内容其实是日志从V$SESSION视图里提取的,我们可以<br> 在生产数据库中创建一个追踪客户端IP地址的触发器:<br> create or replace trigger on_logon_trigger<br> after logon on database<br> begin<br> dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));<br> end;<br> /<br><br> 现在,我们就可以在V$SESSION视图的CLIENT_INFO列中看到新登录的客户端IP地址了。那么现在就可以在<br> session_info 中看客户端的ip了<br><br> 三。 安装logminer<br> 1.<br> logminer实际上是由两个pl/sql内建包(dbms_logmnr和dbms_logmnr_d)和4个v$动态性能视图组成的.<br> v$logmnr_logs<br> v$logmnr_contents<br> v$logmnr_parameters<br><wbr><wbr>安装logminer首先要以sys管理员的身份运行这个pl/sql脚本<br><wbr><wbr>sql&gt; conn /as sysdba<br><wbr><wbr>sql&gt; @/rdbms/admin/dbmslm.sql<br><wbr><wbr>sql&gt; @/rdbms/admin/dbmslmd.sql<br><br> 2. 修改参数 utl_file_dir参数<br> 这个参数是静态参数,修改后需要数据库,才会起作用,如果不重启数据库<br> 在创建数据字典时会报错,下面是创建的过程<br><br> SYS at skate&gt;<wbr><wbr>alter system set utl_file_dir=/home/oracle/logminerlog scope=spfile;<br> alter system set utl_file_dir=/home/oracle/logminerlog scope=spfile<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>*<br> ERROR at line 1:<br> ORA-02095: specified initialization parameter cannot be modified<br><br> SYS at skate&gt;<wbr><wbr>alter system set utl_file_dir='/home/oracle/logminerlog' scope=spfile;<br> System altered.<br> SYS at skate&gt;<wbr><wbr>exec dbms_logmnr_d.build(dictionary_filename=&gt;'logminer',dictionary_location=&gt;'/home/oracle/logminerlog');<br> BEGIN dbms_logmnr_d.build(dictionary_filename=&gt;'logminer',dictionary_location=&gt;'/home/oracle/logminerlog'); END;<br> *<br> ERROR at line 1:<br> ORA-01336: specified dictionary file cannot be opened<br> ORA-29280: invalid directory path<br> ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 3474<br> ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 3552<br> ORA-06512: at "SYS.DBMS_LOGMNR_D", line 12<br> ORA-06512: at line 1<br><br> SYS at skate&gt;<wbr><wbr>host mkdir /home/oracle/logminerlog<br> SYS at skate&gt;<wbr><wbr>exec dbms_logmnr_d.build(dictionary_filename=&gt;'logminer',dictionary_location=&gt;'/home/oracle/logminerlog');<br> BEGIN dbms_logmnr_d.build(dictionary_filename=&gt;'logminer',dictionary_location=&gt;'/home/oracle/logminerlog'); END;<br> *<br> ERROR at line 1:<br> ORA-01336: specified dictionary file cannot be opened<br> ORA-29280: invalid directory path<br> ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 3474<br> ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 3552<br> ORA-06512: at "SYS.DBMS_LOGMNR_D", line 12<br> ORA-06512: at line 1<br> 虽然我修改了utl_file_dir,但还没起作用,所用要重启数据库<br> 重启数据库<br> SYS at skate&gt;<wbr><wbr>shutdown immediate<br><br> SYS at skate&gt;<wbr><wbr>startup<br> ORACLE instance started.<br> Total System Global Area<wbr><wbr>440401920 bytes<br> Fixed Size<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>1262260 bytes<br> Variable Size<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>306187596 bytes<br> Database Buffers<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>130023424 bytes<br> Redo Buffers<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>2928640 bytes<br> Database mounted.<br> Database opened.<br> 确认utl_file_dir参数值<br> SYS at omovo&gt;<wbr><wbr>show parameter utl_file_dir<br> NAME<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>TYPE<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>VALUE<br> ------------------------------------ ----------- ------------------------------<br> utl_file_dir<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>string<wbr><wbr><wbr><wbr><wbr><wbr>/home/oracle/logminerlog<br> 四.创建数据字典<br> SYS at skate&gt; exec dbms_logmnr_d.build(dictionary_filename =&gt;'dictionary.ora',dictionary_location =&gt; '/home/oracle/logminerlog');<br> dictionary_filename数据库字典的名字随便起<br><br> 4.添加分析日志<br><br> SYS at skate&gt; exec dbms_logmnr.add_logfile(logfilename=&gt;'/oracle_data/omovo/redo03.log',options=&gt;dbms_logmnr.new);<br> SYS at skate&gt; exec dbms_logmnr.add_logfile(logfilename=&gt;'/oracle_data/omovo/redo01.log',options=&gt;dbms_logmnr.andfile);<br> 为了减少视图的数据量,加快分析的时间,可以把分析过的日志从视图中删除<br> SYS at skate&gt; exec dbms_logmnr.add_logfile(logfilename=&gt;'/oracle_data/omovo/redo03.log',options=&gt;dbms_logmnr.removefile);<br> SYS at skate&gt; exec dbms_logmnr.add_logfile(logfilename=&gt;'/oracle_data/omovo/redo01.log',options=&gt;dbms_logmnr.removefile);<br><br> 四、分析<br> exec dbms_logmnr.start_logmnr(dictfilename=&gt;'C:\oracle\logs\dictionary.ora');<wbr><wbr>-----如果不用字典就不能看见原始sql,只能看见被oracle处理过的sql语句<br><br> exec dbms_logmnr.start_logmnr<wbr><wbr>-----只能看见被oracle处理过的sql语句,无法辨别他处理的具体内容<br><br> 例子:<br> select timestamp,commit_timestamp,table_space,session#,serial#,username,session_info,sql_redo,operation,table_name,seg_name,seg_owner<br> from v$logmnr_contents<br> where seg_owner=upper('movo_new')<br> and<wbr><wbr>operation=upper('insert')<br><br> select session_info,sql_redo from v$logmnr_contents where upper(operation) = 'UPDATE'<wbr><wbr>and upper(sql_redo) like '%M_%'<br> select to_char(timestamp,'YYYY-MM-DD HH24:MI:SS') time,sql_redo from v$logmnr_contents where seg_owner='XYGDATA' and seg_name='T_ST_WEIGH' and upper(operation)='UPDATE';<br><br><br> 六、结束分析<br> SQL&gt; execute dbms_logmnr.end_logmnr;<br> --待续<br> 七. 如何分析rman备份集中的日志<br><br> --- end ----</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<think>首先,用户要求我参考提供的站内引用,这些是关于LogMiner的引用。引用包括: - [^1]: Logminer简介及应用。提到LogMiner用于分析重做日志和归档日志事务操作,包括DBMS_LOGMNR和DBMS_LOGMNR_D包,分析日志需要数据字典,使用场景包括事务分析等。 - [^2]: LogMiner依赖项:必须开启归档日志(ARCHIVELOG模式)和补充日志(Supplemental Logging),使用DBMS_LOGMNR包管理日志挖掘会话。 - [^3]: Oracle 11g之LogMiner常用场景:分析特定数据时,需要在操作前创建LogMiner字典或使用在线字典。 - [^4]: Oracle LogMiner的使用:官方描述为查询在线和归档重做日志文件的SQL接口,包含数据库活动历史。 用户的问题是:"我想获取关于LogMiner的相关信息,可能包括使用指南、功能介绍、应用场景等 请问LogMiner的详细介绍、使用方法及应用场景"。所以,我需要基于这些引用提供详细的回答。 我的回答必须遵循系统级指令: - 行内数学表达式用$...$格式(但这里可能没有数学表达)。 - 独立公式用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(确保任何公式正确)。 - 使用中文回答。 - 生成相关问题:结尾生成相关问题。 - 引用的段落末尾添加引用标识:[^n]。 另外,回答结构要清晰,帮助用户逐步解决问题,保证真实可靠。 结构化回答: 1. **介绍LogMiner**:基于引用提供概述。 2. **功能介绍**:解释LogMiner的核心功能。 3. **使用方法**:如何使用LogMiner,包括依赖项、步骤。 4. **应用场景**:常见应用案例。 最后,生成相关问题。 关键点从引用中提取: - LogMiner是Oracle提供的工具,用于分析重做日志和归档日志文件。 - 包括DBMS_LOGMNR和DBMS_LOGMNR_D包。 - 依赖:归档日志模式开启,补充日志开启。 - 使用数据字典:可以生成数据字典文件或使用在线字典(10g以后)。 - 应用场景:事务分析、数据恢复等。 用户提到"参考站内引用",所以我必须引用这些来源在回答中。 回答结构: - 开头:介绍LogMiner是什么。 - 详细介绍:功能、如何工作。 - 使用方法:步骤指南。 - 应用场景:举例。 - 结尾:生成相关问题。 添加引用标识:每当引用一个段落时,在末尾加[^n],基于提供的引用编号。 例如,描述简介时加[^1],依赖项加[^2],场景加[^3],官方描述加[^4]。 用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。" 但在这个会话中,用户上一次的问题是第一次,所以没有之前的上下文。用户这次的问题是新的:"我想获取关于LogMiner的相关信息..."。 所以,专注于当前问题。 最终回答大纲: 1. **LogMiner简介**:概述LogMiner,引用[^1]。 2. **核心功能**:描述其功能。 3. **依赖项**:必须开启ARCHIVELOG和补充日志,引用[^2]。 4. **使用方法**:步骤,包括数据字典设置,引用[^3]。 5. **应用场景**:常见用途,引用[^1]和[^3]。 6. **生成相关问题**。 确保语言流畅、中文。 </think>### LogMiner的详细介绍、使用方法及应用场景 LogMiner 是 Oracle 数据库提供的一款强大工具,用于分析重做日志(redo log)和归档日志(archive log)文件。它通过 SQL 接口查询这些日志中记录的事务操作历史,帮助用户进行数据审计、故障排查和恢复操作。LogMiner 由 Oracle 从 8i 版本开始提供,完全免费,包含 DBMS_LOGMNR 和 DBMS_LOGMNR_D 两个包,其中 DBMS_LOGMNR_D 用于处理数据字典相关操作[^4]。LogMiner 能分析在线日志和归档日志,适用于多种 Oracle 版本(如 10g 及以上支持在线数据字典)[^1]。下面我将逐步介绍 LogMiner 的详细介绍、使用方法及应用场景,确保内容真实可靠,基于 Oracle 官方文档和常见实践。 #### 1. LogMiner的详细介绍 LogMiner 的核心功能是解析 Oracle 重做日志文件中的事务信息。重做日志文件记录了数据库的所有更改操作(如 DML 和 DDL 语句),归档日志则是重做日志的备份。LogMiner 使用 SQL 查询将这些二进制日志转换为可读的 SQL 语句输出,方便用户理解数据库活动的历史轨迹[^4]。主要特点包括: - **数据字典支持**:LogMiner 需要使用数据字典来解析对象名和列名。数据字典可以生成外部文件(通过 DBMS_LOGMNR_D.BUILD 过程),或直接使用在线数据字典(Oracle 10g 及以上版本)。例如,分析特定表时,必须提前创建或使用字典以确保日志中的兼容性[^1][^3]。 - **依赖环境**:LogMiner 要求在 Oracle 数据库中开启归档日志(ARCHIVELOG 模式)和补充日志(Supplemental Logging)。ARCHIVELOG 模式下,数据库会自动备份重做日志到归档文件;补充日志则记录额外的事务上下文信息,以便 LogMiner 精确解析操作细节(如主键值)[^2][^4]。 - **组件结构**:LogMiner 由 DBMS_LOGMNR 包管理日志挖掘会话,包括添加日志文件、启动分析和查询结果;DBMS_LOGMNR_D 包负责数据字典提取。输出通过动态视图(如 V$LOGMNR_CONTENTS)展示,用户可以直接执行 SQL 查询[^1][^4]。 LogMiner 的优势在于其非入侵性——它只读取日志文件,不影响数据库正常运行。这使其成为审计和安全分析的关键工具[^4]。 #### 2. LogMiner的使用方法 使用 LogMiner 需要满足前提条件:数据库必须开启 ARCHIVELOG 模式和补充日志。以下是详细的使用步骤指南(以 Oracle 11g 或更高版本为例),基于常见实践和引用内容[^2][^3][^4]。 **前提设置(环境准备)**: - **开启 ARCHIVELOG 模式**:作为数据库管理员(DBA),运行以下 SQL 命令: ```sql SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; ``` - **开启补充日志**:启用最小补充日志以捕获必要的事务信息: ```sql ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; ``` 对于特定表的分析,可能需要额外补充日志(如主键日志)[^2]。 **使用步骤(示例:分析特定事务)**: 1. **生成数据字典**: - 如果使用外部数据字典文件(推荐用于兼容性),执行 DBMS_LOGMNR_D.BUILD 过程: ```sql EXEC DBMS_LOGMNR_D.BUILD(OPTIONS => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS); ``` 这会提取字典信息到重做日志中[^3]。 - 或者,使用在线数据字典(10g 以上): ```sql EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG); ``` 2. **添加日志文件**: - 手动添加要分析的日志文件(可以是重做日志或归档日志): ```sql EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/path/to/archive_log_1.arc', OPTIONS => DBMS_LOGMNR.NEW); EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/path/to/redo_log_2.log', OPTIONS => DBMS_LOGMNR.ADDFILE); ``` 使用 `OPTIONS => DBMS_LOGMNR.NEW` 初始化列表,`OPTIONS => DBMS_LOGMNR.ADDFILE` 添加更多文件[^4]。 3. **启动 LogMiner 会话**: - 开始分析日志文件: ```sql EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS); ``` 如果使用在线字典,替换为 `DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG`[^1][^3]。 4. **查询分析结果**: - 通过 V$LOGMNR_CONTENTS 视图查询日志内容: ```sql SELECT OPERATION, SQL_REDO, SQL_UNDO, TIMESTAMP FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'JOEDEVO'; -- 替换为要分析的模式名 ``` 这会输出事务操作(如 INSERT、UPDATE)、对应的 SQL 语句(SQL_REDO 表示重做操作,SQL_UNDO 表示撤销操作)和时间戳[^3][^4]。 5. **结束会话**: - 分析完成后,释放资源: ```sql EXEC DBMS_LOGMNR.END_LOGMNR; ``` **注意事项**: - **权限要求**:用户需要 DBA 权限或 EXECUTE_CATALOG_ROLE 角色来执行 LogMiner 包。 - **性能优化**:分析大量日志时,建议分批处理以减少内存占用;Oracle 11g 以上支持实时日志分析。 - **错误排查**:如果分析失败,检查日志文件路径是否正确,以及补充日志是否开启充分[^2][^4]。 #### 3. LogMiner的应用场景 LogMiner 适用于多种数据库管理场景,尤其在审计、恢复和性能分析中发挥作用: - **事务审计与安全合规**:分析用户操作(如 DML 变更),追踪未授权更改。例如,审计特定用户 "joedevo" 的所有表操作,以检测安全违规[^3]。 - **数据恢复**:当误删除数据时,通过 SQL_UNDO 字段生成撤销语句实现恢复,而无需从备份还原数据库[^1][^4]。 - **故障排查**:诊断事务冲突或逻辑错误,通过重做日志重现问题场景,辅助 root cause 分析。 - **数据库迁移验证**:在升级或迁移后,对比日志事务确保数据一致性。 - **性能监控**:分析高负载事务模式,优化 SQL 查询(例如,识别频繁更新的表)[^1][^4]。 根据引用,LogMiner 的典型使用场景强调在操作前配置好数据字典,以避免解析错误[^3]。它在企业环境中常用于合规报告和灾难恢复计划中。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值