一、问题描述

某项目组来电,说有一个源表约2万多条的物化视图,每5分钟定时全量(Complete)刷新一次,一天下来,导致Oracle数据库归档日志骤增。

二、问题分析及解决

先明确一个问题:归档日志(Archive Log)和重做日志(REDO Log)的关系。

Oracle的重做日志是一组(或几组)文件,按一定的规则顺序循环写,当重做日志写满后,从头开始写之前,如果数据库在归档模式(Archive),则在重写之前,需要把当前的重做日志进行归档(Archive),形成归档日志。即归档日志来自于重做日志。

基于此,可以通过减少产生重做日志的量来达到减少归档日志量的目的。

综合一下:

1、不要全量刷新,采用在源表上记录物化视图日志的方式,实现快速刷新,减少更新的数据量,达到减少重做日志的目的;

2、指定物化视图为nologging模式

3、减少或取消其上的索引(2W条记录,如果使用得比较频繁,甚至可以考虑把它cache到内存中)

4、如果一定要有索引,自己写刷新的Job,先disable索引,然后刷新,然后重建索引(唯一索引可能有问题)。

5、评估业务、技术要求,考虑取消物化视图,建立一般视图,在访问该视图时,直接从源表中查询。

三、验证过程

验证全量刷新的物化视图产生的REDO日志的大小:

-- 建立源表

create table big_table as select * from dba_objects;

-- 我机器上(11g),大概8W条记录

select count(*) from big_table;

/*

开始验证全量刷新产生的REDO日志的量

*/

-- 建立物化视图

create materialized view big_table_mv as select * from big_table;

-- 查看目前REDO日志的量(重新启动数据库会自动清理)

-- 记录下数值,用于接下来的比较

select a.name, b.value from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';

--243964

-- 手工全量刷新物化视图

begin

dbms_mview.refresh( 'BIG_TABLE_MV', 'C' );

end;

-- 再查看REDO日志的量,比较一下

-- 记录下数值,用于接下来的比较

select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';

--value:38845196

--diff:38601232,增加了约37M

-- 还是比较可观的

-- 把物化视图改为nologging模式

alter table big_table_mv nologging;

-- 再全量刷新

begin

dbms_mview.refresh( 'BIG_TABLE_MV', 'C' );

end;

-- 再查看REDO日志的量,比较一下

-- 记录下数值,用于接下来的比较

select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';

--value:77495608

--diff:38894376,增加了约37M,全量刷新时,指定nologging没有什么效果喔。

-- 给物化视图建立索引

create index big_table_mv_idx on big_table_mv(owner,object_type,object_name);

-- 全量刷新

begin

dbms_mview.refresh( 'BIG_TABLE_MV', 'C' );

end;

-- 再查看REDO日志的量,比较一下

select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';

--value:166458592

--diff:127564216,增加了约121M,索引的影响还是比较大的。

-- 清理

drop materialized view big_table_mv;

drop table big_table purge;

可以发现:

1、全量刷新时,将产生较多的REDO,以上面的情况为例,如果该物化视图每5分钟刷新一次,则全天将产生约10656M(约10G,以不带索引,37M计算)的归档日志数据。

2、当该物化视图上有索引时,归档日志的数据将更大。

接下来再做一个验证,相同数据量,记录物化视图日志,快速刷新,每10秒更新源表中的数条记录。

重启数据库,清理REDO。

验证快速刷新的物化视图产生的REDO日志的大小:

-- 建立源表

create table big_table as select * from dba_objects;

-- 我机器上(11g),大概8W条记录

select count(*) from big_table;

-- 建立物化视图日志

create materialized view log on big_table with rowid including new values;

/*

开始验证快速刷新产生的REDO日志的量

*/

-- 建立物化视图,每10秒刷新一次

create materialized view big_table_mv nologging

refresh fast on demand

with rowid

