tbwshc

tbw

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

Oracle的内核提供数据库的备份和恢复机制,SQL*DBA按表空间进行数据的备份和恢复。Oracle提供两种方式:备份恢复和向前滚动,保证意外故障恢复数据库的一致性和完整性。
  
  ____1. 备份恢复方式
  
  ____对数据库的某个一致状态建立副本,并储存在介质上脱机保存,以此作为数据库恢复的基础。现以Oracle实用程序Export/Import来介绍备份恢复方式。
  
  ____Export/Import是Oracle提供的两个互补性程序,即卸载和装载。它们既完成数据库与操作系统文件的互为转载,同时可以有效地回收数据库的碎片,提供不同版本间Oracle 数据传送的手段,进行不同用户间的数据传送。
  
  ____Export数据卸载,将数据从Oracle写到指定的操作系统文件进行备份。卸载的对象、内容与数量有三种模式:TABLE MODE(表模式)、USER MODE(用户模式)、FULL DATABASEM ODE(所有数据库模式)。使用方式既可用交互方式,也可采用命令行方式,以"关键字=值" 将所需信息在命令行中逐一描述来进行卸载。Export要求用户具有CONNECT或DBA特权。
  
  ____Import与Export互逆,将操作系统文件重新装载至Oracle数据库中,使用方式如Expo rt。使用者要求具有CONNECT和RESOURCE特权,且可选择部分或全部装入。
  
  ____Export/Import非常方便,系统开销小,它的限制是输出的操作系统文件采用专门的压缩方式存放,仅提供给Import使用。
  
  ____也可采用SQL*PLUS和SQL*LOADER实用工具进行备份。使用SQL*PLUS的SPOOL命令通过脱机定向输出,使用PLUS格式化结果,形成指定格式的ASCII文件,需要时可用SQL*LOADER 进行加载。它的方便之处是ASCII文件可以编辑,可方便地加载至其他数据库(如FoxPro、 Sybase中)。
  
  ____2. 向前滚动方式
  
  ____Oracle提供向前滚动方式,使建立备份后成功的事务不会丢失。恢复的基础是数据库的某个一致性状态(即方式1完成的备份恢复),恢复的依据是存档的重作记录文件。启动重作记录文件方法如下:
  
  ____(1) 启动Oracle;
  
  ____(2) 连接Oracle:CONNECT SYSTEM/PASSWORD;
  
  ____(3) 启动ARCHIVE LOG。
  
  ____出现介质故障时,可用SQL*DBA的RECOVER命令,利用存档的重作记录文件恢复一个或多个表空间。RECOVER命令对DATABASE或TABLASPACE进行恢复。前者要求SQL*DBA START UP已被排斥方式装载且未被打开;后者对无活跃回退段的表空间执行脱机,要求数据库已装载且被打开。
  
  ____由于向前滚动方式恢复的依据是存档的重作记录文件,因而系统开销大,但恢复的是建立备份以后的成功事务,所以恢复的程度更高、更完备。
  
  
  Sybase数据库的备份
  
  ____Sybase数据库提供两种恢复方式:自动恢复和非自动恢复。自动恢复是在软故障下提供的一种恢复机制,非自动恢复是发生硬故障时通过已转储的介质装载的一种手动恢复机制。
  
  ____1. 软件故障恢复机制
  
  ____SQL Server重启时启动自动恢复进程,将故障前已提交的事务写到数据库设备上,未完成的事务则回滚。自动恢复进程先恢复系统数据库,后恢复用户数据库。对每个数据执行自动恢复的依据是事务日志,即SYSLOGS表,它记载着用户对数据库的每一改变。
  
  ____恢复过程:扫描日志,对尚未结束的事务执行撤销,对已提交的事务进行重写。
  
  ____撤销机制:反向扫描日志,对每一个撤销事务的更新操作执行反操作。
  
  ____重写机制:正向扫描日志,对已提交的事务但尚在数据库缓冲区中的内容执行物理地写到库设备上。
  
  ____2. 硬故障恢复机制
  
  ____硬故障一般指介质故障,备份的基础数据源来自数据库的转储介质。因而,它的恢复取决于转储(dump)命令的使用情况。
  
  ____现以250MB磁带为例来描述转储、装载过程。
  
  ____(1) 配置备份服务器,启动SQL SERVER和BACKUP SERVER。如:
  
  ____startserver -f run -sybase
  
  ____startserver -f run -syb -backup
  
  ____(2) 建立磁带转储设备
  
  ____sp-addumpdevice "tape",mytape,"/
  
  ____dev/nrct0",6,skip
  
  ____250
  
  ____go
  
  ____其中:"/dev/nrct0"指非回卷磁带设备名,"6"是设备控制号, tape在3~8之间,skip 通知服务器忽略已存在的ANSI磁带标号,250是磁带的大小,以M为单位。
  
  ____建立成功后,可以查询maser.dbo.sysdevices表中有name="mytape"的记录描述。
  
  ____(3) 转储数据库
  
  ____即备份一个完整的数据库,包括它的系统表,建立各种数据对象和事务日志。备份格式不同于操作系统文件,tar命令不可读,它只能由SQL Server的装载工具来识别和恢复。转储命令如下:
  
  ____dump database TRYDB to mytape with init
  
  ____go
  
  ____其中:TRYDB为库名;with init为选项,重新初始化磁带卷。
  
  ____(4) 装载数据库
  
  ____如果数据库受到破坏而必须删除,则要重新初始化库设备,tb重建数据库并装载最近的数据库备份及所有事务日志。
  
  ____装载数据库:
  
  ____load database TRYDB from mytape
  
  ____go
  
  ____以上仅限装载用户数据库,不适用于master库。另外,也可将数据库备份成操作系统文件,执行操作系统备份命令将文件拷至磁带上。恢复时先tar入磁带上的文件,然后装载 ,这种方式不须添加转储设备。
posted @ 2012-07-28 12:40 tbwshc 阅读(738) | 评论 (0)编辑 收藏

1 概述
1.1 数据库面临的安全挑战
数据库是企业核心业务开展过程中最具有战略性的资产,通常都保存着重要的商业伙伴和客户信息,这些信息需要被保护起来,以防止竞争者和其他非法者获取。互联网的急速发展使得企业的数据库信息价值及可访问性得到了提升,同时,也致使数据库信息资产面临严峻的挑战,概括起来主要表现在以下三个层面:
管理层面:主要表现为人员的职责、流程有待完善,内部员工的日常操作有待规范,第三方维护人员的操作监控失效等等,致使安全事件发生时,无法追溯并定位真实的操作者。
技术层面:现有的数据库内部操作不明,无法通过外部的任何安全工具(比如:防火墙、IDS、IPS等)来阻止内部用户的恶意操作、滥用资源和泄露企业机密信息等行为。
审计层面:现有的依赖于数据库日志文件的审计方法,存在诸多的弊端,比如:数据库审计功能的开启会影响数据库本身的性能、数据库日志文件本身存在被篡改的风险,难于体现审计信息的真实性。
伴随着数据库信息价值以及可访问性提升,使得数据库面对来自内部和外部的安全风险大大增加,如违规越权操作、恶意入侵导致机密信息窃取泄漏,但事后却无法有效追溯和审计。
1.2 数据库审计的客观需求
数据库审计与风险控制的目的概括来说主要是三个方面:一是确保数据的完整性;二是让管理者全面了解数据库实际发生的情况;三是在可疑行为发生时可以自动启动预先设置的告警流程,防范数据库风险的发生。因此,如何采取一种可信赖的综合途径,确保数据库活动记录的100%捕获是极为重要的,任何一种遗漏关键活动的行为,都会导致数据库安全上的错误判断,并且干扰数据库在运行时的性能。只有充分理解企业对数据库安全审计的客观需求,才能够给出行之有效的解决方案:
捕捉数据访问:不论在什么时间、以什么方式、只要数据被修改或查看了就需要自动对其进行追踪;
捕捉数据库配置变化:当“数据库表结构、控制数据访问的权限和数据库配置模式”等发生变化时,需要进行自动追踪;
自动防御:当探测到值得注意的情况时,需要自动启动事先设置tb的告警策略,以便数据库安全管理员及时采取有效应对措施,对于严重影响业务运行的高风险行为甚至可以立即阻断;
审计策略的灵活配置和管理:提供一种直截了当的方法来配置所有目标服务器的审计形式、具体说明关注的活动以及风险来临时采取的动作;
审计记录的管理:将从多个层面追踪到的信息自动整合到一个便于管理的,长期通用的数据存储中,且这些数据需要独立于被审计数据库本身;
灵活的报告生成:临时和周期性地以各种格式输出审计分析结果,用于显示、打印和传输;
1.3 现有的数据库审计解决方案的不足
传统的审计方案,或多或少存在一些缺陷,主要表现在以下几个方面:
传统网络安全方案:依靠传统的网络防火墙及入侵保护系统(IPS),在网络中检查并实施数据库访问控制策略。但是网络防火墙只能实现对IP地址、端口及协议的访问控制,无法识别特定用户的具体数据库活动(比如:某个用户使用数据库客户端删除某张数据库表);而IPS虽然可以依赖特征库有限阻止数据库软件已知漏洞的攻击,但他同样无法判别具体的数据库用户活动,更谈不上细粒度的审计。因此,无论是防火墙,还是IPS都不能解决数据库特权滥用等问题。
基于日志收集方案:需要数据库软件本身开启审计功能,通过采集数据库系统日志信息的方法形成审计报告,这样的审计方案受限于数据库的审计日志功能和访问控制功能,在审计深度、审计响应的实时性方面都难以获得很好的审计效果。同时,开启数据库审计功能,一方面会增加数据库服务器的资源消耗,严重影响数据库性能;另一方面审计信息的真实性、完整性也无法保证。
其他诸如应用程序修改、数据源触发器、统一认证系统授权等等方式,均只能记录有限的信息,更加无法提供细料度的数据库操作审计。
1.4 本方案解决的数据库安全问题
为了解决企业数据库安全领域的深层次、应用及业务逻辑层面的安全问题及审计需求,杭州安恒信息技术有限公司依靠其对入侵检测技术的深入研究及安全服务团队积累的数据库安全知识,研制并成功推出了全球领先的、面向企业核心数据库的、集“全方位的风险评估、多视角的访问控制、深层次的审计报告”于一体的数据库审计与风险控制设备,即明御数据库审计与风险控制系统,为企业核心数据库提供全方位安全防护。
在企业业务支撑网络中部署了明御数据库审计与风险控制系统,可以实现企业核心数据库的“系统运行可视化、日常操作可跟踪、安全事件可鉴定”目标,解决企业数据库所面临的管理层面、技术层面、审计层面的三大风险,以满足企业的不断增长的业务需要。明御数据库审计与风险控制系统对于企业数据库的安全防护功能,概括起来体现在以下三个方面:
首先:明御数据库审计与风险控制系统采用“网络抓包、本地操作审计”组合工作模式,结合安恒专用的硬件加速卡,确保数据库访问的100%完整记录,为后续的日常操作跟踪、安全事件鉴定奠定了基础。
其次:明御数据库审计与风险控制系统通过专利级的双引擎技术,一方面利用数据库安全研究团队多年积累的安全知识库,防止无意的危险误操作,阻止数据库软件漏洞引起的恶意攻击;另一方面,依赖智能自学习过程中动态创建的安全模型与异常引擎相结合,有效控制越权操作、违规操作等异常操作行为。
再者:明御数据库审计与风险控制系统 依赖其独特的数据库安全策略库,可以深入到应用层协议(如操作命令、数据库对象、业务操作过程)实现细料度的安全审计,并根据事先设置的安全策略采取诸如产生告警记录、发送告警邮件(或短信)、提升风险等级、加入黑名单、立即阻断等响应。同时,明御数据库审计与风险控制系统可以提供多视角的审计报告,即根据实时记录的网络访问情况,提供多种安全审计报告,更清晰地了解系统的使用情况以及安全事件的发生情况,并可根据这些安全审计报告进一步修改和完善数据库安全策略库。
 
