欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle RAC环境实时数据迁移  

程序员文章站 2022-06-04 16:03:54
...

OracleRAC环境实时数据迁移

———————————————————————————————————————

系统要求及安装前的说明

OracleGoldenGate可以在Oracle不同版本间移动数据,也可以在Oracle和其它类型数据库之间移动数据。OracleGoldenGate支持数据的过滤、映射和转换。Oracle还能在相似的Oracle数据库之间复制DDL操作。注意下面一句:当DDL支持被激活的时候,OracleGoldenGate不支持数据的过滤、映射和转换。

支持的Oracle数据库版本,从9.2开始支持DMLDDL。支持几乎所有的主流操作系统,具体的可以从MOS(MyOracleSupport)中查询。内存方面,OracleGoldenGate需要的内存与同时运行的进程有关。最基本的情况下,需要有一个主提取进程来来捕获源数据、一个副提取数据泵进程来通过网络传输数据、还需要一个复制进程将复制的数据应用到目标端。

GoldenGate通过GGSCI命令接口,每个实例可以支持最多300个并发的抽取和复制进程。一个OracleGoldenGate进程可以看做一个Manager进程,它是主要的控制进程。每个抽取和复制进程需要大约25-55MB的内存,或更多,取决于事务的大小和并发数。

GoldenGate缓存管理器利用了操作系统的内存管理功能来确保GoldenGate进程以持续和有效的方式来进行工作。在缓存中,使用了现代虚拟内存技术来实现:高效地分配和管理活动的缓冲区;可能的情况下,回收旧缓冲区,而不是分页到磁盘中;在必要的时候,将较少使用的信息分页到磁盘中。

GoldenGate进程实际使用的内存数是由操作系统决定的,而不是GoldenGate程序。

系统需要为GoldenGate抽取或复制进程分配足够的交换空间,可以按以下步骤来求出这个空间:启动一个抽取或复制进程;运行GGSC;查看报告文件,找到这一行PROCESSVMAVAILFROMOS(min);将得到的值向上凑整到整数GB,比如,把1.76GB凑整到2G;将这个大小乘以需要运行的抽取和复制进程数,就是可能需要的最大交换空间大小。

需要的空闲磁盘空间为50-150MB,和具体数据库与平台有关。工作目录和系统中安装的每个GoldenGate实例的二进制文件需要的空间大概为40MB,比如将GoldenGate安装到两个独立的目录中,就需要分配80MB的空间;在集群环境中,可以将GoldenGate安装在共享文件系统中,就可以让所有节点都能访问。另外需要为GoldenGate追踪(trail)文件分配硬盘空间,和需要处理的数据的容量有关。比较好的起始点是1GB

OracleGoldenGate追踪文件的存储

为了防止追踪文件的活动干扰业务应用,应该将追踪文件放在一个单独的磁盘或文件系统中。这些文件存放了GoldenGate捕获的所有数据,文件默认大小为10MB,但在配置过程中可能会被更改。追踪文件会逐步累加,但可以通过PURGEOLDEXTRACTS参数指定规则来清空。

对于源端的追踪文件,应该有足够的空间来预防网络连接失败。在典型的配置中,抽取的副进程(称作数据泵)通过网络将本地追踪文件的数据发送到目标端,当网络故障时它也会失败。但是,抽取主进程仍然会继续读取事务日志并写入到本地的追踪文件。因此。必须由足够的磁盘空间来hold住这些累积的数据。

对于目标端的追踪文件,可以根据设置的PURGEOLDEXTRACTS参数来提供足够的磁盘空间。但是即使使用了该参数,在数据传输速度高于应用到目标库中的速度时,仍然有可能会继续累加。

可以按照这个公式来预测需要的追踪文件大小[logvolumeinonehour]x[numberofhoursdowntime]x.4=traildiskspace这里使用了40%,因为GoldenGate只需要事务日志中大约40%的数据。

默认情况下,GoldenGate在按照目录下的dirtmp子目录下的文件来维护数据,你可以使用CACHEMGR参数的CACHEDIRECTORY选项来指定它的路径。

OracleRAC

RAC环境中安装GoldenGate,建议将其安装在共享存储中,这样你可以在任一节点上启动GoldenGate进程,如果在这个节点上运行失败,你可以在另一个节点上启动,而不用修改参数,因为处理检查点保留在安装目录中。

RAC中的所有需要执行GoldenGate进程的节点必须同步系统时间,因为GoldenGate通过比较本地系统时间和提交时间戳来做出关键决策。

TCP/IP

使用主机名或IP来配置GoldenGate进程所在系统的网络,使用主机名会更易于使用。GoldenGate需要以下非保留且非限制的TCP/IP端口:一个端口用于管理器进程和其他GoldenGate进程间的通讯;一个范围内的端口用于本地GoldenGate通讯,默认由7840端口开始,也可以自定义,最多256个端口。

操作系统权限

Linux/Unix上,GoldenGate进程需要有队安装目录中的文件和子目录有读写删除的权限,管理器进程还需要有控制OracleGoldenGate进程的权限。如果使用Windows系统,必须使用Administrator用户登录。抽取进程需要一个能够访问日志文件(包含在线和归档日志)的用户。在UNIX系统中,那个用户必须是Oracle实例所在用户组中的成员。

安腾处理器的要求

如果在一个微软安腾系统上安装OracleGoldenGate,运行库vcredist_IA64.exe必须安装。你可以在微软的网站上下载到这个包,它包含了GoldenGate在安腾平台上操作所需的VisualStudio动态链接库。

另外,在Windows系统上安装GoldenGate以前,安装并配置MicrosoftVisualC++2005SP1

数据库方面的要求

必须使用完整的Oracle客户端而不是OracleInstantClient,这样GoldenGate程序可以访问OracleXDK库。

而关于GoldenGate支持的数据类型、操作类型、表类型等等,官方有相关的说明,开发人员应该注意一下,因为太长,这里不再引用。简单说下,不支持的数据类型有:ORDDICOM,ANYDATA,ANYDATASET,ANYTYPE,BFILE,MLSLABEL,TIMEZONE_ABBR,TIMEZONE_REGION,URITYPE,UROWID;当一张表只有一个字段,不支持该字段的类型为:LOB,LONG,Nestedtable,Userdefineddatatype,VARRAY,XML。由于一个已知的问题,需要将Oracle的回收站功能关闭,否则将导致GoldenGateDDL触发器失效。

GoldenGate的安装

下载与自己平台对应的版本的GoldenGate软件,官网edelivery提供下载

环境变量

首先要在操作系统中设置相关的环境变量,首先是ORACLE_HOME和ORACLE_SID,如果不能在操作系统中设置环境变量,或者系统中存在使用GoldenGate来传输数据的多个实例,那么在UNIX系统中可以在每个抽取/复制进程组中设置参数,格式为:SETENV(ORACLE_HOME=<pathtoOraclehomelocation>)及SETENV(ORACLE_SID=<SID>)还需要将GoldenGate安装目录添加到共享库的环境变量中,如:exportLD_LIBRARY_PATH=/ggs/10.0:$LD_LIBRARY_PATH要注意的一点是,ORACLE_HOME中的lib目录也应该加进去。可以使用ldd命令来检查该环境变量是否设置正确。(共享库环境变量在AIX中是LIBPATH,在SolarisLinux中是LD_LIBRARY_PATH,在HP-UX中是SHLIB_PATH)


安装软件

安装软件其实非常简单,在需要安装的目录中解压压缩包就可以了。然后进入该目录,执行ggsci(一定要在GoldenGate安装目录中执行,因此该Path变量其实可设可不设),在ggsci命令行中执行命令创建工作目录:CREATESUBDIRS

Windows系统中,可以将Manager进程使用install命令添加到服务中。还有如何将GoldenGate配置到系统级别的集群中来提供failover,这里不再说明,有兴趣的可以查下官方文档。



安装DDL支持


如何配置GoldenGate来捕获和传输ddl,在OracleGoldenGateWindowsandUNIXAdministratorsGuide中有比较详细的说明。下面列出一个表格,说明下GoldenGate中用于ddl同步的一些对象


对象

用途

默认名称

DDL标记表

存储DDL信息,该表只接收插入

GGS_MARKER

标记表中的序列

用来填充标记表中的一个字段

GGS_DDL_SEQ

DDL历史表

存储对象元数据历史,接收插入、更新、删除

GGS_DDL_HIST

对象ID历史表

包含了配置的对象的对象ID

GGS_DDL_HIST_ALT

DDL触发器

针对DDL操作,将操作的信息写入到标记表盒历史表

GGS_DDL_TRIGGER_BEFORE

DDLschema

包含DDL同步对象的schema

必须在安装过程中在GLOBALS文件中指定

用户角色

创建执行DDL操作所需的角色

GGS_GGSUSER_ROLE

内部安装表

只用于内部使用的表

GGS_SETUP

ddl_pin

固定DDL追踪、DDL包和DDL触发器,用于性能改进

ddl_pin

ddl_cleartrace.sql

删除DDL跟踪文件

ddl_cleartrace.sql

ddl_status.sql

确认GoldenGateDDL对象已经安装

ddl_status.sql

marker_status.sql

确认标记表已经安装

marker_status.sql

ddl_tracelevel.sql

设置DDL跟踪的级别

ddl_tracelevel.sql



下面讲一下安装DDL对象的步骤:


1.DDL对象选择一个schema

2.为该schema授予以下权限:

GRANTEXECUTEONUTL_FILETO<schema>;

3.为这些对象选择一个表空间,并且该表空间的剩余空间要能承担GGS_DDL_HISTGGS_MARKER表的数据增长,特别是GGS_DDL_HIST,它会根据DDL操作的频繁程度按比例增长。如果没有足够的表空间,数据库中的DDL操作将不能完成,业务应用会被挂起。

4.在这个GoldenGate实例的主目录中打开GLOBALS文件,并将上述schema配置到参数中:GGSCHEMA<schema_name>

5.修改DDL对象的名称,这个步骤是可选的,而且Oracle建议使用默认名称。

6.进入GoldenGate安装目录,断开所有数据库会话,并确保没有新的会话连接。

7.sysdba运行SQL*Plus,安装DDL触发器需要这个权限,触发器会被安装在SYSschema中。

8.执行marker_setup脚本,该脚本安装了DDL支持需要的GoldenGatemarker系统,脚本执行过程中会要求输入GoldenGateschema的名称

9.执行ddl_setup脚本

10.执行role_setup脚本。该脚本删除和创建DDL同步需要的角色,它授权DDL对象上的DML操作

11.将该角色赋给GoldenGate抽取用户。如果这些进程使用了不同的用户,你需要为这些用户分别授权

12.执行ddl_enable.sql脚本来启用DDL触发器

为了改进DDL触发器的性能,可以在数据库启动时,在GoldenGate安装目录下使用sysdba执行ddl_pin脚本SQL>@ddl_pin<DDL_user>该脚本会将该DDL触发器使用的PL/SQL包固定到内存中。它依赖于dbms_shared_pool系统包,使用ddl_pin前确认该包已经安装。



数据库方面的准备


确保ASM能够连通

如果使用了ASM,就要保证GoldenGate能够连接到ASM实例。通过以下步骤来确认:

首先确定ASM实例在tnsnames.ora文件中列出;然后检查Oracle监听是否正在监听这个ASM实例的连接,listener.ora文件需要包含类似于下列的字符串(特别是第二个SID_DESC部分)

SID_LIST_LISTENER_DARAN=
(SID_LIST=
(SID_DESC=
(SID_NAME=PLSExtProc)
(ORACLE_HOME=/rdbms/oracle/ora1012r/64)
(PROGRAM=extproc)
)
(SID_DESC=
(ORACLE_HOME=/rdbms/oracle/ora1012r/64)
(SID_NAME=+ASM1)
)
)


配置字符集

目标数据库的字符集必须是源数据库字符集的超集;如果你的客户端应用使用了不同的字符集,数据库的字符集应该是客户端应用字符集的一个超集;更多信息可以参阅OraclesDatabaseGlobalizationSupportGuide

