Oracle Logminer
1. 简介
LogMiner 本质上是一个redo log的解析工具。 Redo log中记录了数据和数据字典的变更。 基于此logminer 有以下用途。
-
用来定位数据库逻辑损坏,当然这个用途只能是处理应用程序界别的错误,比如误删除了某些表,某些行,误删索引,错误更新数据等。当我们知道错误发生的时间后即可基于时间或者而基于更改进行数据恢复,恢复到损坏之前的状态。
-
能够执行事务级别的undo 操作, 将其恢复到事务提交前的状态。
-
通过分析表的插入和更新趋势 来进行性能调优和容量规划
-
执行后审计,能够用于跟踪数据库上执行的任何DML 和DDL语句。 但是注意logminer是通过挖掘分析redo log来做到解析CDC事件的,所以在没有指定SCN 或者时间点的时候,挖掘CDC事件耗时且耗资源,因为他要挖掘大量的redo log文件。
第一个和第二个用途 基本上类似,只是描述的维度有点差异, 第一个描述的是基于某个时间点或者某些变更进行数据恢复,颗粒比较大, 第二个说的是细粒度的恢复, 可以对事物进行撤销。
2. LogMiner配置
Logminer 有4个最基本的参数: source database,mining database, logminer dictionary, redo log files。
配置名 | 描述 |
---|---|
source database | source database 是生成待分析的redo log的库 |
mining database | logminer执行日志分析的时候使用的数据库 |
logminer dictionary | 提供补全信息, redo log记录的字段名等信息是使用的一些内部编码,查询出来的数据是object ids,有了数据字典可以得到真实的值 |
redo log files | 包含数据库和数据字典变更的文件 |
2.1 配置项要求
Source 和 Mining database
- Source和Mining数据库必须运行在同一个硬件平台上。
- Mining数据库可以与Source数据库相同或完全独立。
- Mining数据库必须与Source数据库运行相同版本或更高版本的 Oracle 数据库软件。
- Mining数据库必须使用与Source数据库相同的字符集(或字符集的超集)。
LogMiner dictionary
- 该字典必须是由生成 redo log文件的同一源数据库生成。
All redo log files:
- 必须由相同的源数据库生成。
- 必须与同一个数据库 RESETLOGS SCN 关联。
- 必须来自 8.0 或更高版本的 Oracle 数据库。
2.2 数据库配置要求
要使用logminer 首先要开启archive log,其次为了获取到sql语句的详细信息, 必须开启补全日志。
开启archive log:
# 关闭数据库, 由于无法在数据库开启状态下开启归档日志,所以首先要关闭数据库
shutdown immediate;
# 启动数据库至mount状态
startup mount;
# 启动归档模式
alter database archivelog;
# 查询归档状态
archive log list;
# 开启最小补全日志.
alter database add supplemental log data;
# 查询是否开启成功,返回YES 或者 IMPLICIT代表已经开启
select supplemental_log_data_min from v$database;
# 开启数据库
alter database open;
3.使用Logminer
配置完成之后就可以通过logminer工具进行redo log的分析了。
首先是启动logminer
# 查询数据库最后一个检查点的对应的SCN
SQL> SELECT CHECKPOINT_CHANGE#, CURRENT_SCN FROM V$DATABASE;
CHECKPOINT_CHANGE# CURRENT_SCN
------------------ -----------
1907519 1914801
启动 logminer
# 启动 logminer, 给定scn的范围
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-
STARTSCN => 1907519, -
ENDSCN => 1914801, -
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -
DBMS_LOGMNR.COMMITTED_DATA_ONLY + -
DBMS_LOGMNR.PRINT_PRETTY_SQL + -
DBMS_LOGMNR.CONTINUOUS_MINE);
PL/SQL procedure successfully completed.
# 查询当前logminer 正在分析的redo log文件列表
SQL> SELECT FILENAME name, LOW_SCN, NEXT_SCN FROM V$LOGMNR_LOGS;
NAME
--------------------------------------------------------------------------------
LOW_SCN NEXT_SCN
---------- ----------
/opt/Oracle12c/oradata/CDCDB/onlinelog/o1_mf_2_ko4pz5qn_.log
1907519 2.8147E+14
启动logminer成功之后就可以查询redo log中的变更数据了
# V$LOGMNR_CONTENTS 中包含了很多的其他非DML 和DDL的数据, 可以进行条件过滤得到你想要的类型的数据。
SQL> SELECT * FROM V$LOGMNR_CONTENTS
停止 logminer
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
PL/SQL procedure successfully completed.
SQL>
Note!!!
Oracle默认配置下Redo log的size为50MB, 50MB的Redo log Size 会造成数据日志的频繁切换, 导致logminer采用redo log的dictionary的数据字典策略时效率低下, 每次日志文件切换后都需要重新构建数据字典,数据字典的构建比较耗时。因此需要修改下默认大小,方法如下:
- 新增日志组
alter database add logfile group 4 ('/opt/Oracle12c/oradata/CDCDB/onlinelog/redo04.log') size 8g,
group 5 ('/opt/Oracle12c/oradata/CDCDB/onlinelog/redo05.log') size 8g,
group 6 ('/opt/Oracle12c/oradata/CDCDB/onlinelog/redo06.log') size 8g;
-
切换当前日志到新的日志组(手动切换下日志组)
alter system switch logfile;
-
触发checkpoint
checkpoint由ckpt进程触发oracle进行checkpoint动作,将data buffer中的脏块(已经写在redo里记录但是没有写到datafile里的)的内容写入到data file里并释放站用的空间,由dbw后台进程完成,并修改controlfile和datafile的scn.一般手工执行是由于要删除某个日志但是该日志里还有没有同步到data file里的内容,就需要手工check point来同步数据,然后就可以drop logfile group n
alter system checkpoint;
- 删除旧的日志组
alter database drop logfile group 1;
alter database drop logfile group 2;
alter database drop logfile group 3;
- 查看切换后的日志组
select group#,members,bytes/1024/1024,status from v$log;
4. Oracle常用命令
序号 | 命令 | 作用 |
---|---|---|
1 | select * from v$version; | 查询数据库版本 |
2 | ALTER TABLE inventory.customers ADD SUPPLEMENTAL LOG DATA (X) COLUMNS; | 修改数据库的不全日志级别,X可选项: ALL PRIMARY KEY UNIQUE KEY FOREIGN KEY |
3 | select user, sys_context(‘userenv’,‘current_schema’) from dual; | 查询当前用户所在的schema |
4 | alter session set current_schema=‘xxxx’ | 切换当前用户所在的schema |
5 | SELECT * FROM v$parameter where name = ‘cluster_database’; | 查询当前数据库是否为rac模式 |
6 | select * from v$option a where a.PARAMETER=‘Real Application Clusters’; | 查询当前数据库是否为rac模式 |
7 | SELECT CURRENT_SCN FROM V$DATABASE; | 查询当前SCN |
8 | select value from v$parameter where name = ‘processes’; | 查询数据库当前连接数限制 |
9 | alter system set processes = 600 scope = spfile; | 修改连接数限制为600, 需要重启数据库 |
10 | select count(*) from v$process; | 查询数据库当前连接数 |
11 | select count(*) from v$session; | 查询当前会话的连接数 |
12 | select owner,object_name,status from sys.dba_objects where status = ‘INVALID’ and owner in (‘SYS’,‘SYSTEM’); | 查询系统失效对象 |