• Oracle远程数据建物化视图(materialized)创建简单记录,以及DBLINK的创建


    目的:实现远程数据库访问及其相应表的定时同步

    一、远程数据库dblink的创建

    select * from dba_db_links;
    select * from user_sys_privs;--查询用户权限

    1、查看scott用户是否具备创建database link 权限

    select * from user_sys_privs where privilege like upper('%DATABASE LINK%') AND USERNAME='SCOTT';

    2、授权dblink

    grant create public database link to scott;

    3、创建dblink

    create public database link DBLINK名 connect to 远程用户名 identified by "密码" USING '远程数据库IP地址/库名';--如果在create之后不加public,则创建的dblink就不是公共的,就只有创建者可以使用

    4、删除dblink

    drop public database link link_movebi;

    二、物化视图(materialized)简介

    首先创建一个测试用表,如下图:

    物化视图也是种视图。Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。
    物化视图存储基于远程表的数据,也可以称为快照。物化视图可以查询表,视图和其它的物化视图。

    1、本地库(创建物化视图需要的权限)

    grant create materialized view to scott;-----切换sys用户授权

    2、源系统库(如果需要进行快速刷新,则需要建立物化视图日志。-->在源表库建立物化视图日志)

    物化视图日志在建立时有多种选项:可以指定为 rowid、primary key 和 object id 几种类型,同时还可以指定 sequence 或明确指定列名。
    不过上面这些情况产生的物化视图日志的结构都不相同。

    --第一种主键类型
    create materialized view log on dept_tmp_test  
    tablespace movebi_data -- 日志空间  
    with primary key;      -- 指定为主键类型
    --第二种rowid类型
    --new values 从句来决定oracle是否在物化视图日志中保持新的和旧的值。including 保存新的和旧的值,如果表上有一个单表物化聚合视图,你想物化视图适合快速刷新,你就要指定including
    create materialized view log on dept_tmp_test  
    tablespace movebi_data -- 日志空间  
    with rowid, sequence (dept_dmid, new_virtual_type_name6) including new values;-- 指定为rowid类型

    查看物化视图日志:

    select * from mlog$_dept_tmp_test;
    SQL> desc mlog$_dept_tmp_test;
    Name                   Type          Nullable Default Comments 
    ---------------------- ------------- -------- ------- -------- 
    DEPT_DMID              NUMBER(22)    Y  --记录每次DML操作对应的DEPT_DMID值                  
    NEW_VIRTUAL_TYPE_NAME6 VARCHAR2(200) Y  --记录每次DML操作对应的NEW_VIRTUAL_TYPE_NAME6值                   
    M_ROW$$                VARCHAR2(255) Y  --保存基表的ROWID信息,根据M_ROW$$中的信息可以定位到发生DML操作的记录。                   
    SEQUENCE$$             NUMBER        Y  --根据DML操作发生的顺序记录序列的编号,当刷新时,根据SEQUENCE中的顺序就可以和基表中的执行顺序保持一致。                  
    SNAPTIME$$             DATE          Y  --记录了刷新操作的时间。                       
    DMLTYPE$$              VARCHAR2(1)   Y  --记录值I、U和D,表示操作是INSERT、UPDATE还是DELETE。                       
    OLD_NEW$$              VARCHAR2(1)   Y  --用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。                       
    CHANGE_VECTOR$$        RAW(255)      Y  --DML操作发生在那个或那几个字段上                       
    XID$$                  NUMBER        Y  --xid$$(事务id)唯一标识对行进行更改的事务。

    删除日志:

    drop materialized view log on dept_tmp_test;

    3、本地库创建物化视图

    (1)创建方式(BuildMethods):包括 build immediate 和 build deferred 两种。
    build immediate 是在创建物化视图的时候就生成数据。
    build deferred 则在创建时不生成数据,以后根据需要在生成数据。默认为 build immediate。
    (2)查询重写(QueryRewrite):包括 enable query rewrite 和 disable query rewrite 两种。
    分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,
    如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为 disable query rewrite。
    (3)物化视图有二种刷新模式
    on demand 顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;
    on commit 提交触发,一旦基表有了commit,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。一般用这种方法在操作基表时速度会比较慢。
    (4)三种刷新方法
    完全刷新(COMPLETE): 会删除表中所有的记录(如果是单表刷新,可能会采用TRUNCATE的方式),然后根据物化视图中查询语句的定义重新生成物化视图。
    快速刷新(FAST): 采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。FAST必须创建基于主表的视图日志。对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。
    FORCE 方式:这是默认的数据刷新方式。Oracle会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。

    关于快速刷新:Oracle物化视图的快速刷新机制是通过物化视图日志完成的。Oracle通过一个物化视图日志还可以支持多个物化视图的快速刷新。
    物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

    create materialized view mv_dept_tmp_test
    refresh fast with rowid
    on demand
    start with sysdate next sysdate+5/24/60
    disable query rewrite
    as
    select * from dept_tmp_test@link_movebi; 
    
    --refresh fast with rowid  快速刷新
    --on demand  在用户需要时由用户刷新
    --start with sysdate next sysdate+5/24/60  这个物化视图每5min进行刷新
    --disable query rewrite  不可重写(默认)

    这里要注意,当发生DML 操作时,内部的触发器会把变化记录到物化视图日志里,也就是说物化视图不支持DDL的同步,
    所以在物化视图的编写过程中尽量不要使用 select * from 的形式,因为这样当基表发生变化时,物化视图就会失效。

    物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,
    Oracle会自动在物化视图日志名称后面加上数字作为序号。

    4、目标物化视图创建索引

    create index pk_id on mv_dept_tmp_test(dept_dmid);

    5、物化视图刷新

    使用dbms_mview.refresh 手工刷新

    --完全刷新  
    EXEC DBMS_MVIEW.REFRESH(LIST => 'mv_table_name',METHOD => 'c');  
    EXEC DBMS_MVIEW.REFRESH('mv_table_name','C');  
    --快速刷新  
    EXEC DBMS_MVIEW.REFRESH(LIST => 'table_name',METHOD => 'f');  
    EXEC DBMS_MVIEW.REFRESH('mv_table_name','F'); 
    --过程调用 
    begin
     DBMS_MVIEW.REFRESH(LIST => 'mv_dept_tmp_test',METHOD => 'f');
    end;

    查看物化视图刷新状态信息

    select mview_name, last_refresh_date, staleness from user_mviews;  
    select name, last_refresh from user_mview_refresh_times;

    物化视图具体操作汇总(方便自己快速查找)

    --1、给本地库授权
    grant create materialized view to scott;
    --2、源系统库目标表建日志
    create materialized view log on dept_tmp_test  
    tablespace movebi_data -- 日志空间  
    with primary key;     -- 指定为主键类型无主键可指定rowid,但注意要和后面创建物化视图时保持一致
    --查看日志
    select * from mlog$_dept_tmp_test;
    --3、本地库创建物化视图
    create materialized view mv_dept_tmp_test
    refresh force
    on demand
    start with sysdate next sysdate+5/24/60
    as
    select * from dept_tmp_test@link_movebi;
    --force(默认)自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。
    --4、修改刷新时间
    alter materialized view mv_dept_tmp_test refresh force on demand start with sysdate next sysdate+10/24/60
    --5、手动快速刷新
    begin
     DBMS_MVIEW.REFRESH(LIST => 'v_union_target_bak',METHOD => 'f');
    end;
    --6、目标库删除物化视图日志
    drop materialized view log on dept_tmp_test;
    --7、本地库删除物化视图
    drop materialized view mv_dept_tmp_test;

    查看物化视图状态备注

    select * from user_mviews;


    staleness:
    1、fresh 最新状态:当前物化视图的内容出于最新的状态
    2、stale 陈旧状态:物化视图引用的主表已经更新,但是物化视图没有刷新,所以内容相对主表来说是旧的
    3、needs_compile 需要编译:物化视图引用的主表比如视图,进行了重建后相应的物化视图就需要编译,当处于这种状态的时候dba_objects
       视图显示的STATUS为INVALID需要运行语句:alter materialized view mv_name compile;
    4、unusable 物化视图引用的主表状态不确定
    5、unknown  未知:通过prebuilt创建的表
    6、undefined 物化视图引用的表来自其他的数据库,一般通过dblink链接过来的

     (注:此为学习记录笔记,仅供参考若有问题请指正,后续补充......)

    参考:https://www.cnblogs.com/xiaohuilong/p/5995596.html

    参考:https://blog.csdn.net/qq_26941173/article/details/78529041

    参考:https://www.cnblogs.com/linjiqin/archive/2012/05/22/2513551.html

  • 相关阅读:
    java接入钉钉机器人(带源码)
    使用java做一个能赚钱的微信群聊机器人(2020年基于PC端协议最新可用版)
    侠说java8--Stream流操作学习笔记,都在这里了
    Elasticsearch调优篇-慢查询分析笔记
    网络探测和抓包工具 wireshark
    window10远程ubuntu18.04
    springdataJPA mysql myisam innodb
    命令集
    java tmpdir 启动 kafka 命令行
    java jar 启动命令
  • 原文地址:https://www.cnblogs.com/shenjie0622/p/10031149.html
Copyright © 2020-2023  润新知