物化视图日志过大,手工清理

参考

https://blog.csdn.net/demonson/article/details/91518341

问题说明:

1.生产环境遇到一个物化视图日志表100g,问题处理根据上述博客,后续测试环境重演

2.总结

由于测试环境关闭或者网络问题,导致主库物化视图日志一直保留,需要清除有问题的物化视图日志。
How to purge MLOG$ Tables in the OLTP database (文档 ID 1922560.1)    
How to REGISTER and UNREGISTER a Materialized View - Testcase (文档 ID 1393276.1)
整体流程:
1.生产环境A库对两个基表创建一个物化日志,物化视图
2.测试环境B库,创建物化视图,通过DB_LINK远程查询
3.模拟正常操作及刷新流程
4.模拟异常情况,将测试环境连接主库db link,测试环境删除物化视图,模拟主库业务正常操作,最终导致生产环境A库物化视图日志无法被清理,Segments越来越大;

1)使用上述之前的操作
SQL> select * from my_mv_cd;
        ID NAME                 ADDRESS
---------- -------------------- --------------------
         1 cc                   CC
2)测试环境B库,创建物化视图,通过DB_LINK远程查询
SQL> create public database link dblink1 connect to yz identified by yz using ‘(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.20.66)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = tt)))‘;
create materialized view scott.mv_cd_test
build immediate refresh fast WITH ROWID on demand
as
select p.rowid person_rowid,a.rowid address_rowid,p.pid as id, p.name, a.address from [email protected] p,[email protected] a
where p.pid = a.aid;

生产环境A库可以查询到如下信息
SQL> select OWNER,NAME,MVIEW_SITE,MVIEW_ID from DBA_REGISTERED_MVIEWS where name in(‘MY_MV_CD‘,‘MV_CD_TEST‘);
OWNER      NAME                                MVIEW_SITE                       MVIEW_ID
---------- ----------------------------------- ------------------------------ ----------
YZ         MY_MV_CD                            TT11204                               104
SCOTT      MV_CD_TEST                          TT                                    105
物化视图的注册信息,以及物化视图对应的db name
SQL> SELECT * FROM DBA_BASE_TABLE_MVIEWS;
OWNER      MASTER                         MVIEW_LAS   MVIEW_ID
---------- ------------------------------ --------- ----------
YZ         TEST_PERSON                    20-AUG-19        105
YZ         TEST_ADDRESS                   20-AUG-19        105
YZ         TEST_PERSON                    20-AUG-19        104
YZ         TEST_ADDRESS                   20-AUG-19        104
根据物化视图ID号,可以得到物化视图对应的基表

生产环境查询,物化视图信息,最后一次全量刷新,名称
SQL> select owner,MVIEW_NAME,LAST_REFRESH_DATE,REFRESH_METHOD,FULLREFRESHTIM,INCREFRESHTIM,INC_REFRESHABLE,KNOWN_STALE,INVALID from DBA_MVIEW_ANALYSIS;
OWNER      MVIEW_NAME                     LAST_REFR REFRESH_ FULLREFRESHTIM INCREFRESHTIM I K I
---------- ------------------------------ --------- -------- -------------- ------------- - - -
YZ         MY_MV_CD                       20-AUG-19 COMPLETE              0             0 Y N N
测试环境查询,物化视图信息,最后一次全量刷新,名称
SQL> select owner,MVIEW_NAME,LAST_REFRESH_DATE,REFRESH_METHOD,FULLREFRESHTIM,INCREFRESHTIM,INC_REFRESHABLE,KNOWN_STALE,INVALID from DBA_MVIEW_ANALYSIS;
OWNER                          MVIEW_NAME                     LAST_REFRESH REFRESH_ FULLREFRESHTIM INCREFRESHTIM I K I
------------------------------ ------------------------------ ------------ -------- -------------- ------------- - - -
SCOTT                          MV_CD_TEST                     18-NOV-19    FAST                  0             0 Y N N

3)模拟正常操作及刷新流程
思路: 插入测试数据,commit提交;
       查询物化视图日志;
       手工刷新生产环境本地物化视图,查询物化视图以及日志情况;
       插入测试数据,commit提交;
       手工刷新测试环境远程物化视图,查询物化视图以及日志情况(此时对于远程物化视图来说,基表的两次测试数据都已应用完成,但是对于本地来说物化视图存在1条记录并未应用的情况)

插入测试数据
SQL> insert into test_person values(2,‘dd‘);
SQL> insert into test_address values(2,‘dd‘,2048);
SQL>commit;

SQL> select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_person;
SNAPTIME$ D
--------- -
01-JAN-00 I
SQL> select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_address;
SNAPTIME$ D
--------- -
01-JAN-00 I
生产环境手工执行刷新存储过程
SQL>exec my_mv_cd_procedure_job;
查询日志表,SNAPTIME 字段无变化
查询生产环境本地物化视图
SQL> select * from my_mv_cd;
        ID NAME                                ADDRESS
