oracle 19c 创建物化视图并测试logminer进行日志挖掘

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.创建物化视图
  1. alter session set container=pdb;
  2. grant create materialized view to scott;
复制代码
create materialized view 物化视图名                 -- 1. 创建物化视图
build [immediate | deferred]                      -- 2. 创建方式,默认 immediate
refresh [force | fast | complete | never]         -- 3. 物化视图刷新方式,默认 force
on [commit | demand]                              -- 4. 刷新触发方式
start with 开始时间                                -- 5. 设置开始时间
next 间隔时间                                      -- 6. 设置间隔时间
with [primary key | rowid]                       -- 7. 类型,默认 primary key
[enable | disable] query rewrite                 -- 8. 是否启用查询重写
as                                               -- 9. 关键字
查询语句;                                         -- 10. select 语句
创建语法解释
  1. 1. "创建 build" 的方式
  2.     (1) 'immediate':立即生效,默认。
  3.     (2) 'deferred' : 延迟至第一次 refresh 时才生效
  4. 2. "刷新 refresh" 的方式
  5.     (1) force    :默认。如果可以 '快速刷新' 就 '快速刷新',否则执行 '完全刷新'
  6.     (2) fast    :'快速刷新'。只刷新 '增量' 部分(前提:创建 '物化日志')
  7.     (3) complete: '完全刷新'。刷新时更新全部数据,包括视图中已经生成的原有数据
  8.     (4) never    : 从不刷新   
  9. 3. "触发" (请注意,on demand 中,才需要设置 '开始时间' 和 '间隔时间') -- 冲突
  10.     (1) on commit:基表有 commit 动作时,刷新刷图("不能跨库执行")
  11.     (2) on demand:在需要时刷新
  12.                    [1] 根据后面设定的 '开始时间' 和 '结束时间' 进行刷新
  13.                    [2] 手动调用 dbms_mview 包中的过程进行刷新                  
  14. 4. 基于基表的 primary key 或 rowid 创建
  15.     (1) 如果是基于 rowid,则不能对基表执行 '分组函数'、'多表连接' 等需要把
  16.         多个 rowid 合成一行的操作(理由很简单:到底以哪个 rowid 为准呢?)
  17. 5. enable query rewrite 启用查询重写(请注意, '开始时间' 和 '间隔时间' 不支持)-- 冲突
  18.     (1) 不支持的理由也很简单。
  19.         所谓的 '重写',就是讲对基表的查询定位到物化视图上,
  20.         而 '开始时间' 和 '间隔时间' 会造成物化视图上部分数据延迟,所以,不能重写
  21.     (2) 参数: query_rewrite_enabled (可通过 v$parameter 视图查询)<br>
复制代码
测试延时刷新
scott用户创建表
  1. CREATE TABLE person_info (
  2.   person_no   VARCHAR2(10),
  3.   NAME        VARCHAR2(30),
  4.   create_date DATE
  5. );
  6. INSERT INTO person_info(person_no, NAME, create_date) VALUES('001', '瑶瑶', SYSDATE);
  7. INSERT INTO person_info(person_no, NAME, create_date) VALUES('002', '倩倩', SYSDATE);
  8. COMMIT;
复制代码
创建1分钟刷新一次物化视图
  1. CREATE MATERIALIZED VIEW mvw_person_info
  2. BUILD IMMEDIATE
  3. REFRESH FORCE
  4. ON DEMAND
  5. START WITH SYSDATE
  6. NEXT SYSDATE + 1/1440
  7. AS
  8. SELECT pi.person_no,   
  9.        pi.name,
  10.        pi.create_date
  11.   FROM person_info pi;
复制代码
测试语句:先查询,等个十几秒在执行 insert,再等 1 分钟左右,观察前后数据
  1. SELECT * FROM mvw_person_info;
复制代码
  1. INSERT INTO person_info(person_no, NAME, create_date) VALUES('003', '美眉', SYSDATE);<br>commit;<br>select * from mvw_person_info;
复制代码
查询物化视图
  1. 1. 查询物化视图,非 DBA 用户,请查询 all_mviews 或 user_mviews
  2. SELECT *
  3.   FROM dba_mviews t
  4. WHERE t.owner = 'SCOTT'
  5.    AND t.mview_name = 'MVW_PERSON_INFO';
  6. 2. 查询一般视图
  7. SELECT * FROM dba_views;