通过以下SQL*Plus命令来查询数据库中的国际设置以及它使用的是字节还是字符语义:

viewplaincopytoclipboardprint?

1SHOWPARAMETERNLS_LANGUAGE

2SHOWPARAMETERNLS_TERRITORY

3SELECTname,value$fromSYS.PROPS$WHEREname='NLS_CHARACTERSET';

4SHOWPARAMETERNLS_LENGTH_SEMANTICS

也可以通过GGSCI来查看当前的数据库语言和字符集设计,并指明是否设置了NLS_LANGVIEWREPORT<group>


需要在操作系统中配置NLS_LANG环境变量,该变量的格式应该是<NLS_LANGUAGE>_<NLS_TERRITORY>.<NLS_CHARACTERSET>

要应用新的环境变量,需要重启GoldenGateManager进程。


配置Oracleredo日志

正常模式下,GoldenGate默认从在线日志中读取数据,当在线日志不可用时读取归档日志。你也可以手动配置GoldenGate来读取归档日志。为了确保GoldenGate读取在线日志的持续性和完整性,按如下过程来配置日志:

如果源数据库是Oracle9i,将_LOG_PARALLELISM参数设为1GoldenGate不支持大于1的值。

GoldenGateredo日志中捕获数据时,可能会引起I/O瓶颈,特别在有多个抽取进程同时读取时。为了避免这个瓶颈,尽量使用更快的驱动器和控制器;并且将日志存放在RAID0+1中,避免使用RAID5

尽管不是必须,但最好启用归档,并将归档日志保留尽可能久的时间。这样如果在线日志在抽取进程完成之前被回收,抽取进程还能从归档日志中读取。比如发生了进程或系统故障,抽取进程就可能需要去重新捕获事务数据。如果不启用归档,要保证在线日志中能容纳足够的数据。

确保备份和归档操作不会导致旧的归档文件被新的所覆盖,导致GoldenGate抽取进程无法找到需要的日志。在RAC配置中,抽取进程需要能访问到集群中所有节点的在线和归档日志。如果归档日志不在Oracle默认指定的位置,需要在抽取进程的参数文件中的TRANLOGOPTIONS参数中指定ALTARCHIVELOGDEST选项。


GoldenGateALO模式

你可以配置抽取进程来专门从归档日志中读取,这也叫做ArchivedLogOnly(ALO)模式。在这个模式下,抽取进程仅从指定位置中的归档日志里读取。ALO模式允许GoldenGate使用传输到次数据库(比如standby)中的日志来作为数据源。


调整游标

抽取进程为取数据的查询和SQLEXEC操作维护游标。如果没有足够的游标,抽取进程就必须替换掉更多的表达式。抽取进程维护游标的最大数由MAXFETCHSTATEMENTS参数决定的,默认值为100,你可能会发现这个值需要增加。你需要同时调整数据库中支持打开的游标数。


设置fetch选项

为了执行redo日志中的特定的update操作,GoldenGate从源数据库中提取额外的行数据。这些数据包括LOBs(10g以前,新版本中可以直接从redo中捕获)、用户定义类型、嵌套表、还有XMLType。默认情况下,GoldenGate使用闪回查询来从undo(rollback)表空间中获取值,通过这种方式,GoldenGate可以重建特定时间点或SCN下的读一致行镜像来匹配redo中的记录。

为了最好地获取记录,在源端数据库如下配置:

1.通过设置初始化参数UNDO_MANAGEMENT(AUTO)UNDO_RETENTION(86400)来保证足够的redo保留时间,在存储空间充裕的环境中,后者可以适当调高后者的值

2.通过这个公式来估计undo表空间需要的大小:<undospace>=<UNDO_RETENTION>*<UPS>+<overhead>

<UPS>是每秒产生的undo块数,<overhead>是元数据的最小开销。这两个数值可以通过V$UNDOSTAT来得出。

3.对于包含LOBs的表:1)LOB存储子句设为RETENTION,当UNDO_MANAGEMENTAUTO时,创建的表的默认设置就是这个值。2)如果用的不是RETENTION而是PCTVERSION时,将PCTVERSION设置为25的初始值。你可以通过STATSEXTRACT命令取得的统计信息来调整它。如果在这些统计信息中的STAT_PER_ROWFETCHCURRENTBYROWIDSTAT_OPER_ROWFETCH_CURRENTBYKEY的值比较高,将PCTVERSION10递增,直到它们的值降到比较低的水平。

4.GoldenGate抽取用户授权:GRANTFLASHBACKANYTABLETO<db_user>;GRANTFLASHBACKON<owner.table>TO<db_user>;


GoldenGatefetch选项中,它提供了一些参数来进行管理:

1.使用带REPORTFETCH选项的STATSEXTRACT命令来查看fetch统计信息。

2.ExtractSTATOPTIONS参数中设置REPORTFETCH选项来使得STATSEXTRACT命令总是显示fetch统计信息

3.通过ExtractMAXFETCHSTATEMENTS参数,可以控制源数据库中Extract维护的,为准备好的查询打开的游标数量

4.Oracle9i数据库中控制抽取的默认fetch动作,可以使用带USESNAPSHOTNOUSESNAPSHOT选项的FETCHOPTIONS参数。它们决定Extract是执行flashback查询还是从表中读取数据的当前镜像。

5.使用FETCHOPTIONS参数中的USELATESTVERSIONNOUSELATESTVERSION选项来处理flashbackqueries失败的情况。如果undo已经过期或是表结构发生了改变,flashback查询是可能会失败的。这两个选项决定Extract是从表中获取当前的数据还是选择忽略。

6.如果需要控制Replicat处理trail记录时,或在丢失字段情况下的反应,使用Replicat参数REPFETCHDCOLOPTIONS


准备需要处理的表

GoldenGate环境中,表的一些属性需要进行处理

1.禁用触发器和级联删除约束。你需要对目标表上的触发器和相关的完整性约束做一些修改。GoldenGate会将触发器或级联删除/更新约束上产生的DML也进行复制,如果在目标表上也有相同的触发器或约束在起作用,可能会产生多余的动作,而引发错误。处理方法为:如果Oracle版本为10.2.0.5或在11.2.0.2之后,可以使用Replicat中的参数DBOPTIONS,带SUPPRESSTRIGGERS选项来使得Replicat在它的会话中禁用触发器;若版本为Oracle9.2.0.7以后,可以使用Replicat参数DBOPTIONS,带DEFERREFCONST选项来将完整性约束的检测和执行推迟到Replicat事务提交以后;如果Oracle版本更老,你必须将触发器和完整性约束禁用,或手动改变它们来忽略Replicat数据库用户。


2.行的唯一标识。GoldenGate需要在源和目标端的表中有几种形式的行的唯一标识,以正确定位到目标行来进行更新和删除操作。

如果不在TABLEMAP表达式中使用KEYCOLS子句,GoldenGate按如下顺序来选择一个行标识:

1)主键

2)不包含虚拟列、UDT(用户定义类型)、函数列、允许空值列的唯一键,按字母顺序选择第一个

3)不包含虚拟列、UDT、函数列的唯一键,但允许空值,按字母顺序选择第一个

4)如果上述类型的键都不存在,GoldenGate将使用所有的字段来构建一个虚拟的键(不包含虚拟列、UDT、函数列等)

你还可以在GolenGateExtractTABLE参数和ReplicatMAP参数里的KEYCOLS子句中定义表中用来唯一标识行的键,它将优先于主键和唯一键。


3.让数据库记录键值。在GGSCI中使用ADDTRANDATA命令来配置数据库,使其在记录行的变化时也记录下键的值,这样redo中的记录对于GoldenGate是可用的。默认情况下,数据库只记录发生改变的字段值。

ADDTRANDATA会强制记录下主键字段或唯一字段,也有可能是所有字段。它创建一个包含这些需要的字段的追加日志组。如果使用了KEYCOLS子句,则记录子句中指定的字段。ADDTRANDATA必须在启动GoldenGate进程执行执行。步骤如下:

1)在源端系统中,在GoldenGate安装目录中运行GGSCI

2)GGSCI中,登录数据库:DBLOGINUSERID<user>,PASSWORD<password>(<user>是一个具有启用表级追加日志的权限的数据库用户)

3)执行ADDTRANDATA命令:ADDTRANDATA<table>[,COLS<columns>][,NOKEY]

<table>是表所属的用户名和表名,表名可以使用通配符,但用户名不能。

4)SQL*Plus中用具有ALTERSYSTEM权限的用户登录,执行下列的命令来在数据库级别启用最小追加日志:ALTERDATABASEADDSUPPLEMENTALLOGDATA;

5)切换日志文件,以开始使用追加日志:ALTERSYSTEMSWITCHLOGFILE;

6)确定追加日志已经启用:SELECTSUPPLEMENTAL_LOG_DATA_MINFROMV$DATABASE;

Oracle9i中,查询结果应该是YES,在10g中,为YESIMPLICIT

7)如果使用了COLS选项来记录KEYCOLS字段,在目标端为这些字段创建唯一索引,以优化行检索的效率。


4.限制没有键的表中行的更改。

如果目标表不含有主键或唯一键,就可能存在重复的行,GoldenGate有可能在目标表上更新或删除太多的行,使得源端和目标段的数据不同步,而且不会有警告信息。为了限制更新的行的数量,可以在Replicat参数文件的DBOPTIONS参数中使用LIMITROWS选项


5.推迟约束的检测。

在下列情况中,约束可能需要更改:

1)源和目标端并不都设为DEFERRED。如果约束在源端是DEFERRABLE,那么它们在目标端也必须是DEFERRABLE。或者,你可以在Replicat参数文件中在root级别上使用这个参数语句,以在复制会话中延迟约束:SQLEXEC("altersessionsetconstraintdeferred")(commit以后才检查约束)

2)键的更新会影响到多行。如果一个update事务可能影响到多行的主键值,Replicat需要将约束设置为DEFERRED,这在GoldenGate术语中叫短暂主键更新(transientprimarykeyupdate)。这种类型的操作通常使用了x+1方式(比如updatetable1setid=id+1;)或类似的操作,使得新值可能与其他行的旧值相同。

为了使Replicat管理这些更新:在目标表上以DEFERRABLE方式创建约束,可以指定为INITIALLYDEFERREDINITIALLYIMMEDIATE;使用Replicat参数HANDLETPKUPDATE来使Replicat在它的事务里将约束设置为INITIALLYDEFERRED,这些约束会在Replicat提交事务以后进行检查。

如果约束不是DEFERRABLEReplicat根据HANDLECOLLISIONSREPERROR参数来处理这些错误,若没有指定,则出现异常终止。


确保Oracle空间对象的正确处理

如果你需要复制包含了SDO_GEORASTER对象类型的字段的表,根据以下说明来配置GoldenGate

1.表的映射

2.设置XML内存缓冲区的大小。你可能需要修改用以存储SDO_GEORASTER数据类型中的SYS.XMLTYPE属性的内存缓冲区大小,这个缓冲区通过DBOPTIONS参数中的XMLBUFSIZE选项控制,默认是1MB,最大可以为10MB。如果数据超过了缓冲区大小,Extract会出现异常。如果表中任何一个值的SDO_GEORASTERMETADATA属性超过了默认的1MB,就需要增大缓冲区。

3.处理georaster表上的触发器。每个georaster表上都有一个触发器来与它的栅格数据表关联。它必须在源和目标环境中都启用,以保证空间数据的一致性。处理级联重复删除的问题,可以使用MAP参数中的REPERROR选项。例如MAPgeo.st_rdt,TARGETgeo.st_rdt,REPERROR(-1403,DISCARD);(更详细的例子可以查看GoldGate官方文档中《OracleInstallationandSetupGuide》中的第45页。)

4.强化获取。在Oracle9i中,Oracle在更新一个行以外的LOB时,会对同一行生个多个update,可以配置Extract来将这些操作捆绑成单个操作,可以使用Extract参数FETCHOPTIONS中的SUPPRESSDUPLICATES选项。