2 方案总体结构
2.1 主要功能
如下图所示,数据库审计与风险控制系统主要的功能模块包括“静态审计、实时监控与风险控制、动态审计(全方位、细粒度)、审计报表、安全事件回放、审计对象管理、系统配置管理管理”几个部分。
2.1.1 数据库静态审计
数据库静态审计的目的是代替繁琐的手工检查,预防安全事件的发生。数据库审计与风险控制系统依托其权威性的数据库安全规则库,自动完成对几百种不当的数据库不安全配置、潜在弱点、数据库用户弱口令、数据库软件补丁、数据库潜藏木马等等静态审计,通过静态审计,可以为后续的动态防护与审计的安全策略设置提供有力的依据。
2.1.2 实时监控与风险控制
数据库审计与风险控制系统可保护业界主流的数据库系统,防止受到特权滥用、已知漏洞攻击、人为失误等等的侵害。当用户与数据库进行交互时,数据库审计与风险控制系统会自动根据预设置的风险控制策略,结合对数据库活动的实时监控信息,进行特征检测及审计规则检测,任何尝试的攻击或违反审计规则的操作都会被检测到并实时阻断或告警。
2.1.3 数据库动态审计
数据库审计与风险控制系统基于“数据捕获→应用层数据分析→监控、审计和响应” 的模式提供各项安全功能,使得它的审计功能大大优于基于日志收集的审计系统,通过收集一系列极其丰富的审计数据,结合细粒度的审计规则、以满足对敏感信息的特殊保护需求。
数据库动态审计可以彻底摆脱数据库的黑匣子状态,提供4W(who/when/where/what)审计数据。通过实时监测并智能地分析、还原各种数据库操作,解析数据库的登录、注销、插入、删除、存储过程的执行等操作,还原SQL操作语句;跟踪数据库访问过程中的所有细节,包括用户名、数据库操作类型、所访问的数据库表名、字段名、操作执行结果、数据库操作的内容取值等。
全方位的数据库活动审计:实时监控来自各个层面的所有数据库活动。如:来自应用程序发起的数据库操作请求、来自数据库客户端工具的操作请求、来自数据库管理人员远程登录数据库服务器产生的操作请求等。
完整的双向审计:除可实时监控数据库的请求操作以外,还可以实时监控所有请求操作后数据库的回应信息,如命令执行情况,错误信息等。
潜在危险活动重要审计:提供对DDL类操作、DML类操作的重要审计功能,重要审计规则的审计要素可以包括:用户、源IP地址、操作时间(任意天、一天中的时间、星期中的天数、月中的天数)、使用的SQL操作类型(Select/Delete/Drop/Insert/Update)。当某个数据库活动匹配了事先定义的重要审计规则时,一条报警将被记录以进行审计。
重要审计规则设置:
重要审计结果展示:
敏感信息细粒度审计:对业务系统的重要信息,提供完全自定义的、精确到字段及记录内容的细粒度审计功能。自定义的审计要素包括登录用户、源IP地址、数据库对象(分为数据库用户、表、字段)、操作时间段(本日、本周、本月、最近三小时、最近十二小时、最近二十四小时、最近七天、最近三十天、任意时间段)、使用的SQL操作类型(select/delete/drop/insert/update/create/turncate)、记录内容。
根据操作类型及记录内容进行细粒度审计:
细粒度审计结果展示:
远程ftp操作审计与回放:对发生在数据库服务器上的ftp命令进行实时监控、审计及回放。审计的要素包括:ftp用户、ftp客户端IP地址、命令执行时间段(本日、本周、本月、最近三小时、最近十二小时、最近二十四小时、tb最近七天、最近三十天、任意时间段)、执行的ftp命令(get/put/ls等等)。
 
自定义ftp操作审计:
ftp审计结果展示:
ftp回放:
 
远程telnet操作审计与回放:对发生在数据库服务器上的Telnet命令进行实时监控、审计及回放。审计的要素包括:telnet用户、telnet客户端IP地址、命令执行时间段(本日、本周、本月、最近三小时、最近十二小时、最近二十四小时、最近七天、最近三十天、任意时间段)、telnet登录后执行的系统命令(login/pwd/root等等)。
自定义telnet操作审计:
 
telnet操作审计结果展示:
会话分析与查看:单个离散的操作(Sql操作、ftp命令、telnet命令)还不足于了解用户的真实意图,一连串的操作所组成的一个完整会话展现,可以更加清晰地判断用户的意图(违规的\粗心的\恶意的)。
Telent操作审计会话查看:
 
2.1.4 审计报表
数据库审计与风险控制系统内嵌了功能强大的报表模块,除了按安全经验、行业需求分类的预定义固定格式报表外,管理员还可以利用报表自定义功能生成定制化的报告。报告模块同时支持Word、Excel、PowerPoint、Pdf格式的数据导出。系统缺省提供以下报表:
 
数据库攻击源统计示意图:
数据库操作审计示意:
同时提供灵活的格式报表功能,可以方便的根据业务逻辑来动态格式化报表元素,提供强大的样式定义,对于熟悉CSS的设计人员来说,可以设计出相当出色的报表样式。
 
2.1.5 安全事件回放
允许安全管理员提取历史数据,对过去某一时段的事件进行回放,真实展现当时的完整操作过程,便于分析和追溯系统安全问题。
很多安全事件或者与之关联的事件在发生一段时间后才引发相应的人工处理, 这个时候, 作为独立审计的数据库审计与风险控制系统就发挥特别的作用. 因为所有的FTP、telnet、客户端连接等事件都保存后台(包括相关的告警), 对相关的事件做定位查询,缩小范围,使得追溯变得容易;同时由于这是独立监控审计模式, 使得相关的证据更具有公证性。
Sql操作回放示意图:
telnet命令回放示意图:
2.1.6 综合管理
数据库审计与风险控制系统提供WEB-base的管理页面,数据库安全管理员在不需要安装任何客户端软件的情况下,基于标准的浏览器即可完成对数据库审计与风险控制系统的相关配置管理,主要包括“审计对象管理、系统管理、用户管理、功能配置、风险查询”等。
下图为审计对象配置示意图:
下图为系统配置示意图:
下图为风险查询示意图: 
 
2.2 审计流程
明御数据库审计与风险控制系统数据库审计流程如下图所示:
2.2.1 审计数据采集
明御数据库审计与风险控制系统审计数据采集的方式包括:网络抓包、本地操作审计,采集的内容主要包括:
账号登录行为数据:采集对账号登录动作的审计。具体包括:
账号名称、登录成功或登录失败、用户终端IP/ID、登录时间等;
对异常动作的审计记录,应记录越权企图、用户终端IP/ID、登录时间等;
账号登录后各种操作记录,记录各种操作的操作人员、操作时间、操作内容,具体包括:
对数据库的一般操作记录;
对关键数据的操作记录;
数据库特殊命令的操作记录
明御数据库审计与风险控制系统对审计数据的采集大多数情况下是通过网络获取,由于其采用了专用硬件加速接口卡,可以在千兆环境下线速捕获,因此保证了明御数据库审计与风险控制系统具备交换机一样的高吞吐量和低延时、并且确保了审计信息的不会丢失。
2.2.2 审计数据标准化
审计数据来源自多种方式采集的数据,而这些数据定义的格式不尽相同。所以,审计数据的标准化就必须把这些不同格式的事件转化成标准格式,然后写入审计数据库。在标准化的过程中,也需要对多种方式采集的数据进行排重处理。
2.2.3 审计数据归并
对于标准化处理后的审计数据必须对某些数据进行归并(会聚)。归并规则,就是在什么情况下,满足什么条件,对哪些字段进行归并。事件归并功能可以对海量的审计数据依据归并条件进行归并,达到简化审计数据,提高审计数据准确率。
审计数据归并规则包含以下属性:
归并字段:归并处理的审计数据字段,所列字段内容相同的审计数据才进行归并;
归并时间:归并审计数据的时间窗口,指多长时间进行一次归并;
归并数目:需要归并事件的数量,指多少事件进行一次归并;
对被归并审计数据的处理方式:被归并的审计数据以何种方式进行处理;
被归并审计数据的处理方式:
丢弃:直接将被归并审计数据全部丢弃,不写入数据库;
写入数据库:将被归并审计数据全部写入数据库;
通过预设归并规则的模板,方便对海量审计数据的归并,明御数据库审计与风险控制系统提供以下预设模板:
根据审计数据名称进行归并分析;
根据审计数据的类型进行归并分析;
根据审计数据的原始时间进行归并分析;
根据受审计的设备类型进行归并分析;
 
2.2.4 安全事件关联
通过安全事件关联功能,来深度挖掘安全隐患、判断审计数据的严重程度,包括关联分析的类型和关联分析规则的内容。
基于时序关联规则:将账号的登录行为和账号各种业务操作行为根据时序进行关联。通过时序关联,形成某一个账号连续的登录行为和操作行为,根据制定审计策略判断其是否业务操作习惯;根据时序关联判断执行每个业务操作的账号是否具有正常的登录记录等;
基于账号与重要操作行为的关联:将对数据库系统的重要业务操作时所使用的账号信息进行关联,用来判断该账号是否正常使用;判断该账号是否具有该项权限所对应的权限范围,是否为合法用户等等。
基于账号与权限关联:将账号应该对应的权限与实际系统中赋予的权限进行关联,用来审计账号的访问权限是否合理;查询资源的授权访问者,权限的分配时间、分配者等是否和审批的一致。
2.2.5 审计结果呈现
审计数据的呈现与安全风险管理是密切相关的。明御数据库审计与风险控制系统提供对审计数据进行实时监控和实时展现。在审计数据的展现或响应中,可以支持邮件、弹出窗口、syslog、SNMP Trap、手机信息、声音报警等多种方式。
2.2.6 灵活的报告展现
明御数据库审计与风险控制系统内嵌了功能强大的报表模块,除了按安全经验、行业需求分类的预定义固定格式报表外,管理员还可以利用报表自定义功能生成定制化的报告。报告模块同时支持Word、Excel、PowerPoint、Pdf、Html、Postscript格式的数据导出。支持两种报表生成模式,即预置固定格式的报表、用户自定义报表:
通过预置固定格式的报表:可快速查看安全告警、SOX审计、设备性能以及应用系统受攻击情况。
灵活的条件格式定义,可以方便的根据业务逻辑来动态格式化报表元素,同时提供强大的样式定义,对于熟悉CSS的设计人员来说,可以设计出相当出色的报表样式。
全部查询:
指定用户查询:
 
2.3 系统优势
2.3.1 零风险、多种方式部署
明御数据库审计与风险控制系统可灵活支持直连、旁路的模式部署到网络中,因此,部署时不需要对现有的网络体系结构(包括:路由器、防火墙、应用层负载均衡设备、应用服务器等)进行调整。同时,依靠“安恒”自主研发的双引擎技术,检测过程中无需对应用程序进行修改,实现应用层的零风险部署。
2.3.2 不影响数据库业务本身
明御数据库审计与风险控制系统主要是通过网络抓包进行数据采集 ,因此并不影响数据库保护对象本身的运行与性能,主要体现在以下几个方面:
不需要对数据库软件进行更改;
不占用数据库本身的资源,比如:CPU资源、内存资源、磁盘资源等;
无需数据库的管理权限;
2.3.3 高可用性
明御数据库审计与风险控制系统全方位确保设备本身的高可用性,包括但不限于:
物理保护:关键部件采用冗余配置(如:冗余电源、内置硬盘RAID等);
掉电保护:设备掉电(如电源被不慎碰掉)时,网络流量将会直接贯通;
系统故障保护:内置监测模块准实时地监测设备自身的健康状况;
不间断的管理保护:在进行策略配置情况下,能保持网络的连接和保护;
不丢包:基于硬件加速的接口卡,在1G、2.5G、10G环境下实现100%数据包捕获;

冗余部署:在具备冗余体系结构的环境中,支持Active-Active或Active-Standby部署配置

posted @ 2012-07-22 14:01 tbwshc| 编辑 收藏

了解如何安装、设置和配置 Oracle GoldenGate 以轻松实现 Oracle Database 10g 和 11g 之间数据的无缝复制。

作者:Porus Homi Havewala

2010 年 4 月发布

Oracle GoldenGate 用于在各种企业系统间以亚秒级速度复制和集成事务数据,是同类最佳的、易于部署的产品。Oracle GoldenGate 可以灵活地在同类和异类系统(包括不同版本的 Oracle Database、不同的硬件平台)tb之间以及 Oracle 数据库和非 Oracle 数据库(包括 Microsoft SQL Server、用于开放系统和 z/OS 的 IBM DB2、Sybase 等等)之间移动数据。

本文演示如何安装、设置和配置此产品以轻松实现 Oracle Database 10g 和 11g 之间数据的无缝复制,还介绍了此产品的加速能力。

Oracle 于 2009 年收购了 GoldenGate,我们可以看到在全球各行业超过 4,000 个解决方案中实施了 Oracle GoldenGate。该软件执行实时的、基于日志的更改数据捕获 (CDC),能够在异构数据库间以极低的延迟和很小的空间移动大量事务数据。

通常,您部署 GoldenGate 捕获、数据泵和交付进程,并且可将这些进程部署在许多不同的操作系统和数据库上。可根据目标数据库的需要,复制所有数据或部分数据。当 Oracle GoldenGate 用于 Oracle 数据库时,可以复制数据操作语言 (DML) 和数据定义语言 (DDL) 操作。(目前只能在同类(不能在异类的)Oracle 版本间复制 DDL 操作。)

Oracle GoldenGate 官方支持 Oracle9i 第 2 版到 Oracle Database 11g 第 2 版,并且对所有这些版本提供 DML/DDL 支持。该产品可用于 Oracle Database 的企业版和标准版。

如上所述,可以在所支持的同类或异类 Oracle Database 版本间移动数据,也可以在 Oracle 数据库和非 Oracle 数据库间移动数据。大多数情况下,可对数据进行筛选、映射和转换。注意,如果启用了 DDL 支持(换言之,如果使用 GoldenGate 进行同类 Oracle Database 版本之间的 DDL 复制),则不支持数据筛选、映射和转换。

Oracle GoldenGate 是以 DBA 为中心的,因此 DBA 很容易学会如何使用它。其实现时间也是最少的 — 一些站点只用一个月的时间就完全付诸实现。

可获得什么

Oracle GoldenGate 产品系列包括:

  • Oracle GoldenGate
  • Management Pack for Oracle GoldenGate(也称为 Oracle GoldenGate Director)
  • Oracle GoldenGate Veridata
  • Oracle GoldenGate Application Adapters
  • Oracle GoldenGate for Mainframe

为使增值服务造福客户,Oracle GoldenGate 核心许可包括 Oracle Active Data Guard 的全权使用许可和 Oracle Database 中 XStream 的全权使用许可。XStream 是与 Oracle Streams 接口的 API。Oracle Active Data Guard 支持主动打开备用数据库以提供报表服务,甚至在应用重做数据的同时也如此。这个特性非常棒,可将生产报表和查询工作分流到备用数据库上。

一直以来,Oracle Streams 只用于在 Oracle 数据库间复制数据。Oracle GoldenGate 还可以在非 Oracle 数据库间复制数据,并且这种复制易于建立。

我们应注意到,已发布的 Oracle — GoldenGate 发展方向声明 中指出,“由于 Oracle GoldenGate 的战略性,将继续支持 Oracle Streams,但不会对其进行主动增强。而是对 Oracle Streams 中最好的内容行评估以确定是否将其并入 Oracle GoldenGate 中。”

此演示的目的

为了进行此次演示,您应在一台 Microsoft Windows 服务器上有三个数据库。这三个数据库是 HRPRD1、HRPRD2 和 HRPRD3。其数据库版本分别为 Oracle Database 11g、 Oracle Database 10g 和 Oracle Database 10g

这三个数据库的 SYS 和 SYSTEM 口令已设置为 hrpassword1,用于测试目的。稍后可更改此口令。

此演示的目的是在 HRPRD2 和 HRPRD3 这两个 Oracle 10g 数据库的 HR.EMPLOYEES 表之间建立单向复制。对第一个数据库中此表的 DML 更改应传给第二个数据库。然后,我们将对这一复制进行增强,可以将更改同时复制到 Oracle 11g 数据库 HRPRD1 中。其结果是,对 HRPRD2 中该表的任何更新、插入和删除不仅将会成功更新 HRPRD3,也会成功更新 HRPRD1。

这种从 Oracle Database 10g 到 Oracle Database 10g 然后再到 Oracle Database 11g 的复制策略常用于升级情况,进行升级时,需要先复制数据,然后方可切换到升级后的数据库版本。Oracle GoldenGate 提供了简单的解决方案。

注意,针对 Oracle 数据库时,您 需要使用 Microsoft ODBC 数据源管理器为这些数据库创建数据源名称 (DSN)。Oracle GoldenGate 复制将使用监听器直接连接到 Oracle 数据库。

需要下载的内容

首先,对于 Windows 系统,需要从 Microsoft 下载中心下载 Microsoft Visual C ++ 2005 SP1 Redistributable Package,然后进行安装。如果计算机上未安装 Visual C++,这用于安装运行本应用程序时所需的 Visual C++ 库的运行时组件。

接下来,需要从 Oracle 技术网 下载 Oracle GoldenGate 软件。截至本文撰写时,OTN 只支持 Windows 平台 64 位版本:适用于 Windows 2000、XP 和 2003(64 位)上的 Oracle 10g 的 Oracle GoldenGate 10.4.0.x 版 (8 MB)。要下载 32 位 Windows 版本,您必须使用 Oracle E-Delivery 网站。(请注意,E-Delivery 下载有一个为期 30 天的试用产品许可,而非 OTN 开发人员许可。)登录此网站后,搜索适用于 Microsoft Windows(32 位)平台的“Oracle Fusion Middleware Product Pack”(因为 Oracle GoldenGate 被视作一个 Oracle 融合中间件产品,而非 Oracle Database 产品),然后单击 Go

此时会出现介质包列表。在此列表中,先选择 Oracle GoldenGate on Oracle Media Pack for Microsoft Windows (32-bit)

此介质包中包含:

适用于 Windows 2000、XP 和 2003 上的 Oracle 10g 的 Oracle GoldenGate 10.4.0.x 版

V18162-01

大小:8.4 MB

适用于 Windows 2000、XP 和 2003 上的 Oracle 11g 的 Oracle GoldenGate 10.4.0.x 版

V18164-01

大小:8.4 MB

Oracle GoldenGate 文档

V18423-01

大小:20 MB

下载这三个 zip 文件,因为您需要适用于 Oracle 10g 和 Oracle 11g 的 Oracle GoldenGate。
然后,返回到 Oracle 融合中间件的介质包列表,从中tb选择 Management Pack for Oracle GoldenGate (v2.0.0.2) Media Pack for Microsoft Windows
该管理包介质包中包含:

适用于 Windows 的 Oracle GoldenGate Director V2.0.0.x Server

V18127-01

大小:228 MB

适用于 Windows 的 Oracle GoldenGate Director V2.0.0.x Client

V18128-01

大小:55 MB

Oracle GoldenGate Director 文档

V18129-01

大小:952 KB

如果您想安装管理包,下载所有这些文件。该管理包是一个安装您 Windows 服务器上的独立产品,。该产品原名为 Oracle GoldenGate Director,它包含一个多层的客户端-服务器应用程序,使组织可以轻松监视和管理其 Oracle GoldenGate 部署。

使用 Oracle GoldenGate Director 的 GUI 界面,可以集中设计和配置 Oracle GoldenGate,还可以管理和监视为了在公司各服务器间复制数据而建立的各种 Oracle GoldenGate 进程。

介质包的主列表中还有其他一些介质包,如 Oracle GoldenGate Veridata Media Pack for Microsoft Windows。

Oracle GoldenGate Veridata 软件作为服务器进行安装,在不同平台上具有代理,它负责将一组数据与另一组数据进行对比以识别不同步的数据,对比时无需停机。此对比可全天候进行,可与大流量的复制同时进行。还可在不同平台间进行数据对比。

除了上述主要介质包外,列表中还显示了其他 Oracle GoldenGate 包。这些软件包适用于非 Oracle 数据库,如 Sybase、SQL Server、IBM DB2、Teradata,还有 JMS 和平面文件,这反映了 Oracle GoldenGate 支持异构的性质。

安装步骤

您下载的 Oracle GoldenGate 文档 zip 文件 (V18423-01.zip) 中包含 Oracle GoldenGate Oracle Installation and Setup Guide Version 10.4 (gg_ora_inst_v104.pdf),其中描述了适用于 Linux、UNIX 和 Windows 上的 Oracle 数据库的 Oracle GoldenGate 的安装步骤。

注意,还有其他一些安装文档,它们针对适用于 Sybase、SQL Server、DB2、MySQL、Teradata 等的 Oracle GoldenGate。

首先,将 Oracle GoldenGate for Oracle 10g (V18162-01.zip) 解压缩到一个新的 Oracle GoldenGate 软件目录中,目录名中不含任何空格。例如,您可以使用 C:\OGG10G 作为 Oracle GoldenGate 目录。此目录中的软件代码将用于建立第一个和第二个 Oracle 10g 数据库之间的复制。

由于您的第三个数据库是 Oracle Database 11g 版 ,您还需要解压缩 Oracle GoldenGate for Oracle 11g (V18164-01.zip)。对于此版本的 Oracle GoldenGate,您需要使用一个单独的目录,C:\OGG11G。此目录中的软件代码将用于控制到第三个 Oracle Database 11g 数据库的复制。

如果您有 Oracle9i 数据库并且想从其复制数据或向其复制数据,需要另一个适用于 Oracle9i 的 Oracle GoldenGate 软件。不过,您不能通过 Oracle 网站下载 Oracle GoldenGate 的 Oracle9i 版本。如果您需要此版本,可能需要通过 My Oracle Support 发出一个系统请求 (SR)。

在命令提示符处输入以下命令

mkdir C:\OGG10G
cd C:\OGG10G
unzip c:\V18162-01.zip

mkdir C:\OGG11G
cd C:\OGG11G
unzip C:\V18164-01.zip

# start the 10g
 databases if not already started
net start OracleServiceHRPRD2
net start OracleServiceHRPRD3

# start the 11g
 database if not already started
net start OracleServiceHRPRD1
  

设置环境变量

现在,您可以打开两个命令窗口(开始..运行..Cmd) ,针对 Oracle Database 10g 和 Oracle Database 11g 将相应的环境变量(如 ORACLE_HOME、ORACLE_SID、LD_LIBRARY_PATH 等)设置为相应的值。

为了在两个 Oracle 10g 数据库间建立复制,将这些变量进行如下设置:

set  ORACLE_HOME=C:\Oracle\product\10.2.0\db_1
set ORACLE_SID=HRPRD2
set  PATH=%ORACLE_HOME%\bin;%PATH%
set  LD_LIBRARY_PATH=C:\OGG10G; %ORACLE_HOME%\LIB; 
%ORACLE_HOME%\jdbc\lib
set  CLASSPATH=;C:\Program 
Files\Java\jre6\lib\ext\QTJava.zip;%ORACLE_HOME%\jdbc\lib
  

ORACLE_SID 可设置为 HRPRD2 或 HRPRD3,两者都是 Oracle 10g 数据库。请注意 PATH、LD_LIBRARY_PATH 和 CLASSPATH 的值。

另一种方法是用系统变量进行这些设置,为此您可以在 Windows XP Professional 中使用:我的电脑..属性..高级..环境变量..系统变量。在这里添加新的系统变量并按如上所述更改路径。

在此例中,在一台服务器上运行两个数据库版本的缺点是,每次启动 Oracle GoldenGate for Oracle 10g 或 Oracle GoldenGate for Oracle 11g 的 Manager 服务时,都必须更改系统变量。您可能要添加与 Oracle Database 11g 有关的系统变量,然后启动 Oracle GoldenGate for Oracle 11g Manager 服务。这之后,您可能要更改这些系统变量,使其适合于 Oracle Database 10g ,然后启动 Oracle GoldenGate for Oracle 10g Manager 服务。由于这是一个测试系统,这么做可能没有问题。但在生产环境下,您需要采取一种更自动化的方法(如采用脚本化的方法)在脚本中设置这些变量并启动 Manager 服务。

GGSCI 命令解释程序

在命令窗口或“我的电脑”级别设置环境变量之后,转到 Oracle GoldenGate 的文件夹下,通过命令行(见图 1)或 Windows 资源管理器运行 Oracle GoldenGate Command Interpreter for Oracle (GGSCI) 程序。


图 1 Oracle GoldenGate Command Interpreter

现在,您可在 GGSCI 中执行 CREATE SUBDIRS 命令来创建 Oracle GoldenGate 的工作子目录。参见图 2,其中列出了所创建的重要目录。


图 2 创建工作子目录

将 Oracle GoldenGate Manager 作为本地程序运行

您可以将 Oracle GoldenGate Manager 当作一个本地程序在命令窗口中运行,也可以将它作为一个 Windows 服务安装以便在 Windows 启动时自动启动。我们建议使用后面这种方法。

如果您希望将其作为一个本地命令运行,只需调用目录中的 Manager 执行文件(调用时带着一个参数文件)即可。命令语法为:

C:\OGG10G>mgr
Usage:  MGR PARAMFILE <param file> [REPORTFILE <report file>]
              [PID <process id>] [PORT  <port number>]
              [USESUBDIRS] [NOUSESUBDIRS]
              [PAUSEATEND] [NOPAUSEATEND]
              [CD <directory>]

PARAMFILE 是必需的参数。因此,您必须在 GGSCI 中创建一个参数文件:

GGSCI (HaviPori) 1> edit params mgr

此命令将在 C:\OGG10G\dirprm 目录中创建一个新的 mgr.prm 文件。在该文件中键入将用于运行 manager 进程的端口号,然后保存该文件。

PORT 7809

默认端口号为 7809。无论您选择哪个端口号,请确保该端口号未被任何其他程序所使用并且没有任何防火墙限制。因为 PORT 是 Manager 唯一需要的参数,所以必须指定该参数。GGSCI 使用该端口将请求发送给 Manager 以启动进程,并且 Extract 进程也使用该端口进行各种操作。

创建该参数文件之后,就可以在 Windows 命令提示符下启动 Manager 了,如下所示:

C:\OGG10G>mgr paramfile c:\OGG10G\dirprm\mgr.prm

该命令启动 Manager,并且显示图 3 所示的消息:


图 3 在 Windows 命令提示符处启动 Manager

必须保持此窗口为打开状态,以保持 Manager 运行。如果您注销,该窗口将关闭,Manager 将停止运行。

将 Manager 作为 Windows 服务进行安装

上文描述了手动启动 Manager 的方法,还有一种启动方法,那就是将 Manager 作为自动启动的 Windows 服务来安装。

在 Windows 集群环境下必须使用后面这种方法,因为出现故障时只有服务可以自动切换到备用服务器上。在非集群系统中,将 Manager 作为服务来安装是可选的方法但也是强烈建议的方法。

在 Windows 中作为服务创建 Manager 进程时,该服务的默认名称为 GGSMGR。您可以为此服务指定自定义的名称。如果您在同一台服务器上需要不止一个 Oracle GoldenGate Manager 服务,比如一个针对 Oracle GoldenGate for Oracle 10g 的服务和另一个针对 Oracle GoldenGate for Oracle 11g 的服务,则指定名称是很重要的。如果您打算运行 Oracle GoldenGate Veridata,还需要一个 Manager 服务。

用以下方法为 Manager 服务指定一个不同的名称。在 GGSCI 命令提示符处执行以下命令:

EDIT PARAMS ./GLOBALS

在出现的记事本编辑器中,选择新建一个文件(如果是首次这么做),然后输入以下代码并保存该 GLOBALS 文件:

MGRSERVNAME OracleGGSMGR1

根据 Windows 上的 Oracle 服务一般带有 Oracle 前缀(如 OracleDBConsole<instancename>、OracleJobScheduler<instancename> 服务)的惯例,使用名称 OracleGGSMGR1。

通过 C:\OGG10G 目录中的 Install 程序可轻松创建 Manager 服务。使用 install addservice 命令,如图 4 所示:


图 4 创建 Manager 服务

新服务在 Windows 服务列表中显示为一个自动启动的服务(见图 5):


图 5 Manager 服务属性

Manager 服务以本地系统帐户运行,也可配置为以特定帐户(使用用户名和口令选项)运行,该用户名和口令可由 addservice 命令指定。现在可通过以下命令启动该服务:

GGSCI (HaviPori) 1> start manager

Starting Manager as service ('OracleGGSMGR1')...
Service started.
  

安装 Windows 事件消息

还可使用 Install 程序将事件消息安装到 Windows 注册表中,这样它们可通过 Windows Event Manager 显示。使用以下命令可完成此操作:

C:\OGG10G>install addevents
Oracle GoldenGate messages installed successfully.
Install program terminated normally.
  

还可将 category.dll 和 ggsmsg.dll 文件从 C:\OGG10G 目录复制到 C:\WINDOWS\system32 目录,从而生成具体的而不是一般性的错误。

建立复制 — 在 HRPRD2 上建立 Extract 进程

Oracle GoldenGate Manager 进程已启动并运行。下一步要建立数据库之间的复制。

为此,您至少需要创建和配置一个 Extract 和 Replicat 组。在这些组中指定您想捕获和复制的数据。

Extract 进程捕获发生的数据更改并将这些更改发送给目标服务器上的一个“线索”。在目标服务器上启动 Replicat 进程,该进程负责进行实际的复制,它从线索中获取数据更改,然后将这些更改应用到目标数据库中。

您还需要为 Oracle GoldenGate Replication 准备数据库:在数据库级打开追加日志 功能。为此,在以 SYSDBA 身份登录到数据库后使用以下命令:

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.

SQL> alter system switch logfile;
System altered

现在可以添加 Extract 组了。

GGSCI (HaviPori) 1> ADD EXTRACT emp_ext, TRANLOG, BEGIN NOW
EXTRACT added.
  

您在这里指定了 TRANLOG,这意味着事务(重做)日志成为数据源。BEGIN 后面可以是该日志中的一个时间戳以便从该时刻开始进行处理,也可以是 NOW 以便立即开始处理。TRANLOG 还可以带有 EXTSEQNO 选项(某个 Oracle 重做日志的序列号,从该日志开始)和 EXTRBA 选项(该日志中的相对字节地址)。

注意,Extract 组的名称只能有八位字符。如果进行以下指定,则可获得完全帮助。

GGSCI (HaviPori) 1> help add extract

接下来,我们要添加一个 RMTTRAIL 或 EXTTRAIL。前者用于远程计算机,如果您在同一台本地计算机上建立复制,则建议使用后者。我们将使用 EXTTRAIL,通过以下命令来创建它:

GGSCI (HaviPori) 1> ADD EXTTRAIL C:\OGG10G\dirdat\et, EXTRACT emp_ext
EXTTRAIL added.
  

EXTTRAIL 被指定为服务器上的一个物理子目录 — 最好在 dirdat 子目录下,dirdat 是为 Oracle GoldenGate 复制而创建的工作目录之一。

指定的文件名只能是两位字符,因为在创建实际文件时,会在这两个指定的字符后追加一个数字后缀以产生实际文件名。例如,当 EXTRACT 进程启动并且发生数据更改时,会创建一个 C:\OGG10G\dirdat\et000001 文件作为提取文件。

RMTTRAIL 的命令语法与之相同,如果您要使用 RMTTRAIL,只需用 RMTTRAIL 代替 EXTTRAIL。主要差别体现在 extract 的参数文件中 — 下一步将创建此参数文件。使用 RMTTRAIL 时,该参数文件将有更多参数用于描述远程主机和远程管理器端口号。

现在,我们来为 Extract 组 emp_ext 创建参数文件,如下所示:

GGSCI (HaviPori) 1> EDIT PARAM emp_ext

在此文件中,键入以下代码行:

EXTRACT emp_ext
USERID system@localhost:1521/HRPRD2, PASSWORD hrpassword1
EXTTRAIL C:\OGG10G\dirdat\et
TABLE hr.employees;

您指定了在这个 Extract 组中,对第一个 Oracle 10g 数据库(即 HRPRD2)中的表 HR.EMPLOYEES 进行提取。

如果您使用了 RMTTRAIL,则只需按下列行进行更改:

RMTHOST <remote host>, MGRPORT <remote manager port number> 
RMTTRAIL C:\<remote GoldennGate Directory>\dirdat\rt
  

现在,可使用以下命令启动 extract:

GGSCI (HaviPori) 1> START EXTRACT EMP_EXT
Sending START request to MANAGER ('OracleGGSMGR1') ...
EXTRACT EMP_EXT starting
  

该进程的状态和有关信息如下所示:

GGSCI (HaviPori) 2> STATUS EXTRACT EMP_EXT
EXTRACT EMP_EXT: RUNNING

GGSCI (HaviPori) 3> INFO EXTRACT EMP_EXT
EXTRACT    EMP_EXT   Last Started 2009-12-08 13:04   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:00 ago)
Log Read Checkpoint  Oracle Redo Logs
                     2009-12-08 13:05:58  Seqno 11, RBA 578560
  

还可查看有关该进程的详细信息:

GGSCI (HaviPori) 4> INFO EXTRACT EMP_EXT detail
EXTRACT    EMP_EXT   Last Started 2009-12-08 13:04   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:00 ago)
Log Read Checkpoint  Oracle Redo Logs
                     2009-12-08 13:07:19  Seqno 11, RBA 596992

  Target Extract Trails:
  Remote Trail Name                                Seqno        RBA     Max MB
  C:\OGG10G\dirprm\et                                  0        923         10
  Extract Source                          Begin             End
  D:\ORADATA\HRPRD2\REDO01.LOG         2009-12-08 12:59  2009-12-08 13:07
  Not Available                           * Initialized *   2009-12-08 12:59

Current directory     C:\OGG10G
Report file                C:\OGG10G\dirrpt\EMP_EXT.rpt
Parameter file         C:\OGG10G\dirprm\EMP_EXT.prm
Checkpoint file        C:\OGG10G\dirchk\EMP_EXT.cpe
Process file             C:\OGG10G\dirpcs\EMP_EXT.pce
Error log                C:\OGG10G \ggserr.log
  

诊断 Extract

只要有错误,extract 进程就会显示为 STOPPED 状态。这种情况下需要进行错误分析。

首先,查看报告文件 C:\OGG10G\dirrpt\EMP_EXT.rpt,上面的详细信息中提到了该报告。

然后,查看日志文件 ggserr.log 和 sqlnet.log 中是否有任何说明性的消息,这两个文件位于 C:\OGG10G 主目录中。

ggserr.log 文件包含事件信息,例如:

2009-12-02  14:53:26  GGS INFO        301   Oracle GoldenGate
Manager for Oracle, mgr.prm:  Command received from GGSCI on host 10.10.10.10 (START EXTRACT  EMP_EXT ).
2009-12-02  14:53:26  GGS INFO        302   Oracle GoldenGate Manager for Oracle, mgr.prm:  
EXTRACT EMP_EXT starting.

也可通过以下方法查看这些事件:

GGSCI (HaviPori) 1> VIEW GGSEVT
…
….
2009-12-02 15:09:34  GGS INFO        302  Oracle GoldenGate Manager for Oracle,
mgr.prm:  EXTRACT EMP_EXT starting.
2009-12-02 15:13:26  GGS INFO        399  Oracle GoldenGate Command Interpreter
for Oracle:  GGSCI command (HaviPoriH): EDIT PARAM emp_ext.
  

sqlnet.log 可显示错误,例如:

TNS-12557: TNS:protocol adapter not loadable

这个特定错误指明存在数据库连接问题,您需要在监听器级进行分析。确保 Path 环境变量在最开始处包含了 Oracle Home bin 子目录。可能有其他的 TNS 错误,它们可能会指明其他解决方法。

EMP_EXT.rpt 可显示如下所示的错误:

2009-12-08 13:01:27  GGS ERROR       182  OCI Error beginning
 session (status = 28009-ORA-28009: connection as SYS should be as SYSDBA or SYSOPER).