复制代码
修改物化视图
  1. alter materialized view 物化视图名
  2. refresh [force | fast | complete | never]
  3. on [commit | demand]
  4. start with 开始时间
  5. next 间隔时间
复制代码
删除物化视图
  1. drop materialized view 物化视图名;
复制代码
手动刷新
  1. BEGIN
  2.    dbms_mview.refresh(list                 => '视图名',
  3.                       method               => 'fast', -- 增量刷新
  4.                       refresh_after_errors => TRUE);
  5. END;
复制代码
2.创建物化视图日志
  1. 1. 适用于 'fast' 增量刷新
  2. 2. with primary key
  3. 3. with rowid        
复制代码
测试 with primary key
  1. CREATE TABLE student_info (
  2. student_no VARCHAR2(10),
  3. NAME VARCHAR2(30)
  4. );
  5. ALTER TABLE student_info ADD CONSTRAINT pk_student_info_student_no
  6. PRIMARY KEY(student_no);
复制代码
创建物化视图日志
  1. create materialized view log on student_info with primary key
  2. [including new values];
  3. -- including new values 允许 Oracle 将数据库 新、旧值都保存在物化视图日志中
  4. -- 即 update 前 和 update 后都保存,按需设置即可
复制代码
插入一条数据
  1. [/code]INSERT INTO student_info(student_no, NAME) VALUES('001', '小优子');
  2. UPDATE student_info t SET t.name = '小游子' WHERE t.student_no = '001';
  3. COMMIT;
  4. [code] 
复制代码
查询物化视图日志信息
  1. SELECT * FROM all_mview_logs;
  2. SELECT * FROM mlog$_student_info;
复制代码
with rowid 测试
  1. 创建 'fast' 增量模式的物化视图条件:
  2. (1) select 语句中包含到的每一个表都需要创建 '物化日志'
  3. (2) select 中必须包含涉及到所有表的 'rowid'
  4. (3) select 中必须明确具体的列,不允许使用 '*'
复制代码
创建表
  1. CREATE TABLE test_a (
  2.   a_id VARCHAR(10),
  3.   NAME VARCHAR2(30)
  4. );
  5. ALTER TABLE test_a ADD CONSTRAINT pk_test_a_a_id PRIMARY KEY(a_id);
  6. CREATE TABLE test_b (
  7.   b_id VARCHAR(10),
  8.   NAME VARCHAR2(30)
  9. );
  10. ALTER TABLE test_b ADD CONSTRAINT pk_test_b_b_id PRIMARY KEY(b_id);
复制代码
创建物化视图日志
  1. [/code]create materialized view log on test_a with rowid including new values;
  2. create materialized view log on test_b with rowid including new values;
  3. [code] 
复制代码
fast 增量测试
创建表
  1. CREATE MATERIALIZED VIEW mvw_test_ab
  2. REFRESH FAST WITH ROWID
  3. ON DEMAND
  4. START WITH SYSDATE
  5. NEXT SYSDATE + 3/1440
  6. AS
  7. SELECT t1.a_id,
  8.        t1.name  a_name,
  9.        t1.rowid a_rowid,
  10.        t2.b_id,
  11.        t2.name  b_name,
  12.        t2.rowid b_rowid
  13.   FROM test_a t1, test_b t2
  14. WHERE t1.a_id = t2.b_id;
复制代码
查询此时没有数据
  1. SELECT * FROM mvw_test_ab;
  2. SELECT * FROM all_mview_logs;
  3. SELECT * FROM mlog$_test_a;
  4. SELECT * FROM mlog$_test_b;
复制代码
插入数据
  1. INSERT INTO test_a(a_id, NAME) VALUES('1', 'a1');
  2. INSERT INTO test_a(a_id, NAME) VALUES('2', 'a2');
  3. INSERT INTO test_a(a_id, NAME) VALUES('3', 'a3');
  4. INSERT INTO test_b(b_id, NAME) VALUES('1', 'b1');
  5. INSERT INTO test_b(b_id, NAME) VALUES('2', 'b2');
  6. INSERT INTO test_b(b_id, NAME) VALUES('3', 'b3');
  7. COMMIT;