管理LOB缓存

由于Replicat必须往目标数据库中按分段写LOB数据,在Replicat和数据库中间可能会产生太多I/O。为了最小化这个I/O对系统的影响,ReplicatLOB分段缓存在一个指定大小的缓冲区中,仅当缓冲区满的时候才会执行写入。默认的大小是32k。打个比方,如果这个缓冲区有25k,那么Replicat以每个块25k来写入数据库,处理一个100kLOBReplicat只产生4I/O

使用Replicat参数DBOPTIONS参数中的LOBWRITESIZE<size>选项来控制LOB缓冲区的大小;如果要禁用LOB缓存,使用DBOPTIONS参数的DISABLELOBCACHING选项。


RAC中的追加说明

总体需求:

RAC集群中的所有节点必须同步系统时钟。GoldenGate通过比较本地系统的时间和事务提交的时间点来做出关键决策。可以通过NTP来不同系统时间,另外可以在OracleGoldenGateWindowsandUNIXReferenceGuide中查看关于THREADOPTIONS参数的IOLATENCY选项的相关说明。所有节点上的COMPATIBLE参数设置也必须相同。


RACGoldenGate参数的设置:

1.AIXSolaris机器上,使用Extract中的THREADOPTIONS参数和BINDCPU<n>选项。这个参数处理被不同的处理器所更新的内存相关的线程安全问题。

2.GoldenGate在传送数据到目标系统以前,会将数据放在内存里的队列中。THREADOPTIONS参数的INQUEUESIZEOUTQUEUESIZE决定队列的长度。需要的话,可以通过调整这些参数来提高抽取的性能。

3.GoldenGate会检测孤儿事务,如果在一个事务过程中发生节点故障,就会出现这种情况,Extract不能捕获到回滚动作。虽然数据库会在failover节点中执行回滚,然而该事务仍然会存在于Extract事务列表中,并阻碍了正在处理这个事务的Extract线程进一步的检查点。默认情况下,GoldenGate在确认了孤儿事务后会从列表中清除它们。如果你想进行控制,可以使用TRANLOGOPTIONS参数中PURGEORPHANEDTRANSACTIONS|NOPURGEORPHANEDTRANSACTIONSTRANSCLEANUPFREQUENCY选项。这个功能可以通过GGSCI上的SENDEXTRACT命令来控制。


RAC上的特殊处理:

1.如果正在运行GoldenGate的主数据库实例停止,或发生了其他故障,Extract将会中断。为了恢复处理,你可以重启实例,或将GoldenGate二进制文件重新挂载到另一个节点上,然后重新启动GoldenGate进程。在另一个节点上启动GoldenGate进程以前,要停止原节点上的Manager进程。

2.一旦redo线程数发生了改变,必须删除并重建Extract组。

3.为了将SQL操作写入到trail中,Extract必须确定正在读取的redo前面没有其他节点的其他操作。打个比方,一个日志包含了1:002:00执行的操作,同时节点2的日志中包含了1:302:30执行的操作。那么,只有2:00以前的操作会被移动到协调redo数据的主Extract进程所在的服务器上。Extract必须确保在2:002:30之间没有更多的操作需要被捕获(保证不同节点中的事务能按顺序写入到trail文件中)

4.active-passive环境中,这个先决条件意味着你可能需要在passive节点上执行一些操作和归档日志,以确保active节点上的操作被传送到passive节点。这能解决缓慢的归档进程和失效的网络连接引发的问题,以及从Oracle节点中移动归档日志到主Extract协调redo数据所在的服务器上可能出现的问题。

5.为了处理RAC上的最后一个事务,在关闭Extract前往GoldenGate正在复制的源表中插入一条伪记录,然后在所有节点上切换日志。这会更新Extract检查点并确认所有归档都能被读取。同时可以确认这些归档日志中的所有事务都已被捕获并以正确的顺序写入到了trail文件中。



管理Oracle复制环境


启用和禁用DDL触发器

你可以启用和禁用捕获DDL操作的触发器,而不需要修改GoldenGate中的任何配置。下面的脚本可以控制DDL触发器:ddl_disable,禁用触发器;ddl_enable,启用触发器,将从启用开始捕获DDL操作。

在运行这些脚本以前,断开执行过DDL操作的会话,包括GoldenGate进程、SQL*Plus、业务应用、和使用Oracle的其他软件。否则数据库可能会产生ORA-04021错误。


维护DDLmarker

你随时都可以清除marker表中的行,它不会保存DDL历史记录。使用Manager参数PURGEMARKERHISTORY来清除marker(PURGEMARKERHISTORY指定一行从最后修改日期开始的最大和最小的保留时间)Manager通过以下方式之一来获取marder表的名称:GLOBAL文件中的MARKERTABLE<table>参数;默认的名称GGS_MARKER


删除DDLmarker

不要删除这个表,除非你准备中断DDL同步。DDL触发器和marker表是相互依赖的。如果DDL触发器处于启用状态,删除marker表的操作将会失败。如果你移除了marker表,将会产生错误ORA-04098:trigger'SYS.GGS_DDL_TRIGGER_BEFORE'isinvalidandfailedre-validation


清空DDLtrace文件

为了防止trace文件过度消耗磁盘空间,定期地运行ddl_cleartrace脚本。这个脚本会删除文件,但GoldenGate将重新创建它。DDLtrace文件的默认名称是ggs_ddl_trace.log。它在OracleUSER_DUMP_DEST路径下。ddl_cleartrace脚本在GoldenGate目录下。


DDL支持启用时应用数据库补丁和更新

数据库补丁和升级常常会使GoldenGateDDL触发器和其他的GoldenGateDDL对象失效。在应用数据库补丁之前,执行下面的步骤:1.禁用GoldenGateDDL触发器@ddl_disable2.应用补丁;3.启用DDL触发器@ddl_enable


DDL支持启用时应用GoldenGate补丁和更新

注意:如果在新版本中有升级说明,应该按照该说明来进行升级。对10.4版本以前的GoldenGate,也不要采用下面的步骤。

1.运行GGSCI,在这个过程中保持该会话的打开状态

2.停止Extract进程来停止捕获DDLSTOPEXTRACT<group>

3.停止Replicat进程来停止复制DDLSTOPREPLICAT<group>

4.下载或解压补丁或升级文件

5.进入GoldenGate安装目录下

6.运行SQL*Plus,并用具有SYSDBA权限的用户登录

7.断开产生过DDL的所有会话,包括GoldenGate进程、SQL*Plus、业务应用、已经其他任何使用Oracle的如阿健。否则数据库可能会出现ORA-04021错误

8.运行ddl_disable脚本来禁用DDL触发器

9.执行ddl_setup脚本,你可能需要输入GoldenGateschema名称、安装模式(NORMAL/INITIALSETUP)

10.执行ddl_enable.sql脚本启用DDL触发器

11.GGSCI中,启动Extract来恢复DDL捕获STARTEXTRACT<group>

12.启用Replicat进程来启动DDL复制STARTREPLICAT<group>


安装之后修改DDL对象名称

1.运行GGSCI,保持该会话处于启动状态

2.停止Extract进程来停止捕获DDLSTOPEXTRACT<group>

3.停止Replicat进程来停止复制DDLSTOPREPLICAT<group>

4.进入GoldenGate安装目录下

5.运行SQL*Plus,并用具有SYSDBA权限的用户登录

6.断开产生过DDL的所有会话,包括GoldenGate进程、SQL*Plus、业务应用、已经其他任何使用Oracle的如阿健。否则数据库可能会出现ORA-04021错误

7.运行ddl_disable脚本来禁用DDL触发器

8.如果要修改DDLschema的名称,可以在GLOBALS文件中指定新的名称:GGSCHEMA<new_schema_name>

9.如果需要修改任何其他对象的名称,在params.sql脚本中执行新的名称,但不要执行这个脚本;如果要修改标记表的名称,在GLOBALS文件中指定参数MARKERTABLE<new_table_name>;如果要修改历史表的名称,在GLOBALS文件中指定参数DDLTABLE<new_table_name>

10.如果需要使用新的schema来储存DDL同步对象,现在创建该schema

11.进入GoldenGate安装目录下

12.运行SQL*Plus并以具有SYSDBA权限的用户登录

13.运行ddl_setup脚本

14.运行ddl_enable.sql脚本来启用DDL触发器

15.GGSCI中,启动Extract来恢复DDL捕获STARTEXTRACT<group>

16.启动Replicat进行来开始DDL复制STARTREPLICAT<group>


重建已经存在的DDL环境到一个干净的状态

按照下面步骤来完全移除并重新安装GoldenGateDDL对象。由于对象间的相互依赖,所有对象都需要移除并重建

1.如果你想结合安装新版本的GoldenGate来执行这个步骤,下载并安装OracleGoldenGate文件,必要的话创建或升级进程组和参数文件

2.(可选)为了保持源和目标结构的连贯性,停止DDL活动并确保Replicat已经处理完所有的DDL并已复制完trail中的DML数据。执行这个命令,如果Replicat已经结束,会看到一条消息提示没有更多的数据需要处理INFOREPLICAT<group>

3.运行GGSCI

4.停止Extract来停止捕获DDLSTOPEXTRACT<group>

5.停止Replicat进程来停止复制DDLSTOPREPLICAT<group>

6.进入GoldenGate安装目录下

7.运行SQL*Plus,并用具有SYSDBA权限的用户登录

8.断开产生过DDL的所有会话,包括GoldenGate进程、SQL*Plus、业务应用、已经其他任何使用Oracle的如阿健。否则数据库可能会出现ORA-04021错误

9.运行ddl_disable脚本来禁用DDL触发器

10.运行ddl_remove脚本来移除GoldenGateDDL触发器、DDL历史和标记表、已经其他相关的对象。这个脚本会生成一个ddl_remove_spool.txt文件,记录了脚本的输出,还有一个ddl_remove_set.txt文件,记录了当前的用户环境设置,以防debug之用

11.运行marker_remove脚本来移除GoldenGatemarker支持系统。这个脚本生成一个marker_remove_spool.txtmarker_remove_set.txt文件,作用和上面的相同

12.运行marker_setup脚本来重新安装OracleGoldenGatemarker支持系统

13.运行ddl_setup脚本

14.运行role_setup脚本来创建GoldenGateDDL角色

15.将这个角色赋给所有GoldenGate用户,包括如下进程相关的用户:Extract,Replicat,GGSCIManager

16.运行ddl_enable.sql脚本来启用DDL触发器


从系统中移除DDL对象

1.运行GGSCI

2.停止Extract进程:STOPEXTRACT<group>

3.停止Replicat进程:STOPREPLICAT<group>

4.进入GoldenGate安装目录下

5.运行SQL*Plus,并用具有SYSDBA权限的用户登录

6.断开产生过DDL的所有会话,包括GoldenGate进程、SQL*Plus、业务应用、已经其他任何使用Oracle的如阿健。否则数据库可能会出现ORA-04021错误

7.运行ddl_disable脚本来禁用DDL触发器

8.运行ddl_remove脚本来移除GoldenGateDDL触发器、DDL历史和标记表、已经其他相关的对象。这个脚本会生成一个ddl_remove_spool.txt文件,记录了脚本的输出,还有一个ddl_remove_set.txt文件,记录了当前的用户环境设置,以防debug之用

9.运行marker_remove脚本来移除GoldenGatemarker支持系统。这个脚本生成一个marker_remove_spool.txtmarker_remove_set.txt文件,作用和上面的相同

环境


源端是一个RAC
rac1rac2:RHEL4u7+ORACLE10.2.0.4+ASM
rac1外网IP192.168.47.241虚拟IP192.168.47.243
rac2外网IP192.168.47.242虚拟IP192.168.47.244

目标端是一个单机
ggdb:RHEL4u7+ORACLE10.2.0.4+ASM
IP:192.168.47.211

两台主机均已创建数据库,sid分别为oradbdyggdb

配置oradbdyggdb的数据同步

goldengate版本11.1.1.0


时间同步


RAC中,节点间的时间同步很重要,官方文档里面的解释是,GoldenGate通过时间来做一些关键决策。这里我们通过NTP来配置时间同步
rac1配置为NTP服务器

rac1:

修改配置文件。配置一个server指向自己

cat>/etc/ntp.conf<<EOF
restrictdefaultnomodifynotrapnoquery
restrict127.0.0.1

server0.rhel.pool.ntp.org
server1.rhel.pool.ntp.org
server2.rhel.pool.ntp.org

server192.168.47.241
server127.127.1.0
fudge127.127.1.0stratum10

driftfile/var/lib/ntp/drift
broadcastdelay0.008
keys/etc/ntp/keys
EOF

启动ntpd服务

servicentpdrestart
chkconfig--level345ntpdon

rac2:

rac2上的操作与rac1类似,不同的是配置的server指向rac1

cat>/etc/ntp.conf<<EOF
restrictdefaultnomodifynotrapnoquery
restrict127.0.0.1

server0.rhel.pool.ntp.org
server1.rhel.pool.ntp.org
server2.rhel.pool.ntp.org

server192.168.47.241
fudge192.168.47.241stratum10

driftfile/var/lib/ntp/ntp.drift
broadcastdelay0.008
keys/etc/ntp/keys
EOF

servicentpdrestart
chkconfig--level345ntpdon

需要注意的是,配置完ntp后大概需要5-10分钟的时候,才会开始进行同步。可以通过ntpq-p命令来查看

[root@rac1~]#ntpq-p
remoterefidsttwhenpollreachdelayoffsetjitter
==============================================================================
rac1.INIT.16u-6400.0000.0004000.00
*LOCAL(0)LOCAL(0)10l30643770.0000.0000.001

[root@rac2~]#ntpq-p
remoterefidsttwhenpollreachdelayoffsetjitter
==============================================================================
rac1LOCAL(0)11u96410.1870.0720.001



源端和目标端之间的时间同步则不是那么重要。可以在目标端手动对时间进行一次同步(目标端的ntpd服务没有启动),并将同步后的系统时间写入bios
[root@ggdb~]#ntpdate192.168.47.241
8Dec15:40:20ntpdate[8311]:adjusttimeserver192.168.47.241offset0.003007sec
[root@ggdb~]#/sbin/hwclock-w

如果不能成功,可以在ntpdate命令中加上-d参数来排查具体原因


创建系统用户


在源端(包括rac1rac2)和目标端创建用户,用于管理GoldenGate

useradd-goinstall-Gdbagoldengate
passwdgoldengate

配置资源限制:
官方建议尽可能将资源限制放开,其实我们可以根据具体情况进行配置,但不能设得太小

cat>>/etc/security/limits.conf<<EOF
goldengatesoftmemlock3145728
goldengatehardmemlock3145728
goldengatesoftnproc200
goldengatehardnproc1024
goldengatesoftstack-
goldengatehardstack-
goldengatesoftfsize-
goldengatehardfsize-
EOF


准备GoldenGate安装环境


源端


RAC环境中,GoldenGate应该安装在一个共享存储中,这样当运行GoldenGate相关进程的节点出现故障时,可以将该目录挂载到另一个节点中继续运行
以下的在rac1上做就可以了

这里有一个分区/dev/sdg1,可以被rac1rac2访问。我们将其格式化ext3文件系统,并挂载到rac1(在正常情况下,我们在rac1上启动extract进程)

[root@rac1~]#mkfs.ext3/dev/sdg1
mke2fs1.35(28-Feb-2004)
Filesystemlabel=
OStype:Linux
Blocksize=4096(log=2)
Fragmentsize=4096(log=2)
12500992inodes,24993115blocks
1249655blocks(5.00%)reservedforthesuperuser
Firstdatablock=0
Maximumfilesystemblocks=4294967296
763blockgroups
32768blockspergroup,32768fragmentspergroup
16384inodespergroup
Superblockbackupsstoredonblocks:
32768,98304,163840,229376,294912,819200,884736,1605632,2654208,
4096000,7962624,11239424,20480000,23887872

Writinginodetables:done
Creatingjournal(8192blocks):done
Writingsuperblocksandfilesystemaccountinginformation:done

Thisfilesystemwillbeautomaticallycheckedevery24mountsor
180days,whichevercomesfirst.Usetune2fs-cor-itooverride.
[root@rac1~]#

挂载到rac1/opt/gg下:
[root@rac1~]#mkdir/opt/gg
[root@rac1~]#mount/dev/sdg1/opt/gg

然后在rac1中配置开机自动挂载(这一步不要在rac2上做)
echo"mount/dev/sdg1/opt/gg">>/etc/rc.local

目标端


目标端是一个单机,安装到/opt/gg
mkdir/opt/gg


在源端和目标端上,赋予goldengate用户/opt/gg目录的使用权限
chown-Rgoldengate:oinstall/opt/gg
chmod-R775/opt/gg



解压goldengate安装文件到安装目录


安装GoldenGate软件很简单,解压即可

源端(rac1)和目标端都做:
goldengate用户登录
[goldengate@rac1goldengateMedia]$mkdir/opt/gg/goldengate
[goldengate@rac1goldengateMedia]$cpggs_Linux_x64_ora10g_64bit_v11_1_1_0_0_078.tar/opt/gg/goldengate
[goldengate@rac1goldengateMedia]$cd/opt/gg/goldengate
[goldengate@rac1goldengate]$tar-xvfggs_Linux_x64_ora10g_64bit_v11_1_1_0_0_078.tar



配置环境变量


源端(rac1rac2)和目标端:
修改goldengate用户的环境变量配置文件(ORACLE_SID按实际情况修改)
cat>>/home/goldengate/.bashrc<<EOF
ORACLE_HOME=/opt/app/oracle/product/10.2.0/db_1
exportORACLE_HOME
ORACLE_SID=oradb1
exportORACLE_SID
GG_HOME=/opt/gg/goldengate
exportGG_HOME
PATH=\$ORACLE_HOME/bin:\$PATH
exportPATH
GG_HOME=/opt/gg/goldengate
exportGG_HOME
LD_LIBRARY_PATH=\$ORACLE_HOME/lib:\$GG_HOME:\$LD_LIBRARY_PATH
exportLD_LIBRARY_PATH
EOF

应用刚刚修改的环境变量,然后进入GoldenGate安装目录,执行lddggsci,确定需要的库文件都能够找到。如果出现共享库文件无法找到,例如libnnz10.so=>notfound,检查LD_LIBRARY_PATH环境变量的设置
[goldengate@ggdbgoldengate]$source~/.bashrc
[goldengate@ggdbgoldengate]$cd$GG_HOME
[goldengate@ggdbgoldengate]$lddggsci
libdl.so.2=>/lib64/libdl.so.2(0x00000037a3900000)
libicui18n.so.38=>/opt/gg/goldengate/libicui18n.so.38(0x0000002a9558c000)
libicuuc.so.38=>/opt/gg/goldengate/libicuuc.so.38(0x0000002a958ec000)libicudata.so.38=>/opt/gg/goldengate/libicudata.so.38(0x0000002a95c25000)
libpthread.so.0=>/lib64/tls/libpthread.so.0(0x00000037a3d00000)
libxerces-c.so.28=>/opt/gg/goldengate/libxerces-c.so.28(0x0000002a968fc000)
libnnz10.so=>/opt/app/oracle/product/10.2.0/db_1/lib/libnnz10.so(0x0000002a96e13000)
libclntsh.so.10.1=>/opt/app/oracle/product/10.2.0/db_1/lib/libclntsh.so.10.1(0x0000002a972b4000)
libstdc++.so.6=>/usr/lib64/libstdc++.so.6(0x00000037a5d00000)
libm.so.6=>/lib64/tls/libm.so.6(0x00000037a3700000)
libgcc_s.so.1=>/lib64/libgcc_s.so.1(0x00000037a5b00000)
libc.so.6=>/lib64/tls/libc.so.6(0x00000037a3400000)
/lib64/ld-linux-x86-64.so.2(0x00000037a3000000)
libnsl.so.1=>/lib64/libnsl.so.1(0x00000037a9100000)



数据库方面的准备


在源端数据库中打开归档模式


SQL>archiveloglistDatabaselogmodeArchiveMode
AutomaticarchivalEnabled
Archivedestination+RECOVERY_DG
Oldestonlinelogsequence120
Nextlogsequencetoarchive121
Currentlogsequence121


若处于非归档模式,则改为归档模式:
SQL>shutdownimmediate
Databaseclosed.
Databasedismounted.
ORACLEinstanceshutdown.
SQL>startupmount;
ORACLEinstancestarted.


SQL>alterdatabasearchivelog;

Databasealtered.

SQL>alterdatabaseopen;

Databasealtered.

SQL>


在源端数据库中打开forcelogging


SQL>selectforce_loggingfromv$database;

FOR
---
NO

SQL>alterdatabaseforcelogging;

Databasealtered.

SQL>selectforce_loggingfromv$database;

FOR
---
YES



在源端数据库中打开supplementallog


SQL>selectsupplemental_log_data_minfromv$database;

SUPPLEME
--------
NO

SQL>alterdatabaseaddsupplementallogdata;

Databasealtered.


切换日志,使更改生效
SQL>altersystemswitchlogfile;

Systemaltered.

SQL>selectsupplemental_log_data_minfromv$database;

SUPPLEME
--------
YES


在源端数据库中关闭回收站


官方的说明是,由于一个已知的问题,回收站会对DDL触发器产生影响,因此需要关闭。由此可见,我们只需要在源库中关闭回收站即可。

SQL>showparameterrecyclebin

NAMETYPEVALUE
-----------------------------------------------------------------------------
recyclebinstringon


SQL>altersystemsetrecyclebin=off;

Systemaltered.

SQL>showparameterrecyclebin

NAMETYPE
--------------------------------------------------------------------
VALUE
------------------------------
recyclebinstring
OFF



确保goldengate能够连接到数据库的ASM实例


RAC中所有节点都要配置


在源端TNSNAMES.ORA中配置ASM实例信息
vi$ORACLE_HOME/network/admin/tnsnames.ora

ORADB_ASM=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521))
(LOAD_BALANCE=yes)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=+ASM)
)
)


在源端LISTENER.ORA中配置ASM实例的相关信息
vi$ORACLE_HOME/network/admin/listener.ora

SID_LIST_LISTENER_RAC1=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=oradb)
(ORACLE_HOME=/opt/app/oracle/product/10.2.0/db_1)
(SID_NAME=oradb1)
)
(SID_DESC=
(GLOBAL_DBNAME=+ASM)
(ORACLE_HOME=/opt/app/oracle/product/10.2.0/db_1)
(SID_NAME=+ASM1)
)
)

上面是rac1中的配置,rac2中的SID_LIST_LISTENER_xxxSID_NAME要相应修改


重启监听
lsnrctlreload


通过sqlplussys/xxx@oradb_asmassysdba来连接asm实例,能连上则说明配置成功


字符集


1.目标数据库的字符集必须是源数据库字符集的超集
2.数据库字符集必须为客户端应用程序字符集的超集

SQL>SHOWPARAMETERNLS_LANGUAGE

NAMETYPEVALUE
-----------------------------------------------------------------------------
nls_languagestringSIMPLIFIEDCHINESE


SQL>SHOWPARAMETERNLS_TERRITORY

NAMETYPEVALUE
-----------------------------------------------------------------------------
nls_territorystringCHINA


SQL>SELECTname,value$fromSYS.PROPS$WHEREname='NLS_CHARACTERSET';

NAME
------------------------------
VALUE$
--------------------------------------------------------------------------------
NLS_CHARACTERSET
ZHS16GBK


SQL>SHOWPARAMETERNLS_LENGTH_SEMANTICS

NAMETYPEVALUE
-----------------------------------------------------------------------------
nls_length_semanticsstringBYTE


SQL>

设置终端的字符集:
root用户登录,源(rac1rac2)和目标端都做
cat>>/etc/bashrc<<EOF
NLS_LANG="SIMPLIFIEDCHINESE_CHINA".ZHS16GBK
exportNLS_LANG
EOF



创建goldengate数据库用户


源和目标端都需要

[oracle@gg1~]$sqlplus/assysdba

SQL*Plus:Release10.2.0.4.0-ProductiononMonAug122:31:422011

Copyright(c)1982,2007,Oracle.AllRightsReserved.


Connectedto:
OracleDatabase10gEnterpriseEditionRelease10.2.0.4.0-64bitProduction
WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions

SQL>createtablespacegoldengate;

Tablespacecreated.

SQL>createusergoldengateidentifiedbygoldengatedefaulttablespacegoldengate;

Usercreated.

SQL>grantconnect,resourcetogoldengate;

Grantsucceeded.

SQL>grantexecuteonutl_filetogoldengate;

Grantsucceeded.

SQL>


抽取进程使用的数据库用户需要额外的权限,我们将这些权限也授予数据库用户goldengate(在源端数据库中执行)

SQL>execdbms_streams_auth.grant_admin_privilege('GOLDENGATE');

PL/SQLproceduresuccessfullycompleted.

SQL>grantinsertonsystem.logmnr_restart_ckpt$togoldengate;

Grantsucceeded.

SQL>grantupdateonsys.streams$_capture_processtogoldengate;

Grantsucceeded.

SQL>grantbecomeusertogoldengate;

Grantsucceeded.

SQL>

为了确保GoldenGate正常运行,特别是在目标端,赋予goldengate用户DBA权限:
SQL>grantdbatogoldengate;



UNDO的设置


goldengate使用flashbackquery从源数据库中读取undo表空间中的数据,以重建基于scn或时间点的读一致性。


建议设置如下:
UNDO_MANAGEMENT=AUTO
UNDO_RETENTION=86400
undo表空间的大小按如下公式估计设置
<undospace>=<UNDO_RETENTION>*<UPS>+<overhead>
<undospace>isthenumberofundoblocks.
<UNDO_RETENTION>isthevalueoftheUNDO_RETENTIONparameter(inseconds).
<UPS>isthenumberofundoblocksforeachsecond.
<overhead>istheminimaloverheadformetadata(transactiontables,etc.).
UsethesystemviewV$UNDOSTATtoestimate<UPS>and<overhead>.


该步骤在源端数据库执行即可


SQL>showparameterundo


NAMETYPEVALUE
-----------------------------------------------------------------------------
undo_managementstringAUTO
undo_retentioninteger900
undo_tablespacestringUNDOTBS1


SQL>altersystemsetundo_retention=86400;


Systemaltered.


flashbackanytable权限赋给extract用户


SQL>grantflashbackanytabletogoldengate;


Grantsucceeded.


SQL>


安装DDLOBJECTS


在源端,以oracle用户登录sqlplus,执行以下脚本


执行marker_setup


确保goldengate的相关进程关闭状态,任何使用oracle的应用程序都已关闭,且不会有新的会话产生。然后执行下面命令

[goldengate@gg1~]$cd/opt/gg/goldengate/
[goldengate@gg1goldengate]$sqlplus/assysdba

SQL>@marker_setup

Markersetupscript

YouwillbepromptedforthenameofaschemafortheGoldenGatedatabaseobjects.
NOTE:Theschemamustbecreatedpriortorunningthisscript.
NOTE:StopallDDLreplicationbeforestartingthisinstallation.

EnterGoldenGateschemaname:goldengate

……

Scriptcomplete.

SQL>


执行ddl_setup


确保所有的会话都已关闭

SQL>@ddl_setup

GoldenGateDDLReplicationsetupscript

VerifyingthatcurrentuserhasprivilegestoinstallDDLReplication...
Checkingusersessions...

Checkcomplete.

YouwillbepromptedforthenameofaschemafortheGoldenGatedatabaseobjects.
NOTE:ForanOracle10gsource,thesystemrecyclebinmustbedisabled.ForOracle11gandlater,itcanbeenabled.
NOTE:Theschemamustbecreatedpriortorunningthisscript.
NOTE:StopallDDLreplicationbeforestartingthisinstallation.

EnterGoldenGateschemaname:goldengate

Youwillbepromptedforthemodeofinstallation.
ToinstallorreinstallDDLreplication,enterINITIALSETUP
ToupgradeDDLreplication,enterNORMAL
Entermodeofinstallation:INITIALSETUP

Working,pleasewait...
Spoolingtofileddl_setup_spool.txt

UsingGOLDENGATEasaGoldenGateschemaname,INITIALSETUPasamodeofinstallation.

Working,pleasewait...

RECYCLEBINmustbeempty.
ThisinstallationwillpurgeRECYCLEBINforallusers.
Toproceed,enteryes.Tostopinstallation,enterno.

Enteryesorno:yes

……

Scriptcomplete.
SQL>

执行role_setup


创建一个名为ggs_ggsuser_role的角色,包含了ddlobjects需要的权限
SQL>@role_setup

GGSRolesetupscript

ThisscriptwilldropandrecreatetheroleGGS_GGSUSER_ROLE
Touseadifferentrolename,quitthisscriptandthenedittheparams.sqlscripttochangethegg_roleparametertothepreferredname.(Donotrunthescript.)

YouwillbepromptedforthenameofaschemafortheGoldenGatedatabaseobjects.
NOTE:Theschemamustbecreatedpriortorunningthisscript.
NOTE:StopallDDLreplicationbeforestartingthisinstallation.

EnterGoldenGateschemaname:goldengate
Wrotefilerole_setup_set.txt

PL/SQLproceduresuccessfullycompleted.

Rolesetupscriptcomplete

GrantthisroletoeachuserassignedtotheExtract,GGSCI,andManagerprocesses,byusingthefollowingSQLcommand:

GRANTGGS_GGSUSER_ROLETO<loggedUser>

where<loggedUser>istheuserassignedtotheGoldenGateprocesses.
SQL>

将创建的角色授权给goldengate用户


SQL>grantggs_ggsuser_roletogoldengate;

Grantsucceeded.

SQL>

启用DDL触发器


SQL>@ddl_enable

Triggeraltered.

SQL>

安装可选的性能工具


安装dbms_shared_pool


如果系统中不存在dbms_shared_pool包,则手动执行脚本安装。如下

SQL>selectobject_name,object_typefromdba_objectswhereobject_name='DBMS_SHARED_POOL';

norowsselected

SQL>@?/rdbms/admin/dbmspool

Packagecreated.

Grantsucceeded.

Viewcreated.

Packagebodycreated.

SQL>selectobject_name,object_typefromall_objectswhereobject_name='DBMS_SHARED_POOL';

OBJECT_NAMEOBJECT_TYPE
-------------------------------------------------
DBMS_SHARED_POOLPACKAGE
DBMS_SHARED_POOLPACKAGEBODY

2rowsselected.

ddl_pin


ddl_pin将触发器用到的plsql包放进内存中

SQL>@ddl_pingoldengate

PL/SQLproceduresuccessfullycompleted.

PL/SQLproceduresuccessfullycompleted.

PL/SQLproceduresuccessfullycompleted.

SQL>



配置goldengate


创建goldengate工作目录


源端和目标端:

[goldengate@rac1goldengate]$cd$GG_HOME
[goldengate@rac1goldengate]$./ggsci

GGSCI(rac1)1>createsubdirs

Creatingsubdirectoriesundercurrentdirectory/opt/gg/goldengate

Parameterfiles/opt/gg/goldengate/dirprm:created
Reportfiles/opt/gg/goldengate/dirrpt:created
Checkpointfiles/opt/gg/goldengate/dirchk:created
……

GGSCI(gg1)2>exit

创建trail文件存放目录


源和目标端:

[goldengate@rac1~]$mkdir/opt/gg/trails
[goldengate@rac1~]$ls-l/opt/gg|greptrails
drwxr-xr-x2goldengateoinstall4096Nov2714:57trails
[goldengate@rac1~]$

配置MANAGER


源端和目标端:

DYNAMICPORTLIST中配置了GoldenGate(extractreplicat)进程使用的端口范围
PORT参数指定MANAGER使用的端口
AUTORESTART参数使抽取/复制进程失败后自动重启
配置MANAGER的参数,PURGEOLDEXTRACTS参数指定:当根据checkpoint发现已经完成抽取和复制的trail文件将被自动删除,但保留最近10个。
PURGEDDLHISTORYPURGEMARKERHISTORY分别删除DDL历史表和marker表中的过期数据,以控制它们不会变得过于庞大。

GGSCI(gg1)1>editparamsmgr

DYNAMICPORTLIST7840-7914
PORT5898
PURGEOLDEXTRACTS/opt/gg/trails/w1*,USECHECKPOINTS,MINKEEPFILES10
PURGEOLDEXTRACTS/opt/gg/trails/w2*,USECHECKPOINTS,MINKEEPFILES10
AUTORESTARTER*,RETRIES3,WAITMINUTES5
PURGEDDLHISTORYMINKEEPDAYS3,MAXKEEPDAYS5,FREQUENCYMINUTES30
PURGEMARKERHISTORYMINKEEPDAYS3,MAXKEEPDAYS5,FREQUENCYMINUTES30
~
~

全局参数设置


源端:

GGSCI(rac1)2>editparams./globals
GGSCHEMAgoldengate
~
~
~

目标端:

创建一个checkpoint
replicat通过这个表来维护trail文件中的readposition。这不是个必须的操作,如果没有这个表,则通过一个磁盘文件来维护

GGSCI(ggdb)2>dbloginuseridgoldengate,passwordgoldengate
Successfullyloggedintodatabase.

GGSCI(ggdb)3>addcheckpointtablegoldengate.chkpoint

SuccessfullycreatedcheckpointtableGOLDENGATE.CHKPOINT.

GGSCI(ggdb)4>editparams./globals

GGSCHEMAgoldengate
CHECKPOINTTABLEgoldengate.chkpoint
~
~
~
~
"./globals"2L,44Cwritten

配置源端extract


为了避免primaryextract受到网络的影响,我们在源端和目标端之间增加一个datapump,这样的话,primaryextract负责将数据从源数据中抽取出来,存在本地的trail文件中,然后datapump进程负责将本地trail文件中的数据传输到目标端的trail文件里。这样能提高更高的灵活性和可用性(当源和目标端之间的网络出现故障时,primaryextract会继续抽取数据存到本地的trail),图解如下:


我们这里要同步4个用户下的所有表:dycommondatabase20dyulcentermanagedyacdb34dyulcenterm_bak
这里我们将它们分成两部分来测试,两个primaryextract,一个负责同步dycommondatabase20dyulcentermanage下的数据,另一个负责同步dyacdb34dyulcenterm_bak

首先添加两个primaryextractgroup,因为这是一个两节点的RAC,我们需要指定threads2选项

GGSCI(rac1)4>addextractw1ext,tranlog,threads2,beginnow

EXTRACTadded.

GGSCI(rac1)5>infoall

ProgramStatusGroupLagTimeSinceChkpt

MANAGERSTOPPED
EXTRACTSTOPPEDDYEXT00:00:0000:00:07

编辑w1ext的参数文件:

1.EXTTRAIL参数指定该抽取进程对应的exttrail
2.DISCARDFILE参数指定一个文件,用来记录不能正常处理的记录,这里使用追加方式,最大为5MB
3.TRANLOGOPTIONSALTARCHIVELOGDEST指定源数据库归档所在的路径。如果不确定,使用该SQL*Plus命令:showparameterlog_archive_dest_1
4.TRANLOGOPTIONSALTARCHIVEDLOGFORMAT指定了归档文件的命名格式,可以通过SQL*Plus命令showparameterlog_archive_format来确定该格式
5.由于源数据使用了ASM,这里通过tranlogoptionsasmuser来提供登录ASM实例的用户名和密码(用户名必须是SYS)
6.DDLINCLUDEMAPPED表示只捕获MAPPED范围内的DDL操作
7.DDLOPTIONSADDTRANDATA:当创建新的表时,自动为其启用追加日志
8.FETCHOPTIONSMISSINGROWREPORT表示当extract需要获取的行在源库中无法定位时,extract进程继续运行,相关的错误信息会保存在discardfile参数指定的文件中;USESNAPSHOT表示extract使用flashback查询来从undo从获取一些数据,比如无法从redo中直接获取的UDT、嵌套表、XMLtype以及9i中的LOBNOUSELATESTVERSION使得extract当无法从undo中获取数据时,忽略该条件而不是从源表中获取当前值。
9.STATOPTIONSREPORTFETCH:使用ggsci命令stats时,显示获取的行的统计信息
10.WARNLONGTRANS1H,CHECKINTERVAL5M:当发现超过1个小时的长事务时,会在错误日志中产生一条warning5分钟检测一次

GGSCI(rac1)6>editparamsw1ext

EXTRACTw1ext
USERIDgoldengate,PASSWORDgoldengate
EXTTRAIL/opt/gg/trails/w1
DISCARDFILEw1extdsc,APPEND,MEGABYTES5
TRANLOGOPTIONSALTARCHIVELOGDEST+RECOVERY_DG
TRANLOGOPTIONSALTARCHIVEDLOGFORMAT%t_%s_%r.dbf
TRANLOGOPTIONSASMUSERSYS@ORADB_ASM,ASMPASSWORDBBB
DDLINCLUDEMAPPED
DDLOPTIONSADDTRANDATA
FETCHOPTIONS,USESNAPSHOT,NOUSELATESTVERSION,MISSINGROWREPORT
STATOPTIONSREPORTFETCH
WARNLONGTRANS1H,CHECKINTERVAL5M
TABLEdycommondatabase20.*;
TABLEdyulcentermanage.*;


添加该extract对应的trail文件,用来存储抽取的数据。单个文件大小设置为100MB
GGSCI(rac1)7>addexttrail/opt/gg/trails/w1,extractw1ext,MEGABYTES100
EXTTRAILadded.

添加secondaryextractgroup,即datapump

GGSCI(rac1)8>ADDEXTRACTw1extdp,EXTTRAILSOURCE/opt/gg/trails/w1,BEGINnow
EXTRACTadded.

编辑参数文件
RMTHOST后面跟目标端的ip或主机名(需在hosts文件中有对应ip解析)manager进程的端口号;RMTTRAIL指定目标端的trail文件所在位置

GGSCI(rac1)9>editparamsw1extdp

EXTRACTw1extdp
USERIDGOLDENGATE,PASSWORDGOLDENGATE
RMTHOST192.168.47.211,MGRPORT5898
RMTTRAIL/opt/gg/trails/w1
DISCARDFILEw1extdpdsc,APPEND,MEGABYTES5
TABLEdycommondatabase20.*;
TABLEdyulcentermanage.*;
~
~
添加该rmttrail

GGSCI(rac1)10>addrmttrail/opt/gg/trails/w1,extractw1extdp,megabytes100
RMTTRAILadded.


类似的,我们添加第二组primary&secondaryextract以及exttrail&rmttrail
GGSCI(rac1)11>addextractw2ext,tranlog,threads2,beginnow
EXTRACTadded.

GGSCI(rac1)12>editparamsw2ext

EXTRACTw2ext
USERIDgoldengate,PASSWORDgoldengate
EXTTRAIL/opt/gg/trails/w2
DISCARDFILEw2extdsc,APPEND,MEGABYTES5
TRANLOGOPTIONSALTARCHIVELOGDEST+RECOVERY_DG
TRANLOGOPTIONSALTARCHIVEDLOGFORMAT%t_%s_%r.dbf
TRANLOGOPTIONSASMUSERSYS@ORADB_ASM,ASMPASSWORDBBB
DDLINCLUDEMAPPED
DDLOPTIONSADDTRANDATA
FETCHOPTIONS,USESNAPSHOT,NOUSELATESTVERSION,MISSINGROWREPORT
STATOPTIONSREPORTFETCH
WARNLONGTRANS1H,CHECKINTERVAL5M
TABLEdyacdb34.*;
TABLEdyulcenterm_bak.*;

GGSCI(rac1)13>addexttrail/opt/gg/trails/w2,extractw2ext,MEGABYTES100
EXTTRAILadded.

GGSCI(rac1)14>ADDEXTRACTw2extdp,EXTTRAILSOURCE/opt/gg/trails/w2,BEGINnow
EXTRACTadded.

GGSCI(rac1)15>editparamsw2extdp

EXTRACTw2extdp
USERIDGOLDENGATE,PASSWORDGOLDENGATE
RMTHOST192.168.47.211,MGRPORT5898
RMTTRAIL/opt/gg/trails/w2
DISCARDFILEw1extdpdsc,APPEND,MEGABYTES5
TABLEdyacdb34.*;
TABLEdyulcenterm_bak.*;
~
~

GGSCI(rac1)16>addrmttrail/opt/gg/trails/w2,extractw2extdp,megabytes100
RMTTRAILadded.



配置目标端replicat


回到目标端,使用goldengate用户登录到ggsci命令行中,对应前面的两组extractdatapump增加两个replicat

GGSCI(ggdb)6>addreplicatw1rep,exttrail/opt/gg/trails/w1,checkpointtablegoldengate.chkpoint
REPLICATadded.

这里的handlecollisions参数在目标端数据初始化并同步之后去掉

编辑参数文件:
1.assumetargetdefs:由于在这里我们源端和目标端的表结构是完全一致的,因此使用这个参数来使replicat不用去查看相关的定义文件,从而提高效率
2.DDLOPTIONSREPORT:将ddl的具体信息写入到报告文件中
3.BATCHSQL:将相似的SQL语句放到一个数组中以加快执行速度。在normal模式下,repliat同一时间只应用一条sql语句。
4.DBOPTIONSDEFERREFCONST:将完整性约束推迟到replicat事务提交以后再检测
5.如果数据库版本在10.2.0.511.2.0.2以后,可以使用DBOPTIONSSUPPRESSTRIGGERSreplicat会话中禁用触发器。如果不是,应该在目标端数据库中禁用触发器(触发器产生的DML操作会从源端同步到目标端)
6.DBOPTIONSLOBWRITESIZE:将要写入目标库的LOB数据缓存在内存中,当达到参数中指定的大小时写入数据,以减少I/O。这个值的范围是2KB1MB,默认为32KB
7.DDLERRORDEFAULTDISCARDRETRYOPMAXRETRIES5RETRYDELAY20:当出现DDL错误,重试5次,时间间隔为20秒。如果失败,replicat会继续运行,但相关信息会记录在discardfile中。
8.HANDLECOLLISIONS:当replicat往表中插入一条记录,而该记录已经存在,则进行覆盖;当replicat在表中试图更新或删除一条记录,而该记录不存在,则该操作被丢弃。这个参数一般在initial-dataload中使用,在源和目标端的数据同步之后应该将该参数删除
9.MAPTARGET:源表和目标表之间的映射,可以使用通配符

GGSCI(ggdb)7>editparamsw1rep

REPLICATw1rep
ASSUMETARGETDEFS
USERIDGOLDENGATE,PASSWORDGOLDENGATE
DISCARDFILEw1repdsc,APPEND,MEGABYTES5
DDLINCLUDEMAPPED
DDLOPTIONSREPORT
BATCHSQL
DBOPTIONSDEFERREFCONST
DBOPTIONSLOBWRITESIZE102400
HANDLECOLLISIONS
DDLERRORDEFAULTDISCARDRETRYOPMAXRETRIES5RETRYDELAY20
MAPdycommondatabase20.*,TARGETdycommondatabase20.*;
MAPdyulcentermanage.*,TARGETdyulcentermanage.*;
~
~
~

同样地再配置一个replicat进程w2rep
GGSCI(ggdb)8>addreplicatw2rep,exttrail/opt/gg/trails/w2,checkpointtablegoldengate.chkpoint
REPLICATadded.

GGSCI(ggdb)9>editparamsw2rep

REPLICATw2rep
ASSUMETARGETDEFS
USERIDGOLDENGATE,PASSWORDGOLDENGATE
DISCARDFILEw2repdsc,APPEND,MEGABYTES5
DDLINCLUDEMAPPED
DDLOPTIONSREPORT
BATCHSQL
DBOPTIONSDEFERREFCONST
DBOPTIONSLOBWRITESIZE102400
HANDLECOLLISIONS
DDLERRORDEFAULTRETRYOPMAXRETRIES5RETRYDELAY20
MAPdyacdb34.*,TARGETdyacdb34.*;
MAPdyulcenterm_bak.*,TARGETdyulcenterm_bak.*;
~

ADDTRANDATA


在启动goldengate相关进程之前,在目标端使用trandata对源数据库中需要同步的表启用对象级别的追加日志

GGSCI(rac1)17>dbloginuseridgoldengate,passwordgoldengate
Successfullyloggedintodatabase.

GGSCI(rac1)18>addtrandatadycommondatabase20.*
LoggingofsupplementalredodataenabledfortableDYCOMMONDATABASE20.AUDITCONFIG.

LoggingofsupplementalredodataenabledfortableDYCOMMONDATABASE20.AUDITHISTORY.
……

如果表中没有主键和唯一键,会产生一条警告,例如:
2011-12-0822:53:11WARNINGOGG-00869NouniquekeyisdefinedfortableUDPPACKPORTSET.Allviablecolumnswillbeusedtorepresentthekey,butmaynotguaranteeuniqueness.KEYCOLSmaybeusedtodefinethekey.

GGSCI(rac1)19>addtrandatadyulcentermanage.*
……
GGSCI(rac1)20>addtrandatadyacdb34.*
……
GGSCI(rac1)21>addtrandatadyulcenterm_bak.*
……

业务表中没有主键和唯一键,这是个很糟糕的习惯,这里就不批判了...

数据初始化(initialdataload)


在进行同步以前,要先对目标端的数据进行初始化
在线迁移有几种方法,这里采取比较靠谱的两种:通过数据库工具(expdp/impdp)和通过文件导入到replicat。我们将这两种方法分别应用在两组抽取/复制对应的4个数据库用户上。w1ext对应的dycommondatabase20用户和dyulcentermanage使用前者,w2ext对应的dyacdb34dyulcenterm_bak使用后者。

通过expdp/impdp来迁移初始数据


流程图如下:



准备工作


1.禁用DDL的抽取和复制
extractreplicat参数中将ddl去掉。实际上,若能保证在expdp导出数据期间不会有ddl操作,可以忽略此项
2.replicat中使用HANDLECOLLISIONS参数。每一个目标表都必须由一个主键或唯一键。如果没有,使用KEYCOLS选项来代替,如果不能指定,祈祷不会出现两条完全一样的记录吧...

在源端和目标端打开MANAGER


在源端和目标端执行ggsci命令startmgr,启动manager进程

在源端,打开extract进程
GGSCI(rac1)35>startextw1ext

SendingSTARTrequesttoMANAGER...
EXTRACTW1EXTstarting

GGSCI(rac1)36>startextw1extdp

SendingSTARTrequesttoMANAGER...
EXTRACTW1EXTDPstarting


GGSCI(rac1)37>infoall

ProgramStatusGroupLagTimeSinceChkpt

MANAGERRUNNING
EXTRACTRUNNINGW1EXT00:00:0000:00:05
EXTRACTRUNNINGW1EXTDP00:00:0002:00:51
EXTRACTSTOPPEDW2EXT00:00:0001:54:09
EXTRACTSTOPPEDW2EXTDP00:00:0001:50:00

在源端,执行expdp导出数据


首先需要在源数据中创建一个directory

SQL>createdirectoryexpdpdiras'/bak/expdpdata';

Directorycreated.

执行导出:
[oracle@rac1~]$expdpsystem/aaadirectory=expdpdirdumpfile=w1data_%U.dmplogfile=w1data.logschemas=dycommondatabase20,dyulcentermanageparallel=4

将初始数据导入到目标数据库


先通过ftpexpdp导出的文件拷贝到目标主机上:


