ORACLE物化视图日志问题分析

ORACLE物化视图日志问题分析

                        

 

深入理解:

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

 

任何物化视图都会包括的4列:
SNAPTIME$$
:用于表示刷新时间。
DMLTYPE$$
:用于表示DML操作类型,I表示INSERTD表示DELETEU表示UPDATE
OLD_NEW$$
:用于表示这个值是新值还是旧值。NEW)表示新值,OLD)表示旧值,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博客 ” ,链接:http://blog.itpub.net/30109892/viewspace-1972981/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30109892/viewspace-1972981/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值