2009-12-08 13:01:27  GGS ERROR       190  PROCESS ABENDING.
  

这指明 Extract 进程正在尝试以 sys 而不是 SYSDBA 身份登录。只需在 Extract 的参数文件中将登录参数改为“system”即可。

在这里我们应注意,在 Extract 参数文件中 login 行的末尾指定 SYSDBA 是不起作用的,尽管这么做对于 GGSCI 中的 DBLOGIN 命令(在下文中可看到此命令)确实会起作用。

ggserr.log 文件可显示类似错误:

2009-12-03 00:43:16  GGS INFO        399  Oracle GoldenGate 
Command Interpreter for Oracle:  GGSCI command (HaviPoriH): start manager.
2009-12-03 00:43:25  GGS ERROR       182  Oracle GoldenGate 
Manager for Oracle, mgr.prm:  OCI Error during OCIServerAttach 
(status = 12154-ORA-12154: TNS:could not resolve the connect identifier specified).
2009-12-03 00:43:25  GGS ERROR       190  Oracle GoldenGate 
Manager for Oracle, mgr.prm:  PROCESS ABENDING.
  

这指明 Manager 的参数文件 mgr.prm 中所提供的登录凭证可能存在问题。其结果是 Manager 没有启动。

您还可能在 Extract 的报告文件中看到另一个错误。例如,EMP_EXT.rpt 可能会有此类错误:

2009-12-07 16:40:08  GGS ERROR       190  No minimum supplemental
 logging is enabled. This may cause extract process to handle key 
update incorrectly if key column is not in first row piece.
2009-12-07 16:40:08  GGS ERROR       190  PROCESS ABENDING.
  

问题的解决方法显然是在数据库级启用追加日志功能。由于该功能已启用,在本例中将不会看到此错误。

在 HRPRD3 上建立 Replicat 进程

现在转到目标数据库 HRPRD3,在本例中该数据库位于同一服务器上。由于这也是一个 Oracle 10g 数据库,您可以使用同一 Oracle GoldenGate for Oracle 10g 安装软件(在 C:\OGG10G 子目录中)和同一 Manager 服务。如果这个数据库位于另一台服务器上,您需要在该服务器上安装适用于该数据库版本的相应 Oracle GoldenGate 软件然后配置一个新的 Manager 服务。

首先,使用 GGSCI 的 DBLOGIN 命令连接到该数据库,这样以后发出的其他命令将在此数据库上运行。

注意,DBLOGIN 正常运行,如下所示:

GGSCI (HaviPori) 1> 
DBLOGIN USERID system@localhost:1521/HRPRD3 PASSWORD hrpassword1
Successfully logged into database.
  

在 GGSCI help 中可以看到还有两个参数:SOURCEDB 和 TARGETDB。这两个参数只用于非 Oracle 数据库。

现在,需要为要复制的 employees 表添加一个检查点表:

GGSCI (HaviPori) 2> ADD CHECKPOINTTABLE HR.EMPLOYEES_CHKPT
Successfully created checkpoint table HR.EMPLOYEES_CHKPT.
  

此表中保存的检查点指示 Replicat 进程的当前读写位置。这用于在进程需要重启时或者在服务器出现任何故障或网络停顿时防止数据丢失。如果没有这一机制,将导致数据丢失。另一个好处是,通过使用检查点,多个 Extract 或 Replicat 进程可通过相同的一组线索进行读取。

对于以批处理模式运行的 Extract 和 Replicat 进程,检查点不是必需的,因为这样的进程总是可以重启。然而,在 Extract 和 Replicat 进程连续工作的情况下,检查点是必需的。检查点通常保存在 dirchk 子目录的文件中,但是对于 Replicat,可以选择在数据库的检查点表中保存检查点。

如果您在 GLOBALS 参数文件中指定检查点表,则上面的命令可使用该文件中的规定。这种情况下,只需这样来使用该命令:

GGSCI (HaviPori) 3> ADD CHECKPOINTTABLE
No checkpoint table specified, using GLOBALS specification (hr.employees_chkpt).
Successfully created checkpoint table HR.EMPLOYEES_CHKPT.
  

现在可以添加 Replicat 组了, 具体如下所示,其中指定的 EXTTRAIL 正是在第一个数据库中建立 Extract 组时所使用的 EXTTRAIL。这样,该 Replicat 组将以 Extract 组创建的线索为数据源,即使用相同的线索:

GGSCI (HaviPori) 4> ADD REPLICAT emp_rep, EXTTRAIL C:\OGG10G\dirdat\et, CHECKPOINTTABLE hr.employees_chkpt, 
REPLICAT added.
  

编辑此 Replicat 组的参数文件,具体如下:

GGSCI (HaviPori) 5> EDIT PARAM emp_rep

在新文件中输入以下内容:

REPLICAT emp_rep
USERID system@localhost:1521/HRPRD3, PASSWORD hrpassword1
ASSUMETARGETDEFS
MAP hr.employees, TARGET hr.employees;
  

由于各表具有完全相同的 DDL 结构,您使用 ASSUMETARGETDEFS 参数。

现在可以启动 Replicat 组:

GGSCI (HaviPori) 6> start REPLICAT emp_rep
Sending START request to MANAGER ('GGSMGR') ...
REPLICAT EMP_REP starting

稍候片刻再查看其状态,如果立即查看,其状态可能显示为“stopped”。看到状态为 “running”后,查看详细信息,执行 info all 命令显示所有正在运行的进程:

GGSCI (HaviPori) 7> status REPLICAT emp_rep
REPLICAT EMP_REP: STOPPED

GGSCI (HaviPori) 8> status REPLICAT emp_rep
REPLICAT EMP_REP: RUNNING

GGSCI (HaviPori) 11> info REPLICAT emp_rep detail
REPLICAT   EMP_REP   Last Started 2009-12-08 13:35   Status RUNNING
Checkpoint Lag       00:00:00 (updated 00:00:01 ago)
Log Read Checkpoint  File C:\OGG10G\dirdat\et000001
                     2009-12-08 13:33:24.000000  RBA 985

  Extract Source                          Begin             End
  C:\OGG10G\dirdat\et000001               2009-12-08 13:33  2009-12-08 13:33
  C:\OGG10G\dirdat\et000000               * Initialized *   2009-12-08 13:33

Current directory    C:\OGG10G
Report file          C:\OGG10G\dirrpt\EMP_REP.rpt
Parameter file       C:\OGG10G\dirprm\EMP_REP.prm
Checkpoint file      C:\OGG10G\dirchk\EMP_REP.cpr
Checkpoint table     HR.EMPLOYEES_CHKPT
Process file         C:\OGG10G\dirpcs\EMP_REP.pcr
Error log            C:\OGG10G\ggserr.log

GGSCI (HaviPori) 12> info all
Program     Status      Group       Lag           Time Since Chkpt
MANAGER     RUNNING
EXTRACT     RUNNING     EMP_EXT     00:00:00      00:00:03
REPLICAT    RUNNING     EMP_REP     00:00:00      00:00:06
  

此时可对两个 Oracle Database 10g 数据库 HRPRD2 和 HRPRD3 之间的复制进行测试。但我们决定等到建立好到 Oracle 11g 数据库 HRPRD1 的复制之后再进行测试。下面我们将建立该复制。

在 HRPRD1 上建立 Replicat 进程

您的 Oracle 11g 数据库 HRPRD1 也在同一服务器上。由于它是一个 11g 数据库版本,您需要使用本文开始时解压缩到 C:\OGG11G 目录中的 Oracle GoldenGate for Oracle 11g 软件。

对于 Oracle 11g 数据库 home,按如下所示设置环境变量:

set ORACLE_HOME=C:\app\havipori\product\11.1.0\db_1
set ORACLE_SID=HRPRD1
set PATH=%ORACLE_HOME%\bin;%PATH%
set LD_LIBRARY_PATH=C:\OGG11G; %ORACLE_HOME%\LIB; %ORACLE_HOME%\jdbc\lib
set CLASSPATH=;C:\Program Files\Java\jre6\lib\ext\QTJava.zip;%ORACLE_HOME%\jdbc\lib
  

按照与 Oracle GoldenGate for Oracle 10g 安装软件类似的步骤进行操作,创建一个名为 OracleGGSMGR2 的 Manager 服务并启动它。创建工作子目录和 mgr.prm 文件。这些步骤如下所示:

C:\OGG11G>ggsci 
GGSCI (HaviPori) 1> EDIT PARAMS ./GLOBALS
  

在该文件中键入 MGRSERVNAME OracleGGSMGR2,然后保存。

C:\OGG11G>install addservice
Service 'OracleGGSMGR2' created.
Install program terminated normally.

GGSCI (HaviPori) 1>create subdirs
Creating subdirectories under current directory C:\OGG11G

Parameter files                C:\OGG11G\dirprm: created
Report files                   C:\OGG11G\dirrpt: created
Checkpoint files               C:\OGG11G\dirchk: created
Process status files           C:\OGG11G\dirpcs: created
SQL script files               C:\OGG11G\dirsql: created
Database definitions files     C:\OGG11G\dirdef: created
Extract data files             C:\OGG11G\dirdat: created
Temporary files                C:\OGG11G\dirtmp: created
Veridata files                 C:\OGG11G\dirver: created
Veridata Lock files            C:\OGG11G\dirver\lock: created
Veridata Out-Of-Sync files     C:\OGG11G\dirver\oos: created
Veridata Out-Of-Sync XML files C:\OGG11G\dirver\oosxml: created
Veridata Parameter files       C:\OGG11G\dirver\params: created
Veridata Report files          C:\OGG11G\dirver\report: created
Veridata Status files          C:\OGG11G\dirver\status: created
Veridata Trace files           C:\OGG11G\dirver\trace: created
Stdout files                   C:\OGG11G\dirout: created

GGSCI (HaviPori) 2>  EDIT PARAMS mgr
  

在该文件中键入以下代码行,然后保存该文件。注意,这里使用了不同的端口号并且 Manager 现在登录到 HRPRD1 上。

PORT 7810
USERID system@localhost:1521/HRPRD1 PASSWORD hrpassword1
  

现在可以启动 Manager 了。下一步是使用 DBLOGIN 登录到 Oracle 11g 数据库,然后在此数据库中创建检查点表。

GGSCI (HaviPori) 3> start manager
Starting Manager as service ('OracleGGSMGR2')...
Service started.

GGSCI (HaviPori) 4> DBLOGIN USERID system@localhost:1521/HRPRD1 PASSWORD hrpassword1
Successfully logged into database.

GGSCI (HaviPori) 5> ADD CHECKPOINTTABLE HR.EMPLOYEES_CHKPT
Successfully created checkpoint table HR.EMPLOYEES_CHKPT.
  

现在,可以在数据库 HRPRD1 中创建第二个 Replicat 组了。注意,我们将使用和前面数据库 HRPRD3 所使用的完全相同的线索。

这样,HRPRD2 的数据所写入到的同一个线索同时为两个数据库(HRPRD3 和 HRPRD1)、两个 Replicat 组所使用。这相当棒。

如果在 ADD REPLICAT 命令中不使用 BEGIN NOW,则 Replicat 进程会在跟踪开始时就启动,这也不错。

GGSCI (HaviPori) 6> ADD REPLICAT emp_rep, EXTTRAIL C:\OGG10G\dirdat\et, CHECKPOINTTABLE hr.employees_chkpt,

REPLICAT added.

GGSCI (HaviPori) 7> EDIT PARAM emp_rep
  

在此文件中输入以下几行内容:

REPLICAT emp_rep
USERID system@localhost:1521/HRPRD1, PASSWORD hrpassword1
ASSUMETARGETDEFS
HANDLECOLLISIONS
DISCARDFILE c:\OGG11G\dirrpt\emp_ext.dsc, purge
MAP hr.employees, TARGET hr.employees;
  

注意该文件中额外的参数,如 HANDLECOLLISIONS 和 DISCARDFILE。这是为了对表中记录重复之类的错误进行处理。我们已将这些参数作为选项放入此文件中,也可以将它们放入第一个 Replicat 组的参数文件中。

HANDLECOLLISIONS 在源数据库活动时对初始数据加载进行自动错误处理。确保在初始加载完成后删除此参数。DISCARDFILE 参数指示被删除的记录将保存在哪个文件中。

现在启动该 Replicat 组并查看其状态:

GGSCI (HaviPori) 8> start REPLICAT emp_rep
Sending START request to MANAGER ('GGSMGR2') ...
REPLICAT EMP_REP starting

GGSCI (HaviPori) 9> status REPLICAT emp_rep
REPLICAT EMP_REP: STOPPED
  

其状态显示为 stopped,但 C:\OGG11G 目录下的任何日志文件中都没有错误指示。

迫使错误显示出来的唯一方法是从命令提示符处运行 Replicat。这可用于调试目的 — 错误(如果有的话)会显示在屏幕上而不是写入报告文件中。但在 Oracle GoldenGate for Oracle 11g 版本中,看上去需要通过这种方法来使 Replicat 运行起来,虽然我们认为这可能是测试服务器上的环境问题造成的。使用的命令为:

C:\OGG11G> replicat paramfile c:\OGG11G\dirprm\emp_rep.prm

***********************************************************************
                 Oracle GoldenGate Delivery for Oracle
                      Version 10.4.0.19 Build 002
        Windows (optimized), Oracle 11 on Sep 18 2009 16:44:02
Copyright (C) 1995, 2009, Oracle and/or its affiliates.  All rights reserved.

                    Starting at 2009-12-09 11:46:28
***********************************************************************
Operating System Version:
Microsoft Windows XP Professional, on x86
Version 5.1 (Build 2600: Service Pack 2)

Process id: 1504
Description:
***********************************************************************
**            Running with the following parameters                  **
***********************************************************************
REPLICAT emp_rep
USERID system@localhost:1521/HRPRD1, PASSWORD ***********
ASSUMETARGETDEFS
HANdlecollisions
Discardfile c:\OGG11G\dirrpt\emp_ext.dsc, purge
MAP hr.employees, TARGET hr.employees;

CACHEMGR virtual memory values (may have been adjusted)
CACHEBUFFERSIZE:                         64K
CACHESIZE:                              512M
CACHEBUFFERSIZE (soft max):               4M
CACHEPAGEOUTSIZE (normal):                4M
PROCESS VM AVAIL FROM OS (min):           1G
CACHESIZEMAX (strict force to disk):    881M

Database Version:
Oracle Database 11g
 Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE    11.1.0.6.0      Production
TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

Database Language and Character Set:
NLS_LANG environment variable not set, using default value AMERICAN_AMERICA.WE8M
SWIN1252.
NLS_LANGUAGE     = "AMERICAN"
NLS_TERRITORY    = "AMERICA"
NLS_CHARACTERSET = "WE8MSWIN1252"

Warning: NLS_LANG is not set. Please refer to user manual for more information.

***********************************************************************
**                     Run Time Messages                             **
***********************************************************************
Opened trail file C:\OGG10G\dirdat\et000001 at 2009-12-09 11:46:35

MAP resolved (entry HR.EMPLOYEES):
  MAP HR.EMPLOYEES, TARGET hr.employees;
Using following columns in default map by name:
  EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE,
  JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID

Using the following key columns for target table HR.EMPLOYEES: EMPLOYEE_ID.
  

此时,Replicat 进程已准备就绪,我们可在屏幕上查看其状态。如果您打开一个新的命令窗口、启动 GGSCI 并查看其状态,Replicat 进程会显示为 RUNNING。这样,通过这种方式,Oracle Database 11g 中的复制开始工作。

文件中额外的参数(如 HANDLECOLLISIONS 和 DISCARDFILE)是特意添加的,这是因为通过命令行运行 Replicat 进程时屏幕上曾显示出记录重复错误。从下面的输出结果中可以看到这些错误,这些错误指示初始加载时出现的问题与重复的记录有关。

通过进一步的分析发现,某个用户在 Oracle 11g 目标数据库中手动插入了记录,而手动插入的数据与启动 Oracle GoldenGate 复制进程之后 插入到 Oracle 10g 源数据库中的数据相同。这就引发了记录重复,从而导致重复问题。

…
***********************************************************************
**                     Run Time Messages                             **
***********************************************************************
Opened trail file C:\OGG10G\dirdat\et000000 at 2009-12-09 11:17:51

Switching to next trail file C:\OGG10G\dirdat\et000001 at 2009-12-09 11:17:51 du
e to EOF, with current RBA 923
Opened trail file C:\OGG10G\dirdat\et000001 at 2009-12-09 11:17:51

Processed extract process graceful restart record at seq 1, rba 923.

MAP resolved (entry HR.EMPLOYEES):
  MAP HR.EMPLOYEES, TARGET hr.employees;
Using following columns in default map by name:
  EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE,
  JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID

Using the following key columns for target table HR.EMPLOYEES: EMPLOYEE_ID.

2009-12-09 11:17:54  GGS WARNING     218  Aborted grouped transaction on 'HR.EMP
LOYEES', Database error 1 (ORA-00001: unique constraint (HR.EMP_EMAIL_UK) violat
ed).

2009-12-09 11:17:54  GGS WARNING     218  Repositioning to rba 985 in seqno 1.

2009-12-09 11:17:54  GGS WARNING     218  SQL error 1 mapping HR.EMPLOYEES to HR
.EMPLOYEES OCI Error ORA-00001: unique constraint (HR.EMP_EMAIL_UK) violated (st
atus = 1), SQL <INSERT INTO "HR"."EMPLOYEES" ("EMPLOYEE_ID","FIRST_NAME","LAST_N
AME","EMAIL","PHONE_NUMBER","HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANA
GER_ID","DEPARTMENT_ID") VALUES (:a0,:a1,:a2,:a3,:a4,:a5>.

2009-12-09 11:17:54  GGS WARNING     218  Repositioning to rba 985 in seqno 1.
….
  

解决此问题的办法是使用 HANDLECOLLISIONS 和 DISCARDFILE 参数,然后重启该 Replicat 进程。DISCARDFILE 在出现被删除的记录时可提供更多信息。在命令提示符处启动运行 Replicat 进程后,等待直到其通过线索完成运行并根据需要删除记录。

然后在命令窗口按 Ctrl-C 停止该 Replicat 进程。这将显示:

Enter X to exit or C to continue: X
***********************************************************************
*                   ** Run Time Statistics **                         *
***********************************************************************
Last record for the last committed transaction is the following:
___________________________________________________________________
Trail name :  C:\OGG10G\dirdat\et000001
Hdr-Ind    :     E  (x45)     Partition  :     .  (x04)
UndoFlag   :     .  (x00)     BeforeAfter:     A  (x41)
RecLength  :   196 (x00c4)    IO Time    : 2009-12-08 13:43:36.000000
IOType     :     5  (x05)     OrigNode   :   255  (xff)
TransInd   :     .  (x03)     FormatType :     R  (x52)
SyskeyLen  :     0  (x00)     Incomplete :     .  (x00)
AuditRBA   :         11       AuditPos   : 1188880
Continued  :     N  (x00)     RecCount   :     1  (x01)

2009-12-08 13:43:36.000000 Insert             Len   196 RBA 1295
Name: HR.EMPLOYEES
___________________________________________________________________

Reading C:\OGG10G\dirdat\et000001, current RBA 1604, 2 records
Report at 2009-12-09 11:47:56 (activity since 2009-12-09 11:46:35)

From Table HR.EMPLOYEES to HR.EMPLOYEES:
       #                   inserts:         2
       #                   updates:         0
       #                   deletes:         0
       #                  discards:         0
       #         insert collisions:         2

Last log location read:
     FILE:      C:\OGG10G\dirdat\et000001
     SEQNO:     1
     RBA:       1604
     TIMESTAMP: Not Available
     EOF:       YES
     READERR:   400
  

现在可以取消 HANDLECOLLISIONS 参数了,可在该参数行之前添加“—”将其注释掉。然后在命令行重启该 Replicat 进程。由于记录重复问题已得到解决,该进程现在可以正常工作,以后对源数据库进行任何更改时,该进程都可将这些更改复制过来。

对复制进行测试

从图 6 的命令行窗口中可以看到 HRPRD1、HRPRD2 和 HRPRD3 这三个数据库的 HR.EMPLOYEES 表中的记录。这三个数据库都正好有 107 条记录。在第三个窗口中可看到使用的 SELECT 命令。


图 6 三个数据库中的员工记录

现在可以在源数据库 HRPRD2 的 HR.EMPLOYEES 表中 INSERT 和 COMMIT 一些行,然后查看这些行是否被复制到目标数据库 HRPRD3 和 HRPRD1 中。从图 7 中可以看到这些 INSERT 操作。


图 7 插入到 HRPRD2 的员工表中

对所有三个数据库再次运行 SELECT,其结果显示,即刻发生了到目标数据库的复制,所有数据库现在都有 109 条记录(如图 8 所示)。这样,使用 Oracle GoldenGate 到 Oracle 10g 和 Oracle 11g 的复制成功。


图 8 即刻复制到其他数据库

您已看到,从 Oracle Database 10g 到 10g 数据库的复制可正常进行。从 Oracle Database 10g 到 11g 数据库的复制也可正常进行,但是只有在命令提示符处启动 Replicat 进程(例如使用“replicat paramfile c:\OGG11G\dirprm\emp_rep.prm”)才会如此。而从 GGSCI 启动 Replicat 进程仍会使其滞留于 stopped 状态。这可能是由于我们的测试服务器存在环境错误。我们应记住,如果从命令提示符处启动就不会有错误,进程会正常运行。

功能、资源需求和影响

您已看到,Oracle GoldenGate 的 Extract 和 Replicat 进程已生效。每个实例(即一个 Manager 进程)可通过 GGSCI 命令接口支持多达 300 个并发的 Extract 和 Replicat 进程,这个数量相当大。

然而,随着此类进程数量的增加,对内存的占用也会增加 — 每个 Extract 和 Replicat 进程需要大约 25 至 55 MB 内存。对内存的占用实际上可能更高,这取决于并发事务的数量和事务大小。这始终是个问题。

Oracle GoldenGate Replication 还对源系统有 3% 到 5% 的 CPU 影响,这取决于生成的重做日志的数量。

我们在这里建立的是单向复制。还可以建立双向多主复制(对多站点更新的复制)。在这样的安装环境中,Oracle GoldenGate 通过研究和了解两个站点何时更新相同的记录来解决冲突。您可以设置一些冲突解决规则(如时间戳,或者哪一方始终优先等等),您也可以就如何解决冲突设置用户退出机制。

即使目标数据库的表中没有唯一键时,Oracle GoldenGate 也能复制数据。这对所有支持的数据库都是可行的,条件是您能够指定那些是唯一的列或者使用整行作为一个键 — 因为任何删除或更新操作都需要某种唯一性。

目前,Oracle GoldenGate 不能复制双字节数据,但计划在未来的版本中支持这种复制。现在,对双字节数据的处理可传递给一个备用数据库以用于灾难恢复。

Oracle GoldenGate Director

Oracle GoldenGate 中的这一产品现在名为 Oracle Management Pack for GoldenGate。这是一个多层的客户端-服务器应用程序,通过一个 GUI 界面监视和管理 Oracle GoldenGate 的部署。如果多台主机上安装了 Oracle GoldenGate Director 的远程客户端,您可以对这些主机上运行的多个 Oracle GoldenGate 实例(Manager 进程)进行管理。

这些客户端全部连接到集中安装的 Oracle GoldenGate Director 服务器,该服务器使用 Oracle WebLogic Server 11g (10.3.1) 作为功能应用服务器。以前,较早的 JBoss Application Server 3.2.7 附带 Oracle GoldenGate Director。现在它为 Oracle WebLogic Server 所取代,但要注意后者必须在安装 Oracle GoldenGate Director 服务器之前在系统上预先安装并运行。

Oracle GoldenGate Director 服务器有一个 Web 界面并且需要在现有 Oracle 数据库中拥有自己的数据库信息库(至少 200 MB),您也可以对该信息库使用 MySql 或 Microsoft SQL Server 。作为一项安全措施,Oracle GoldenGate Director 的安装要求该信息库所使用的数据库口令必须至少为八位字符,其中至少包含一个数字和一个字母数字字符。

如果在 GGSCI 中定义一个进程,您可以通过 Oracle GoldenGate Director 配置、监视和控制该进程。从操作系统命令行执行的其他独立进程(如 DDLGEN 进程)不能通过 Oracle GoldenGate Director 监视。

在 Windows、UNIX 和 NonStop 平台上,Extract 进程、Replicat 进程、Manager 进程、线索(本地或远程)、文件(本地或远程)以及 Extract 和 Replicat 任务均可通过 Oracle GoldenGate Director 来配置、监视和控制。

总结及其他信息

在 Oracle GoldenGate Manager 参数文件中可以指定其他参数,可通过这些参数来允许动态端口分配、在 Manager 启动时自动启动复制进程(如 Extract 和 Replicat)、建立对所有线索的集中维护(清除)。

The Oracle GoldenGate Administration Guide Version 10.4 详细介绍了这些高级 Manager 参数。该指南还介绍了如何以不同的方法配置 Extract 和 Replicat 进程、如何将 Oracle GoldenGate Replication 用于实时报表、实时数据分布、实时数据仓储、维护实时备用数据库和主-主高可用性等各种目的,以及如何配置 DDL 同步。在某个数据库要升级,但要求停机时间几乎为零的情况下,Oracle GoldenGate 也非常有用 — 您只需建立从旧的数据库版本到新的数据库版本之间的 Oracle GoldenGate 复制,然后在切换时将您的所有客户端切换为指向新数据库即可。这会是一个极好的选择,例如,如果您准备将现有数据库移到 Oracle Exadata V2 数据库机上,以便将您的所有数据库整合到世界上最快的数据库机。

有关 Oracle GoldenGate 的另一个有用的参考资料是 Oracle GoldenGate Troubleshooting and Tuning Guide Version 10.4 。在本文开始时下载的文档 zip 文件中包含了这个参考资料和管理指南

我们想感谢 Oracle 融合中间件和 Oracle GoldenGate 的各位 Oracle 产品经理,本文所述建立 Oracle GoldenGate 复制的过程得到了他们的欣然帮助(真正的 Oracle 精神)。我们期待着计划之中的 Oracle GoldenGate Director 与 Oracle Enterprise Manager Grid Control 的集成。

Oracle Enterprise Manager Grid Control 是 Oracle 的一个强大的企业管理产品。如果您想了解如何对您环境中所有的 Oracle RAC 或非 Oracle RAC 数据库、Oracle 自动存储管理 (ASM) 实例和 Oracle Clusterware 自动打补丁,请阅读作者的一篇题为“使用 Oracle Enterprise Manager Grid Control 修补数千个数据库” 的文章。有关如何使用 Oracle Enterprise Manager Grid Control 为您公司的数据库轻松建立 Oracle Recovery Manager (Oracle RMAN) 备份的信息,请阅读“Oracle RMAN 备份:提供简单方式 ”。

另外,要了解使用 Oracle Enterprise Manager Grid Control 进行 Oracle Data Guard 的安装、管理(包括倒换和故障切换)和监视如何能够节省大量的时间和资源,请阅读作者最近发表的另一篇文章“使用 Grid Control 轻松预防生产灾难 ”。

posted @ 2012-07-22 14:00 tbwshc| 编辑 收藏

---- 容灾首先是一个概念,要认识到为什么做容灾,才能做好容灾。世界上没有卖后悔药的,当灾难降临了,如果没有行之有效的数据保护、数据恢复的容灾措施,带来不可预估的损失将是无法避免的。类似电信行业、金融行业,证券行业也是如此,动辄涉及数以百亿计的资金、涉及庞大的客户量,在系统数据的准确、业务的连续、关键业务的不中断等方面更是不容出现任何的差错。
 
----目前,业界具有容灾功能的常用解决方案主要包括以下几类:磁盘阵列复制技术,主要由一些磁盘阵列厂商提供,如EMC SRDFIBM PPRC HP BusinessCopyHDS TrueCopy等;存储卷复制技术,tb由一些卷管理软件厂商提供,如VERITAS VVR;数据库复制技术,由数据库厂商以及一些第三方厂商提供,如DSG RealSyncQuest SharePlex等;应用层复制技术,由各系统的应用厂商自己提供。
 
----磁盘阵列复制技术主要适用于数据中心级的海量数据复制,此技术用户必需采用支持该功能的磁盘阵列型号,而这些阵列大都为高端阵列,投资非常昂贵。并且,由于政府行业用户的带宽有限,而磁盘阵列复制技术对带宽的要求又相对很高,动辄需要上GB的带宽。此外,采用磁盘阵列复制技术,其目标端无法提供实时数据查询,由于目标端数据库在复制过程中不能被打开,难于实现交易与查询的分离,同时也造成大量投资浪费。因此,磁盘阵列复制技术无法满足某些行业集中交易系统的容灾需求,使得这些用户难以选择此种解决方案。
 
----存储卷复制技术主要适用于工作组级的数据复制,它对CPU资源占用高。同样由于目标端数据无法提供实时数据查询和对带宽的要求高,使得证券等行业用户也难以选择。
 
----而应用层复制技术只适合那些在应用中提供了该技术的应用,由于它的非标准化、开发和维护工作量大,使得其应用不成熟也不普遍。关键行业对数据的可靠性要求又非常之高,使得关键行业用户也不敢冒然选择此种复制技术。
 
----DSG RealSync属于数据库复制技术,它适用于从工作组级、企业级到数据中心级的复制需求,无论系统采用什么样的服务器平台、什么样的存储平台,只要是ORACLE系统之间的复制即可适用。采用DSG RealSync复制技术,其目标端数据库在复制过程中处于可用状态,帮助关键行业用户实现生产系统与查询统计报表系统的分离;其源端系统和目标端系统可以采用异构的操作系统平台、存储平台;支持选择性复制,即支持只复制指定的user、指定的Table、指定的行和列,从而节省存储空间,提高应用灵活性;支持1对多,多对1的复制结构,即:能够将多个数据库中的数据复制到一个数据库中,能够将一个数据库中的不同数据分发到不同的数据库中;也节约带宽和网络资源,其所需带宽一般在几Mbps,几十Mbps
 
----随着用户容灾意识的逐渐增强,关键行业也提出了建设一套高效、可靠、投资回收比高的灾难备份系统的需求,以确保系统的数据安全和灾难发生时数据的快速恢复。   
posted @ 2012-07-22 13:58 tbwshc| 编辑 收藏

// MultiThread.cpp : 定义控制台应用程序的入口点。

//

#include "stbdafx.h"
#include <windows.h>
#include <iostream>

using namespace std;
int tickets = 100;
HANDLE hMutex;

DWORD WINAPI Fun1Proc(LPVOID lp);
DWORD WINAPI Fun2Proc(LPVOID lp);

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread1,hThread2;
hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
hMutex = CreateMutex(NULL,FALSE,NULL);

Sleep(2000);
system("pause");
return 0;
}