复制代码
在次查询有数据
  1. SQL> SELECT * FROM mlog$_test_b;
  2. M_ROW$$
  3. --------------------------------------------------------------------------------
  4. SNAPTIME$ D O CHANGE_VECTOR$$        XID$$
  5. --------- - - -------------------- ----------
  6. AAASHJAAaAAAAEdAAA
  7. 01-JAN-00 I N FE           1.9704E+15
  8. AAASHJAAaAAAAEdAAB
  9. 01-JAN-00 I N FE           1.9704E+15
  10. AAASHJAAaAAAAEdAAC
  11. 01-JAN-00 I N FE           1.9704E+15
复制代码
3.进行日志挖掘
查看当前日志
  1. SQL> select max(SEQUENCE#) from v$archived_log;
  2. MAX(SEQUENCE#)
  3. --------------
  4.        187
复制代码
日志切换
  1. alter system archive log current;
复制代码
安装 LogMiner
  1. @$ORACLE_HOME/rdbms/admin/dbmslm.sql <br>@$ORACLE_HOME/rdbms/admin/dbmslmd.sql
复制代码
这两个脚本必须均以 DBA 用户身份运行。其中第一个脚本用来创建 DBMS_LOGMNR 包,该包用来分析日志文件。第二个脚本用来创建 DBMS_LOGMNR_D 包,该包用来创建数据字典文件。
创建完毕后将包括如下过程和视图:
类型
过程名
用途
过程
Dbms_logmnr_d.build
创建一个数据字典文件
过程
Dbms_logmnr.add_logfile
在类表中增加日志文件以供分析
过程
Dbms_logmnr.start_logmnr
使用一个可选的字典文件和前面确定要分析日志文件来启动 LogMiner
过程
Dbms_logmnr.end_logmnr
停止 LogMiner 分析
视图
V$logmnr_dictionary
显示用来决定对象 ID 名称的字典文件的信息
视图
V$logmnr_logs
在 LogMiner 启动时显示分析的日志列表
视图
V$logmnr_contents
LogMiner 启动后,可以使用该视图在 SQL 提示符下输入 SQL 语句来查询重做日志的内容
 
创建数据字典文件

LogMiner 工具实际上是由两个新的 PL/SQL 内建包( (DBMS_LOGMNR 和 DBMS_LOGMNR_D)和四个 V$动态性能视图(视图是在利用过程 DBMS_LOGMNR.START_LOGMNR启动 LogMiner 时创建)组成。在使用 LogMiner 工具分析 redo log 文件之前,可以使用DBMS_LOGMNR_D 包将数据字典导出为一个文本文件。该字典文件是可选的,但是如果没有它, LogMiner 解释出来的语句中关于数据字典中的部分(如表名、列名等)和数值都将是 16进制的形式,我们是无法直接理解的。例如,下面的 sql 语句:
  1. INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '张三');
复制代码
  1. insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'),hextoraw('4a6f686e20446f65'));
复制代码
  1. CREATE DIRECTORY utlfile AS '/home/oracle/LOGMNR';
  2. alter system set utl_file_dir='/home/oracle/LOGMNR' scope=spfile;
复制代码
 这个方式放弃等后续问问别人
直接分析方式
  1. exec dbms_logmnr.add_logfile(logfilename => '/home/oracle/arch11/1_189_1106805210.dbf',options=>dbms_logmnr.new);
  2. exec dbms_logmnr.add_logfile(logfilename => '/home/oracle/arch11/1_189_1106805210.dbf',options=>dbms_logmnr.addfile);
  3. exec dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog);
  4. set linesize 200
  5. alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
  6. select timestamp,commit_timestamp,sql_redo from v$logmnr_contents where table_name like '%PER%' and operation='INSERT';
复制代码
查看分析结果如下
  1. 2023-02-14 21:56:22
  2. insert into "SCOTT"."PERSON_INFO"("PERSON_NO","NAME","CREATE_DATE") values ('003','hrz',TO_DATE('2023-02-14 21:56:21', 'yyyy-mm-dd hh24:mi:ss'));
复制代码
注意:logmnior最大表字符支持最大30,字段也是字符最大30个
  1. The tables or column names selected for mining must not exceed 30 characters.
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表