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博客 ” ,链接:http://blog.itpub.net/30109892/viewspace-1972981/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30109892/viewspace-1972981/