本文讨论的是Oracle数据库提供的数据复制机制,所讨论的解决方案全部与平台无关。
2、介绍
复制是目标数据库与源数据库之间数据保持同步的一种机制,复制可以分成不同的类型,如:
2.1数据库内的复制
在这种情况下,一个表中的数据复制到同一个数据库中的另一个表中,这是复制的一种简化形式。
2.2在两个不同的数据库之间的复制
在这种情况下数据从源数据库复制到目标数据库。
2.3跨数据库和平台的复制
在不同数据库平台之间复制数据也是可以的,如在不同平台上托管的Oracle,Sybase,SQL Server。
在以上所有情况下,根据不同要求,数据流可以是单向的,也可以是双向的。
3、需要复制的原因
大多数时候,复制是由技术需求驱动的,如使用复制来解决与数据可用性相关的技术问题,数据复制需求大概有以下原因:
3.1配置一个灾难恢复站点
在这种情况下,会在与源数据库不同的地点安装一个独立的数据库,数据从源数据库单向复制到DR(灾难恢复)数据库,这种配置使得灾难降临源数据库位置时,数据和服务器遭受损坏后,业务可以通过DR站点继续不间断运行。
3.2网络延迟影响应用程序的性能
在这种情况下,在一台不同的物理机器上创建源数据库的副本,用户通过这些数据库副本访问数据,由于数据不需要在线,在源数据库和数据库副本之间的同步可以在一天的特定时间进行。
3.3单个数据库被用于多个用途
如在线事务处理和报告,这样在同一个数据库上加载太多的负载可能使数据库性能急剧下降,为了降低数据库的负载,创建一个新的数据库,从源数据库将数据复制到新数据库,需要在线数据的应用程序就连接到源数据库,可以在离线数据上工作的应用程序就连接到另一个数据库。
4、数据复制方法
Oracle提供了多种数据复制技术,如:
触发器
使用快照和物化视图的基本复制方法
数据卫士复制
Oracle流
4.1基于触发器的复制
触发器是Oracle的一个基本元素,当一个基础表上发生了DML操作时可以通过它执行特定的任务,触发器使用PL-SQL代码,它是附加在表上的,当表上执行了特定的DML操作时,Oracle会自动调用触发器。
基于触发器的解决方案包括下列组件:
在源数据库上创建指向目标数据库的数据库连接,如果是在同一个数据库内的复制就不需要创建数据库连接。
对于每个要复制的表,在源数据库上创建三个触发器:After Insert,After Update和After Delete。
根据DML操作,触发器将使用数据库连接在目标数据库中执行Insert,Update和Delete操作。
触发器的使用:
触发器可以用于数据库内的复制,也可以用于跨数据库的复制。
这个解决方案成本很低。
但性能不是很好,原因是每个事务都要等触发器完成它的操作才能继续,导致事务处理更加延迟。
这个解决方案需要彻底地测试,如果其中一个触发器不工作,将会导致数据库中的数据不一致。
4.2基于物化视图的复制
物化视图(MV)和普通视图不同,,使用MV时,Oracle创建一个与MV同名的表存储MV的查询结果,需要数据的用户使用MV可以立即从MV表中获得数据。使用这种方法,Oracle避免了每次获取数据时都执行MV查询,如果使用普通视图的话,每次取数据时都会执行一次视图的查询。由于数据在表中,数据检索工作比普通视图要快得多。
当用户适合使用离线数据时,物化视图可以带来很多方便,为了保持MV数据与基础表(MV查询中使用到的表)中的数据同步,MV需要定期进行刷新,有两种刷新模式。
完整刷新:在这种情况下,Oracle会truncate掉整张表,然后使用MV查询结果集重新填充表。
快速刷新:在这种情况下,Oracle使用每个基础表创建的MV日志刷新MV,无论何时基础表数据通过DML操作修改后,MV日志会通过一个全局触发器得到更新。
由于快速刷新使用的是MV日志刷新MV,与完整刷新相比,这种方法刷新使用的时间要短得多。
MV刷新间隔
根据数据要求,MV每天刷新一次或每天以固定间隔时间刷新,刷新频率根据数据要求不同而不同,使用快速刷新时建议每天刷新一次。
MV的用法
在以下情况下可以使用MV:
需要联合源数据库中多个表的数据复制到目标数据库中。在这种情况下,在源数据库中创建MV和MV日志,MV在源数据库端刷新,在目标数据库上创建数据库连接访问源数据库上的MV。
许多时候都需要使用到汇总函数查询,每次汇总所需时间都较长,同时表中的数据时静态的,且不会连续不断地修改,数据也不要求是在线的,在这种情况下使用MV能够大幅度提升数据检索性能。
4.3使用数据卫士复制 – 物理备用数据库
数据卫士架构是基于归档日志的,使用重做传输代理服务可以将归档日志从源数据库传输到目标数据库,当归档日志抵达目标数据库后,日志将会自动在目标数据库上应用。
使用数据卫士时,只能有一个数据库是主数据库,其它数据库都是备用数据库。主数据库需要在归档模式下运行,此时目标数据库也叫做后备数据库,运行在备用模式下,目标数据库是主数据库精确的物理副本,主数据库处于可读/写模式,而备用数据库处于只读模式,复制按以下步骤执行。
在主数据库上的DML操作产生重做日志,当重做日志装满或达到切断大小时,就开始在主数据库上进行归档。
主数据库使用重做传输代理将规定日志副本发送到目标数据库。
当归档日志抵达备用数据库后,将自动应用到备用数据库。
如果由于某些原因归档日志未能传输到备用数据库,将会自动重试,直到归档日志复制到备用数据库,在这种情况下,备用数据库会创建backlog,这将会导致备用数据库滞后于主数据库。
备用数据库处于只读状态,因此可以用于报告系统。
使用物理备用数据库的数据卫士:
这个配置最常用在灾难恢复站点上。
如果目标数据库要求只能为只读模式,在这种情况下,目标数据库可以用于报告系统,这样可以减轻源数据库的负荷。
4.4使用数据卫士复制 – 逻辑备用数据
在这种配置中,主数据库在归档模式下打开,目标数据库也叫做备用数据库,在逻辑备用模式下打开,目标数据库是主数据库的逻辑备份,主和备用数据库都处于可读/写模式,复制的步骤如下:
主数据库上的DML操作生成REDO日志,一旦REDO日志填满或达到文件最大值,主数据库就开始对日志进行归档。
主数据库也使用重做传输代理发送归档副本到备用数据库。
一旦归档日志传输到备用数据库,SQL应用进程将日志转换成SQL语句,也叫做逻辑修改记录(Logical Change Records,即LCR)。
然后在备用数据库上应用LCR。
如果由于某些原因归档日志没有传输到备用数据库,传输代理进程将会自动重试,直到归档日志成功传输到备用数据库。在这种情况下备用数据库上会创建backlog,这会导致备用数据库滞后于主数据库。
备用数据库在只读和读写模式下都可用。
图 3 数据卫士 – 逻辑备用数据库
这个配置允许备用数据库在读/写模式下打开,因此,应用程序可以指向源和目标数据库,这样对源数据库可以起到负载均衡的作用。
4.5使用Oracle流复制
Oracle流是构建在数据卫士架构之上的,它是逻辑备用数据库的扩展,和逻辑备用数据库上的SQL应用进程类似,流有捕获、传播和应用进程。
和数据卫士比较,流提供了更灵活的方式转换和管理数据流,流使用队列发送和接收数据,流有以下两种实现方法。
本地捕获:在这种实现方式中,捕获和传播进程运行在源数据库上,应用进程运行在目标数据库上,请参考下面的图。
图 4 流 – 本地捕获
下游捕获:在这种实现中,捕获和应用进程运行在目标数据库上。
无论哪种实现方式,流都有下面的基本过程。
图 6 流复制基本过程
捕获 – 通过归档日志捕获数据库变化(DML和DDL),将数据库变化转换成逻辑修改记录。
传播 – 传播用于对队列中的消息分段,它们也将传播这些消息从一个队里传播到另一个队里。
应用 – 应用进程从队列解码队列消息,并将变化应用到数据库上。
使用或不是以下游捕获方法使用Oracle流:
正如前面提到的,Oracle流是基于数据卫士架构的,它是一种高级数据复制方法,因为它提供了更灵活的过滤操作,它可以用于比较严格的数据复制操作,如只复制Insert操作,或Update或Delete操作。
如果需要实时的复制,那下游流捕获方法更有用,因为它实现了几乎实时的复制。
如果源数据需要转换,或目标数据库的特定列需要被填充,此时Oracle流也会提供数据转换功能。
5、对比矩阵表
6、总结
考虑到可扩展性和延迟时间,Oracle流可能是最佳复制解决方案,流也对事务提供了灵活的过滤方法,如过滤Insert/Update或Delete。它允许在目标数据库上执行读写操作。
如果延迟无关紧要,且目标数据库仅用于只读目的,那么数据卫士可能是最佳解决方案。
本文作者:未知