DWORD WINAPI Fun1Proc(LPVOID lp)
{
while(1)
{
 WaitForSingleObject(hMutex,INFINITE);
 if(tickets > 0)
 {
 Sleep(10);
 cout << "thread1 sell ticket." << tickets-- <<endl;
 }
 else
 break;
 ReleaseMutex(hMutex);
}
return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lp)
{
while(1)
{
 WaitForSingleObject(hMutex,INFINITE);
 if(tickets > 0)
 cout << "thread2 sell ticket." << tickets-- <<endl;
 else
 break;
 ReleaseMutex(hMutex);
}
return 0;
}


 

posted @ 2012-07-21 11:57 tbwshc 阅读(1110) | 评论 (0)编辑 收藏

哎!

惨……

最近接连维护两个很烦人的项目,我的第一想法就是重写!可是上头的意思是说我的想法太疯狂。

可每次有这种情况我都感觉还是重写划算点……

之前的之前一个东东重写也就一周时间,而上头还是决定用着,对那东东很麻烦怕新写的别人不适应 以及稳定性的担心。而结果就没重写,接下来的几个月我都被那玩意烦。哎

回正题

这两个项目一个是C++的,一个是C#的,两个都是关于网络的。都是非常有各自语言的特色

C++的那个项目是所有要处理消息的函数都是统一的 void xxxx(void* pData);

然后进去就

int* pxx = (int*)pData;

 pxx= XXX(sss);

pData += sizeof int;

SH_XXX* pshxx = (SH_XXX*)pData;

Mxxxk(pshxx,xxxixx);

sss;

Send(g_Buf);//所有处理函数的最后都是这一句

写的是行云流水,酣畅淋漓啊。慢慢看也明白,但是人都容易马虎的,很多时候调的时候一不小心, 就不知道跑哪儿去了。

所有函数使用同一个全局缓冲区,读和写是同时进行的。tb有可能读了一些东西,偏移一段后进入某个 函数又退回一段距离开始写东西。前前后后,读读写写。哎,烦啊

至于C#的那个,导出是委托,每一个东西都有一个父类。比如

Code;

DoubleCode : Code;

ThreeCode : DoubleCode;

SessionCode : TreeCode;

StreamCode : SessionCode;

posted @ 2012-07-21 11:55 tbwshc 阅读(151) | 评论 (0)编辑 收藏

最近才知道struct和class的静态构造函数的触发规则是不同的,不像class在第一次使用类的时候触 发静态构造函数。如果只访问struct实例的字段是不会触发静态构造函数调用的。通过测试发现当访问静 态字段,struct本身的函数(静态和实例)和带参数的构造函数就会引起静态构造函数的执行。而调用默 认构造和未覆写的基类虚函数是不会的。为什么呢?

让我们先来看看class和struct在调用构造函数时的区别。class使用newobj指令而struct使用initobj 指令来构造对象。newobj在堆上申请一块内存并调用相应的构造函数进行初始化,然后将对象地址返回给 计算栈。initbobj则是从本地变量表中载入已经分配出来的struct实例然后初始化struct的各字段。这个 初始化过程是CLR内部执行的,而不像class编译器会给class添加一个默认构造函数(这就是为什么 struct不能给字段添加默认值的原因。但在类中如果给字段添加了默认值编译器就会自动在构造函数中添 加字段赋值操作)。如果给struct中定义了一个有参数的构造函数,那么系统就不会使用initobj指令, 而是直接用call指令调用带参数的构造函数。

我们最常见最常用的调用函数的指令是call和callvirt。对于静态函数使用call指令,对于class使用 callvirt指令(不论class中的函数是不是虚的)。只有子类调用父类的函数的时候(避免递归调用)以 及构造函数中(由编译器添加保证父类字段被初始化)使用call指令。而对于struct我们发现只要调用的 函数是struct本身定义的都是使用call指令。call和callvirt指令的差别在于,call会把调用的函数当作 静态函数看待,而不会关心调用当前函数时实例指针(this)是否为空。这就是struct调用函数时为什么 都是call因为struct实例是不可能被置为null的。实际上class在调用非虚函数时实际上也是使用call的 只是多做了一步验证——this是否为空,让我们来验证一下。

class Class_Test{  public void Test1() {}  public virtual void Test2()

{}  public static void Test3() {}  public override string ToString()  

{    return base.ToString();  }}Class_Test c = new Class_Test

();c.Test1();c.Test2();Class_Test.Test3();string str = c.ToString();

posted @ 2012-07-21 11:54 tbwshc 阅读(1314) | 评论 (1)编辑 收藏

简介:实用工具类开发和维护会耗费程序员的时间。Boost 通过提供几个高质量的库,从而简化了此 过程,您可以将这些库轻松集成到现有的代码库中。本文简单概述一些较流行的 Boost 实用工具类,并 帮助您了解如何将它们投入使用。

实用工具类(utility classes)在几乎任何适当规模的 C++ 项目中都是必需的,但是不存在满足此 需求的标准方法。通常,团队根据他们的需求编写实用工具类代码,但是由于缺少重要的接口信息,使得 相同组织中的其他项目团队无法重用那些类。建议的标准模板库(Standard Template Library,STL)只 具有诸如 hash、stack 和 vector 等少数基本类,因此无法有效地用于取代遗留实用工具库。

