oracle 11g 归档日志分析

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 16:45   29   0

1. 开启数据库归档模式;(必须)

2. 开启数据库补全日志;(必须)

3. 生成离线数据字典;(不推荐使用在线数据字典,日志量大的情况下会影响效率)

4. 创建数据库触发器;(用来记录客户端IP地址,可选)

5. 开始日志分析;

6. 查询分析结果;

7. 遗留问题。


1. 开启数据库归档日志

--在磁盘上创建归档日志文件存放目录
SQL> HOST MKDIR d:\arch_dest_01;
SQL> HOST MKDIR d:\arch_dest_02;

--指定归档日志存放路径及文件命名格式:
SQL> ALTER SYSTEM SET log_archive_dest_1='location=d:\arch_dest_01' SCOPE=SPFILE;
SQL> ALTER SYSTEM SET log_archive_dest_2='location=d:\arch_dest_02' SCOPE=SPFILE;
SQL> ALTER SYSTEM SET log_archive_format='redo_%D_%T_%R_%S.log' SCOPE=SPFILE;
--关闭并重新加载数据库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;

--启用归档日志模式并打开数据库
SQL> ALTER DATABASE archivelog;
SQL> ALTER DATABASE open;

--确认数据库为归档日志模式
SQL> SELECT log_mode FROM v$database;   --返回ARCHIVELOG为归档模式
SQL> SELECT archiver FROM v$instance;   --返回STARTED为归档模式

--强制日志切换并确认归档成功
SQL> ALTER SYSTEM SWITCH logfile;
SQL> SELECT name FROM v$archived_log;


2. 开启数据库补全日志

SQL> ALTER DATABASE ADD SUPPELEMENTAL LOG DATA(PRIMARY KEY, UNIQUE INDEX) COLUMNS;

--查看补全日志是否开启
     SELECT supplemental_log_data_min,
            supplemental_log_data_pk,
            supplemental_log_data_ui,
            supplemental_log_data_fk,
            supplemental_log_data_all
       FROM v$database;


3. 生成离线数据字典

--初始化数据字典路径
SQL> ALTER SYSTEM SET UTL_FILE_DIR='d:\ora_dic' SCOPE=SPFILE;

--重启数据库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

--生成离线数据字典
SQL> EXECUTE dbms_logmnr_d.build(dictionary_filename => 'test.dic', dictionary_location => 'd:\ora_dic');


4. 创建数据库触发器

SQL> CREATE OR REPLACE TRIGGER on_logon_trigger
SQL>   AFTER logon ON DATABASE
SQL> BEGIN
SQL>   dbms_application_info.set_client_info(sys_context('userenv','ip_address'));
SQL> END;


5. 开始日志分析

--添加待分析归档日志文件
SQL> EXECUTE dbms_logmnr.add_logfile(logfilename => 'd:\arch_dest_01\redo_xxx1.log', options => dbms_logmnr.new);
SQL> EXECUTE dbms_logmnr.add_logfile(logfilename => 'd:\arch_dest_01\redo_xxx2.log');
SQL> EXECUTE dbms_logmnr.add_logfile(logfilename => 'd:\arch_dest_01\redo_xxx3.log');

--方法1:使用在线数据字典(只能在被分析数据库上使用)
SQL> EXECUTE dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog);

--方法2:使用离线数据字典
SQL> EXECUTE dbms_logmnr.start_logmnr(DictFileName => 'd:\oar_dic\test.dic'); 

--分析结果在v$logmnr_content,结束分析会话
SQL> EXECUTE dbms_logmnr.end_logmnr; 


6. 查询分析结果

--根据相关视图创建分析结果表
SQL> CREATE TABLE logmnr_result AS (SELECT * FROM v$logmnr_contents);

--创建索引以提高查询速度
CREATE INDEX LOGMNR_TIMESTAMP ON logmnr_result (TIMESTAMP)
  tablespace MYCRM
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

--查询分析结果
     SELECT l.timestamp,
            l.operation,
            l.table_name,
            l.machine_name,
            l.session_info,
            l.sql_redo
       FROM logmnr_20131101 l
      WHERE l.table_space = 'MYCRM'
        AND l.table_name IN('ORDERHIST', 'ORDERDET', 'STOCK')
      ORDER BY l.timestamp;

如下图:


7. 遗留问题

虽然创建了相关触发器,且在视图v$session的client_info列成功记录了IP地址,但分析结果SESSION_INFO列中的Client_info信息仍然为空,不知道问题在哪儿,这个留待以后解决。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP