Oracle高级复制
在开始之前,需要简单说明一下,目前公司有几个项目都采用Oracle作为数据库平台,并且有的项目使用到了Oracle的数据库复制技术,其中也遇到了一些问题,因此在这里,我对Oracle的复制技术谈一下我个人的理解,希望能够对采用Oracle数据库的项目组有所帮助。其中在文中使用到的 SQL脚本都是经过检验可以运行的。
首先简单介绍和数据库复制有关的基本概念,然后探讨Oracle数据复制技术中的几个重要模型,最后介绍Oracle的数据复制管理器以及如何利用它来配置和维护复制环境。
在文章的开头,我想首先简单谈一下复制的基本概念,也就是什么是复制?复制简单地说就是在由两个或者多个数据库系统构成的一个分布式数据库环境中拷贝数据的过程。Oracle高级复制,也称为对称复制,第一次是在Oracle 7.1.6版本中出现的,在这之前的Oracle版本中,Oracle数据复制方法仅有只读快照形式的基本复制一种方法。随着Oracle版本的每一次升级,数据复制的功能、管理以及速度等方面都得到了很大的改进和完善。目前,由于对分布式数据环境需求的不断增长,越来越多的应用提出了数据复制的需求。
1.基本概念
1. 分布式数据库技术
分布式数据库技术是目前我们经常提及的分布式计算的一个重要组成部分,该技术允许数据在多个服务器端共享。采用分布式数据库技术,一个本地服务器可以存取不同物理地点的远程服务器上的数据;也可以使所有的服务器均可以持有数据的拷贝/复制,这样分布式系统中的所有服务器均可进行本地存取。
设计一个分布式计算解决方案首先需要考虑的问题就是应用的完整性、复杂性、性能和可用性以及响应时间等,同时还需要考虑的是对于不同的应用需求是采用实时存取远程数据还是采用延迟存取远程数据。这对于数据复制来讲就是采取实时更新复制方案还是延迟数据复制方案。
2. 同步和异步的概念
同步分发数据库技术是一种实时远程存取和实时更新数据的技术。这种技术可以保证应用的完整性降低了应用的复杂性,但是如果系统存在网络存取速度很慢这样的问题,相应响应时间就会很慢。
异步分发数据库技术是一种延迟远程存取和延迟传播对数据更新的技术。这种技术具有很高的可用性和很短的响应时间。相比同步分发数据库技术就显得复杂一些,为了确保应用的完整性需要仔细考虑和设计。
对于实际的商业问题,必须权衡这两种技术的利弊最终选择最佳的解决方案,有些问题选用同步技术比较适合,也有一些问题采用异步技术是比较好的解决方案,还有一些问题必须综合这两种技术。
3. 复制的概念
复制,顾名思义就是将数据库中的数据拷贝到不同物理地点的数据库中以支持分布式应用,它是整个分布式计算解决方案的一个重要组成部分。上面介绍了同步和异步的概念,这里针对复制也存在同步复制和异步复制的问题。
同步复制,复制数据在任何时间在任何复制节点均保持一致。如果复制环境中的任何一个节点的复制数据发生了更新操作,这种变化会立刻反映到其他所有的复制节点。这种技术适用于那些对于实时性要求较高的商业应用中。
异步复制,所有复制节点的数据在一定时间内是不同步的。如果复制环境中的其中的一个节点的复制数据发生了更新操作,这种改变将在不同的事务中被传播和应用到其他所有复制节点。这些不同的事务间可以间隔几秒,几分种,几小时,也可以是几天之后。复制节点之间的数据临时是不同步的,但传播最终将保证所有复制节点间的数据一致。
4. 更新冲突
在异步复制环境中,对于所有应用最关键的就是要确保数据的一致性。我们来看下面这种情况会有什么后果发生呢?在同一时间对同一个表的同一行数据的同一列在两个不同的地点作更新。这种情况就会发生称之为更新冲突的错误。为保证数据的一致性,更新冲突必须被检测到并且处理以确保在不同地点的数据元素保持同样的值。更新冲突可以通过限制"所有权" 到单一节点或者将更新某个特定数据元素的权利限制到某一具体节点的方法来避免。
2.Oracle数据复制应用模型
为确保实际应用数据的一致性,必须在异步复制应用模型中考虑冲突避免或者冲突检测和消除的方法。例如,对于一个实际商业应用,首先必须在逻辑上了解该商业应用采取的冲突避免方法和在某个节点有那些数据以及这些数据中那些是可更新的,而那些又是不可更新的。在下面的这一部分中,我们首先将详细讨论两种常用的冲突避免方法:主站点所有权模型和动态所有权模型。然后,讨论共享所有权模型以及这种模型引起的冲突检测和处理问题,最后,讨论针对Fail-over的复制配置,这种复制方案同时考虑了冲突避免和冲突检测与消除两种情况。
1. 主站点所有权
主站点所有权,异步复制数据被一个单一节点"所有",这些要复制的数据仅能被该节点更新,其他节点向拥有该数据的主节点订阅(subscribe)数据,这意味着他们在本地系统上只能够存取这些复制数据的只读拷贝。下面是一些这样的例子。
(1) 决策支持系统(DSS)的联机事务处理数据的卸载。来自一个或者多个OLTP系统的数据可以被卸载到一个独立的局部DSS中,用于只读分析
(2) 中央信息的分发。产品信息,如价格列表等在总部节点上维护,然后将这些信息复制到远程销售办事处的只读产品目录系统中
(3) 远程信息的集中。许多远程节点上的产品目录数据复制到总部节点,这里总部节点只需要有数据只读的权限
一个主节点拥有一个表的完全所有权,而其他节点只能订阅这个表的只读拷贝。也可以是多个主节点拥有同一个表的截然不同子集或者划分,而另一些节点则订阅这些子集或者划分的只读拷贝。如,一个分布的产品目录系统可以让不同的销售办事处拥有一个表的属于自己的一个"水平"部分,如在客户(CUSTOMERS)表, 订单(ORDERS)表和目录(ITEMS)这些表中含有每个销售办事处为之服务的客户和产品信息。中心总部节点可以通过订阅每个办事处拥有的数据来保持一个完整的所有产品和客户信息的只读拷贝。
2. 动态所有权
动态所有权,异步更新将复制数据从一个节点移到另一个节点,而在该过程中,必须保证在同一时刻只有一个特定的节点可以对数据进行更新。一个典型实际应用就是"海关订单处理系统",订单处理的典型步骤是,报关→同意→装运→开单→收单→入帐等。应用模型可以执行其中的任何步骤,但必须保证各个不同模块的同一个数据应该在一个综合数据库中。在该系统中,当且仅当订单的状态表明前一个步骤已经完成时,下一个应用模块才可以执行更新订单数据的操作。例如,"装运" 应用模块仅能在"报关"并且得到"同意"后才能被执行。 (Delphi中的DEMO程序中提供了一个简化版本演示程序)
通过使用动态所有权复制模型,可以将一个系统分布在多个节点和数据库上,也就是说应用模型可以建立在不同的系统上。我们还是来看上面的例子,"报关"和" 批准"这两部分可以运行在一个系统上,"装运"在另一个系统上,"开单"和"收单"等又可在一个系统上。在这个分布式系统中,数据可以被复制到不同的节点上,这些节点对复制的数据只要具有只读的权限即可。如,利用复制,"报关"节点可以监视已经报关的订单处理过程。
前面讨论的主节点所有权和动态所有权复制模型具有一个共同的特征:在任何一个给定的时间点,只允许一个节点有更新数据的权利,而其余节点对于复制的数据拷贝仅有只读权限。然而,还存在这样的情况,允许多个节点可以更新同一个数据,在极端情况下可以是在同一时刻,这就是所说的共享所有权。
3. 共享所有权
共享所有权使用异步复制,这对于主节点和动态所有权模型来讲存在一些限制。在共享所有权情况下,整个系统可以存在暂时的不一致,同时必须使用冲突检测和消除。共享所有权模型相对于前面两种模型具有一些新的特点。
例如,对于前面我们讨论的那个采用具有水平划分主节点复制方案来的分布式"订单处理系统"的例子。采用共享所有权模型,每个销售办事处都有库表中不同的水平划分,该库表含有每一个办事处为之服务的一些订单信息和与消费者有关的顾客信息。每一个销售办事处只输入与自己有关的顾客订单情况,而不管其余顾客信息。
然而,在实际商业应用中,这个模型不是最佳的选择。例如,这种情况,一个零售集团在一个大城市中可以有好几个商场。顾客可能经常去离他们住的最近的那个商场,但是偶尔也可能到其他商场去购物。这时,如果多家商场执行更新同一个顾客和其订单数据的信息,更新冲突就会发生。所以在这种情况下必须要采用冲突检测和消除方案。
Oracle高级复制支持同时既考虑冲突避免又考虑冲突检测和消除的复制模型。Oracle高级复制之所以又称为对称复制,其原因之一就是支持对称复制模型,也就是可以在任何地方更新,即所有的复制节点都可以进行更新处理。为了避免冲突,一种方法就是将应用设计为将更新限制在一些特定的节点。对于共享所有权,Oracle提供了自动冲突检测和消除方案。
4. 备用数据库(Fail-Over)
异步复制通过将一个主系统数据复制到另一系统,可以起到对主系统的崩溃提供保护的作用,这也就是所说的Fail-Over系统,如果主系统出现问题,业务依旧可以通过复制数据库进行。
Oracle高级复制支持这种Fail-Over配置。同时,Oracle也针对Fail-Over提供了另外两个可选的解决方案:Oracle并行服务器和备用数据库配置。用户可以根据吞吐量、可用性、事务损失的可能性和其他一些如数据一致性、方法的局限性等参考指标来权衡选择合适的Fail-Over 方案。
3.Oracle 高级复制配置
Oracle高级复制即可支持基于整个表的复制也可支持基于部分表的复制两种复制方案。这两种复制方案主要是通过Oracle的两种复制机制来完成的,即多主复制和可更新快照复制,同时还可以将这两种复制机制结合起来以满足不断变化的业务需求。
1. 多主复制
多主复制方案支持全表在各个主节点间的对称复制,允许所有主节点对主表都有更新操作的权利。任何一个主节点上的复制表的更新都会被传播并被直接应用到其他所有主表。一个主节点出现问题,不会对其他主节点之间变化的传播造成影响。
多主复制采用一种称为"延迟远程过程调用(deferred remote procedure calls RPCs)"的机制作为主要的传播和应用变化的机制。各节点之间变化的传播,既可以以基于事件的方式立即传播,也可以在某个特定的时间点,如在网络空闲时(如晚上)传播。在传播变化时,如果其中的一个远端系统没有准备好,传播变化的延迟远程过程调用(RPCs)就会保存在其本地队列中,等到系统准备好以后再执行。
2. 可更新快照
Oracle将最早Oracle 7上的只读快照机制扩展为一种允许快照可更新的对称复制机制。快照更新的传播方式和如何应用到快照主节点采用了和多主复制一样的延迟远程过程调用机制。
对于快照的定义,既可以是包含一个主表的完全拷贝,也可以是为满足基于值的选择标准的主表中行的子集。快照在主节点的刷新是按照一定的时间间隔或用户单独请求进行的。最后一次刷新后主表的任何变化也同样被传播并应用到快照。多个快照的刷新是在一个一致的事务中完成的,这就确保了数据和引用的完整性。
3. 混合配置
可以将多主复制和可更新快照复制结合在一起,构成一种新的混合配置,这种配置可以完成对全表或者子表的复制。例如下面这种应用就是一个典型的混合配置方案,一个系统具有两个位于不同地理区域的中心节点,这两个不同的地理区域下面还有一些分支机构,两个中心节点可以彼此看做是自己的备份节点。采用多主复制方法在两个中心站点之间复制数据,同时采用只读或者可更新快照复制方法在每个区域范围中的主节点之间复制全表或者子表。这种配置的一个显著好处就是当其中的一个中心节点发生问题时,这些快照的主节点可以被重新定义到另一个运行良好的中心节点,从而提高了系统的可靠性。
4. 其他复制机制
Oracle除了前面讨论的三种复制机制以外,还提供了另外两种复制机制:过程级复制和同步复制。
(1)过程级复制:这种复制方案主要应用在存在大量数据更新以及采取批处理方式操作数据时需要复制数据的情况。例如,下面这个应用,一个以年为单位管理客户订单的公司,对于老的订单数据不再需要在线保存,而需要卸载到某存储介质中。这时,如果在多个节点间复制每一独立的行级变化效率将是非常低的。对于这种情况,可以直接在每个复制节点执行一个过程来直接进行这种更新操作。Oracle高级复制提供的分布式模式管理功能(将在下面详细讨论)可以非常方便地在多个节点上设置和维护过程级复制的远程过程。
(2) 同步复制:一个采用同步复制方案的表发生变化时,Oracle会确保这种变化能够成功地作用在本地表和其他节点的复制表,如果失败则整个事务会被成功回滚。同步复制在网络的稳定性比较高的情况下是可行的,可以保证复制节点之间的复制数据一直保持同步。
4.Oracle管理工具
很显然,有效的管理工具对于成功的分布式应用是非常关键的,如果没有能力去操作它,再专业的复制功能也不能发挥很好的作用。Oracle高级复制提供了几个功能强大的管理工具,诸如复制目录,分布式模式管理以及其他的一些Oracle 复制管理工具。
1. 复制目录
复制目录是一个包含定义复制环境原数据的一个单一综合库。复制目录本身也被复制到多个节点以确保高可用性和授权用户可以简单地实现本地存取管理。
复制目录定义了被复制的数据库对象,复制的节点以及用于复制的机制。数据库对象有需要复制的库表和其他一些相关的对象,如索引,视图,过程,触发器和同义词等等。这些原数据是开放的,用户可以通过标准SQL语句进行检索和查询。
2. 分布式模式管理
Oracle高级复制的分布式模式管理功能允许在一个控制点就可进行复制环境的定义和改变。对复制环境的任何改变,都将自动复制并且应用这些数据定义语言(DDL)命令到其他复制环境节点,同时也利用数据库触发器和复制相关过程自动生成复制所需要的一些支持对象。
分布式模式管理在一个被称为主定义节点的地方进行控制。它自动将DDL推向其他所有主节点并且也允许快照节点"拉"回并且执行这些DDL命令。由于主定义节点使用并且维护着整个复制目录,该复制目录本身也被复制到其他节点,所以该主定义节点一旦出现问题,就必须用其他节点来代替。分布式模式管理可以通过一个图形用户界面管理工具(GUI)来配置。
3. Oracle复制管理器
Oracle复制管理器是Oracle提供的一个图形界面的复制管理工具,通过该工具可以配置,定时和通过一个节点来管理整个的复制环境。该管理工具可以单独运行也可以在Oracle企业管理器中通过一个applet来激活。
采用Oracle复制管理器,用于复制的对象组可以通过一些鼠标操作非常简单地定义。复制组可以包含表和其他相关的对象,如触发器,存储过程,索引,视图,同义词以及序列等。Oracle除了可以复制每个复制组的全部拷贝以外,还可以选择复制数据的子集。复制组的配置可以在任何时候修改,这种变化将自动应用到其他所有的复制节点。
一旦定义了对象组,可以通过Oracle复制管理器,简单进行拖拉操作,就可自动部署复制组到一个新的节点。这些快照节点既可以是只读的也可以是可更新的。复制节点配置完成以后,用户可以配置定时以使复制环境中的变化传播到其他节点,当然也可以选择采用同步复制。
4. 选择冲突解决方案
如果选择采用一种可以在任何地方更新的复制方案,Oracle复制管理器提供了几个内建的冲突解决方案,诸如"最近时间戳"和"站点优先"等来解决潜在的冲突。对于不同的表可以选择不同的方法,甚至可以对一个表中的不同列选择不同的冲突消除方案。用户对于一些特殊的商业需求也可以创建自己的冲突解决方案。
5. 实时管理
通过Oracle的复制管理器,复制环境中任何地方发生的错误均可以非常快速和简单地分离出来并且改正。通过一个单一的节点,用户就可以看到每个节点的延迟事务队列,也可以重新定时或者强制立即执行事务。另外,用户也可以利用Oracle企业管理器的事件管理功能来对复制环境进行监视,该事件管理器提供了对多个站点间的复制状态的主动监视功能,另外还提供了可以定义自动改正的选项等。
5.主要配置参数说明示例
Oracle高级复制,也称为对称复制。和Oracle的其他功能不同,Oracle的高级复制不是即插即用的,用户必须深刻理解它们是如何工作的以及各种复制方案的优缺点。深刻理解复制的基本概念可以帮助你设计一个可靠的复制环境。
接下来主要介绍搭建Oracle高级复制环境时需要设置的一些系统参数。需要提醒注意的是,这里所给出的这些系统参数的具体配置数值只能保证可以成功的搭建出一个相对较好的高级复制环境,但并未对这些参数的优化配置进行进一步的深入探讨。
现在我们正式开始。假设有两个节点,节点名分别为RLDBA和XJTU。
数据库名 Rldba Xjtu
数据库域名 Hr_group World
数据库SID Rep.world Xjtu.world
Listener端口号 1521 1521
服务器IP地址 192.168.110.221 192.168.110.130
1. 实现数据库复制的前提条件
q 数据库支持高级复制功能:您可以用system身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持。
q 数据库初始化参数要求:
(1) db_domain = test.com.cn:指明数据库的域名(默认的是WORLD),这里可以用您公司的域名。
(2) global_names = true:它要求数据库链接(database link)和被连接的数据库名称一致。 现在全局数据库名:db_name+"."+db_domain
q 数据库连接通畅:
运行$tnsping hr_svr与$tnsping xjtu,出现以下提示符:
Attempting to contact
(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.200)(PORT=1521)) OK(n毫秒)则表示数据库连接通畅,可以准备复制。
2. 系统环境参数(init.ora文件)设置(对于非缺省值)
如果要搭建Oracle高级复制环境,必须在初始化文件中设置下列参数,见表1所示。
参数名称 推荐值 备注
processes 100 进程数,default=59如果进程数大于59数据库将可能发生死锁
shared_pool_size 30000000 至少30M,如果有很多的复制对象的话,则需要更多的空间
large_pool_size 500K
db_block_buffers 550K
compatible 8.0.5.0 该版本以上
db_file_multiblock_read_count 16
dml_locks 100
sequence_cache_entries 30
sequence_cache_hash_buckets 23
global_names TRUE
distributed_lock_timeout 300
distributed_transactions 10
Open_links 6 复制节点多的话,需要增加
Sort_area_size 1000000
db_name RLDBA
job_queue_processes 6 定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。
job_queue_interval 60 定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。
parallel_max_servers 10 只适用于并行传播
parallel_min_servers 2 只适用于并行传播
PEPLICATION_DEPENDENCY_TRACKING TRUE 如果采用并行传播,必须设置为TRUE
(表1:Oracle高级复制环境初始化参数设置)
表1中各个参数的推荐值认为目前的复制环境只有两个节点,一个简单的高级复制环境,如果节点较多,且复制关系复杂,需要复制的表也很多,则需要相应增大一些参数的值,这可以通过修改不同的参数试验获得。如果修改了以上这几个参数,需要重新启动数据库以使参数生效。
将所有的SNAPSHOT 或者是JOB_QUEUE_KEEP_CONNECTIONS参数都删除,因为Oracle以后已经不支持这些参数。
2.Net8参数文件
(1)sqlnet.ora文件设置
# SQLNET.ORA Network Configuration File: D:\Oracle\Ora81\network\admin\sqlnet.ora# Generated by Oracle configuration toolsSQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)automatic_ipc=offnames.default_domain = worldname.default_zone = worldsqlnet.expire_time = 0DISABLE_OOB = ON
(2)tnsnames.ora文件设置
RLDBA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = hr_svr)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = rep.world) ) )XJTU = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xjtu)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = xjtu.world) ) )
上面Host为各个复制节点的IP地址,如果复制节点很多,则全部加入到tnsnames.ora文件中,本文作为用例中有两个节点。
3.表空间
如果搭建Oracle高级的高级复制环境,额外需要加大一些表空间,表2是建议的初始表空间。
表空间 建议初始值 建议
SYSTEM 至少20M
ROLLBACK SEGMENTS 至少20M 建议回滚段的下一个区大小设置至少为100K。
TEMPORARY 至少10M
TOOLS 至少20M
( 表2:Oracle系统表空间大小设置 )
上面这些建议的设置是一种较小复制环境下的空间设置。如果要复制的表很多,每天的变化量很大,复制节点复杂,则需要相应增大表空间的大小,具体数据依据具体情况而定。
6.复制应用实例
上面我们对复制基本概念及复制参数的作了说明,接下来主要介绍一个Oracle快照复制的实际例子及其技术实现细节。
(1) 业务需求描述
在一个实际的数据库应用中,如电信、人力资源管理等应用中通常都采用这样一种解决方案,在一个行政区域内,如一个省或者一个市,在不同的地理位置架设数台数据库服务器,这些不同地理位置的服务器具有同样的后台数据库。为了维护数据库系统的一致性,对于整个行政区域应用的基本数据表应该保持一致,如果不考虑数据复制,想维护同样的不冲突的代码表是很困难的。下面我们不考虑实际的业务应用,只从数据库复制角度来说明Oracle快照复制的应用。
为了维护整个系统基本数据表的一致性,比如有这样的业务需求,对RLDBA上的一些表采用统一维护,即在一台服务器上维护。而在其他位置(如数据库 XJTU,用户SNAP)可以直接使用这些表,也就是说在位置1具有对代码表插入、删除和更新的能力,而在其他地方具有同步查询应用的能力。
(2) 应用设计
针对上述的需求,现在提出了这样一种解决方案,也就是采用Oracle的快照复制。具体业务实现方案设计如下:
在位置1的数据库RLDBA维护所有的表,在其余数据库建立相对于位置1的所有表的快照。为了维护快照的方便,在位置2创建一个单独的快照表空间和一个模式(schema),也可以称为用户(USER),系统中的其他用户通过一个私有同义词来存取这些快照。这里私有同义词相对公共同义词要好,这是因为在位置1存在一个同样的系统,它的表是通过公共同义词来存取的。对于快照的刷新,采用Oracle系统包DBMS_REFRESH进行,并将该刷新过程的运行定时在每天早上2:00,这样可以减少网络流量。对于快照的刷新形式,由于对于表的维护不是很多而且表的数据量相对较少,所以在此选择了完全刷新,这样就避免了管理快照日志的麻烦。下面以一个节点2(XJTU)为例来说明具体的技术实现细节。
(3) 技术实现细节
除非特别说明,下面的SQL命令都是在数据库XJTU的SYSETM用户下运行的。
1. 在数据库2(XJTU)上增加数据库1(RLDBA)的services name,可以直接在tnsnames.ora文件中增加数据库1的services name,包括IP地址,SID以及端口号等。services name 命名为rep.world。
2. 创建一个用于连接数据库1(RLDBA)的数据库连接(dblink)
DROP PUBLIC DATABASE LINK rep.hr_group@rldba; //删除Database linkCREATE PUBLIC DATABASE LINK rep.hr_group@rldba CONNECT TO rldba IDENTIFIED BY admin USING 'rldba'; //Create Database linkselect * from cat@rep.hr_group@rldba; //Test the Database link
注:出于安全考虑,可以采用一个私有数据连接。
3. 创建一个名为snapshot_rldba的表空间来存放RLDBA快照,并创建一个和该表空间有关的名为Snap的用户。
CREATE TABLESPACE "snapshot_rldba"LOGGING DATAFILE 'D:\ORACLE\ORADATA\ORA8I\SNAPSHOT_RLDBA.ora'SIZE 30MDEFAULT STORAGE ( INITIAL 30K NEXT 15K MINEXTENTS 100 MAXEXTENTS UNLIMITED PCTINCREASE 0 ); //Create Table spaceCREATE USER snap IDENTIFIED BY snap DEFAULT TABLESPACE "snapshot_rldba"; //Create User in the table spaceGRANT CONNECT, RESOURCE TO snap; //grant role to the user
4. 运行下面的脚本文件snapsql.sql来生成创建rldba数据库上rldba用户表的快照脚本:
注意如果所需生成快照的表中含有类型为long的列,"select *"在这里就不会起作用,上面的这个SQL脚本就不能自动建立生成所需快照的脚本,必须通过在select列表中显式地添加long型列名来创建表的快照。下面是一个例子,假如我们要创建快照依赖的表T_YGJBXX中有一个列ZP类型为long,就需要单独写出如下的创建快照的脚本:
CREATE SNAPSHOT T_YGJBXX PCTFREE 10 PCTUSED 40TABLESPACE "snapcost_rldba "STORAGE (INITIAL 40960 NEXT 57344 PCTINCREASE 0 )USING INDEX REFRESH WITH PRIMERY KEYFOR UPDATEAS select YGID, GZBH, FZJRLB, ZP, SXZY, XCSZY from T_YGJBXX@rep.hr_group@rldba; //Create snapshot
EXECUTE DBMS_SNAPSHOT.REFRESH ('snap.T_YGJBXX ')
运行脚本文件create_snapshot.sql后,就在模式snap中创建了所需要的快照。下一步就是考虑该如何刷新快照。对于快照的刷新,可以通过一些桌面DBA工具来刷新快照也可以通过系统包dbms_snapshot.refresh来刷新一个快照:
创建或选择实现数据库复制的用户和对象,给用户赋权,数据库对象必须有主关键字,如果数据库对象没有主关键字,可以运行以下SQL命令添加:
alter table dept add (constraint dept_deptno_pk primary key (deptno));
5. 创建一个定时刷新过程来定时刷新快照:
--sp_snapshot_refresh.sql CREATE OR REPLACE PROCEDURE sp_snapshot_refresh ISBEGINDBMS_REFRESH.MAKE ( NAME=>' T_YGJBXX ', LIST=>'snap. T_YGJBXX', NEXT_DATE=>TRUNC (SYSDATE+1)+2/24, INTERVAL=>'(SYSDATE+1)', IMPLICIT_DESTROY=>FALSE, LAX=>TRUE);END sp_snapshot_refresh; --创建了一个定时任务来每天早晨2:00定时刷新快照
EXECUTE sp_snapshot_refresh; //Execute the procedure
SELECT JOB, WHAT FROM DBA_JOBS; //查询刚刚加入的这个任务
CREATE SYNONYM system.T_YGJBXX FOR snap.T_YGJBXX;//在用户system下创建快照的私有同义词
GRANT SELECT ON dm_gy_rydm TO system;//以snap用户向system用户授与快照可以select的权限。
6. 同样的步骤在其它位置建立位置1(rldba)的表快照和定时刷新任务。这样就可实现在位置1统一维护代码表,在位置2和其它位置使用该表的目的。如下面的SQL语句,在位置2(xjtu)用户snap浏览在位置1(rldba)中的代码表。
SELECT * FROM T_YGJBXX;
(4) 日常维护及注意事项
无论任何时候只要出现网络连接问题,刷新就会失败。这些错误信息可以在alert.log文件中找到。下面简单介绍一下对这种问题的处理办法:
1.首先在任务队列中找到刷新快照的任务编号
SELECT JOB,
what FROM DBA_JOBS;
2.删除该任务
EXECUTE DBMS_JOB.REMOVE (JOBNO);
3.删除快照组
EXECUTE DBMS_REFRESH.DESTROY ('tax_dmb_grp');
4.重新创建快照组并且重新定时任务来定时刷新快照
EXECUTE sp_snapshot_refresh('snap.T_YGJBXX')
5.快照监视
SELECT NAME, TO_CHAR(last_refresh,'DD-MON-YY HH:MM:SS') FROM DBA_SNAPSHOTS;