目标端:
[oracle@ggdb~]$ftp192.168.47.241
Connectedto192.168.47.241.
……
ftp>cd/bak/expdpdata
250Directorysuccessfullychanged.
ftp>lcd/bak/impdpdata
Localdirectorynow/bak/impdpdata
ftp>bin
200SwitchingtoBinarymode.
ftp>mgetw1*

创建directory
SQL>createdirectoryimpdpdiras'/bak/impdpdata';

Directorycreated.

需要的表空间也要先创建好

数据导入:
impdpsystem/aaadirectory=impdpdirdumpfile=w1data_%U.dmplogfile=w1data_impdp.logschemas=dycommondatabase20,dyulcentermanageparallel=4


由于数据库版本是10.2.0.4,需要在目标库中禁用我们要同步的用户中的触发器
SQL>

begin
forxin(selectowner,trigger_namefromdba_triggers
whereownerin('DYCOMMONDATABASE20','DYULCENTERMANAGE'))
loop
executeimmediate'altertrigger'||x.owner||'.'||x.trigger_name||'disable';
endloop;
end;

/


在目标端,启动复制进程


impdp导入结束之后,启动复制进程

GGSCI(ggdb)51>startrepdyrep

SendingSTARTrequesttoMANAGER...
REPLICATDYREPstarting

通过inforeplicatdyrep命令来查看复制的状态

在目标端的数据变化追上initial-load结束的时间点后,关闭handlecollisions参数:先使用SENDREPLICAT命令使之对运行中的replicat生效,然后修改参数文件,使其在下一次启动时生效。

GGSCI(ggdb)57>SENDREPLICATw1rep,NOHANDLECOLLISIONS

SendingNOHANDLECOLLISIONSrequesttoREPLICATW1REP...
W1REPNotablesfoundmatchingGOLDENGATE.*tosetNOHANDLECOLLISIONS.

然后修改dyrep参数文件,去掉handlecollisions参数

通过文件到replicat方式来迁移初始数据


流程图如下所示



expdp/impdp的优势之一就是导入很快,而通过文件到replicat的方式,需要一条一条地应用到目标库中,因此导入是最慢的

准备工作


1.禁用DDL的抽取和复制
2.确认目标端表是空的
3.禁用外键及check约束
4.replicat中使用HANDLECOLLISIONS参数
5.可以删除大表中的索引以加快导入速度,导入结束后再重建索引

在源端和目标端打开MANAGER


在源端和目标端执行ggsci,打开manager
startmgr
这一步在上面已经做过了,就不再重复


配置初始化extract


在源端,添加一个extract,并配置参数

GGSCI(rac1)1>addextracteinit,sourceistable
EXTRACTadded.

参数说明:
1.SOURCEISTABLE:将源数据库中指定的表中的所有记录导出到指定的文件中,一般用于initial-dataload
2.RMTFILE:目标文件的路径。设置最大文件数和最大文件大小,否则当文件超过2GB时会出错

GGSCI(rac1)2>editparamseinit

EXTRACTeinit
SOURCEISTABLE
USERIDGOLDENGATE,PASSWORDGOLDENGATE
RMTHOST192.168.47.211,MGRPORT5898
RMTFILE/opt/gg/trails/initdata,purge,maxfiles100,megabytes1024
TABLEdyacdb34.*;
TABLEdyulcenterm_bak.*;

在目标库中创建表空间、用户及表结构


在导入数据以前,需要准备好这个容器
我们使用expdp来导出,不导出表中的数据:

源端:
[oracle@rac1~]$expdpsystem/aaadirectory=expdpdirdumpfile=w2data.dmplogfile=w2data.logschemas=DYACDB34,DYULCENTERM_BAKexclude=table_data,table_statistics

目标端:
[oracle@ggdb~]$ftp192.168.47.241
Connectedto192.168.47.241.
……
ftp>cd/bak/expdpdata
250Directorysuccessfullychanged.
ftp>lcd/bak/impdpdata
Localdirectorynow/bak/impdpdata
ftp>bin
200SwitchingtoBinarymode.
ftp>mgetw2*

导入用户及其表结构:
[oracle@ggdb~]$impdpsystem/aaadirectory=impdpdirdumpfile=w2data.dmplogfile=w2data_imp.logschemas=DYACDB34,DYULCENTERM_BAK

禁用约束:
SQL>
begin
forxin(selectowner,table_name,constraint_namefromdba_constraintswhereownerin('DYACDB34','DYULCENTERM_BAK')andconstraint_typein('C','R'))loop
executeimmediate'altertable'||x.owner||'.'||x.table_name||
'disableconstraint'||x.constraint_name;
endloop;
dbms_output.put_line('ok');
end;
/

禁用触发器:
SQL>
begin
forxin(selectowner,trigger_namefromdba_triggers
whereownerin('DYACDB34','DYULCENTERM_BAK'))
loop
executeimmediate'altertrigger'||x.owner||'.'||x.trigger_name||'disable';
endloop;
end;
/

在源端,打开抽取进程


GGSCI(rac1)3>startextw2ext
SendingSTARTrequesttoMANAGER...
EXTRACTW2EXTstarting

GGSCI(rac1)4>startextw2extdp
SendingSTARTrequesttoMANAGER...
EXTRACTW2EXTDPstarting

GGSCI(rac1)5>infoall

ProgramStatusGroupLagTimeSinceChkpt

MANAGERRUNNING
EXTRACTRUNNINGW1EXT00:00:0000:00:08
EXTRACTRUNNINGW1EXTDP00:00:0000:00:05
EXTRACTRUNNINGW2EXT02:58:5700:00:04
EXTRACTRUNNINGW2EXTDP00:00:0003:03:40

在源端,启动initial-loadextract


[goldengate@rac1~]$cd$GG_HOME
[goldengate@rac1goldengate]$./extractparamfiledirprm/einit.prmreportfile/opt/gg/einit.log

通过查看报告文件监控抽取的过程和结果,直到抽取结束

配置初始化replicat


在目标端,添加一个replicat,并配置参数

GGSCI(rac2)1>addreplicatrinit,specialrun
REPLICATadded.

参数说明:
1.SPECIALRUN:一次性的导入,不会产生checkpoint。一般用于通过文件到replicat的初始数据的加载,或者批量进行更新同步
2.EXTFILE:指定数据所在文件的路径,文件名需要输入全称
3.ASSUMETARGETDEFS:由于源和目标数据需要同步的表的结构一致,指定该参数以提高效率

GGSCI(rac2)2>editparamsrinit

REPLICATrinit
SPECIALRUN
USERIDGOLDENGATE,PASSWORDGOLDENGATE
EXTFILE/opt/gg/trails/initdata000000
ASSUMETARGETDEFS
MAPDYACDB34.*,TARGETDYACDB34.*;
MAPDYULCENTERM_BAK.*,TARGETDYULCENTERM_BAK.*;

在目标端,启动initial-loadreplicat


[goldengate@ggdbgoldengate]$cd$GG_HOME
[goldengate@ggdbgoldengate]$./replicatparamfiledirprm/rinit.prmreportfile/opt/gg/rinit.log

我的测试环境中由于生成了3extfile,需要修改rinit参数文件,将extfile文件名修改,再执行2次。也可以增加两个specialrunreplicat来同时执行。导入结束后注意查看生成的日志,确保没有出现错误

在目标端,启动复制进程


initial-loadreplication结束之后,启动复制进程

GGSCI(ggdb)51>startrepw2rep

SendingSTARTrequesttoMANAGER...
REPLICATW2REPstarting

通过inforeplicatw2rep命令来查看复制的状态

在目标端的数据变化追上initial-load结束的时间点后,关闭handlecollisions参数:先使用SENDREPLICAT命令使之对运行中的replicat生效,然后修改参数文件,使其在下一次启动时生效。

GGSCI(ggdb)57>SENDREPLICATw2rep,NOHANDLECOLLISIONS

SendingNOHANDLECOLLISIONSrequesttoREPLICATW2REP...
W2REPNotablesfoundmatchingGOLDENGATE.*tosetNOHANDLECOLLISIONS.

然后修改w2rep参数文件,去掉handlecollisions参数

重新启用目标数据库中导入数据前禁用的约束:

SQL>
begin
forxin(selectowner,table_name,constraint_namefromdba_constraintswhereownerin('DYACDB34','DYULCENTERM_BAK')andconstraint_typein('C','R'))loop
executeimmediate'altertable'||x.owner||'.'||x.table_name||
'enableconstraint'||x.constraint_name;
endloop;
dbms_output.put_line('ok');
end;
/




可以试着在源数据库中进行一些ddldml操作,在目标端使用ggsci命令stats或在数据库中查看更改是否被应用了。

这里GoldenGate就配置完成了
日常管理和维护


启动关闭使用startstopggsci命令,查看状态使用infostatus命令,查看统计信息使用stats命令,注意查看discard文件和其他日志文件(比如goldengate安装目录下的ggserror.log和源端user_dump_dest下的ggs_ddl_trace.log)这里不再赘述


故障切换


RAC环境中,最好将GoldenGate相关的二进制文件、参数文件、trail文件等都放在共享存储上。正常情况下,由其中一个节点来执行GoldenGate进程。当这个节点发生故障时,可以将GoldenGate文件所在目录重新挂载到另一个节点中,这样就可以从中断的地方继续工作。

在这个测试中,extract进程运行在rac1中,如果rac1发生了故障,rac2准备接管(相关os用户和目录应该在先前已经建好)

挂载到rac2上:
[root@rac2~]#mount/dev/sdg1/opt/gg
[root@rac2~]#ls-l/opt/gg
total24
drwxr-xr-x14goldengateoinstall4096Nov2801:57goldengate
drwxrwxr-x2goldengateoinstall16384Nov2801:05lost+found
drwxr-xr-x2goldengateoinstall4096Nov2801:57trails

然后切换到goldengate用户,启动managerextract进程

[root@rac2~]#su-goldengate
[goldengate@rac2~]$cd/opt/gg/goldengate/
[goldengate@rac2goldengate]$./ggsci

GGSCI(rac2)1>startmgr

Managerstarted.

GGSCI(rac2)2>infoall

ProgramStatusGroupLagTimeSinceChkpt

MANAGERRUNNING
EXTRACTABENDEDDYEXT00:00:0000:01:19
EXTRACTABENDEDDYEXTDP00:00:0000:01:18

GGSCI(rac2)3>startext*

SendingSTARTrequesttoMANAGER...
EXTRACTDYEXTstarting

SendingSTARTrequesttoMANAGER...
EXTRACTDYEXTDPstarting

GGSCI(rac2)4>infoall

ProgramStatusGroupLagTimeSinceChkpt

MANAGERRUNNING
EXTRACTRUNNINGDYEXT00:00:0000:00:01
EXTRACTABENDEDDYEXTDP00:00:0000:14:53

此时primaryextract进程开始正常工作,datapump进程处于abended状态。这是正常的,这是因为rac1发生了节点故障,相关事务在rac2上执行回滚,但extract不能捕获到回滚动作,这些事务还存在于extract事务列表中。
默认情况下,GoldenGate会花一定的时间确认该事务(默认为10分钟),然后从列表中清除它们。然后再启动datapump进程,可以正常运行:

GGSCI(rac2)24>startextdyextdp

SendingSTARTrequesttoMANAGER...
EXTRACTDYEXTDPstarting


GGSCI(rac2)25>infoall

ProgramStatusGroupLagTimeSinceChkpt

MANAGERRUNNING
EXTRACTRUNNINGDYEXT00:00:0000:00:02
EXTRACTRUNNINGDYEXTDP00:00:0008:23:02


注意rac2tnsnames.oralistener.ora里关于ASM已经正确配置,否则extract进程会起不来。



一些错误和警告信息

错误:


OGG-00052OracleGoldenGateDeliveryforOracle,dyrep.prm:Noreplicationmapsspecified.
replicat配置文件中必须指定map,target参数

