Oracle RAC环境实时数据迁移

Oracle RAC环境实时数据迁移

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

系统要求及安装前的说明

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

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

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

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

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

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

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

Oracle GoldenGate追踪文件的存储

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

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

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

可以按照这个公式来预测需要的追踪文件大小 [log volume in one hour] x [number of hours downtime] x .4 = trail disk space 这里使用了40%,因为GoldenGate只需要事务日志中大约40%的数据。

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

Oracle RAC

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

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

TCP/IP

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

操作系统权限

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

安腾处理器的要求

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

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

数据库方面的要求

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

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

GoldenGate的安装

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

环境变量

首先要在操作系统中设置相关的环境变量,首先是ORACLE_HOME和ORACLE_SID,如果不能在操作系统中设置环境变量,或者系统中存在使用GoldenGate来传输数据的多个实例,那么在UNIX系统中可以在每个抽取/复制进程组中设置参数,格式为:SETENV (ORACLE_HOME = <path to Oracle home location>) 及 SETENV (ORACLE_SID = <SID>) 还需要将GoldenGate安装目录添加到共享库的环境变量中,如: export LD_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命令行中执行命令创建工作目录:CREATE SUBDIRS

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



安装DDL支持


如何配置GoldenGate来捕获和传输ddl,在Oracle GoldenGate Windows and UNIX Administrators Guide中有比较详细的说明。下面列出一个表格,说明下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

DDL schema

包含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

确认GoldenGate DDL对象已经安装

ddl_status.sql

marker_status.sql

确认标记表已经安装

marker_status.sql

ddl_tracelevel.sql

设置DDL跟踪的级别

ddl_tracelevel.sql



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


1. DDL对象选择一个schema

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

GRANT EXECUTE ON UTL_FILE TO <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触发器需要这个权限,触发器会被安装在SYS schema中。

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

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)
 )
 )


配置字符集

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

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

view plaincopy to clipboardprint?

1 SHOW PARAMETER NLS_LANGUAGE 

2 SHOW PARAMETER NLS_TERRITORY 

3 SELECT name, value$ from SYS.PROPS$ WHERE name = 'NLS_CHARACTERSET'; 

4 SHOW PARAMETER NLS_LENGTH_SEMANTICS 

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


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

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


配置Oracle redo日志

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

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

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

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

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


GoldenGateALO模式

你可以配置抽取进程来专门从归档日志中读取,这也叫做Archived Log Only(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表空间需要的大小: <undo space> = <UNDO_RETENTION> * <UPS> + <overhead>

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

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

4. GoldenGate抽取用户授权: GRANT FLASHBACK ANY TABLE TO <db_user>; 或 GRANT FLASHBACK ON <owner.table> TO <db_user>;


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

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

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

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

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

5. 使用FETCHOPTIONS参数中的USELATESTVERSIONNOUSELATESTVERSION选项来处理flashback queries失败的情况。如果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在它的会话中禁用触发器;若版本为Oracle 9.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中使用ADD TRANDATA命令来配置数据库,使其在记录行的变化时也记录下键的值,这样redo中的记录对于GoldenGate是可用的。默认情况下,数据库只记录发生改变的字段值。

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

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

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

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

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

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

5) 切换日志文件,以开始使用追加日志: ALTER SYSTEM SWITCH LOGFILE;

6) 确定追加日志已经启用: SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

在Oracle 9i中,查询结果应该是YES,在10g中,为YESIMPLICIT

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


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

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


5. 推迟约束的检测。

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

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

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

为了使Replicat管理这些更新:在目标表上以DEFERRABLE方式创建约束,可以指定为INITIALLY DEFERREDINITIALLY IMMEDIATE;使用Replicat参数HANDLETPKUPDATE来使Replicat在它的事务里将约束设置为INITIALLY DEFERRED,这些约束会在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选项。例如MAP geo.st_rdt, TARGET geo.st_rdt, REPERROR (-1403, DISCARD) ; (更详细的例子可以查看GoldGate官方文档中《Oracle Installation and Setup Guide》中的第45页。)

4. 强化获取。在Oracle 9i中,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来不同系统时间,另外可以在Oracle GoldenGate Windows and UNIX Reference Guide中查看关于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上的SEND EXTRACT命令来控制。


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错误。


维护DDL marker

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


删除DDL marker

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


清空DDL trace文件

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


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

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


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

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

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

2. 停止Extract进程来停止捕获DDL : STOP EXTRACT <group>

3. 停止Replicat进程来停止复制DDL : STOP REPLICAT <group>

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

5. 进入GoldenGate安装目录下

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

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

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

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

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

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

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


安装之后修改DDL对象名称

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

2. 停止Extract进程来停止捕获DDL : STOP EXTRACT <group>

3. 停止Replicat进程来停止复制DDL : STOP REPLICAT <group>

4. 进入GoldenGate安装目录下

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

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

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

8. 如果要修改DDL schema的名称,可以在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捕获 START EXTRACT <group>

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


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

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

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

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

3. 运行GGSCI

4. 停止Extract来停止捕获DDL : STOP EXTRACT <group>

5. 停止Replicat进程来停止复制DDL : STOP REPLICAT <group>

6. 进入GoldenGate安装目录下

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

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

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

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

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

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

13. 运行ddl_setup脚本

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

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

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


从系统中移除DDL对象