本文将介绍几个 Boost 实用工具类,包括 tuple、static_assert、pool、random 和 program_options。您需要对标准 STL 具备一定的了解才能充分理解本文的内容。本文中的所有代码都已 使用 Boostb 1.35 来进行了测试并使用 gcc-3.4.4 来进行了编译。

boost::tuple 类

有时,您希望 C++ 函数返回多个不相关的值。在推出 STL 之前,实现此目的的方法是创建所有不相 关变量的结构,并以指针或引用的形式返回它们或作为参数传递给函数——但是任一种方法都不是表达程 序员意图的方法。STL 引入了 pair,可将其用于聚合不相关的数据部分,但它一次只能处理两个数据对 象。为了使用 int、char 和 float 的元组(tuple ),您可以按如下方式返回 pair:

make_pair<int, pair<char, float> > (3, make_pair<char, float> ('a', 0.9));

随着您添加更多的元素,创建元组结构将变得越来越困难。Boost tuple 类型派上了用场。要使用 boost::tuple,您必须包括头文件 tuple.hpp。要执行元组比较和元组 I/O,您需要分别包括 tuple_comparison.hpp 和 tuple_io.hpp。

第一个使用元组的程序

清单 1 使用 int、char 和 float 的元组并打印内容。

清单 1. 创建 Boost 元组并打印内容

#include <iostream>
#include <tuple.hpp>
#include <tuple_comparison.hpp>
#include <tuple_io.hpp>
using namespace boost;
int main ( )
 {
 tuple<int, char, float> t(2, 'a', 0.9);
  std::cout << t << std::endl;
 return 0;
 }

此代码的输出为 (2 a 0.9)。请注意,<< 运算符重载 std::ostream,以便通过转储每个单独 的 tuple 元素来输出元组。

posted @ 2012-07-21 11:54 tbwshc 阅读(1092) | 评论 (0)编辑 收藏

在C/C++中,整型的长度跟编译器相关,编译器的实现取决于CPU。 比如TC++是DOS16下的应用程序,DOS16是16位的操作系统,所以TC++中sizeof(int)==16;同理win32中sizeof(int)==32。

C99标准定义一个叫着<stdint.h>的头文件,该头文件定义了一系列各种类别的整数类型typedef名字。尽管速多C++工具支持该头文件已经有一段时间了,但它尚未正式收录于C++标准,因此,在使用该头文件之前,你应该先阅读你的编译器文档,看看它是否支持该文件。在某些C++ 的编译器中,如GNC,为了能使用C99标准的这些新特性,就在<inttypes.h>头文件中引入了这个文件< stdint.h>.

字长固定的整型类型

C99标准在<stdint.h>这个头文件的类型定义中,有一套是字长固定的整型类型:

int8_t   int16_t   int32_t   int64_t

与其对应的字长固定的无符号型整型类型有:

uint8_t   uint16_t   uint32_t   uint64_t

它们的名字非常直观。例如,int8_t是长度固定为8比特的有符号整型类型,tb而uint8_t则是字长固定为8比特的无符号型整型类型。当你需要确保在不同的平台上,整型数据的字长固定不变,那么你就可以使用这些typedef名字。允许对期望的性质进行更为详细的描述。例如,有的类型的名字是 int_least8_t,它至少有 8 位,还有 int32_t,它恰好是 32 位。

C99标准标准保证至少可以访问 8 位、16 位、32 位和 64 位类型。没有保证会提供精确宽度类型。不要使用这种类型,除非您肯定是实在不能接受更大的类型。另一个可选的类型是新的 intptr_t 类型,它是一个足够大的可以容纳一个指针的整数。并不是所有的系统都提供这样一种类型(尽管当前所有的 Linux 和 BSD 实现都提供)。

字长最小的快速整型类型

该头文件还定义了另外一套typedef名字,即“最小指定长度的快速整数类型”。这套typedef名字中的每一种都表示一种整数类型,它满足在长度不小于某个指定长度的前提下,拥有最快的处理速度。这些整数类型的名字为int_fastX_t(有符号)或者uint_fastX_t(无符号),其中“X”表示最小指定长度。例如,int_fast32_t指得是字长至少为32比特的快速有符号整型类型。最小字长快速整型类型有:

int_fast8_t  int_fast16_t  int_fast32_t  int_fast64_t

对应的无符号整型类型有:

uint_fast8_t  uint_fast16_t  uint_fast32_t  uint_fast64_t

什么情况下使用这些typedef名字?

假设你需要一个字长不少于16比特的循环计数器,那么你会希望该计数器的类型总是当前计算机CPU最佳操作的整型类型,而int_fast16_t可以保证任何平台上的编译器总是选择字长不少于16比特的最快整型类型。

#include <inttypes.h>
for (int_fast16_t n=0; n<30000; ++n)
{
//.. do something
}


 

posted @ 2012-07-21 11:53 tbwshc 阅读(1034) | 评论 (0)编辑 收藏

SQL Server 2008中对汇总有明显的增强,有点像Oracle的语法了。请看下面四个例子:

假定场景如下:某几位员工在不同时间参加了不同的项目,获取了相应的收入,现在需要按各种分类进行统计。

基本表如下:

USE testDb2  GO   IF NOT OBJECT_ID('tb_Income') IS NULL DROP TABLE [tb_Income]   /****** Object: Table [dbo].[tb_Income] Script Date: 2012/4/5 8:19:21 ******/   CREATE TABLE [dbo].[tb_Income](  [TeamID] int not null,  [PName] [Nvarchar](20) NOT NULL,  [CYear] Smallint NOT NULL,  [CMonth] TinyInt NOT NULL,  [CMoney] Decimal (10,2) Not Null  )   GO  INSERT [dbo].[tb_Income]  SELECT 1,'胡一刀',2011,2,5600  union ALL SELECT 1,'胡一刀',2011,1,5678  union ALL SELECT 1,'胡一刀',2011,3,6798  union ALL SELECT 2,'胡一刀',2011,4,7800  union ALL SELECT 2,'胡一刀',2011,5,8899  union ALL SELECT 3,'胡一刀',2012,8,8877   union ALL SELECT 1,'苗人凤',2011,1,3455  union ALL SELECT 1,'苗人凤',2011,2,4567  union ALL SELECT 2,'苗人凤',2011,3,5676  union ALL SELECT 3,'苗人凤',2011,4,5600  union ALL SELECT 2,'苗人凤',2011,5,6788  union ALL SELECT 2,'苗人凤',2012,6,5679  union ALL SELECT 2,'苗人凤',2012,7,6785   union ALL SELECT 2,'张无忌',2011,2,5600  union ALL SELECT 2,'张无忌',2011,3,2345  union ALL SELECT 2,'张无忌',2011,5,12000  union ALL SELECT 3,'张无忌',2011,4,23456  union ALL SELECT 3,'张无忌',2011,6,4567  union ALL SELECT 1,'张无忌',2012,7,6789  union ALL SELECT 1,'张无忌',2012,8,9998   union ALL SELECT 3,'赵半山',2011,7,6798  union ALL SELECT 3,'赵半山',2011,10,10000  union ALL SELECT 3,'赵半山',2011,9,12021  union ALL SELECT 2,'赵半山',2012,11,8799  union ALL SELECT 1,'赵半山',2012,12,10002   union ALL SELECT 3,'令狐冲',2011,8,7896  union ALL SELECT 3,'令狐冲',2011,9,7890  union ALL SELECT 2,'令狐冲',2011,10,7799  union ALL SELECT 2,'令狐冲',2011,11,9988  union ALL SELECT 2,'令狐冲',2012,9,34567  union ALL SELECT 3,'令狐冲',2012,12,5609   GO 数据如下:

SELECT * FROM tb_Income   /*   TeamID PName CYear CMonth CMoney   胡一刀 2011 2 5600.00   胡一刀 2011 1 5678.00   胡一刀 2011 3 6798.00   胡一刀 2011 4 7800.00   胡一刀 2011 5 8899.00   胡一刀 2012 8 8877.00   苗人凤 2011 1 3455.00   苗人凤 2011 2 4567.00   苗人凤 2011 3 5676.00   苗人凤 2011 4 5600.00   苗人凤 2011 5 6788.00   苗人凤 2012 6 5679.00   苗人凤 2012 7 6785.00   张无忌 2011 2 5600.00   张无忌 2011 3 2345.00   张无忌 2011 5 12000.00   张无忌 2011 4 23456.00   张无忌 2011 6 4567.00   张无忌 2012 7 6789.00   张无忌 2012 8 9998.00   赵半山 2011 7 6798.00   赵半山 2011 10 10000.00   赵半山 2011 9 12021.00   赵半山 2012 11 8799.00   赵半山 2012 12 10002.00   令狐冲 2011 8 7896.00   令狐冲 2011 9 7890.00   令狐冲 2011 10 7799.00   令狐冲 2011 11 9988.00   令狐冲 2012 9 34567.00   令狐冲 2012 12 5609.00  */ 一、使用CUBE汇总数据(http://msdn.microsoft.com/en-us/library/bb522495%28v=sql.105%29.aspx)

小试牛刀,

/*********使用CUBE汇总数据***************/   /********* 3w@live.cn 邀月***************/  SELECT TeamID as 小组ID,  SUM(CMoney) 总收入  FROM tb_Income  GROUP BY CUBE (TeamID)  ----ORDER BY TeamID desc
 

 

改进查询:

SELECT TeamID as 小组ID,PName as 姓名,  SUM(CMoney) 总收入  FROM tb_Income  GROUP BY CUBE (TeamID,PName)


二、使用ROLLUP汇总数据(http://msdn.microsoft.com/en-us/library/bb522495%28v=sql.105%29.aspx)

/*********使用ROLLUP汇总数据***************/   /********* 3w@live.cn 邀月***************/   SELECT TeamID as 小组ID,PName as 姓名,  SUM(CMoney) 总收入  FROM tb_Income  GROUP BY ROLLUP (TeamID,PName)


注意:使用Rollup与指定的聚合列的顺序有关。

 

三、使用Grouping Sets创建自定义汇总数据(http://msdn.microsoft.com/en-us/library/bb522495%28v=sql.105%29.aspx)

除了Cube和Rollup,还有更加灵活强大的自定义集合汇总--Grouping Sets

/*********使用Grouping Sets创建自定义汇总数据***************/   /********* 3w@live.cn 邀月***************/   SELECT TeamID as 小组ID,PName as 姓名,CYear as 年份,----min(CMonth) as 月份,  SUM(CMoney) 总收入  FROM tb_Income  Where CMonth=2  GROUP BY grouping SETS ((TeamID),(TeamID,PName),(CYear,PName))


四、使用Grouping标识汇总行(http://technet.microsoft.com/zh-cn/library/ms178544.aspx)

细心的朋友可能会注意到,如果Cube后有两个以上的汇总列时,可能会有一些列是Null,那么这些Null值究竟tb本身就是Null,还是由于聚合产生的Null呢,此时,GroupingID函数大显身手的机会来了。

/*********使用Grouping标识汇总行***************/   /********* 3w@live.cn 邀月***************/  SELECT TeamID as 小组ID,CYear as 年份,  CASE WHEN grouping(TeamID)=0 AND grouping(CYear)=1 THEN '小组汇总' WHEN grouping(TeamID)=1 AND grouping(CYear)=0 THEN '年份汇总' WHEN grouping(TeamID)=1 AND grouping(CYear)=1 THEN '所有汇总' else '正常行' END as 行类别,  SUM(CMoney) 总收入  FROM tb_Income  GROUP BY CUBE (TeamID,CYear) 结果:

 

其实,还有更复杂的Grouping_ID,不过,一般情况下用不到,需要的同学,请看MSDN:

http://technet.microsoft.com/zh-cn/library/bb510624.aspx


小结:带有Cube,Rollup,grouping Sets的Group By函数在统计与分析中有着广泛的应用,相信它的高效简捷,在特定的场合会令人你爱不释手!

 

posted @ 2012-07-15 17:16 tbwshc 阅读(796) | 评论 (0)编辑 收藏

仅列出标题
共10页: First 2 3 4 5 6 7 8 9 10