版权声明:本文为博主原创文章,转载请标明出处。 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