现在的位置: 首页 > 综合 > 正文

Oracle RAC环境实时数据迁移

2013年01月03日 ⁄ 综合 ⁄ 共 11665字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.