ITPub博客

首页 > 数据库 > Oracle > ORACLE物化视图日志问题分析

ORACLE物化视图日志问题分析

原创 Oracle 作者:bestpaydata 时间:2016-01-07 09:26:43 0 删除 编辑

ORACLE物化视图日志问题分析

                        

 

深入理解:

物化视图日志是用来记录基表更细操作的一种特殊日志表,物化视图的快速刷新要求基本必须建立物化视图日志。物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号。

 

任何物化视图都会包括的4列:
SNAPTIME$$
:用于表示刷新时间。
DMLTYPE$$
:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。
OLD_NEW$$
:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。
CHANGE_VECTOR$$
:表示修改矢量,用来表示被修改的是哪个或哪几个字段。
如果WITH后面跟了ROWID,则物化视图日志中会包含:M_ROW$$:用来存储发生变化的记录的ROWID。
如果WITH后面跟了PRIMARY KEY,则物化视图日志中会包含主键列。
如果WITH后面跟了OBJECT ID,则物化视图日志中会包含:SYS_NC_OID$:用来记录每个变化对象的对象ID。
如果WITH后面跟了SEQUENCE,则物化视图日子中会包含:SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。
如果WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。

1,故障模拟

create table t_info_a(id number(10),name varchar2(30));

alter table t_info_a add constraint pk_id01 primary key(id);

insert into t_info_a

select 111,'kkk' from dual;

SELECT * FROM t_info_a;

CREATE MATERIALIZED VIEW LOG ON t_info_a 

WITH PRIMARY KEY 

INCLUDING NEW VALUES;

select * from all_mview_logs;

    CREATE MATERIALIZED VIEW MV_t_info_a --创建物化视图 

    BUILD IMMEDIATE  --在视图编写好后创建 

    REFRESH FAST WITH PRIMARY KEY  --根据主表主键增量刷新(FAST,增量)  

    ON DEMAND  -- 在用户需要时,由用户刷新 

    ENABLE QUERY REWRITE  --可读写 

    AS 

    SELECT * FROM t_info_a; --查询语句  

   drop table MLOG$_T_INFO_A;

SELECT * FROM T_INFO_A


 

update T_INFO_A a

set a.name = 'rrrr' where id = 111;


相应的

insert into T_INFO_A

 select 222,'tttt' from dual;

 delete from T_INFO_A where id = 111;

都会报同样的错误;

(如果在生产中基表是核心信息表,那么造成的灾难不可预估.)

2,解决办法

只需要如下一条命令即可:

drop materialized view log on "BTUPAYPROD"."T_INFO_A";


--DROP MATERIALIZED VIEW "BTUPAYPROD"."MLOG$_T_INFO_A";

 

验证问题是否已解决:

update T_INFO_A a

 set a.name = 'rrrr' where id = 111;

 insert into T_INFO_A

 select 222,'tttt' from dual;

 delete from T_INFO_A where id = 111;


没有报错,而且相应操作也成功。

3,生产环境中正确操作步骤演练

create table t_info_b(id number(10),name varchar2(30));

insert into t_info_b

select 111,'kkk' from dual;

alter table t_info_b add constraint pk_id02 primary key(id);

SELECT * FROM t_info_b;


先创建物化视图:

CREATE MATERIALIZED VIEW LOG ON t_info_b 

WITH PRIMARY KEY 

INCLUDING NEW VALUES;

--查看物化视图日志信息

select * from all_mview_logs t

where t.MASTER = 'T_INFO_B'


 

--创建物化视图(其实这步可有可无)

CREATE MATERIALIZED VIEW MV_t_info_b --创建物化视图 

    BUILD IMMEDIATE  --在视图编写好后创建 

    REFRESH FAST WITH PRIMARY KEY  --根据主表主键增量刷新(FAST,增量)  

    ON DEMAND  -- 在用户需要时,由用户刷新 

    ENABLE QUERY REWRITE  --可读写 

    AS 

SELECT * FROM t_info_b; --查询语句  

现在假设MLOG$_T_INFO_B这个表很大(如:100G),需要删除以释放空间资源。该如何解决呢?

朋友们:看到MLOG$_开头的东西的时候要注意了,千万别跟删普通表一样的删除,千万不要drop table MLOG$_T_INFO_B;这样的命令了。否则灾难就找上门来了。

正确的做法是:理解MLOG$_T_INFO_B这个是表T_INFO_B上的物化视图日志,然后用如下命令删除。

 drop materialized view log on "BTUPAYPROD"."T_INFO_B";

--完成后我们来看看

SELECT * FROM t_info_b;


说明基表能查询。

再试试增、删、改操作:

insert into t_info_b

select

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30109892/viewspace-1972981/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-01-19

  • 博文量
    126
  • 访问量
    1054947