1. 适用场景
相信许多DBA同学都碰到过这样的情况,由于各种原因需要对数据库进行不完全的恢复,但又不确定应该恢复到哪个时间点或者SCN。在DM中,用户可以使用DBMS_LOGMNR包对归档日志进行挖掘,重构出DDL和DML等操作,并通过获取的信息进行更深入的分析;同样,可以对归档日志文件进行恢复被误操作的数据,并进行故障跟踪,定位执行误操作的用户信息。目前DBMS_LOGMNR只支持归档日志进行分析,配置归档后,还需要将dm.ini中的RLOG_APPEND_LOGIC选项配置为1或2。
本文实验环境的 DM 数据库版本为:DM Database Server 64 V8-1-2-2-21.05.07-138925-10006-ENT Pack4
2. 配置源数据库
1) 检查是否开启了归档和追加日志
|
select para_name, para_value from v$dm_ini where para_name in ('ARCH_INI', 'RLOG_APPEND_LOGIC'); |
PARA_NAME PARA_VALUE
----------------- ----------
RLOG_APPEND_LOGIC 0
ARCH_INI 0
2) 修改dm.ini参数
设置RLOG_APPEND_LOGIC=1
注:RLOG_APPEND_LOGIC 需要设置为 1 或 2,1 代表如果有主键列,记录 UPDATE 和 DELETE 操作时只包含主键列信息,若没有主键列则包含所有列信息;2 代表不论是否有主键列,记录 UPDATE 和 DELETE 操作时都包含所有列的信息。
|
alter system set 'RLOG_APPEND_LOGIC'=1 both; |
3) 配置归档
|
alter database mount; alter database add archivelog 'dest=/dmarch,type=local,file_size=256,space_limit=1024'; alter database archivelog; alter database open; |
4) 验证结果
|
select para_name, para_value from v$dm_ini where para_name in ('ARCH_INI', 'RLOG_APPEND_LOGIC'); |
PARA_NAME PARA_VALUE
----------------- ----------
RLOG_APPEND_LOGIC 1
ARCH_INI 1
3. 源数据库模拟数据操作
1) 创建表空间、用户、表
|
create tablespace tbs_logmnr datafile 'tbs_logmnr.dbf' size 64; create user logmnr identified by "dameng123" default tablespace tbs_logmnr; grant dba, resource, vti to logmnr; create table logmnr.users as select * from dba_users; update logmnr.users set user_id=100 where user_id<=50331700; commit; truncate table logmnr.users; |
2) 归档日志切换
|
alter system switch logfile; alter system archive log current; alter database archivelog current; |
3) 查看归档
|
select sequence# seq , name , to_char(first_time, 'yyyy-mm-dd hh24:mi:ss') first_time, to_char(next_time, 'yyyy-mm-dd hh24:mi:ss') next_time , first_change# , next_change# from v$archived_log; |
SEQ NAME FIRST_TIME NEXT_TIME FIRST_CHANGE# NEXT_CHANGE#
----------- ------------------------------------------------------------ ------------------- ------------------- -------------------- --------------------
1 /dmarch/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-13_17-31-20.log 2021-05-13 21:11:31 2021-05-13 21:11:31 27728 32461
2 /dmarch/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-13_21-11-33.log 2021-05-13 21:11:31 2021-05-13 21:30:29 32462 32963
3 /dmarch/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-13_21-30-31.log 2021-05-13 21:30:29 2021-05-13 21:42:57 32964 33432
4 /dmarch/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_10-06-25.log 2021-05-13 21:42:57 2021-05-14 10:53:13 33433 33715
5 /dmarch/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_12-01-31.log 2021-05-14 10:53:13 2021-05-14 12:23:40 33716 34196
6 /dmarch/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_12-30-49.log 2021-05-14 12:23:40 2021-05-14 12:30:49 34197 34203
4. 开始日志挖掘
1) 查询魔数
|
select db_magic from v$rlog; |
DB_MAGIC
--------------------
1581226857
2) 下载源端归档日志到本地,修改归档日志魔数(依次修改2个归档日志魔数)
|
./dmmdf TYPE=2 FILE=/dmarch_logmnr/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_12-01-31.log ./dmmdf TYPE=2 FILE=/dmarch_logmnr/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_12-30-49.log |
3) 添加一个或多个需要分析的归档日志文件
|
DBMS_LOGMNR.ADD_LOGFILE('/dmarch_logmnr/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_12-01-31.log'); DBMS_LOGMNR.ADD_LOGFILE('/dmarch_logmnr/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_12-30-49.log'); |
注:对于不在数据库默认归档路径下的归档日志,可以直接指定归档日志的绝对路径添加进分析列表。
4) 查询通过 ADD_LOGFILE 添加的归档日志文件
|
SELECT LOW_SCN , NEXT_SCN , LOW_TIME , HIGH_TIME, LOG_ID , FILENAME FROM V$LOGMNR_LOGS; |
LOW_SCN NEXT_SCN LOW_TIME HIGH_TIME LOG_ID
-------------------- -------------------- -------------------------- -------------------------- -----------
FILENAME
-------------------------------------------------------------------
33716 34196 2021-05-14 10:53:13.510294 2021-05-14 12:23:40.627000 0
/dmarch_logmnr/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_12-01-31.log
34197 34361 2021-05-14 12:23:40.627000 2021-05-14 12:30:50.432000 1
/dmarch_logmnr/ARCHIVE_LOCAL1_0x4C89FA28[0]_2021-05-14_12-30-49.log
5) 启动归档日志文件分析
|
DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2128, STARTTIME=>TO_DATE('2021-05-14 11:30:00', 'YYYY-MM-DD HH24:MI:SS'), ENDTIME=>TO_DATE('2021-05-14 12:30:00', 'YYYY-MM-DD HH24:MI:SS')); |
注:可以指定日志文件分析的时间段或SCN范围,同样可以指定Options的功能组合,如下:
Options :提供如下的可选模式,各模式可以通过+或者按位或来进行组合。其它位的值如1、4、8等目前不支持,配置后不会报错,但是没有效果。
|
Options |
对应值 |
说明 |
|
COMMITTED_DATA_ONLY |
2 |
仅从已交的事务的日志中挖掘信息 |
|
DICT_FROM_ONLINE_CATALOG |
16 |
使用在线字典 |
|
NO_SQL_DELIMITER |
64 |
拼写的 SQL 语句最后不添加分隔符 |
|
NO_ROWID_IN_STMT |
2048 |
拼写的 SQL 语句中不包含 ROWID |
6) 查看归档日志文件的分析结果
|
select TIMESTAMP , START_TIMESTAMP , COMMIT_TIMESTAMP, OPERATION , OPERATION_CODE , ROLL_BACK , TABLE_NAME , ROW_ID , USERNAME , DATA_OBJ# , DATA_OBJV# , SQL_REDO , REDO_VALUE , UNDO_VALUE from V$LOGMNR_CONTENTS where table_name = 'xxx'; |
注:可以根据需要指定追踪信息,如表名、用户名、时间段等,在数据库中执行的操作会被解析为单行元组的SQL操作,即在数据库中执行一条update XX set name=xx where id<100;则在日志分析结果中会解析为一条条单行元组的SQL操作,如:update XX set name=xx where id=1;update table_name set name=xx where id=2;等所有id小于100的SQL操作。
OPERATION 字段代表操作类型,主要包括start、insert、update、delete、commit、rollback等语句。
OPERATION_CODE 代表操作类型代码,1表示插入操作,2表示删除操作,3表示更新操作,6表示事务起始语句,7表示提交操作,9表示批量更新,36表示回滚操作。
7) 终止归档日志文件分析
|
DBMS_LOGMNR.END_LOGMNR(); |
进行日志挖掘过程中,在V$LOGMNR_LOGS、V$LOGMNR_CONTENTS等数据库动态性能视图上会产生分析数据,数据存储在TEMP临时表空间上,会话断开或终止归档日志文件分析后,数据会被清除。
5. 注意
做日志挖掘时候,始终用同一个会话窗口执行sql,这样才会成功。