1. 运行GGSCI

2. 停止Extract进程: STOP EXTRACT <group>

3. 停止Replicat进程: STOP REPLICAT <group>

4. 进入GoldenGate安装目录下

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

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

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

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

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

环境


源端是一个RAC
rac1 rac2: RHEL 4u7 + ORACLE 10.2.0.4 + ASM
rac1 外网IP 192.168.47.241 虚拟IP 192.168.47.243
rac2 外网IP 192.168.47.242 虚拟IP 192.168.47.244

目标端是一个单机
ggdb: RHEL 4u7 + ORACLE 10.2.0.4 + ASM
IP: 192.168.47.211

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

配置oradb 到 dyggdb的数据同步

goldengate版本11.1.1.0


时间同步


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

rac1:

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

cat>/etc/ntp.conf<<EOF
restrict default nomodify notrap noquery
restrict 127.0.0.1

server 0.rhel.pool.ntp.org
server 1.rhel.pool.ntp.org
server 2.rhel.pool.ntp.org

server 192.168.47.241
server 127.127.1.0
fudge 127.127.1.0 stratum 10

driftfile /var/lib/ntp/drift
broadcastdelay 0.008
keys /etc/ntp/keys
EOF

启动ntpd服务

service ntpd restart
chkconfig --level 345 ntpd on

rac2:

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

cat>/etc/ntp.conf<<EOF
restrict default nomodify notrap noquery
restrict 127.0.0.1

server 0.rhel.pool.ntp.org
server 1.rhel.pool.ntp.org
server 2.rhel.pool.ntp.org

server 192.168.47.241
fudge 192.168.47.241 stratum 10

driftfile /var/lib/ntp/ntp.drift
broadcastdelay 0.008
keys /etc/ntp/keys
EOF

service ntpd restart
chkconfig --level 345 ntpd on

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

