dbms_logmnr 之一 cdb 层面操作

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/ctypyb2002/article/details/89446462

os: centos 7.4
db: oracle 12.1.0.2

logmnr 一般是处理用户用户错删除,更新数据.
需要在 CDB$ROOT 运行 DBMS_LOGMNR,需要确保 pdb 状态为 open,可以通过 alter pluggable database orclpdb open;修改

版本

# lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID:	CentOS
Description:	CentOS Linux release 7.4.1708 (Core) 
Release:	7.4.1708
Codename:	Core

# su - oracle
$ sqlplus / as sydba;
SQL> set lines 500;
SQL> set pages 500;
SQL> 
SQL> 
SQL> select ins."INSTANCE_NUMBER",ins."INSTANCE_NAME",ins."HOST_NAME",ins."VERSION"
from v$instance ins
;   

INSTANCE_NUMBER INSTANCE_NAME	 HOST_NAME							  VERSION
--------------- ---------------- ---------------------------------------------------------------- -----------------
	      1 orcl		 oradb								  12.1.0.2.0

SQL> select *
from v$version v
where 1=1
;

BANNER										     CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production		  0
PL/SQL Release 12.1.0.2.0 - Production							  0
CORE	12.1.0.2.0	Production								  0
TNS for Linux: Version 12.1.0.2.0 - Production						  0
NLSRTL Version 12.1.0.2.0 - Production							  0

启用补全日志

为了在日志里记录更多有用的信息,需要启用辅助日志.

SQL> alter database force logging;

SQL> alter database add supplemental log data (all,primary key,unique index,foreign key) columns ;

SQL> select dat."SUPPLEMENTAL_LOG_DATA_ALL",
       dat."SUPPLEMENTAL_LOG_DATA_MIN",
       dat."SUPPLEMENTAL_LOG_DATA_PK",
       dat."SUPPLEMENTAL_LOG_DATA_UI",
       dat."SUPPLEMENTAL_LOG_DATA_FK",
       dat."SUPPLEMENTAL_LOG_DATA_PL"
from v$database dat
;  

SUP SUPPLEME SUP SUP SUP SUP
--- -------- --- --- --- ---
YES YES      YES YES YES NO

SQL> select * from dba_supplemental_logging ;

MIN PRI UNI FOR ALL PRO
--- --- --- --- --- ---
YES YES YES YES YES NO

SQL> select *
from (
select sequence#,dbms_flashback.get_system_change_number(),name 
from v$archived_log 
where name is not null 
order by sequence# desc 
) t0
where rownum <=1
;

 SEQUENCE# DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()  NAME
---------- ----------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       140				     3469819                 /u01/app/oracle/product/12.1.0/db_1/dbs/dgarc11_140_998931252.dbf


数据准备

SQL> create table tmp_t0 (c0 varchar(100),c1 varchar(100));    

Table created.

SQL> insert into tmp_t0 select '1','1' from dual union all select '2','2' from dual;

2 rows created.

SQL> commit;            

Commit complete.

SQL> update tmp_t0 set c1='22' where c0='2';

1 row updated.

SQL> commit;

Commit complete.

SQL> delete from tmp_t0 where c0='2';

1 row deleted.

SQL> commit;

Commit complete.

SQL> alter system archive log current;

System altered.

SQL> select *
from (
select sequence#,dbms_flashback.get_system_change_number(),name 
from v$archived_log 
where name is not null 
order by sequence# desc 
) t0
where rownum <=1
;

 SEQUENCE# DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()  NAME
---------- ----------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       141				     3470323                 /u01/app/oracle/product/12.1.0/db_1/dbs/dgarc11_141_998931252.dbf


使用

默认就是安装 dbms_logmnr 的,只需要使用即可,如果没有安装,就执行如下两个脚本:

SQL> @$ORACLE_HOME\rdbms\admin\dbmslmd.sql;
SQL> @$ORACLE_HOME\rdbms\admin\dbmslm.sql;

第一个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
第二个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。

step 1 建立日志分析的列表

begin
  dbms_logmnr.add_logfile(
    logfilename=>'/u01/app/oracle/product/12.1.0/db_1/dbs/dgarc11_141_998931252.dbf',
    options=>dbms_logmnr.addfile
  );
end;
/

step 2 启动 logmnr

begin
  dbms_logmnr.start_logmnr(
    options=>dbms_logmnr.dict_from_online_catalog
    --options=>dbms_logmnr.dict_from_redo_logs
  );
end;
/

step 3 查看分析结果

select *
  from v$logmnr_contents
 where 1=1
   and table_name LIKE 'TMP_T0%'
 order by timestamp desc  
 ;
 
select xid,timestamp,username,sql_redo,sql_undo
  from v$logmnr_contents
 where 1=1
 and table_name LIKE 'TMP_T0%'
 order by timestamp desc 
 ;
 

在这里插入图片描述

step 4 结束 logmnr

begin
  dbms_logmnr.end_logmnr;
end;
/

分析异机日志文件时,需要事先创建数据字典

扫描二维码关注公众号,回复: 6011138 查看本文章
create directory utlfile AS '/tmp';
alter system set utl_file_dir='/tmp' scope=spfile;

begin
	dbms_logmnr_d.build(
	   dictionary_filename => 'dictionary.ora', 
	   dictionary_location =>'/tmp'
	);
end;
/

其中 dictionary_location 需要和 utl_file_dir 的值一样.

begin
  dbms_logmnr.add_logfile(
    logfilename=>'/u01/app/oracle/product/12.1.0/db_1/dbs/dgarc11_141_998931252.dbf',
    options=>dbms_logmnr.addfile
  );
end;
/

begin
    dbms_logmnr.start_logmnr(
       dictfilename=>'/tmp/dictionary.ora'
    );
end;
/

参考:
https://docs.oracle.com/database/121/ARPLS/d_logmnr.htm#ARPLS66787
https://docs.oracle.com/database/121/REFRN/GUID-C62A7B96-2DD4-4E70-A0D9-26EE4BFBE256.htm
https://docs.oracle.com/database/121/SUTIL/GUID-3417B738-374C-4EE3-B15C-3A66E01AE2B5.htm#SUTIL019

猜你喜欢

转载自blog.csdn.net/ctypyb2002/article/details/89446462