SQRMYY是CQ公司的重点用户,由于平台软件需要每天在HIS系统中提取病历信息,在提取过程中对生成数据库的性能有一定的开销,影响医院正常业务的使用,综合考虑决定在异地重新构建个备库,通过GoldenGate实时的把生成数据库的数据复制到备库,平台软件通过在备库中提取病历信息,既可以分担生成数据库的压力也可以起到一定的容灾作用,以下为该环境的搭建过程的过程记录。
GoldenGate现在已经是业内成熟的数据容灾与复制产品,经过多年的发展和完善,现在已经成为业内事实上的标准之一, Oracle官方网站提供免费的安装包下载,供大家学习使用下载界面如下图:
在安装配置GoldenGate前,我们首先要对用户的环境进行准备,并且根据操作系统版本和已经安装的数据库版本下载对应合适的安装包,安装包非常小,一般都只有几十M,如SQRMYY的环境是windows 2003 64位系统+oracle 11GR2,则就需要下载的安装包为ogg112101_ggs_Windows_x64_ora11g_64bit.zip,可以从安装包的命令规则清楚的知道该GoldenGate安装包的版本是11g,适用于windows x64平台,Oracle数据库要求是11g。
另外windows平台在安装前,需要安装 Mircrosoft Visual C++ 2005 SP1 Redistributable,这是 Windows 环境下 Visual C++库的运行组件。GoldenGate运行的时候会用到它的一些库,所以不安装的话,可能导致“系统无法执行指定的程序”的错误,最后还要设置环境变量,根据数据库的安装环境设置ORACLE_HOME和ORACLE_SID两个环境变量,方法这里就不再详述。
数据库设置方面要求在归档模式下(GoldenGate 的原理是基于对日志变化的捕获(CDC),当日志切换频繁时,GoldenGate能从 archive log 中查找对应的记录,从而保证了信息的完整性),另外还必须打开数据库级别的补充日志,首先确认数据库是否开启了 supplemental log,如果没有则开启,登录PLSQL做如下操作
SQL> alter database add supplemental log data
SQL> select supplemental_log_data_min from v$database;
SUPPLEME
--------
YES
最后还要在数据库中创建GoldenGate用户(用户名:ggs,密码:ggs),授予必要的权限,这里我们直接授予DBA权限。
SQL> create user ggs identified by ggs default tablespace users temporary tablespace temp;
User created.
SQL> grant dba to ggs;
Grant succeeded.
GoldenGate的安装非常简单,首先只需要把下载的安装包解压到指定的目录,解压后的结果如下:
然后找到ggsci.exe双击进入命令界面,接下来的所有操作都在该命令界面完成,首先是创建GoldenGate对应的目录,输入create subdirs命令,所有目录就会自动创建成功
GGSCI (source) 1> create subdirs
Creating subdirectories under current directory D:\ogg
Parameter files D:\ogg\dirprm: created
Report files D:\ogg\dirrpt: created
Checkpoint files D:\ogg\dirchk: created
Process status files D:\ogg\dirpcs: created
SQL script files D:\ogg\dirsql: created
Database definitions files D:\ogg\dirdef: created
Extract data files D:\ogg\dirdat: created
Temporary files D:\ogg\dirtmp: created
Stdout files D:\ogg\dirout: created
我们来介绍其中一些比较重要的目录:
1、 dirchk:用来存放检查点(Checkpoint)文件
2、 dirdat:用来存放 Trail 文件,以后详述;
3、 dirdef:用来存放通过 DEFGEN 工具生成的源或目标端数据定义文件;
4、 dirpcs:用来存放进程状态文件
5、 dirprm:用来存放配置参数文件
6、 dirrpt:用来存放进程报告文件
7、 dirsql:用来存放 SQL 脚本文件
8、 dirtmp:当事务所需要的内存超过已分配内存时,缺省存储在这个目录。
更详细的内容请参考 Oracle®GoldenGate Oracle Installation and Setup Guide,最后在windows环境中,可以把manager进程添加到服务中,这样可以方便的管理,输入EDIT PARAMS ./GLOBALS,(注意./GLOBALS 最好使用大写)在弹出的的记事本编辑器中,输入以下代码:
mgrservname ggmgr
保存并退出后,回到 Windows 命令提示符,在 gg 根目录用 install 命令添加服务:install addservice ,然后手动命名的服务,这样就添加成功了。
D:\ogg>install addservice
Service ‘GGMGR’ created.
Install program terminated normally.
至此GoldenGate的安装就已经完成,是不是非常的简单,以上的步骤在生产服务器和目标端服务器上都要操作,接下来要实现数据库的复制,只需要配置相应的参数和进程就可以,接下来我们就来进行配置。
GoldenGate的实施非常简单,主要是一些参数的配置和进程的添加,不过之前还要做一件事,就是为每个表添加表级的transdata
GGSCI(source)3>dblogin userid ggs,password ggs
Successfully logged into database.
GGSCI(source)4>add trandata zlhis.*
GGSCI(source)5>add trandata zltools.*
但是我们在执行的过程中,发现对中文支持不好,出现如下提示:
在这种情况下,我们只能通过直接在数据库中用命令添加,可以通过下面的SQL语句生成对应的ZLHIS和ZLTOOLS所有表的添加执行语句:
Select 'Alter Table '||owner||'.'||table_name||' add SUPPLEMENTAL Log data(Primary Key,Unique Index) Columns;' From dba_tables
Where owner in ('ZLTOOLS','ZLHIS')
l 配置源端参数文件
首先要对源端的manager进程参数进行配置,manager参数相当于是个全局参数,在这里可以设置日志的保留时间,是否自动启动Extract进程等相关信息。
GGSCI(source)>edit params mgr
写入下面的内容:
port 7809
dynamicportlist 7800-8000
autorestart extract *,waitminutes 2,resetminutes 5
PURGEOLDEXTRACTS D:\ogg\dirdat\*,usecheckpoints, minkeepdays 3
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
创建抽取进程,该进程用来对源端数据库的相关操作进行跟踪记录,以便在目标端重复操作这些记录,达到同步的目的,其中目标端的ip地址为192.168.12.12,同样是D:\OGG目录。
GGSCI(source)>edit params zlext
写入下面的内容:
EXTRACT zlext
SETENV(ORACLE_HOME="D:\oracle\product\11.2.0\dbhome_1")
SETENV(ORACLE_SID="his")
SETENV(NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK")
userid ggs, password ggs
rmthost 192.168.12.12,mgrport 7809
exttrail D:\ogg\dirdat\e0
Dynamicresolution
numfiles 3000
Gettruncates
table ZLHIS.*;
table ZLTOOLS.*;
GGSCI(source)>add extract zlext,tranlog,begin now
EXTRACT added
GGSCI(source)>add exttrail d:\ogg\dirdat\e0,extract zlext
EXTTRAIL added
GGSCI(source)>add rmttrail d:\ogg\dirdat\r0,extract zlext
RMTRAIL added
Extract zlext表示这是一个 Extract 进程,名字为 zlext,这里名字需要和 edit params 后面的名字相对应。dynamicresolution 指的是 GoldenGate 动态解析源端的表名,与非动态对应,默认 GoldenGate 会在一个进程启动的时候它会到数据库中查询表的属性,然后创建一个对象记录。这条记录在内存以及磁盘中维护,如果需要复制的表很多,那么创建的过程非常耗时。同理配置Pump投递进程组,正如之前介绍的 Pump进程本质是Extract进程的一种特殊形式,他的目的是把源端抽取进程的trail日志传输到目标端。
GGSCI(source)>edit params zlpump
写入下面的内容:
extract zlpump
dynamicresolution
numfiles 3000
passthru
rmthost 192.168.12.12,mgrport 7809,compress
rmttrail d:\ogg\dirdat\p0
exttrail d:\ogg\dirdat\e0
table ZLHIS.*;
table ZLTOOLS.*;
GGSCI(source)>add extract zlpump,exttrailsource d:\ogg\dirdat\e0
EXTRACT added.
GGSCI(source)>add rmttrail d:\ogg\dirdat\p0,extract zlpump
RMTTRAIL added.
l 配置目标端参数文件
首先在目标端同样要配置manager进程参数,大体内容同源端差不多,如下:
GGSCI(target)>edit params mgr
写入下面的内容:
port 7809
dynamicportlist 7800-8000
autorestart extract *,waitminutes 2,resetminutes 5
PURGEOLDEXTRACTS D:\ogg\dirdat\*,usecheckpoints, minkeepdays 3
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
目标端的只需要配置replicat进程,比较简单,具体的参数如下:
GGSCI(target)>edit params zlrep
写入下面的内容:
replicat zlrep
SETENV(ORACLE_HOME="D:\oracle\product\11.2.0\dbhome_1")
SETENV(ORACLE_SID="his")
SETENV(NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK")
USERID ggs, PASSWORD ggs
ASSUMETARRGETDEFS
GETTRUNCATES
discardfile d:\ogg\dirrpt\repsz.dsc,append, megabytes 10
map ZLHIS.*,target ZLHIS.*;
map ZLTOOLS.* target ZLTOOLS.*;
通过前面的参数配置,GoldenGate在源端和目标端的配置就已经完成,但是在启用这些进程前我们还需要对目标端数据进行初始化,以保证数据的完整性,GoldenGate数据化初始化的方式有三种:
1. 使用数据库工具(rman/imp/impdp/dataguard)进行初始化,这种方法最简单最有效;
2. Extract 进程把数据抽取到文件然后 Replicat 进程投递到容灾端数据库,这是方法的缺点是比较慢。
3. Extract 进程把抽取数据到到一个外部表,然后通过外部工具导入到容灾库中。
4. Extract 进程把数据抽取到一个外部表文件,然后通过 SQL*Loader 工具把数据导入到容灾端
针对目前我们ZLHIS的数据量大小,我们一般建议采用数据库工具进行初始化,优先采用rman和impdp的方式,这里我们以impdp为例,简单介绍下目标端初始化的操作过程,首先保证源端的抽取进程为运行状态,这样是为了保证能够捕获源端的数据的变化情况。
GGSCI(source)>start zlext
Sending START request to MANAGER ...
EXTRACT ZLEXT starting
GGSCI(source)>start zlpump
Sending START request to MANAGER ...
EXTRACT ZLPUMP starting
GGSCI (source)> info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING ZLEXT 00:00:00 00:00:02
EXTRACT RUNNING ZLPUMP 00:00:00 00:00:02
这时候我们就可以在dirdat中产生了记录文件,如图:
查看对应的进程report,可以看到如下信息
在保证源端捕获进程启动的情况下,查询源端数据库当前的SCN号,以便目标端启动同步进程时使用。
SQL>select current_scn from v$database;
CURRENT_SCN
-----------
83294457
通过EXPDP导出源端数据,并且指定flashback_scn参数。
expdp sys/oracle directory=backup dumpfile=back.dmp dmplogfile=back.log full=y flashback_scn=83294457;
在目标端通过IMPDP导入备份的DMP文件,然后禁用目标端数据库的自动作业、触发器,外键约束等。
impdp sys/oracle directory=backup dumpfile=back.dmp logfile=back.log full=y;
最后在目标端启动Replicat进程,启动的时候指定SCN,应用基于该SCN之后,保证数据的一致性。
GGSCI (target) > start zlrep, aftercsn 83294457
Sending START request to MANAGER ...
REPLICAT ZLREP starting
GGSCI (target)> info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING ZLREP 00:00:00 00:00:02
至此,目标端的初始化和同步已经完成,开始实时同步数据,两边的数据完全一致,接下来就是连接到备库进行病历数据的提取,经过测试数据完全一致。
以前我们在遇到类似需求的时候,一般是通过逻辑DG实现,GoldenGate同逻辑DG比较有以下优势:
l 支持异构平台和跨操作系统实时复制
GoldenGate几乎支持目前市面上流行的所有主流操作系统平台和数据库,而且支持集成ETL工具实现智能数据过滤,灵活的拓扑结构,实施部署简单。
l 亚秒级数据实时复制
这是GoldenGate同其它复制软件比较最大的优势点,在大数据量和高负载平台上GoldenGate的响应优势非常明显,几乎没有延迟。
l 高性能高可靠性
GoldenGate有自己的checkpoint机制,支持断点续传,不影响生成库的运行,捕获不依赖数据库的触发器和规则,对源数据影响非常小。
l Oracle战略支持力度
Oracle公司收购GoldenGate后声称对其原来的产品Streams和Data Guard Logical Standby将不再做任何重大改进,而是会把它们的一些优秀特性集成到GoldenGate产品上来,Oracle对GoldenGate产品的重视程度可见一斑。
总之GoldenGate是一款功能非常强大的实时复制软件,目前在SQRMYY的应用只是发挥了其中很小一部分功能,如果有兴趣和需求的技术人员可以一起进行深入研究。