一、Streams概述

  Oracle 的Streams提供了信息共享的一种方式,区别于其它数据共享的方式,Streams甚至允许不同类型的数据库之间传递数据,实现这点的根本在于Streams的复制流程,通过捕获,传播,应用三个步骤,将指定的信息传输到指定位置,在捕获消息,管理消息,以及在不同数据库或应用之间共享消息等方面提供了比传统解决方案更为强大的功能和扩展性。Streams特性适用于分布式的企业应用,数据仓库,高可用解决方案等等。

  只要 掌握的足够精通,你就能感受到Streams强大的可定制性 ,比如说控制哪些信息被捕获,这些信息在数据库之间的流向,注入数据库时做怎样的处理,何时关闭stream等等。通过一些自定义的配置,Streams自动捕获、应用和管理诸如DML/DDL修改触发的消息。你甚至自定义信息存入stream,Streams会自动传输这些信息到其它数据库或相关应用。

二、Streams能用来做什么

1、 数据复制Data Replication

  Streams 通过capture进程捕获dml,ddl操作,然后通过propagate进程传播到其它数据库,然后再通过apply进程应用的方式复制数据。这中间的每个步骤都是可定制的,所谓术业有专攻,在俺看来streams就是用来干这个的。后面三思会通过无数个示例一一演示不同规则,不同需求,不同环境的配置。

2、 数据保护Data Protection

  最有效的数据保护策略就是冗余,Streams显然能够实现这一点,因为streams的主要功能就是复制数据。不过需要注意的是,由于streams实现复制的方式是逻辑的,因此如果你希望用streams取代dataguard................不是完全不可以,不过,需要好好设计。Streams与逻辑standby非常想像,都是通过分析primary的redolog,如果你对oracle dataguard特性有一定了解,那你一定能够理解,但凡逻辑standby不支持的,streams也不支持。

3、 数据仓库数据加载Data Warehouse Loading

  数据加载是数据复制中的特例。数据仓库系统的数据也是需要更新的,比如说新增或修改数据的同步,streams恰恰就可以满足这一点,因此streams也可以应用于数据仓库系统。

4、 提供数据库服务的高可用支持Database Availability During Upgrade and Maintenance Operations

  借助streams特性的帮助,你可以尽可能的降低甚至避免数据库在升级或维护操作时的停机时间。而且由于streams的实现是逻辑的,因此几乎可以无视跨版本跨平台跨字符集等方式的升级,并且如果前期准备得当,也可以做到短暂停机甚至完全不停机。

  当然说老实话三思个人认为这个东西也是看起来很美,一方面系统升级并不会频繁(更别提又跨平台又跨版本甚至再跨字符集之类超常规需求,越大型系统越是如此),第二由于是逻辑实现,前期工作必不可少,即使是逻辑就不可能100%相同,总会有些条件不具备,总会有些对象不支持,总会有些操作无法执行,这些都是需要dba在前期予以考虑并解决的,因此相对于物理方式,streams会给dba带来相当多的必须手工介入操作的机会。

三、为什么要用Streams

  在回答为什么要用Streams前,我们先得了解什么是Streams。前面大概介绍了一下streams能用来做什么,当然,都是些官方定义,实际上Streams不是一项新特性,但也不是一项很新的特性。从Oracle的9iR2版本开始推出,在10g中得到了一些增强(比如提供了downstream),其主要功能说白了就是复制数据。说到复制数据,你可能会想到oracle的其它一些同样实现数据复制功能的特性,比如说高级复制(Advanced Replication),Dataguard等等。

  在9iR2之前高级复制应用比较广泛,高级复制也分两种:多主复制和基于物化视图的复制,就我理解其最大的劣势是大数据量下效率堪优,并且对于ddl的支持不够友好。从技术实现思路上与streams几无相同之处,倒是逻辑standby与streams的实现方式非常想像,都是通过分析redo生成重做的sql语句在目标端执行,如果要说差异的话,逻辑standby只提供了整库级的复制,从功能上来看standby还是更适合应用于容灾,而streams不仅能够实现整库级的同步,在复制策略上设计的非常灵活,你可以通过不同的方式实现表空间/SCHMEA/表级的复制。也就是在复制策略定制上更灵活。由于是分析redo实现,因此对ddl的支持相比高级复制那实在好太多了(虽然仍有不很操作和数据类型不支持),并且streams仍属于逻辑实现的方式,因此支持跨平台跨版本的实施,这点是dataguard无法比拟的(至少在目前)。

  如果要说劣势的话,虽然经历了9i,10g到最新的11g,但streams实现还是个新东西,其应用的广泛程度自然远不能与高级复制和dataguard相比,因此在稳定性上可能还有所欠缺,比如说碰到bug的机率会比较高。从管理的角度,streams比dataguard要复杂一些,与高级复制应该说不相上下。当然这里并不是要写一篇专门对比streams/dataguard/高级复制间差异的文章,因此,点到为止吧,通过大致的对比希望能让你了解到streams的特点和优劣。

  然后,回到问题上,为什么要用Streams呢,这个问题还得你自己回答,三思始终认为,所有技术所有服务于应用的,应用模式确定之后究竟哪种技术更适合你的应用,那是需要根据具体情况具体分析的。应用能决定一切吗?也不绝对,比如技术实施的成本/时间/难易度包括后期维护等等,这些也都是需要综合考虑的,当然这也就体现出DBA的价值了,如果你实在没有自信,一定要三思帮你拿个主意,那也没有问题,只要出的起价俺就干的了这活,有数据库的活尽管找我,没问题啊,同时我司还可承接如下业务:苦力搬运,装卸,水电工,瓦工,木工,室内装潢,通下水道,VB、VC、.Net、C#、JAVA、J2EE、C++、delphi、汇编、单片机、手机软件、手机游戏开发、网络管理、建站、ASP网站、JSP、PHP、CGI开发,考试替考、黑车、黑枪、代客讨债,代理欺负中小学生(年纪在5-15岁之间,身高在50CM-120CM之间)代中小学生写作业等等俺都行啊,俺的联系方式详见: 转换手机号玩玩