总体思路:出现数据误删等操作,先记录下事务产生的大概时间;查看对应事务产生的归档信息,用此归档进行日志挖掘;创建并打开DBMS_LOGMNR,将需要分析的时间段输入,就能查看这段时间所做的操作;
---------------------------------------------------------------------------------------------------------------------------------
目录
一、环境准备
1. 开启归档和开启附加日志
(1)开启归档:进入$DM_HOME/bin目录下
[dmdba@DM bin]$ ./disql SYSDBA/Dameng123:5238
进入disql工具执行:
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ADD ARCHIVELOG 'TYPE=LOCAL,DEST=/bak/archlog,FILE_SIZE=64,SPACE_LIMIT=1024';
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
查看归档信息:
SQL> select para_name, para_value from v$dm_ini where para_name in ('ARCH_INI','RLOG_APPEND_LOGIC');
(2)开启附加日志:
附加日志参数需要设置为1或者2,1 代表如果有主键列,记录UPDATE和DELETE操作时只包含主键列信息,若没有主键列则包含所有列信息;2 代表不论是否有主键列,记录UPDATE和DELETE操作时都包含所有列的信息。
SQL> SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',2);
2.事务操作
进行一些增删改DML和DDL事务操作,以产生归档信息,并模拟表数据误删或数据库对象误删的操作;如:
SQL> CONN DB/qwerty123:5238
SQL> DELETE FROM QQ WHERE ID=11;
SQL> UPDATE QQ SET NUM=111111 WHERE ID=04;
SQL> COMMIT;
SQL> TRUNCATE TABLE QQ;
SQL> DROP TABLE QQ;
SQL> SELECT * FROM QQ;
出现数据误删情况,先记录下操作发生的大概时间:
SQL> select sysdate;
3.查看对应归档文件产生的时间和路径信息
SQL> select first_time,name from v$archived_log;
二、归档日志分析
1. 添加需要分析的归档
(1)创建系统包:
SQL> SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOGMNR');
-- 查看创建包信息:显示为1,即开启状态;
SQL> SELECT SF_CHECK_SYSTEM_PACKAGE('DBMS_LOGMNR');
(2)DBMS_LOGMNR分析日志:
SQL> DBMS_LOGMNR.ADD_LOGFILE('/bak/archlog/ARCHIVE_LOCAL1_0x43951B76[0]_2022-03-15_14-32-04.log');
SQL> DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2130,STARTTIME=>TO_DATE('2022-03-18 17:00:00','YYYY-MM-DD HH24:MI:SS'),ENDTIME=>TO_DATE('2022-03-18 18:40:00','YYYY-MM-DD HH24:MI:SS'));
SQL> SELECT * FROM V$LOGMNR_LOGS;
SQL> select start_timestamp,username,session_info,sql_redo from v$logmnr_contents;
DBMS_LOGMNR包的参数:
STARTTIME分析时或者加载时的过滤条件,日志起始时间;
ENDTIME分析时或者加载时的过滤条件,日志结束时间;
OPTIONS提供如下表所列的可选模式:
COMMITTED_DATA_ONLY | 2 | 仅从已交的事务的日志中挖掘信息 |
DICT_FROM_ONLINE_CATALOG | 16 | 使用在线字典 |
NO_SQL_DELIMITER | 64 | 拼写的 SQL 语句最后不添加分隔符 |
NO_ROWID_IN_STMT | 2048 | 拼写的 SQL 语句中不包含 ROWID |
如:要选择OPTIONS的所有参数进行分析,OPTIONS=>(2+16+64+2048);
查看分析结果:
SQL> select START_TIMESTAMP,COMMIT_TIMESTAMP,TABLE_NAME,ROW_ID,USERNAME,SQL_REDO,REDO_VALUE,UNDO_VALUE from V$LOGMNR_CONTENTS;
SQL> set linesize 1000;
SQL> set pagesize 100;
SQL> SELECT SQL_REDO, TIMESTAMP FROM V$LOGMNR_CONTENTS WHERE TABLE_NAME IS NOT NULL;
SQL> DBMS_LOGMNR.END_LOGMNR(); -- 关闭归档日志分析;
更多资讯请上达梦技术社区了解: https://eco.dameng.com