---------- ----------------------------------- --------------------
         2 dd                                  dd
         1 cc                                  CC
查询测试环境物化视图(改变未生效)
SQL> select * from MV_CD_TEST;
SQL> select * from MV_CD_TEST;
PERSON_ROWID       ADDRESS_ROWID              ID NAME                                     ADDRESS
---- ---------------------------------------- ----------------------------------------
AAAV5nAAEAAAbm/AAA AAAV5pAAEAAAbnPAAA          1 cc                                       CC

插入测试数据
SQL> insert into test_person values(3,‘EE‘);
SQL> insert into test_address values(3,‘EE‘,3048);
SQL>commit;

查询物化视图日志,虽然两个物化视图,一个已经刷新完毕,但是物化视图日志并无变化
SQL> select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_person;
SNAPTIME$ D
--------- -
20-AUG-19 I
01-JAN-00 I

第二次刷新,刷新远程测试环境物化视图
SQL> exec  dbms_mview.refresh(‘MV_CD_TEST‘);
查询远程,测试环境物化视图
SQL>  select * from MV_CD_TEST;
PERSON_ROWID       ADDRESS_ROWID              ID NAME       ADDRESS
------------------ ------------------ ---------- ---------- ----------
AAAV5nAAEAAAbm/AAA AAAV5pAAEAAAbnPAAA          1 cc         CC
AAAV5nAAEAAAbm9AAB AAAV5pAAEAAAbnNAAB          3 EE         EE
AAAV5nAAEAAAbm9AAA AAAV5pAAEAAAbnNAAA          2 dd         dd

查询本地生产环境物化视图日志及本地物化视图
SQL> select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_person;
no rows selected
!!!  正常情况下不会如此,说明再测试的过程中,本地环境自动刷新同步了,导致物化视图被刷新。

删除本地物化刷新JOB,重复上述操作,调整为delete操作
BEGIN
DBMS_SCHEDULER.DROP_JOB( job_name => ‘my_mv_cd_job‘ );
 END;
 /
本地,删除物化视图基表,一条记录,多次刷新本地物化视图,观察现象。
SQL> delete test_person where pid=3;
SQL> commit;
SQL>  select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_person;
SNAPTIME$ D
--------- -
01-JAN-00 D
生产环境手工执行刷新存储过程
SQL>exec my_mv_cd_procedure_job;
SQL>exec my_mv_cd_procedure_job;
查询发现,
SQL> select * from my_mv_cd;
        ID NAME                 ADDRESS
---------- -------------------- --------------------
         2 dd                   dd
         1 cc                   CC
SQL> delete test_person where pid=2;
SQL> commit;
远程测试环境刷新
SQL> exec  dbms_mview.refresh(‘MV_CD_TEST‘);
SQL> exec  dbms_mview.refresh(‘MV_CD_TEST‘);
可以发现,删除2条记录,但是物化视图日志,只保留了一条记录,这是本地并未应用的物化视图日志
SQL> select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_person;
SNAPTIME$ D
--------- -
20-AUG-19 D

4.模拟异常情况,将测试环境连接主库db link,测试环境删除物化视图,模拟主库业务正常操作,最终导致生产环境A库物化视图日志无法被清理,Segments越来越大;
SQL>drop public database link dblink1;
SQL> drop materialized view scott.MV_CD_TEST;

虽然测试环境已经删除了物化视图,但是生产环境还是记录了物化视图信息,由于DB LINK失效导致,生产环境并未收到关于删除的操作更新。
SQL>select OWNER,NAME,MVIEW_SITE,MVIEW_ID from DBA_REGISTERED_MVIEWS where name in(‘MY_MV_CD‘,‘MV_CD_TEST‘);
OWNER      NAME       MVIEW_SITE                       MVIEW_ID
---------- ---------- ------------------------------ ----------
YZ         MY_MV_CD   TT11204                               104
SCOTT      MV_CD_TEST TT                                    105

SQL>  SELECT * FROM DBA_BASE_TABLE_MVIEWS;
OWNER      MASTER                         MVIEW_LAS   MVIEW_ID
---------- ------------------------------ --------- ----------
YZ         TEST_PERSON                    20-AUG-19        104
YZ         TEST_ADDRESS                   20-AUG-19        104
YZ         TEST_PERSON                    20-AUG-19        105
YZ         TEST_ADDRESS                   20-AUG-19        105

插入测试数据
SQL> insert into test_person values(3,‘EE‘);
SQL> commit;
生产环境手工执行刷新存储过程
SQL>exec my_mv_cd_procedure_job;

