物化视图prebuilt和在线重定义

数据迁移中有一种解决方案很有亮点,如果表的数据量大,迁移涉及的表不多,同时对于维护时间有要求的情况下,物化视图的prebuilt方式就是一种很不错的选择。
大体的步骤和方法如下:
假设源环境是test_source,目标环境是test_target

在源环境中test_source的操作如下:
Create table test_mv as select *from all_objects  ;
alter table test_mv modify(object_id primary key);
create materialized view log on test;    这个地方需要注意是主键,with rowid的方式是不可以的

目标环境test_target的操作如下:
创建db link
然后创建表,同步表结构即可
create table test_mv as select * from test_mv@prdb where 1=2;
然后创建物化视图,和表同名
create materialized view test_mv on prebuilt table refresh fast as select * from test_mv@test_source;
第一次需要全量刷新数据,也就意味着一次全量,以后都是增量
exec dbms_mview.refresh(‘TEST_MV’,‘FAST’); -- 刷新数据
确认数据同步正常,删除物化视图即可
Drop materialized view test_mv;

需要补充的是创建快速刷新的物化视图,使用如下with rowid的方式是可行的,但是在prebuilt table的情况下,这个还无法支持。
create materialized view test_mv on prebuilt table refresh fast with rowid as select * from test_mv@test_source;
这个其实也可以理解。因为源环境和目标环境是完全不同的数据库环境,rowid无法固定,只能通过主键的方式来定位。
而如果我们进一步细想,如果是同一个数据库中要做这种类似的操作,好像实践意义不大,谁会无聊的自己复制自己的数据,然后不断刷新。
其实不然,大名鼎鼎的在线重定义就是如此。我们来捋一捋里面的一些东西。
在线重定义需要有一个检查步骤。
EXEC dbms_redefinition.can_redef_table('N1','TAB_PART_ONE_PAR',1); 
默认是需要使用PK,否则会报出错误ORA-12089: cannot online redefine table "N1"."TAB_PART_ONE_PAR" with no primary key
而一种改进思路就是使用rowid的方式,改进成为下面的形式即可。
EXEC dbms_redefinition.can_redef_table('N1','TAB_PART_ONE_PAR',dbms_redefinition.cons_use_rowid); 
在同一个数据库中,这样做是没有问题的,我们完全可以通过rowid定位到具体的一行数据。
而在线重定义为什么能够始终保持重定义的过程中,源表始终可用,其实内部就是在通过物化视图日志来得到增量的数据变化,重定义过程中DML操作依旧是在源表上进行,对于源表要说完全没有影响那是不可能的,但是能够保证数据访问,更新操作始终可进行,这个意义就大大不同了。为什么一个表可以在线修改为分区表,为什么一个表添加若干个字段始终会保持业务不受影响。因为在线重定义的本质就是物化视图的prebuilt,比如我们要把一个普通表改为分区表,那么普通表就是源表,分区表就是目标表。
在线重定义的过程中会从源表中复制数据到目标表,类似于insert into 目标表 select *from 源表,或者dbms_mview.refresh('目标表‘,'C')这种方式。
而增量的数据则会写入物化视图日志,可以在后续不断去刷新缩小数据的差异。这个过程就是无话视图的增量刷新,类似于dbms_mview.refresh('目标表‘,'F');
而在最后确认无误的情况下,能够删除和表同名的物化视图,则停止了数据的更新,这样目标表也释放出来了,这个时候需要做的就是,复制源表的数据字典信息,和目标表替换。整个过程都给完整的衔接起来了。
    如此看来,在线重定义的过程真是好玩,和物化视图prebuilt方式较大的差别就是数据字典信息的复制,而在多数据库环境中,源库,目标库的数据访问信息本就不同,所以也就无需考虑这个因素了,大道至简,其实很多思路都是相通。

时间: 2024-09-20 21:35:26

物化视图prebuilt和在线重定义的相关文章

在线重定义的补充测试

    在很多时候,我们都是需要保持业务的可持续性,尽管说DDL的过程持续时间很短,但是在线业务出现,就会阻塞DML,导致业务访问中断,事务收到影响,所以在有些场景下,高可用的需求可能比性能的需求优先级还要高一些.     比如一个分区表,突然发现分区的规则存在一些问题,如果需要重新规划分区,部署,可能对于在线业务影响较大,能不能平滑的过渡到重新规划的分区模式下.     比如一个普通表,随着数据量的增加发现已经存在一些管理瓶颈,比如历史数据的清理比较麻烦,想改为分区表的方式     比如一个表

使用在线重定义重构亿级分区表

在我的印象中,一直以来都会收到一封报警邮件,之前分析过,排查过,最后发现是一个遗留问题,协调开发同学,停业务维护还是有一些难度,最后不了了之了,在今天又突然想起了这件事情,觉得还是需要做点什么. 报警邮件类似下面的形式: ZABBIX-监控系统: ------------------------------------ 报警内容: Disk I/O is overloaded on 10.127.2.134_xx机房_xxxx ----------------------------------

基于 dbms_redefinition 在线重定义表

      Oracle 支持在线重定义表,也就是说我们可以在修改表结构(DDL)的同时进行相关的DQL.DML操作,使得前端的DML根本感觉不到表结构实际上已经发生了变化,对于用户而言是完全透明的.当然在线重定义期间,前端性能会稍微有所下降.Oracle提供的重定义包dbms_redefinition即是用与完成此操作.其实质是Oracle使用了智能物化视图及物化视图日志的方式.在对象结构重组期间,表现为一个本地对象的复制,重组期间发生的任何变化都会被刷新到最新.   1.在线重定义表的主要功

oracle在线重定义包DBMS_REDIFINITION #

http://blog.itpub.net/post/468/12855 在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统.Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就无法完成了.而且,对于被大量DML语句访问的表,幸运的是,Oracle从9i版本开始提供了在线重定义表功能,通过调用DBMS_REDEFINITION包,可以在修改表结构的同时允许DML操作. 在线重定义表具有以下功能: 1.

[20170214]在线重定义测试.txt

[20170214]在线重定义测试.txt --//以前测试过,重复测试,因为生产系统要做一次相同的操作. --//实际的原理利用物化事务.注例子好像来源于piner的<构建oracle高可用环境>,当时版本是9i,好像没有 --//dbms_redefinition.copy_table_dependents函数. 1.准备工作: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER

Oracle Online Redefinition在线重定义(中)

上篇中,我们简单地介绍了如何使用Oracle在线重定义特性进行数据表Online的结构变动操作.本篇我们从一个较复杂的案例出发,讨论复杂变化情况下如何进行Online Redefinition,以及dbms_redefinition包各个关键方法的作用.   3.一个分区表的重定义动作   我们定义一个数据表T.     SQL> create table t as select object_id, object_name, created from dba_objects; Table cr

Oracle Online Redefinition在线重定义(上)

面对越来越多的7*24系统,运维人员进行工作可用的时间窗口变的越来越小.就在有限的时间窗口中,硬件检修.网络改造配置占据了很多时间.对数据库对象进行日常维护,越来越成为我们需要关注的问题.   进行数据重排.表分区.字段类型修改.字段增改这样的操作,在开发和测试环境上是比较容易进行的.即使数据表很大,操作耗时可能会很高,我们也能够通过一些非技术的手段赢取操作时间窗.但是对于投产系统而言,操作过程中的长时间锁定可能是业务不能接受的.这个时候,就可以考虑Oracle的一些Online操作技术.  

Oracle在线重定义失败后的处理

普通表在线重定义为分区表过程中报错,数值范围超过了分区限制大小,那么想要重新对表进行在线重定义需要经过哪些步骤呢?这个例子记录了处理过程: SALES@ORCL>exec dbms_redefinition.start_redef_table('SALES', 'SALES', 'SALES_P'); BEGIN dbms_redefinition.start_redef_table('SALES', 'SALES', 'SALES_P'); END; * ERROR at line 1: OR

oracle 10g在线重定义新特性:关联对象自动重命名(二)

9i的在线重定义存在一个问题,执行完在线重定义后,表的名称虽然保持不变,但是索引.约束.触发器等关联对象的名称会发生变化,有时候这会带来一定的问题,而要在事后手工修改,会比较麻烦. 10g的在线重定义解决这个问题.如果对象是利用COPY_TABLE_DEPENDENTS创建的,那么这些关联的对象在重定义操作完成后,自动改为原始的名称.如果是手工创建的关联对象,则可以利用REGISTER_DEPENDENT_OBJECT过程,所有执行了REGISTER_DEPENDENT_OBJECT过程的关联对