[root@rac1 ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
rac1 .INIT. 16 u - 64 0 0.000 0.000 4000.00
*LOCAL(0) LOCAL(0) 10 l 30 64 377 0.000 0.000 0.001

[root@rac2 ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
rac1 LOCAL(0) 11 u 9 64 1 0.187 0.072 0.001



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

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


创建系统用户


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

useradd -g oinstall -G dba goldengate
passwd goldengate

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

cat >>/etc/security/limits.conf<<EOF
goldengate soft memlock 3145728
goldengate hard memlock 3145728
goldengate soft nproc 200
goldengate hard nproc 1024
goldengate soft stack -
goldengate hard stack -
goldengate soft fsize -
goldengate hard fsize -
EOF


准备GoldenGate安装环境


源端


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

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

[root@rac1 ~]# mkfs.ext3 /dev/sdg1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
12500992 inodes, 24993115 blocks
1249655 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
763 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[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 -R goldengate:oinstall /opt/gg
chmod -R 775 /opt/gg



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


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

源端(rac1)和目标端都做:
goldengate用户登录
[goldengate@rac1 goldengateMedia]$ mkdir /opt/gg/goldengate
[goldengate@rac1 goldengateMedia]$ cp ggs_Linux_x64_ora10g_64bit_v11_1_1_0_0_078.tar /opt/gg/goldengate
[goldengate@rac1 goldengateMedia]$ cd /opt/gg/goldengate
[goldengate@rac1 goldengate]$ tar -xvf ggs_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
export ORACLE_HOME
ORACLE_SID=oradb1
export ORACLE_SID
GG_HOME=/opt/gg/goldengate
export GG_HOME
PATH=\$ORACLE_HOME/bin:\$PATH
export PATH
GG_HOME=/opt/gg/goldengate
export GG_HOME
LD_LIBRARY_PATH=\$ORACLE_HOME/lib:\$GG_HOME:\$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
EOF

应用刚刚修改的环境变量,然后进入GoldenGate安装目录,执行ldd ggsci,确定需要的库文件都能够找到。如果出现共享库文件无法找到,例如libnnz10.so => not found,检查LD_LIBRARY_PATH环境变量的设置
[goldengate@ggdb goldengate]$ source ~/.bashrc
[goldengate@ggdb goldengate]$ cd $GG_HOME
[goldengate@ggdb goldengate]$ ldd ggsci
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> archive log listDatabase log mode Archive Mode
Automatic archival Enabled
Archive destination +RECOVERY_DG
Oldest online log sequence 120
Next log sequence to archive 121
Current log sequence 121


若处于非归档模式,则改为归档模式:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.


SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL>


在源端数据库中打开force logging


SQL> select force_logging from v$database;

FOR
---
NO

SQL> alter database force logging;

Database altered.

SQL> select force_logging from v$database;

FOR
---
YES



在源端数据库中打开supplemental log


SQL> select supplemental_log_data_min from v$database;

SUPPLEME
--------
NO

SQL> alter database add supplemental log data;

Database altered.


切换日志,使更改生效
SQL> alter system switch logfile;

System altered.

SQL> select supplemental_log_data_min from v$database;

SUPPLEME
--------
YES


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


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

SQL> show parameter recyclebin

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on


SQL> alter system set recyclebin=off;

System altered.

SQL> show parameter recyclebin

NAME TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
recyclebin string
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_xxx SID_NAME要相应修改


重启监听
lsnrctl reload


通过sqlplus sys/xxx@oradb_asm as sysdba来连接asm实例,能连上则说明配置成功


字符集


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

SQL> SHOW PARAMETER NLS_LANGUAGE

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_language string SIMPLIFIED CHINESE


SQL> SHOW PARAMETER NLS_TERRITORY

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_territory string CHINA


SQL> SELECT name, value$ from SYS.PROPS$ WHERE name = 'NLS_CHARACTERSET';

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


SQL> SHOW PARAMETER NLS_LENGTH_SEMANTICS

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE


SQL>

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



创建goldengate数据库用户


源和目标端都需要

[oracle@gg1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Mon Aug 1 22:31:42 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create tablespace goldengate;

Tablespace created.

SQL> create user goldengate identified by goldengate default tablespace goldengate;

User created.

SQL> grant connect,resource to goldengate;

Grant succeeded.

SQL> grant execute on utl_file to goldengate;

Grant succeeded.

SQL>


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

SQL> exec dbms_streams_auth.grant_admin_privilege('GOLDENGATE');

PL/SQL procedure successfully completed.

SQL> grant insert on system.logmnr_restart_ckpt$ to goldengate;

Grant succeeded.

SQL> grant update on sys.streams$_capture_process to goldengate;

Grant succeeded.

SQL> grant become user to goldengate;

Grant succeeded.

SQL>

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



UNDO的设置


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


建议设置如下:
UNDO_MANAGEMENT=AUTO
UNDO_RETENTION=86400
undo表空间的大小按如下公式估计设置
<undo space> = <UNDO_RETENTION> * <UPS> + <overhead>
❍ <undo space> is the number of undo blocks.
❍ <UNDO_RETENTION> is the value of the UNDO_RETENTION parameter (in seconds).
❍ <UPS> is the number of undo blocks for each second.
❍ <overhead> is the minimal overhead for metadata (transaction tables, etc.).
Use the system view V$UNDOSTAT to estimate <UPS> and <overhead>.


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


SQL> show parameter undo


NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1


SQL> alter system set undo_retention=86400;


System altered.


将flashback any table 权限赋给extract用户


SQL> grant flashback any table to goldengate;


Grant succeeded.


SQL>


安装DDL OBJECTS


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


执行marker_setup


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

[goldengate@gg1 ~]$ cd /opt/gg/goldengate/
[goldengate@gg1 goldengate]$ sqlplus / as sysdba

SQL> @marker_setup

Marker setup script

You will be prompted for the name of a schema for the GoldenGate database objects.
NOTE: The schema must be created prior to running this script.
NOTE: Stop all DDL replication before starting this installation.

Enter GoldenGate schema name:goldengate

……

Script complete.

SQL>


执行ddl_setup


确保所有的会话都已关闭

SQL> @ddl_setup

GoldenGate DDL Replication setup script

Verifying that current user has privileges to install DDL Replication...
Checking user sessions...

Check complete.

You will be prompted for the name of a schema for the GoldenGate database objects.
NOTE: For an Oracle 10g source, the system recycle bin must be disabled. For Oracle 11g and later, it can be enabled.
NOTE: The schema must be created prior to running this script.
NOTE: Stop all DDL replication before starting this installation.

Enter GoldenGate schema name:goldengate

You will be prompted for the mode of installation.
To install or reinstall DDL replication, enter INITIALSETUP
To upgrade DDL replication, enter NORMAL
Enter mode of installation:INITIALSETUP

Working, please wait ...
Spooling to file ddl_setup_spool.txt

Using GOLDENGATE as a GoldenGate schema name, INITIALSETUP as a mode of installation.

Working, please wait ...

RECYCLEBIN must be empty.
This installation will purge RECYCLEBIN for all users.
To proceed, enter yes. To stop installation, enter no.

Enter yes or no:yes

……

Script complete.
SQL>

执行role_setup


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

GGS Role setup script

This script will drop and recreate the role GGS_GGSUSER_ROLE
To use a different role name, quit this script and then edit the params.sql script to change the gg_role parameter to the preferred name. (Do not run the script.)

You will be prompted for the name of a schema for the GoldenGate database objects.
NOTE: The schema must be created prior to running this script.
NOTE: Stop all DDL replication before starting this installation.

Enter GoldenGate schema name:goldengate
Wrote file role_setup_set.txt

PL/SQL procedure successfully completed.

Role setup script complete

Grant this role to each user assigned to the Extract, GGSCI, and Manager processes, by using the following SQL command:

GRANT GGS_GGSUSER_ROLE TO <loggedUser>

where <loggedUser> is the user assigned to the GoldenGate processes.
SQL>

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


SQL> grant ggs_ggsuser_role to goldengate;

Grant succeeded.

SQL>

启用DDL触发器


SQL> @ddl_enable

Trigger altered.

SQL>

安装可选的性能工具


安装dbms_shared_pool


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

SQL> select object_name,object_type from dba_objects where object_name='DBMS_SHARED_POOL';

no rows selected

SQL> @?/rdbms/admin/dbmspool

Package created.

Grant succeeded.

View created.

Package body created.

SQL> select object_name,object_type from all_objects where object_name='DBMS_SHARED_POOL';

OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
DBMS_SHARED_POOL PACKAGE
DBMS_SHARED_POOL PACKAGE BODY

2 rows selected.

ddl_pin


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

SQL> @ddl_pin goldengate

PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

SQL>



配置goldengate


创建goldengate工作目录


源端和目标端:

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

GGSCI (rac1) 1> create subdirs

Creating subdirectories under current directory /opt/gg/goldengate

Parameter files /opt/gg/goldengate/dirprm: created
Report files /opt/gg/goldengate/dirrpt: created
Checkpoint files /opt/gg/goldengate/dirchk: created
……

GGSCI (gg1) 2> exit

创建trail文件存放目录


源和目标端:

[goldengate@rac1 ~]$ mkdir /opt/gg/trails
[goldengate@rac1 ~]$ ls -l /opt/gg | grep trails
drwxr-xr-x 2 goldengate oinstall 4096 Nov 27 14:57 trails
[goldengate@rac1 ~]$

配置MANAGER


源端和目标端:

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

GGSCI (gg1) 1> edit params mgr

DYNAMICPORTLIST 7840-7914
PORT 5898
PURGEOLDEXTRACTS /opt/gg/trails/w1*, USECHECKPOINTS, MINKEEPFILES 10
PURGEOLDEXTRACTS /opt/gg/trails/w2*, USECHECKPOINTS, MINKEEPFILES 10
AUTORESTART ER *, RETRIES 3, WAITMINUTES 5
PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5, FREQUENCYMINUTES 30
PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5, FREQUENCYMINUTES 30
~
~

全局参数设置


源端:

GGSCI (rac1) 2> edit params ./globals
GGSCHEMA goldengate
~
~
~

目标端:

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

GGSCI (ggdb) 2> dblogin userid goldengate,password goldengate
Successfully logged into database.

GGSCI (ggdb) 3> add checkpointtable goldengate.chkpoint

Successfully created checkpoint table GOLDENGATE.CHKPOINT.

GGSCI (ggdb) 4> edit params ./globals

GGSCHEMA goldengate
CHECKPOINTTABLE goldengate.chkpoint
~
~
~
~
"./globals" 2L, 44C written

配置源端extract


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


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

首先添加两个primary extract group,因为这是一个两节点的RAC,我们需要指定threads 2选项

GGSCI (rac1) 4> add extract w1ext,tranlog,threads 2,begin now

EXTRACT added.

GGSCI (rac1) 5> info all

Program Status Group Lag Time Since Chkpt

MANAGER STOPPED
EXTRACT STOPPED DYEXT 00:00:00 00:00:07

编辑w1ext的参数文件:

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

GGSCI (rac1) 6> edit params w1ext

EXTRACT w1ext
USERID goldengate, PASSWORD goldengate
EXTTRAIL /opt/gg/trails/w1
DISCARDFILE w1extdsc,APPEND,MEGABYTES 5
TRANLOGOPTIONS ALTARCHIVELOGDEST +RECOVERY_DG
TRANLOGOPTIONS ALTARCHIVEDLOGFORMAT %t_%s_%r.dbf
TRANLOGOPTIONS ASMUSER SYS@ORADB_ASM,ASMPASSWORD BBB
DDL INCLUDE MAPPED
DDLOPTIONS ADDTRANDATA
FETCHOPTIONS, USESNAPSHOT, NOUSELATESTVERSION, MISSINGROW REPORT
STATOPTIONS REPORTFETCH
WARNLONGTRANS 1H, CHECKINTERVAL 5M
TABLE dycommondatabase20.*;
TABLE dyulcentermanage.*;


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

添加secondary extract group,即data pump

GGSCI (rac1) 8> ADD EXTRACT w1extdp, EXTTRAILSOURCE /opt/gg/trails/w1, BEGIN now
EXTRACT added.

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

GGSCI (rac1) 9> edit params w1extdp

EXTRACT w1extdp
USERID GOLDENGATE, PASSWORD GOLDENGATE
RMTHOST 192.168.47.211, MGRPORT 5898
RMTTRAIL /opt/gg/trails/w1
DISCARDFILE w1extdpdsc,APPEND,MEGABYTES 5
TABLE dycommondatabase20.*;
TABLE dyulcentermanage.*;
~
~
添加该rmttrail

GGSCI (rac1) 10> add rmttrail /opt/gg/trails/w1,extract w1extdp, megabytes 100
RMTTRAIL added.


类似的,我们添加第二组primary&secondary extract以及exttrail&rmttrail
GGSCI (rac1) 11> add extract w2ext,tranlog,threads 2,begin now
EXTRACT added.

GGSCI (rac1) 12> edit params w2ext

EXTRACT w2ext
USERID goldengate, PASSWORD goldengate
EXTTRAIL /opt/gg/trails/w2
DISCARDFILE w2extdsc,APPEND,MEGABYTES 5
TRANLOGOPTIONS ALTARCHIVELOGDEST +RECOVERY_DG
TRANLOGOPTIONS ALTARCHIVEDLOGFORMAT %t_%s_%r.dbf
TRANLOGOPTIONS ASMUSER SYS@ORADB_ASM,ASMPASSWORD BBB
DDL INCLUDE MAPPED
DDLOPTIONS ADDTRANDATA
FETCHOPTIONS, USESNAPSHOT, NOUSELATESTVERSION, MISSINGROW REPORT
STATOPTIONS REPORTFETCH
WARNLONGTRANS 1H, CHECKINTERVAL 5M
TABLE dyacdb34.*;
TABLE dyulcenterm_bak.*;

GGSCI (rac1) 13> add exttrail /opt/gg/trails/w2,extract w2ext, MEGABYTES 100
EXTTRAIL added.

GGSCI (rac1) 14> ADD EXTRACT w2extdp, EXTTRAILSOURCE /opt/gg/trails/w2, BEGIN now
EXTRACT added.

GGSCI (rac1) 15> edit params w2extdp

EXTRACT w2extdp
USERID GOLDENGATE, PASSWORD GOLDENGATE
RMTHOST 192.168.47.211, MGRPORT 5898
RMTTRAIL /opt/gg/trails/w2
DISCARDFILE w1extdpdsc,APPEND,MEGABYTES 5
TABLE dyacdb34.*;
TABLE dyulcenterm_bak.*;
~
~

GGSCI (rac1) 16> add rmttrail /opt/gg/trails/w2,extract w2extdp, megabytes 100
RMTTRAIL added.



配置目标端replicat


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

GGSCI (ggdb) 6> add replicat w1rep,exttrail /opt/gg/trails/w1,checkpointtable goldengate.chkpoint
REPLICAT added.

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

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

GGSCI (ggdb) 7> edit params w1rep

REPLICAT w1rep
ASSUMETARGETDEFS
USERID GOLDENGATE, PASSWORD GOLDENGATE
DISCARDFILE w1repdsc,APPEND,MEGABYTES 5
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
BATCHSQL
DBOPTIONS DEFERREFCONST
DBOPTIONS LOBWRITESIZE 102400
HANDLECOLLISIONS
DDLERROR DEFAULT DISCARD RETRYOP MAXRETRIES 5 RETRYDELAY 20
MAP dycommondatabase20.* , TARGET dycommondatabase20.* ;
MAP dyulcentermanage.* , TARGET dyulcentermanage.* ;
~
~
~

同样地再配置一个replicat进程 w2rep
GGSCI (ggdb) 8> add replicat w2rep,exttrail /opt/gg/trails/w2,checkpointtable goldengate.chkpoint
REPLICAT added.

GGSCI (ggdb) 9> edit params w2rep

REPLICAT w2rep
ASSUMETARGETDEFS
USERID GOLDENGATE, PASSWORD GOLDENGATE
DISCARDFILE w2repdsc,APPEND,MEGABYTES 5
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
BATCHSQL
DBOPTIONS DEFERREFCONST
DBOPTIONS LOBWRITESIZE 102400
HANDLECOLLISIONS
DDLERROR DEFAULT RETRYOP MAXRETRIES 5 RETRYDELAY 20
MAP dyacdb34.* , TARGET dyacdb34.* ;
MAP dyulcenterm_bak.* , TARGET dyulcenterm_bak.* ;
~

ADD TRANDATA


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

GGSCI (rac1) 17> dblogin userid goldengate,password goldengate
Successfully logged into database.

GGSCI (rac1) 18> add trandata dycommondatabase20.*
Logging of supplemental redo data enabled for table DYCOMMONDATABASE20.AUDITCONFIG.

Logging of supplemental redo data enabled for table DYCOMMONDATABASE20.AUDITHISTORY.
……

如果表中没有主键和唯一键,会产生一条警告,例如:
2011-12-08 22:53:11 WARNING OGG-00869 No unique key is defined for table UDPPACKPORTSET. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.

GGSCI (rac1) 19> add trandata dyulcentermanage.*
……
GGSCI (rac1) 20> add trandata dyacdb34.*
……
GGSCI (rac1) 21> add trandata dyulcenterm_bak.*
……

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

数据初始化(initial data load)


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

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


流程图如下:



准备工作


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

在源端和目标端打开MANAGER


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

在源端,打开extract进程
GGSCI (rac1) 35> start ext w1ext

Sending START request to MANAGER ...
EXTRACT W1EXT starting

GGSCI (rac1) 36> start ext w1extdp

Sending START request to MANAGER ...
EXTRACT W1EXTDP starting


GGSCI (rac1) 37> info all

Program Status Group Lag Time Since Chkpt

MANAGER RUNNING
EXTRACT RUNNING W1EXT 00:00:00 00:00:05
EXTRACT RUNNING W1EXTDP 00:00:00 02:00:51
EXTRACT STOPPED W2EXT 00:00:00 01:54:09
EXTRACT STOPPED W2EXTDP 00:00:00 01:50:00

在源端,执行expdp导出数据


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

SQL> create directory expdpdir as '/bak/expdpdata';

Directory created.

执行导出:
[oracle@rac1 ~]$ expdp system/aaa directory=expdpdir dumpfile=w1data_%U.dmp logfile=w1data.log schemas=dycommondatabase20, dyulcentermanage parallel=4

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


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


目标端:
[oracle@ggdb ~]$ ftp 192.168.47.241
Connected to 192.168.47.241.
……
ftp> cd /bak/expdpdata
250 Directory successfully changed.
ftp> lcd /bak/impdpdata
Local directory now /bak/impdpdata
ftp> bin
200 Switching to Binary mode.
ftp> mget w1*

创建directory
SQL> create directory impdpdir as '/bak/impdpdata';

Directory created.

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

数据导入:
impdp system/aaa directory=impdpdir dumpfile=w1data_%U.dmp logfile=w1data_impdp.log schemas=dycommondatabase20, dyulcentermanage parallel=4


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

begin
for x in (select owner,trigger_name from dba_triggers 
where owner in ('DYCOMMONDATABASE20', 'DYULCENTERMANAGE')) 
loop
execute immediate 'alter trigger '||x.owner||'.'||x.trigger_name||' disable';
end loop;
end;

/


在目标端,启动复制进程


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

GGSCI (ggdb) 51> start rep dyrep

Sending START request to MANAGER ...
REPLICAT DYREP starting

通过info replicat dyrep 命令来查看复制的状态

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

GGSCI (ggdb) 57> SEND REPLICAT w1rep, NOHANDLECOLLISIONS

Sending NOHANDLECOLLISIONS request to REPLICAT W1REP ...
W1REP No tables found matching GOLDENGATE.* to set NOHANDLECOLLISIONS.

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

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


流程图如下所示



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

准备工作


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

在源端和目标端打开MANAGER


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


配置初始化extract


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

GGSCI (rac1) 1> add extract einit,sourceistable
EXTRACT added.

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

GGSCI (rac1) 2> edit params einit

EXTRACT einit
SOURCEISTABLE
USERID GOLDENGATE, PASSWORD GOLDENGATE
RMTHOST 192.168.47.211, MGRPORT 5898
RMTFILE /opt/gg/trails/initdata,purge,maxfiles 100,megabytes 1024
TABLE dyacdb34.*;
TABLE dyulcenterm_bak.*;

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


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

源端:
[oracle@rac1 ~]$ expdp system/aaa directory=expdpdir dumpfile=w2data.dmp logfile=w2data.log schemas= DYACDB34,DYULCENTERM_BAK exclude=table_data,table_statistics

目标端:
[oracle@ggdb ~]$ ftp 192.168.47.241
Connected to 192.168.47.241.
……
ftp> cd /bak/expdpdata
250 Directory successfully changed.
ftp> lcd /bak/impdpdata
Local directory now /bak/impdpdata
ftp> bin
200 Switching to Binary mode.
ftp> mget w2*

导入用户及其表结构:
[oracle@ggdb ~]$ impdp system/aaa directory=impdpdir dumpfile=w2data.dmp logfile=w2data_imp.log schemas=DYACDB34,DYULCENTERM_BAK

禁用约束:
SQL>
begin
for x in (select owner,table_name,constraint_name from dba_constraints where owner in ('DYACDB34', 'DYULCENTERM_BAK') and constraint_type in ('C','R')) loop
execute immediate 'alter table '||x.owner||'.'||x.table_name||
' disable constraint '||x.constraint_name;
end loop;
dbms_output.put_line('ok');
end;
/

禁用触发器:
SQL>
begin
for x in (select owner,trigger_name from dba_triggers 
where owner in ('DYACDB34', 'DYULCENTERM_BAK')) 
loop
execute immediate 'alter trigger '||x.owner||'.'||x.trigger_name||' disable';
end loop;
end;
/

在源端,打开抽取进程


GGSCI (rac1) 3> start ext w2ext
Sending START request to MANAGER ...
EXTRACT W2EXT starting

GGSCI (rac1) 4> start ext w2extdp
Sending START request to MANAGER ...
EXTRACT W2EXTDP starting

GGSCI (rac1) 5> info all

Program Status Group Lag Time Since Chkpt

MANAGER RUNNING
EXTRACT RUNNING W1EXT 00:00:00 00:00:08
EXTRACT RUNNING W1EXTDP 00:00:00 00:00:05
EXTRACT RUNNING W2EXT 02:58:57 00:00:04
EXTRACT RUNNING W2EXTDP 00:00:00 03:03:40

在源端,启动initial-load extract


[goldengate@rac1 ~]$ cd $GG_HOME
[goldengate@rac1 goldengate]$ ./extract paramfile dirprm/einit.prm reportfile /opt/gg/einit.log

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

配置初始化replicat


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

GGSCI (rac2) 1> add replicat rinit,specialrun
REPLICAT added.

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

GGSCI (rac2) 2> edit params rinit

REPLICAT rinit
SPECIALRUN
USERID GOLDENGATE,PASSWORD GOLDENGATE
EXTFILE /opt/gg/trails/initdata000000
ASSUMETARGETDEFS
MAP DYACDB34.* , TARGET DYACDB34.* ;
MAP DYULCENTERM_BAK.* , TARGET DYULCENTERM_BAK.* ;

在目标端,启动initial-load replicat


[goldengate@ggdb goldengate]$ cd $GG_HOME
[goldengate@ggdb goldengate]$ ./replicat paramfile dirprm/rinit.prm reportfile /opt/gg/rinit.log

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

在目标端,启动复制进程


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

GGSCI (ggdb) 51> start rep w2rep

Sending START request to MANAGER ...
REPLICAT W2REP starting

通过info replicat w2rep 命令来查看复制的状态

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

GGSCI (ggdb) 57> SEND REPLICAT w2rep, NOHANDLECOLLISIONS

Sending NOHANDLECOLLISIONS request to REPLICAT W2REP ...
W2REP No tables found matching GOLDENGATE.* to set NOHANDLECOLLISIONS.

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

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

SQL>
begin
for x in (select owner,table_name,constraint_name from dba_constraints where owner in ('DYACDB34', 'DYULCENTERM_BAK') and constraint_type in ('C','R')) loop
 execute immediate 'alter table '||x.owner||'.'||x.table_name||
 ' enable constraint '||x.constraint_name;
end loop;
dbms_output.put_line('ok');
end;
/




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

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


启动关闭使用startstop ggsci命令,查看状态使用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
total 24
drwxr-xr-x 14 goldengate oinstall 4096 Nov 28 01:57 goldengate
drwxrwxr-x 2 goldengate oinstall 16384 Nov 28 01:05 lost+found
drwxr-xr-x 2 goldengate oinstall 4096 Nov 28 01:57 trails

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

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

GGSCI (rac2) 1> start mgr

Manager started.

GGSCI (rac2) 2> info all

Program Status Group Lag Time Since Chkpt

MANAGER RUNNING
EXTRACT ABENDED DYEXT 00:00:00 00:01:19
EXTRACT ABENDED DYEXTDP 00:00:00 00:01:18

GGSCI (rac2) 3> start ext *

Sending START request to MANAGER ...
EXTRACT DYEXT starting

Sending START request to MANAGER ...
EXTRACT DYEXTDP starting

GGSCI (rac2) 4> info all

Program Status Group Lag Time Since Chkpt

MANAGER RUNNING
EXTRACT RUNNING DYEXT 00:00:00 00:00:01
EXTRACT ABENDED DYEXTDP 00:00:00 00:14:53

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

GGSCI (rac2) 24> start ext dyextdp

Sending START request to MANAGER ...
EXTRACT DYEXTDP starting


GGSCI (rac2) 25> info all

Program Status Group Lag Time Since Chkpt

MANAGER RUNNING
EXTRACT RUNNING DYEXT 00:00:00 00:00:02
EXTRACT RUNNING DYEXTDP 00:00:00 08:23:02


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



一些错误和警告信息

错误:


OGG-00052 Oracle GoldenGate Delivery for Oracle, dyrep.prm: No replication maps specified.
replicat配置文件中必须指定map , target参数

OGG-00212 Oracle GoldenGate Delivery for Oracle, dyrep.prm: Invalid option for MAP:xxx
replicat参数中map子句语法不正确(,/等符号前加上空格)

OGG-00259 Oracle GoldenGate Delivery for Oracle, dyrep.prm: Schema name cannot be wildcarded.
replicat参数的map ,target参数中,schema不能使用通配符

dblogin登录失败:
dblogin userid goldengate,password goldengate报错 ERROR: Failed to open data source for user GOLDENGATE
以syssystem或其它具有DBA权限的用户可以使用dblogin登录,然后再登录goldengate能成功.
解决办法:授予goldengate用户select any dictionary权限


警告:

OGG-00869 Oracle GoldenGate Command Interpreter for Oracle: No unique key is defined for table xxx. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.
xxx表没有唯一键,若数据库中不能对表添加主键或唯一约束,可以使用goldengateKEYCOLS参数指定能准确标识行的列。否则该表的所有字段都将被保存到redo中用以标识更改的行。

OGG-01756 Oracle GoldenGate Command Interpreter for Oracle: Cannot register EXTRACT DYEXT with database because of the following SQL error: OCI Error ORA-06550: line 1, column 3128: PL/SQL: ORA-00942: table or view does not exist ORA-06550: line 1, column 3117: PL/SQL: SQL Statement ignored (status = 0). See Extract user privileges in the Oracle GoldenGate for Oracle Installation and Setup Guide. You can manually register this group with the REGISTER EXTRACT command.
处理方法请见数据库方面的准备中的创建goldengate数据库用户后半段

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

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

比如,在节点添加之前,goldengate map log threads顺序如下(数据库log thread在后,下同):

1—>1 (假设是sequence 100,rba 1001)

2—>2(假设是sequence 88,rba 3009)

当添加节点后,map log threads的顺序会变成:

1—->3(sequence 88,rba 3009)

2—->1(sequence 100,rba 1001)

3—->2(new)

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

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

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

需要我们特别记录的checkpoint有:Current Checkpoint、Recovery Checkpoint以及Write Checkpoint

1.正常停止extract(略)

2.获得extract的checkpoint记录

GGSCI (node1) 21> info ext_r1 showch

EXTRACT EXT_R1 Last Started 2011-08-16 22:35 Status STOPPEDCheckpoint Lag 00:00:00 (updated 00:06:21 ago)Log Read Checkpoint Oracle Redo Logs 2011-08-17 03:32:48 Thread 1, Seqno 62, RBA 29890576Log Read Checkpoint Oracle Redo Logs 2011-08-17 03:32:34 Thread 2, Seqno 42, RBA 18674704

Current Checkpoint Detail:

Read Checkpoint #1

Oracle RAC Redo Log

Startup Checkpoint (starting position in the data source): Thread #: 1 Sequence #: 61 RBA: 32112656 Timestamp: 2011-08-16 22:34:53.000000 SCN: 0.3743980 (3743980) Redo File: +DATA1/my/onlinelog/group_1.261.758327805

Recovery Checkpoint (position of oldest unprocessed transaction in the data source): Thread #: 1 Sequence #: 62 RBA: 29890576 Timestamp: 2011-08-17 03:32:48.000000 SCN: 0.3811675 (3811675) Redo File: +DATA1/my/onlinelog/group_2.262.758327805

Current Checkpoint (position of last record read in the data source): Thread #: 1 Sequence #: 62 RBA: 29890576 Timestamp: 2011-08-17 03:32:48.000000 SCN: 0.3811675 (3811675) Redo File: +DATA1/my/onlinelog/group_2.262.758327805

BR Previous Recovery Checkpoint: Thread #: 1 Sequence #: 0 RBA: 0 Timestamp: 2011-08-16 22:35:09.416136 SCN: Not available Redo File:

BR Begin Recovery Checkpoint: Thread #: 1 Sequence #: 62 RBA: 22437392 Timestamp: 2011-08-17 02:35:11.000000 SCN: 0.3798208 (3798208) Redo File:

BR End Recovery Checkpoint: Thread #: 1 Sequence #: 62 RBA: 24120320 Timestamp: 2011-08-17 02:35:16.000000 SCN: 0.3801192 (3801192) Redo File:

Read Checkpoint #2

Oracle RAC Redo Log

Startup Checkpoint (starting position in the data source): Thread #: 2 Sequence #: 41 RBA: 25323024 Timestamp: 2011-08-16 22:34:40.000000 SCN: 0.3743980 (3743980) Redo File: +DATA1/my/onlinelog/group_3.266.758328125

Recovery Checkpoint (position of oldest unprocessed transaction in the data source): Thread #: 2 Sequence #: 42 RBA: 18674704 Timestamp: 2011-08-17 03:32:34.000000 SCN: 0.3811674 (3811674) Redo File: +DATA1/my/onlinelog/group_4.267.758328125

Current Checkpoint (position of last record read in the data source): Thread #: 2 Sequence #: 42 RBA: 18674704 Timestamp: 2011-08-17 03:32:34.000000 SCN: 0.3811674 (3811674) Redo File: +DATA1/my/onlinelog/group_4.267.758328125

BR Previous Recovery Checkpoint: Thread #: 2 Sequence #: 0 RBA: 0 Timestamp: 2011-08-16 22:35:09.416136 SCN: Not available Redo File:

BR Begin Recovery Checkpoint: Thread #: 2 Sequence #: 42 RBA: 15242240 Timestamp: 2011-08-17 02:35:02.000000 SCN: 0.3800455 (3800455) Redo File:

BR End Recovery Checkpoint: Thread #: 2 Sequence #: 42 RBA: 15242240 Timestamp: 2011-08-17 02:35:02.000000 SCN: 0.3800455 (3800455) Redo File:

Write Checkpoint #1

GGS Log Trail

Current Checkpoint (current write position): Sequence #: 3 RBA: 51132 Timestamp: 2011-08-17 03:32:48.695373 Extract Trail: /opt/ggs/dirdat/r1/ex

Header: Version = 2 Record Source = A Type = 6 # Input Checkpoints = 2 # Output Checkpoints = 1

File Information: Block Size = 2048 Max Blocks = 100 Record Length = 4096 Current Offset = 0

Configuration: Data Source = 3 Transaction Integrity = 1 Task Type = 0

Status: Start Time = 2011-08-16 22:35:10 Last Update Time = 2011-08-17 03:32:48 Stop Status = G Last Result = 402

3.新建extract进程。

GGSCI (node1) 34> ADD EXT ext_r1, BEGIN NOW, TRANLOG, THREADS 3

2011-08-17 03:52:26 INFO OGG-01749 Successfully registered EXTRACT EXT_R1 to start managing log retention at SCN 3826107.EXTRACT added.

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

GGSCI (node1) 35> alter EXTRACT ext_r1, TRANLOG, EXTSEQNO 62, EXTRBA 29890576,thread 1EXTRACT altered.

GGSCI (node1) 36> alter EXTRACT ext_r1, TRANLOG, EXTSEQNO 42, EXTRBA 18674704,thread 2

EXTRACT altered.

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

GGSCI (node1) 42> ALTER EXTRACT ext_r1, IOEXTSEQNO 62, IOEXTRBA 29890576,thread 1

GGSCI (node1) 42> ALTER EXTRACT ext_r1, IOEXTSEQNO 42, IOEXTRBA 18674704,thread 2

6. 修改exttrail或者rmttrail的write checkpoint

GGSCI (node1) 47> ADD EXTTRAIL /opt/ggs/dirdat/r1/ex,SEQNO 3, RBA 51132, EXTRACT ext_r1EXTTRAIL added.

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

8.重新启动extract(略)

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

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

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

1. 利用 Keys + Handlecollisions

2.利用 commit SCN/CSN

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

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

1. When there is primary key update (PKUpdate), the HANDLECOLLISIONS method may lose data. The solution in the case of a primary key update is for Extract to fetch whole row by making a flashback query. However, this is not efficient and may not be possible in certain environments.

2. When a table does not have any type of key, HANDLECOLLISIONS may introduce duplicate rows in the table. One workaround is to add a primary or unique key to the target table.

3. The exact timestamp when the initial load was started may not be known (and different tables may have different start times), so it is almost inevitable that HANDLECOLLISIONS will be used for certain records un-necessarily. This could mask a real data integrity problem.

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

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

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

1. 一致性的exp和imp

2. 一致性的expdp和impdp

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

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

3. 基于备份的表空间搬移(Transportable Tablespace from Backup with RMAN)

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

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

4. Dataguard

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值