环境:
OS:Centos 7
DB:2节点RAC 11.2.0.4
logmnr 可以用来分析redo 日志和归档文件。将redo日志或者归档文件中的内容提取出来,供DBA进行操作分析历史操作,
比如进行误删除操作的恢复。 LOGMNR 分析日志,需要创建一个数据字典,这个数据字典可以存储在外部文件(external file) 或者redo log 中。 如果要存储在外部文件中,数据库参数utl_file_dir 需要配置,并重启数据库。
有些时候,我们的生产系统不能重启,因此只能选用redo log来存储数据字典,下面的例子是基于redo log来存储数据字典的方法的:
1.redo log 存储数据字典
使用redo log 存储数据字典不需要重启数据库,也不需要配置任何参数,这种方式比较灵活.直接可以创建数据字典到redo文件
declare
begin
dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS);
end;
SQL> execute dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS);
BEGIN dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS); END;
*
ERROR at line 1:
ORA-01354: Supplemental log data must be added to run this command
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 6110
ORA-06512: at "SYS.DBMS_LOGMNR_INTERNAL", line 6208
ORA-06512: at "SYS.DBMS_LOGMNR_D", line 12
ORA-06512: at line 1
解决办法:
需要开启附加日志
alter database add supplemental log data;
2.添加需要分析的文件
declare
begin
dbms_logmnr.add_logfile('+DATA/slnngk/archivelog/2021_10_09/thread_1_seq_101.443.1085454503',dbms_logmnr.new);
end;
declare
begin
dbms_logmnr.add_logfile('+DATA/slnngk/archivelog/2021_10_09/thread_1_seq_102.444.1085454505',dbms_logmnr.addfile);
end;
报错误:
SQL> execute dbms_logmnr.ADDFILE('+DATA/slnngk/archivelog/2021_10_08/thread_1_seq_88.424.1085435681',dbms_logmnr.new);
BEGIN dbms_logmnr.ADDFILE('+DATA/slnngk/archivelog/2021_10_08/thread_1_seq_88.424.1085435681',dbms_logmnr.new); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00221: 'ADDFILE' is not a procedure or is undefined
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
解决办法,安装相应的包(在其中一个节点上执行,我这里是在节点1上执行):
SQL>@$ORACLE_HOME/rdbms/admin/dbmslm.sql
SQL>@$ORACLE_HOME/rdbms/admin/dbmslmd.sql
函数说明
dbms_logmnr.new 在数据字典中添加第一个需要分析的文件
dbms_logmnr.addfile 在数据字典中添加其他需要分析的文件
4.开始分析文件
我们使用不同的方式存储数据字典,让oracle开始分析文件的命令参数不一样。
如果是外部文件方式存储数据字典,是不需要使用任何参数的,如果使用的是redo日志文件,
需要明确告知Oracle 数据字典存储在redo文件中.
declare
begin
dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
end;
不使用options,可以分析其他库的日志
declare
begin
dbms_logmnr.start_logmnr();
end;
否则报如下的错误
5.开始分析内容
经过上一步分析后,日志中的内容,可以在视图v$logmnr_contents中查询到.
select * from v$logmnr_contents where sql_redo like '%drop%'
6.结束日志分析
declare
begin
dbms_logmnr.end_logmnr;
end;
logmnr 挖掘日志,是会话级别的操作。分析数据不在数据库级别共享
也可以分析其他库的日志
1.使用redo_log作为数据字典
declare
begin
dbms_logmnr_d.build(options => dbms_logmnr_d.STORE_IN_REDO_LOGS);
end;
2.添加其他的库的日志
declare
begin
dbms_logmnr.add_logfile('/tmp/redo03.log',dbms_logmnr.new); ##其他库的日志文件
end;
3.分析
declare
begin
dbms_logmnr.start_logmnr(options => 0);
end;
4.查看分析日志
select sql_redo from v$logmnr_contents
where lower(sql_redo) like '%tb_test%' or lower(sql_redo) like '%200454%';
只能获取到可识别的ddl语句,dml语句因为没有映射关系,分析结果不可读
5.结束分析
declare
begin
dbms_logmnr.end_logmnr;
end;