OGG-00212OracleGoldenGateDeliveryforOracle,dyrep.prm:InvalidoptionforMAP:xxx
replicat参数中map子句语法不正确(,/等符号前加上空格)

OGG-00259OracleGoldenGateDeliveryforOracle,dyrep.prm:Schemanamecannotbewildcarded.
replicat参数的map,target参数中,schema不能使用通配符

dblogin登录失败:
dbloginuseridgoldengate,passwordgoldengate报错ERROR:FailedtoopendatasourceforuserGOLDENGATE
syssystem或其它具有DBA权限的用户可以使用dblogin登录,然后再登录goldengate能成功.
解决办法:授予goldengate用户selectanydictionary权限


警告:

OGG-00869OracleGoldenGateCommandInterpreterforOracle:Nouniquekeyisdefinedfortablexxx.Allviablecolumnswillbeusedtorepresentthekey,butmaynotguaranteeuniqueness.KEYCOLSmaybeusedtodefinethekey.
xxx表没有唯一键,若数据库中不能对表添加主键或唯一约束,可以使用goldengateKEYCOLS参数指定能准确标识行的列。否则该表的所有字段都将被保存到redo中用以标识更改的行。

OGG-01756OracleGoldenGateCommandInterpreterforOracle:CannotregisterEXTRACTDYEXTwithdatabasebecauseofthefollowingSQLerror:OCIErrorORA-06550:line1,column3128:PL/SQL:ORA-00942:tableorviewdoesnotexistORA-06550:line1,column3117:PL/SQL:SQLStatementignored(status=0).SeeExtractuserprivilegesintheOracleGoldenGateforOracleInstallationandSetupGuide.YoucanmanuallyregisterthisgroupwiththeREGISTEREXTRACTcommand.
处理方法请见数据库方面的准备中的创建goldengate数据库用户后半段

RAC环境中threads变更后如何确保goldengate继续正常复制

当rac节点变更的时候,比如我们添加或者删除了集群中的节点,理所当然会对节点对应的logthreads进行添加或者删除,但会造成goldengate的maplogthreads的顺序发生紊乱。在进行这一类行为变更的时候,特别需要注意goldengate端也需要进行特别处理。

比如,在节点添加之前,goldengatemaplogthreads顺序如下(数据库logthread在后,下同):

1—>1(假设是sequence100,rba1001)

2—>2(假设是sequence88,rba3009)

当添加节点后,maplogthreads的顺序会变成:

1—->3(sequence88,rba3009)

2—->1(sequence100,rba1001)

3—->2(new)

当ogg重新工作的时候,因为此时map的顺序发生了变化,因此会造成抽取进度出现问题。

如果有足够的处理时间,简单而又安全的做法是停止源端应用,删除extract进程后,重新配置新的extract进程并从当前开始抽取。但在这段时间内,所有的操作需确保在应用已经停止服务的前提下,否则数据将造成丢失或者不一致,需要手工处理或者重新初始化。

如果应用无法停机呢?我们可以将新建的extract进度修改成停止之前的进度状态,从而避免操作过程中应用的停机行为。

需要我们特别记录的checkpoint有:CurrentCheckpoint、RecoveryCheckpoint以及WriteCheckpoint

1.正常停止extract(略)

2.获得extract的checkpoint记录

GGSCI(node1)21>infoext_r1showch

EXTRACTEXT_R1LastStarted2011-08-1622:35StatusSTOPPEDCheckpointLag00:00:00(updated00:06:21ago)LogReadCheckpointOracleRedoLogs2011-08-1703:32:48Thread1,Seqno62,RBA29890576LogReadCheckpointOracleRedoLogs2011-08-1703:32:34Thread2,Seqno42,RBA18674704

CurrentCheckpointDetail:

ReadCheckpoint#1

OracleRACRedoLog

StartupCheckpoint(startingpositioninthedatasource):Thread#:1Sequence#:61RBA:32112656Timestamp:2011-08-1622:34:53.000000SCN:0.3743980(3743980)RedoFile:+DATA1/my/onlinelog/group_1.261.758327805

RecoveryCheckpoint(positionofoldestunprocessedtransactioninthedatasource):Thread#:1Sequence#:62RBA:29890576Timestamp:2011-08-1703:32:48.000000SCN:0.3811675(3811675)RedoFile:+DATA1/my/onlinelog/group_2.262.758327805

CurrentCheckpoint(positionoflastrecordreadinthedatasource):Thread#:1Sequence#:62RBA:29890576Timestamp:2011-08-1703:32:48.000000SCN:0.3811675(3811675)RedoFile:+DATA1/my/onlinelog/group_2.262.758327805

BRPreviousRecoveryCheckpoint:Thread#:1Sequence#:0RBA:0Timestamp:2011-08-1622:35:09.416136SCN:NotavailableRedoFile:

BRBeginRecoveryCheckpoint:Thread#:1Sequence#:62RBA:22437392Timestamp:2011-08-1702:35:11.000000SCN:0.3798208(3798208)RedoFile:

BREndRecoveryCheckpoint:Thread#:1Sequence#:62RBA:24120320Timestamp:2011-08-1702:35:16.000000SCN:0.3801192(3801192)RedoFile:

ReadCheckpoint#2

OracleRACRedoLog

StartupCheckpoint(startingpositioninthedatasource):Thread#:2Sequence#:41RBA:25323024Timestamp:2011-08-1622:34:40.000000SCN:0.3743980(3743980)RedoFile:+DATA1/my/onlinelog/group_3.266.758328125

RecoveryCheckpoint(positionofoldestunprocessedtransactioninthedatasource):Thread#:2Sequence#:42RBA:18674704Timestamp:2011-08-1703:32:34.000000SCN:0.3811674(3811674)RedoFile:+DATA1/my/onlinelog/group_4.267.758328125

CurrentCheckpoint(positionoflastrecordreadinthedatasource):Thread#:2Sequence#:42RBA:18674704Timestamp:2011-08-1703:32:34.000000SCN:0.3811674(3811674)RedoFile:+DATA1/my/onlinelog/group_4.267.758328125

BRPreviousRecoveryCheckpoint:Thread#:2Sequence#:0RBA:0Timestamp:2011-08-1622:35:09.416136SCN:NotavailableRedoFile:

BRBeginRecoveryCheckpoint:Thread#:2Sequence#:42RBA:15242240Timestamp:2011-08-1702:35:02.000000SCN:0.3800455(3800455)RedoFile:

BREndRecoveryCheckpoint:Thread#:2Sequence#:42RBA:15242240Timestamp:2011-08-1702:35:02.000000SCN:0.3800455(3800455)RedoFile:

WriteCheckpoint#1

GGSLogTrail

CurrentCheckpoint(currentwriteposition):Sequence#:3RBA:51132Timestamp:2011-08-1703:32:48.695373ExtractTrail:/opt/ggs/dirdat/r1/ex

Header:Version=2RecordSource=AType=6#InputCheckpoints=2#OutputCheckpoints=1

FileInformation:BlockSize=2048MaxBlocks=100RecordLength=4096CurrentOffset=0

Configuration:DataSource=3TransactionIntegrity=1TaskType=0

Status:StartTime=2011-08-1622:35:10LastUpdateTime=2011-08-1703:32:48StopStatus=GLastResult=402

3.新建extract进程。

GGSCI(node1)34>ADDEXText_r1,BEGINNOW,TRANLOG,THREADS3

2011-08-1703:52:26INFOOGG-01749SuccessfullyregisteredEXTRACTEXT_R1tostartmanaginglogretentionatSCN3826107.EXTRACTadded.

4.修改currentcheckpoint(注意每个thread都要修改)

GGSCI(node1)35>alterEXTRACText_r1,TRANLOG,EXTSEQNO62,EXTRBA29890576,thread1EXTRACTaltered.

GGSCI(node1)36>alterEXTRACText_r1,TRANLOG,EXTSEQNO42,EXTRBA18674704,thread2

EXTRACTaltered.

5.修改recoverycheckpoint(注意每个thread都要修改)

GGSCI(node1)42>ALTEREXTRACText_r1,IOEXTSEQNO62,IOEXTRBA29890576,thread1

GGSCI(node1)42>ALTEREXTRACText_r1,IOEXTSEQNO42,IOEXTRBA18674704,thread2

6.修改exttrail或者rmttrail的writecheckpoint

GGSCI(node1)47>ADDEXTTRAIL/opt/ggs/dirdat/r1/ex,SEQNO3,RBA51132,EXTRACText_r1EXTTRAILadded.

7.验证checkpoint是否修改成功(使用showch,略)

8.重新启动extract(略)

oracle-oraclegoldengate零停机初始化的技巧

在实施goldengate过程中,初始化的方案选择是一个重要的环节,尤其对一个7*24小时的系统环境来讲。一个出色的goldengate的实施不应该以停机时间作为代价,合适的初始化方法完全可以做到零停机。

如果事务不间断进行,如何保证初始化过程中事务的完整性和数据的准确性呢(静态的初始化环境无需多讲)?实现方法还是多样的,从工作机制上来讲,归纳起来主要有2种。

1.利用Keys+Handlecollisions

2.利用commitSCN/CSN

Handlecollisions参数依赖于表上的Key(Primarykey/Uniquekey)来对数据进行重复行和缺失行的处理,常在数据初始化过程中保证数据的一致性,gg文档上的初始化办法,比如initialload,都是用的这种办法。但是这种办法在实际的工程实施中是有相当大的限制。

首先,该初始化办法性能比较糟糕,对于大型数据库来讲,并不合适。更严重的是,它有很大的缺陷性。(引自metalinkdoc):

1.Whenthereisprimarykeyupdate(PKUpdate),theHANDLECOLLISIONSmethodmaylosedata.ThesolutioninthecaseofaprimarykeyupdateisforExtracttofetchwholerowbymakingaflashbackquery.However,thisisnotefficientandmaynotbepossibleincertainenvironments.

2.Whenatabledoesnothaveanytypeofkey,HANDLECOLLISIONSmayintroduceduplicaterowsinthetable.Oneworkaroundistoaddaprimaryoruniquekeytothetargettable.

3.Theexacttimestampwhentheinitialloadwasstartedmaynotbeknown(anddifferenttablesmayhavedifferentstarttimes),soitisalmostinevitablethatHANDLECOLLISIONSwillbeusedforcertainrecordsun-necessarily.Thiscouldmaskarealdataintegrityproblem.

在实际的工程实施中,个人不推荐使用基于Keys+Handlecollisions模式的初始化办法。

那么基于commitSCN的初始化办法是否可靠呢?如果你用过逻辑备库,Stream等东西,退一步讲,抑或是做过一致性的导入导出,应该很清楚SCN在版本一致性方面的重要作用。

问题简单化,goldengate初始化的的核心问题就变成了如何联机进行基于SCN一致性的同步。实现的工具和方法还是不少的。

1.一致性的exp和imp

2.一致性的expdp和impdp

通过exp和expdp的一致性参数(例如flashback_scn),导出特定SCN点上的一致性版本,使用这种方法初始化存在一个问题,就是构造一致性数据过程中会对undo造成比较大的压力,尤其对大型数据库来讲,可以通过分割的datapump来实现数据的分组同步,分散undo的压力,然后合适时间将分组的datapump合并即可。

该方法的优点就是可以跨平台和跨版本初始化。

3.基于备份的表空间搬移(TransportableTablespacefromBackupwithRMAN)

为何是基于备份的表空间搬移呢?单纯的表空间搬移需要数据库或者表空间readonly,copy数据文件的这段时间应用是需要停止的,因此表空间搬移并不适合7*24小时的初始化环境。

基于备份的表空间搬移的一个最大的优势就是零停机,而且支持异构平台和跨版本(对于不同字节顺序的source-target平台初始化,需要进行convert),但是需要10g以上版本才支持,同样受到表空间搬移的那些限制条件。

4.Dataguard

Dataguard适合同平台同版本的系统环境初始化。

当然,在实际工程中,还会有别的一些处理办法,或者各种办法之间有交融,作为方案制定者和实施者,你所能驾驭的,就是对你来说合适的。