准备工作
1.启动DBMS_LOGMNR系统包
DM8默认是会创建DBMS_LOGMNR系统包的,保险起见我们可以先查一下:
select sf_check_system_package('DBMS_LOGMNR');
返回值为1则为已启用DBMS_LOGMNR系统包。
2.日志准备
在使用该系统包之前,应该开启归档和最小附加日志。
开启最小附加日志:
SP_SET_PARA_VALUE(2,'RLOG_APPEND_LOGIC',1);
开启归档:
alter database mount;
alter database add archivelog 'dest=/home/dmdba/dm8/arch,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=10240';
alter database archivelog;
alter database open;
查询验证:
select sf_get_para_value(2,'RLOG_APPEND_LOGIC');
select sf_get_para_value(2,'ARCH_INI');
均返回1表示均已开启。
使用DBMS_LOGMNR
1.查询和添加需要分析归档
select name,first_time,next_time,first_change# ,next_change# from v$archived_log;--查看有哪些归档可用
dbms_logmnr.add_logfile('/home/dmdba/dm8/arch/ARCHIVE_LOCAL1_0xC5AC857[0]_2021-12-14_11-21-17.log');
dbms_logmnr.add_logfile('/home/dmdba/dm8/arch/ARCHIVE_LOCAL1_0xC5AC857[0]_2021-12-14_10-59-35.log');
select * from v$logmnr_logs;--查看已添加的归档
2.启动归档日志分析
dbms_logmnr.start_logmnr (options=>2130,
starttime=>to_date('2021-12-14 00:00:00','YYYY-MM-DD HH24:MI:SS'),
endtime=>to_date('2021-12-15 00:00:00','YYYY-MM-DD HH24:MI:SS'));
注意:options可以按模式相加来取组合。如组合全部模式则为:2+16+64+2048=2130,那么options取值就是2130.
3.查询日志分析结果
select operation_code,scn,sql_redo,timestamp,seg_owner,table_name
from v$logmnr_contents
where operation_code < 6;
注意:sql_undo功能达梦数据库目前暂时不支持,只能查到sql_redo的内容,所以通过V$LOGMNR_CONTENTS查询的sql_undo列全部为空值。
关于V$LOGMNR_CONTENTS中,操作类型 OPERATION 和 OPERATION_CODE的对应关系分别为: INTERNAL 0、INSERT 1、DELETE 2、UPDATE 3、BATCH_UPDATE 4、DDL 5、START 6、COMMIT 7、SEL_LOB_LOCATOR 9、LOB_WRITE 10、LOB_TRIM 11、SELECT_FOR_UPDATE 25、LOB_ERASE 28、MISSING_SCN 34、ROLLBACK 36、UNSUPPORTED 255、SEQ MODIFY 37
整个V$LOGMNR_CONTENTS的定义类似oracle的,可以参考
V$LOGMNR_CONTENTS (oracle.com)https://docs.oracle.com/en/database/oracle/oracle-database/18/refrn/V-LOGMNR_CONTENTS.html#GUID-B9196942-07BF-4935-B603-FA875064F5C3(22条消息) V$LOGMNR_CONTENTS字段含义_傲娇木子的博客-CSDN博客_v$logmnr_contents
https://blog.csdn.net/weixin_43938004/article/details/110226987
4.终止分析
dbms_logmnr.end_logmnr();
注意事项
1.实测可知,在add_logfile之后,我们对数据库所作修改,归档日志的内容变动,均不再影响日志分析结果。即我们看到的分析结果是取决于add_logfile时对应归档日志的内容,并不会动态刷新。
2.如果要移除需要分析归档日志,可以使用remove_logfile语句:
dbms_logmnr.remove_logfile('/home/dmdba/dm8/arch/ARCHIVE_LOCAL1_0xC5AC857[0]_2021-12-14_10-59-35.log');
如果所有需要分析的归档日志均被移除,再查询日志分析结果会报错。
3.start_logmnr之后不能再添加文件。因此如果数据库数据有更新,应该关闭logmnr之后再打开重新加日志再分析。
4.logmnr支持的是归档日志分析,无法分析redo日志。