START WITH TO_DATE('18-03-2011 10:09:08', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE + 1 / 8640

as select * from big_table;

-- 查看目前REDO日志的量(重新启动数据库会自动清理)

-- 记录下数值,用于接下来的比较

select a.name, b.value from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';

--305808

select count(*) from big_table t where t.owner = 'EPAPRD';

--937

-- 每隔2秒钟,删除并重新插入1000条记录,执行100次吧。

-- 共删除10万条,插入10万条。

declare

i integer;

begin

i := 1;

loop

delete from big_table t where t.owner = 'EPAPRD';

insert into big_table select * from dba_objects o where o.OWNER = 'EPAPRD';

commit;

dbms_lock.sleep(2);

i := i + 1;

exit when i > 100;

end loop;

end;

-- 再查看REDO日志的量,比较一下

-- 记录下数值,用于接下来的比较

select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';

--value:126422824

--diff:126117016,大约121M。

-- 给物化视图建立索引

create index big_table_mv_idx on big_table_mv(owner,object_type,object_name);

-- 每隔2秒钟,删除并重新插入1000条记录,执行100次

-- 共删除10万条,插入10万条。

declare

i integer;

begin

i := 1;

loop

delete from big_table t where t.owner = 'EPAPRD';

insert into big_table select * from dba_objects o where o.OWNER = 'EPAPRD';

commit;

dbms_lock.sleep(2);

i := i + 1;

exit when i > 100;

end loop;

end;

-- 再查看REDO日志的量,比较一下

select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';

--value:252701192

--diff:126584176,大约121M。

-- 为什么有索引和没有索引的REDO大小几乎没有差别?删除、插入数据时,都是要维护索引的呀。

-- 清理

drop materialized view big_table_mv;

drop table big_table purge;

可以看出,快速刷新模式下,刷新100次,每次删除1000条、插入1000条记录,产生的REDO日志大小与1次全量刷新的大小小了很多。而且在生产环境中,想来不太可能有如果之多的操作,实际产生的REDO日志会更小。

oracle写一个全量刷新,Oracle物化视图定时全量刷新以致归档日志骤增相关推荐

  1. oracle12c视图刷新,12c 物化视图 - 对快速刷新的理解

    前一篇博客用一个简单的示例描述了完全刷新的物化视图.完全刷新的物化视图每次刷新都需要对保存数据的基表执行delete操作,在将新的结果集insert到基表.为了减少这个开销,为了减少这个开销Oracl ...

  2. iOS换一种思路写一个无限轮播的滚动视图

    换一种思路写一个无限轮播的滚动视图 写这篇博客已经距离我当时写差不多有一个月时间了,也完善了很多,基本是没有bug的,如果有,不妨留言,喜欢的话,劳烦各位点个赞,不喜欢的,不妨看看思路,提提意见 1. ...

  3. oracle复制一个表的结构图,Oracle复制表结构

    Oracle复制表结构 如下,表a是数据库中已经存在的表,b是准备根据表a进行复制创建的表: 1.只复制表结构的sql create table b as select * from a where ...

  4. oracle给一个表创建序列,oracle表中怎么创建序列

    oracle序列的创建: create sequence seq_newsId increment by 1 start with 1 maxvalue 999999999; 获得oracle序列的S ...

  5. 物化视图基于rowID快速刷新

    --1创建log create MATERIALIZED VIEW LOG ON gh_qyghgx WITH rowid; create MATERIALIZED VIEW LOG ON gh_qy ...

  6. 批量刷新远程物化视图的方法(备用)

    一.创建远程数据库连接 create database link MDMconnect to MDMidentified by mdmusing '(DESCRIPTION = (ADDRESS_LI ...

  7. 查看oracle压力,一个很简单测试oracle压力方法

    今天做了一个简单的测试数据库压力,把东西分享了一下. 服务器情况: 操作系统版本:CentOS 5.6 -64 cpu:Intel(R) Xeon(R) CPU  X5660  @ 2.80GHz * ...

  8. oracle使一个字段自增,Oracle数据库实现一个字段自增

    对于SQL SERVER数据库实现字段自增比较简单,可以之间使用函数:identity(),例如我们在建表时可以这样实现: create table tbRentInfo( sID int ident ...

  9. oracle声明一个表变量赋值,Oracle Declare 变量声明

    declare 在 Oracle 一般是用在函数.存储过程和块结构及简单的事务中. 普通变量 声明declare v_number number(10); -- 长度10 v_char varchar ...

  10. oracle新建一个用户_Kettle 连接oracle将数据保存到Excel

    关注微信公共号:小程在线 现在公共号更改了推送规则,为了您能方便的接受消息,阅读完之后,麻烦点击下在看或点赞或评论,谢谢! 关注CSDN博客:程志伟的博客 搞定完数据库之间的数据传输,Kettle的学 ...

最新文章

  1. 装饰器模式(Decorator)
  2. radio按扭设置只读_disabled属性样式问题
  3. MySQL数据库:触发器Trigger
  4. form表单提交时,同一个名字的input类型的两个同时提交会覆盖吗
  5. java imapi.jat的使用_springboot+mybatis+Maven+jsp+Quartz整合实战林业厅项目
  6. python之str与bytes互转
  7. jquery 输入框,单选按钮,下拉列表和复选框的使用
  8. 有关Select 语句查询.四
  9. maven整合ssh框架笔记
  10. 14 、软件测试-MySQL的基本使用方法-增删改查
  11. linux 命令行 过滤,linux过滤命令
  12. IDEA 重复执行 updating indices问题
  13. Thymeleaf从后端取数据到js中 js中字符串转数字的函数应用
  14. LeCo-88.合并两个有序数组
  15. lwip【4】 lwIP配置文件opt.h和lwipopts.h初步分析之一
  16. 基于企业微信机器人实现预警功能
  17. WebStorm英文版汉化
  18. 北大c语言百度云资源,北大C语言讲义.pdf
  19. php undefined 判断,JS中如何判断null、undefined与NaN
  20. java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher

热门文章

  1. 股基交易额市场份额(VMS)
  2. Velodyne 16线三维激光雷达
  3. 分布式id黑科技完善
  4. 不用计算机时自动关掉屏幕,电脑怎么取消自动黑屏
  5. java闰年的计算方法_java中对 闰年的计算 以及月份天数
  6. Springboot版本的WebSocket向app端推送消息实现
  7. mac软件推荐及chrome插件推荐
  8. 【Tableau server 8.0】Tableau server 考试真题回顾总结
  9. 翻译: Revisiting Contrastive Methods for Unsupervised Learning of Visual Representations
  10. 机器人学之动力学笔记【11】—— 拉格朗日 动力学方程