SQL> select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_person;
SNAPTIME$ D
--------- -
21-AUG-19 I
SQL> insert into test_person values(2,‘dd‘);
SQL> commit;
生产环境手工执行刷新存储过程
SQL>exec my_mv_cd_procedure_job;
SQL>  select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_person;
SNAPTIME$ D
--------- -
20-AUG-19 I
20-AUG-19 I

SQL> select * from my_mv_cd;
        ID NAME            ADDRESS
---------- -------------------- --------------------
         3 EE              EE
         1 cc              CC
         2 dd              dd
可以发现,发生此问题时,物化视图日志将用不被删除,最终实际某生产环境,物化视图日志达到100G水平。
https://blog.csdn.net/demonson/article/details/91518341
How to purge MLOG$ Tables in the OLTP database (文档 ID 1922560.1)
由于测试环境关闭或者网络问题,导致主库物化视图日志一直保留,需要清除有问题的物化视图日志。
SQL>EXEC DBMS_MVIEW.PURGE_MVIEW_FROM_LOG(105);
SQL> select SNAPTIME$$,DMLTYPE$$ from  MLOG$_test_person;
no rows selected
SQL> EXEC DBMS_MVIEW.UNREGISTER_MVIEW(‘SCOTT‘, ‘MV_CD_TEST‘, ‘TT‘);
SQL> select OWNER,NAME,MVIEW_SITE,MVIEW_ID from DBA_REGISTERED_MVIEWS where name in(‘MY_MV_CD‘,‘MV_CD_TEST‘);
SQL>  SELECT * FROM DBA_BASE_TABLE_MVIEWS;
关于注册信息均被删除

How to REGISTER and UNREGISTER a Materialized View - Testcase (文档 ID 1393276.1)

原文地址:https://www.cnblogs.com/lvcha001/p/11888151.html

时间: 2024-08-30 07:12:50

物化视图日志过大,手工清理的相关文章

Oracle数据库入门——如何根据物化视图日志快速刷新物化视图

Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL> create table t(id number, name varchar2(30), num number);表已创建. SQL> create materialized view log on t with rowid, sequence(id, name) including new v

Oracle 物化视图日志

一.物化视图日志是什么 oracle 的物化视图的快速刷新要求必须建立物化视图日志,通过物化视图日志可以实现增量刷新功能. 官方文档给出的对物化视图日志的释义: A materialized view log is required on a master to perform a fast refresh on materialized views based on the master. When you create a materialized view log for a master

Oracle数据库入门——物化视图日志结构

物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途. 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号. 物化视图日志在建立时有多种选项:可以指定为ROWID.PRIMARY KEY和OBJECT ID几种类型,同时还可以指定SEQUENCE或明确指定列名.上面这些情况产生的物化视图日志的结构都不相同. 任何物化视图都会包

数据库日志太大,清理日志文件

如果你的数据库出现如下场景,那么你需要对数据库进行日志清理了. 注:清理后的数据库,可能无法对数据库进行还原,所以,清理之前需要对数据库进行完整备份: 1.没有做任何操作,数据库日渐查询缓慢. 2.数据库数据很少,但是日志文件很大 你就需要查看是否日志文件过大,如果日志文件太大,就需要对日志文件进行清理了. 清理输入框的脚本如下: ----查询数据库日志 USE 数据库名 SELECT NAME, size FROM sys.database_files -----清空数据库日志 USE mas

【转】Oracle之物化视图

原文地址:http://www.cnblogs.com/Ronger/archive/2012/03/28/2420962.html 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体查询性能的提高,并没有实质上的好处.1.物化视图的类型:ON DEMAND.ON COMMIT 二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视

物化视图(转)

物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体查询性能的提高,并没有实质上的好处.1.物化视图的类型:ON DEMAND.ON COMMIT 二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性:而ON COMMIT是说,一旦基表有了CO

物化视图的刷新(转载)

转载源自于:http://czmmiao.iteye.com/blog/1827254 物化视图 物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照.物化视图可以基于表查询,视图和其它的物化视图.通常情况下,在复制环境下,物化视图被称为主表,在数据仓库中称为明细表.对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的.如果你想修改本地副本,必须用高级复制的功能.当你想从一个表或视图中抽取

《oracle每天一练》Oracle之物化视图

相关帖子思考和跟踪 本文转自Ronger 物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体查询性能的提高,并没有实质上的好处.1.物化视图的类型:ON DEMAND.ON COMMIT 二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性:

转: Oracle中的物化视图

物化视图创建语法:CREATE MATERIALIZED VIEW <schema.name>PCTFREE <integer>--存储参数PCTUSED <integer>--存储参数TABLESPACE <tablespace_name>--表空间BUILD IMMEDIATE|DEFERRED--创建方式ENABLE|DISABLE QUERY REWRITE--是否支持查询重写REFRESH <FORCE|FAST|COMPLETE|NEVER