LogMiner 是达梦公司提供的一个非常有用的日志分析工具,使用该工具可以轻松获取 DM 归档日志文件中的具体内容,更是可以分析出所有对于数据库操作的 DML 和 DDL 语句。因此该工具特别适用于调试、审计或者回退某个特定的事务。
LogMiner 分析工具实际上是由一组 DMPL/SQL 包和一些动态视图组成的,它作为 DM 数据库的一部分来发布,是一个完全免费的工具。
其主要用途有:
使用 DBMS_LOGMNR 包对归档日志进行挖掘,可以重构出 DDL 和 DML 等操作语句,并通过获取的信息进行更深入的分析。
要实现日志挖掘,除了将常规的物理 redo 日志记录下来以外,还需要按照特定的格式将对数据库进行的逻辑操作存储下来,专门用于 DBMS_LOGMNR 包的挖掘,获取数据库系统的历史执行语句。
这部分逻辑日志同时也记录在重做日志文件中。
配置数据库运行于归档模式。
在 dm.ini 文件中将 RLOG_APPEND_LOGIC 选项设为 1 或者 2。
以下三个相关参数都属于系统级动态参数:
可以按照如下参数配置成全表级开启逻辑日志,排除系统表,产生的额外逻辑日志量适中。
alter system set 'RLOG_APPEND_LOGIC'=1;
alter system set 'RLOG_IGNORE_TABLE_SET'=1;
alter system set 'RLOG_APPEND_SYSTAB_LOGIC'=0;
注:DM 数据库目前只支持对归档日志的分析
ORACLE 数据库在有日志切换时,才会形成归档日志文件。而达梦数据库是在将 redo 日志写入联机日志文件后,再由专用的归档线程异步地将其写入归档文件。也就是说 DM 数据库并不是等到联机日志切换发生时才形成归档日志。
程序在运行过程中可以强行删除正在使用的归档日志文件,一旦删除,除非 mount 再 open 数据库,否则将没有归档日志输出。
达梦数据库中归档模式下,按照预设的大小例如 64M 生成一个归档日志文件,当执行归档切换命令时,该归档文件的大小会变成实际日志占用的大小,比如 200K。并且后续如果有 redo 需要再次写入归档日志文件时,才会看到由于切换生成的最新归档日志文件。
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOGMNR');
场景:开发人员某天执行了 DML 操作,删除若干条核心数据,但具体时间无法准确提供,需要找到误删除的数据,重新插入原表。
解决方案一:通过日志挖掘技术可以准确找到误删时间点,再结合最近的备份,在备份机上还原数据库到指定的时间点,然后使用 dmexp/dmimp 工具将表数据导入导出。
解决方案二:结合日志挖掘,找到删除事务发生的时间点或者事务 ID,如果数据库闪回功能打开,并且误操作发生时间没有超过 undo 日志保留时间,可以使用 selet 的方式找到之前的数据。
不管哪种方案,尽快找到误操作时间点非常关键。接下来我们通过以下测试表模拟整个恢复过程。
测试表 T1 共有 10 条数据:
测试环境下准备好以上数据后,做一次日志切换,执行后续操作,再次切换归档,后面生成的日志将会放置在这次新生成的归档日志文件中,便于分析。
模拟误操作删除 ID > 1 的数据并提交:
此时表 T1 只剩余一条记录
做一次日志切换,将写入该 redo 的日志文件内容切换出来,生产环境下直接找到对应的归档日志文件
开始日志挖掘,找出误操作对应的事务 ID 和准确的时间点(以下操作是在达梦提供的 manger 可视化工具中完成的),3 个步骤即可完成挖掘:
通过以上视图可以准确查询到误操作事务发生时的 XID。用 10 进制表示为 65409,时间戳也能显示出来。
如果使用解决方案一则如下两个参数需事先设置正确:
alter system set 'ENABLE_FLASHBACK'=1; --开启闪回功能
alter system set 'UNDO_RETENTION'=3600 scope=both; --undo日志的保留时间,单位秒
目前的测试环境下已正确配置,故使用如下查询附加上 DM 数据库的特殊关键字,即可查询出误删除的 数据如下:
可以看出删除前的数据显示出来。使用 create table t_tmp as select * from test1.t1 when trxid 65409 将数据导出到一个中间表,后续进行相应处理。
如果没有开启闪回功能或者 undo 数据的保留时间过期,那么无法通过上述方式找回数据。
但可以通过视图中事务开始的 START_SCN 值,再加上全库备份结合归档,将数据库异机恢复到该事务发生的前一时刻,然后使用 dexp/dimp 将正确的表数据导出导入,从而达到数据恢复的目的。
以下是恢复数据库的三条核心语句,特别是第二条中的 LSN 值非常关键,将其设置成等于 START_SCN。
目前日志挖掘相关视图中没有包含 undo_sql,只能找到对应的 redo_sql,需要通过 redo_sql 信息推断出 undo_sql。但实际情况中,对于有主键的表进行更新和删除操作,无法通过 V$LOGMNR_CONTENTS 视图得到必须的前映像。除非将 RLOG_APPEND_LOGIC 设置成 2,但这样会造成日志量成倍增长且需要写脚本来推导出相应 undo_sql。
达梦数据库中对表的所有 DML 和 DLL 操作都存在对应的操作码。可以选择指定的时间段,按操作码分类,即可统计出哪种类型的操作最频繁,有没有存在非法操作等信息。
统计某时段 DML 语句的执行频度
处理方式:根据日志挖掘结果中代表操作类型的字段,分类汇总分析。
统计某一时段的增删改的语句就可以写成:
select case
when operation_code=1 then '插入记录'
when operation_code=3 then '更新记录'
when operation_code=2 then '删除记录'
end as 操作类型,
count(*) 操作次数 from v$logmnr_contents where operation_code in (1, 2, 3)
group by operation_code order by count(*);
也可按如下生成更加易读的视图:
create table dml_statistics as
select '插入记录' as 操作类型, 0 as 操作次数 from dual union
select '更新记录' as 操作类型, 0 as 操作次数 from dual
union
select '删除记录' as 操作类型, 0 as 操作次数 from dual;
select t.操作类型, nvl(t1.操作次数,0) from dml_statistics t,
(select case
when operation_code=1 then '插入记录'
when operation_code=3 then '更新记录'
when operation_code=2 then '删除记录'
end as 操作类型,
count(*) as 操作次数 from v$logmnr_contents where operation_code in (1, 2, 3)
group by operation_code) t1
where t.操作类型 = t1.操作类型(+);
实际生产中按照这种方式,纵向以小时为单位,分析出一天当中哪些时段的 DML 操作最为频繁,有无明显异常时段。
找出某时段是谁或者是哪个应用非法更新了某张重要表的数据
处理方式:根据日志挖掘结果的相关字段,找出非法操作责任人。
create user droper identified by droper123; --创建模拟更新用户
conn sysdba/Dameng123:5237;
grant select,update on test1.t3 to droper; --授予更改权限
切换到sysdba用户下做一次日志切换动作
切换到drop而用户下执行非法更新操作,id=6的行的name列修改为 mongodb
再次切换出归档日志做分析、处理。
对应的 SQL_REDO 语句为:
UPDATE "TEST1"."T3" SET "NAME" = 'mongodb' WHERE "ID" = 6 AND "NAME" = 'redis'
这里表没有定义主键,所以条件后面来了所有的列值,改视图中目前不支持undo_sql,期待后续版本加入。
也可使用日志挖掘包中提供的过程得到某个 REDO_SQL 中包含的列的具体值。
下图显示更改后的值是 mongodb,尽管 REDO_SQL 中包含了前映像,但无法挖出 undo 值。
LOGMINER 对于数据库管理员(DBA)来讲是个功能非常强大的工具,也是在日常工作中经常要用到的一个工具,借助该工具,可以得到大量关于数据库活动的信息。
LOGMINER 最重要的用途之一就是不用全部恢复数据库就可以恢复数据库的某个变化。另外,该工具还可用于监视或者审计用户的活动,比如 DBA 可以利用 logminer 工具查看到谁曾经修改了哪些数据以及这些数据在修改前的状态。
文章
阅读量
获赞