Oracle GoldenGate可以在Oracle不同版本间移动数据,也可以在Oracle和其它类型数据库之间移动数据。Oracle GoldenGate支持数据的过滤、映射和转换。Oracle还能在相似的Oracle数据库之间复制DDL操作。注意下面一句:当DDL支持被激活的时候,Oracle GoldenGate不支持数据的过滤、映射和转换。
支持的Oracle数据库版本,从9.2开始支持DML和DDL。支持几乎所有的主流操作系统,具体的可以从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的回收站功能关闭,否则将导致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_HIST和GGS_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前确认该包已经安装。
SHOW PARAMETER NLS_LANGUAGE
SHOW PARAMETER NLS_TERRITORY
SELECTname, value$ from SYS.PROPS$ WHEREname = 'NLS_CHARACTERSET';
SHOW PARAMETER NLS_LENGTH_SEMANTICS
SHOW PARAMETER NLS_LANGUAGE SHOW PARAMETER NLS_TERRITORY SELECT name, value$ from SYS.PROPS$ WHERE name = 'NLS_CHARACTERSET'; SHOW PARAMETER NLS_LENGTH_SEMANTICS也可以通过GGSCI来查看当前的数据库语言和字符集设计,并指明是否设置了NLS_LANG: VIEW REPORT <group>
配置Oracle redo日志
正常模式下,GoldenGate默认从在线日志中读取数据,当在线日志不可用时读取归档日志。你也可以手动配置GoldenGate来读取归档日志。为了确保GoldenGate读取在线日志的持续性和完整性,按如下过程来配置日志:
如果源数据库是Oracle 9i,将_LOG_PARALLELISM参数设为1,GoldenGate不支持大于1的值。
当GoldenGate从redo日志中捕获数据时,可能会引起I/O瓶颈,特别在有多个抽取进程同时读取时。为了避免这个瓶颈,尽量使用更快的驱动器和控制器;并且将日志存放在RAID 0+1中,避免使用RAID 5。
尽管不是必须,但最好启用归档,并将归档日志保留尽可能久的时间。这样如果在线日志在抽取进程完成之前被回收,抽取进程还能从归档日志中读取。比如发生了进程或系统故障,抽取进程就可能需要去重新捕获事务数据。如果不启用归档,要保证在线日志中能容纳足够的数据。
确保备份和归档操作不会导致旧的归档文件被新的所覆盖,导致GoldenGate抽取进程无法找到需要的日志。在RAC配置中,抽取进程需要能访问到集群中所有节点的在线和归档日志。如果归档日志不在Oracle默认指定的位置,需要在抽取进程的参数文件中的TRANLOGOPTIONS参数中指定ALTARCHIVELOGDEST选项。
GoldenGate的ALO模式
你可以配置抽取进程来专门从归档日志中读取,这也叫做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_MANAGEMENT为AUTO时,创建的表的默认设置就是这个值。 2) 如果用的不是RETENTION而是PCTVERSION时,将PCTVERSION设置为25的初始值。你可以通过STATS EXTRACT命令取得的统计信息来调整它。如果在这些统计信息中的STAT_PER_ROWFETCH CURRENTBYROWID或STAT_OPER_ROWFETCH_CURRENTBYKEY的值比较高,将PCTVERSION按10递增,直到它们的值降到比较低的水平。
4. 为GoldenGate抽取用户授权: GRANT FLASHBACK ANY TABLE TO <db_user>; 或 GRANT FLASHBACK ON <owner.table> TO <db_user>;
在GoldenGate的fetch选项中,它提供了一些参数来进行管理:
1. 使用带REPORTFETCH选项的STATS EXTRACT命令来查看fetch统计信息。
2. 在Extract的STATOPTIONS参数中设置REPORTFETCH选项来使得STATS EXTRACT命令总是显示fetch统计信息
3. 通过Extract的MAXFETCHSTATEMENTS参数,可以控制源数据库中Extract维护的,为准备好的查询打开的游标数量
4. 在Oracle 9i数据库中控制抽取的默认fetch动作,可以使用带USESNAPSHOT或NOUSESNAPSHOT选项的FETCHOPTIONS参数。它们决定Extract是执行flashback查询还是从表中读取数据的当前镜像。
5. 使用FETCHOPTIONS参数中的USELATESTVERSION或NOUSELATESTVERSION选项来处理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需要在源和目标端的表中有几种形式的行的唯一标识,以正确定位到目标行来进行更新和删除操作。
如果不在TABLE或MAP表达式中使用KEYCOLS子句,GoldenGate按如下顺序来选择一个行标识:
1) 主键
2) 不包含虚拟列、UDT(用户定义类型)、函数列、允许空值列的唯一键,按字母顺序选择第一个
3) 不包含虚拟列、UDT、函数列的唯一键,但允许空值,按字母顺序选择第一个
4) 如果上述类型的键都不存在,GoldenGate将使用所有的字段来构建一个虚拟的键(不 包含虚拟列、UDT、函数列等)
你还可以在GolenGate中Extract的TABLE参数和Replicat的MAP参数里的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中,为YES或IMPLICIT。
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 DEFERRED或INITIALLY IMMEDIATE;使用Replicat参数HANDLETPKUPDATE来使Replicat在它的事务里将约束设置为INITIALLY DEFERRED,这些约束会在Replicat提交事务以后进行检查。
如果约束不是DEFERRABLE,Replicat根据HANDLECOLLISIONS和REPERROR参数来处理这些错误,若没有指定,则出现异常终止。
确保Oracle空间对象的正确处理
如果你需要复制包含了SDO_GEORASTER对象类型的字段的表,根据以下说明来配置GoldenGate:
1. 表的映射
2. 设置XML内存缓冲区的大小。你可能需要修改用以存储SDO_GEORASTER数据类型中的SYS.XMLTYPE属性的内存缓冲区大小,这个缓冲区通过DBOPTIONS参数中的XMLBUFSIZE选项控制,默认是1MB,最大可以为10MB。如果数据超过了缓冲区大小,Extract会出现异常。如果表中任何一个值的SDO_GEORASTER的METADATA属性超过了默认的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对系统的影响,Replicat将LOB分段缓存在一个指定大小的缓冲区中,仅当缓冲区满的时候才会执行写入。默认的大小是32k。打个比方,如果这个缓冲区有25k,那么Replicat以每个块25k来写入数据库,处理一个100k的LOB,Replicat只产生4次I/O。
使用Replicat参数DBOPTIONS参数中的LOBWRITESIZE <size>选项来控制LOB缓冲区的大小;如果要禁用LOB缓存,使用DBOPTIONS参数的DISABLELOBCACHING选项。
RAC中的追加说明
总体需求:
RAC集群中的所有节点必须同步系统时钟。GoldenGate通过比较本地系统的时间和事务提交的时间点来做出关键决策。可以通过NTP来不同系统时间,另外可以在Oracle GoldenGate Windows and UNIX Reference Guide中查看关于THREADOPTIONS参数的IOLATENCY选项的相关说明。所有节点上的COMPATIBLE参数设置也必须相同。
RAC中GoldenGate参数的设置:
1. 在AIX和Solaris机器上,使用Extract中的THREADOPTIONS参数和BINDCPU <n>选项。这个参数处理被不同的处理器所更新的内存相关的线程安全问题。
2. GoldenGate在传送数据到目标系统以前,会将数据放在内存里的队列中。THREADOPTIONS参数的INQUEUESIZE和OUTQUEUESIZE决定队列的长度。需要的话,可以通过调整这些参数来提高抽取的性能。
3. GoldenGate会检测孤儿事务,如果在一个事务过程中发生节点故障,就会出现这种情况,Extract不能捕获到回滚动作。虽然数据库会在failover节点中执行回滚,然而该事务仍然会存在于Extract事务列表中,并阻碍了正在处理这个事务的Extract线程进一步的检查点。默认情况下,GoldenGate在确认了孤儿事务后会从列表中清除它们。如果你想进行控制,可以使用TRANLOGOPTIONS参数中PURGEORPHANEDTRANSACTIONS|NOPURGEORPHANEDTRANSACTIONS和TRANSCLEANUPFREQUENCY选项。这个功能可以通过GGSCI上的SEND EXTRACT命令来控制。
RAC上的特殊处理:
1. 如果正在运行GoldenGate的主数据库实例停止,或发生了其他故障,Extract将会中断。为了恢复处理,你可以重启实例,或将GoldenGate二进制文件重新挂载到另一个节点上,然后重新启动GoldenGate进程。在另一个节点上启动GoldenGate进程以前,要停止原节点上的Manager进程。
2. 一旦redo线程数发生了改变,必须删除并重建Extract组。
3. 为了将SQL操作写入到trail中,Extract必须确定正在读取的redo前面没有其他节点的其他操作。打个比方,一个日志包含了1:00到2:00执行的操作,同时节点2的日志中包含了1:30到2:30执行的操作。那么,只有2:00以前的操作会被移动到协调redo数据的主Extract进程所在的服务器上。Extract必须确保在2:00到2:30之间没有更多的操作需要被捕获(保证不同节点中的事务能按顺序写入到trail文件中)。
4. 在active-passive环境中,这个先决条件意味着你可能需要在passive节点上执行一些操作和归档日志,以确保active节点上的操作被传送到passive节点。这能解决缓慢的归档进程和失效的网络连接引发的问题,以及从Oracle节点中移动归档日志到主Extract协调redo数据所在的服务器上可能出现的问题。
5. 为了处理RAC上的最后一个事务,在关闭Extract前往GoldenGate正在复制的源表中插入一条伪记录,然后在所有节点上切换日志。这会更新Extract检查点并确认所有归档都能被读取。同时可以确认这些归档日志中的所有事务都已被捕获并以正确的顺序写入到了trail文件中。
启用和禁用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。它在Oracle的USER_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.txt和marker_remove_set.txt文件,作用和上面的相同
12. 运行marker_setup脚本来重新安装Oracle GoldenGate marker支持系统
13. 运行ddl_setup脚本
14. 运行role_setup脚本来创建GoldenGate DDL角色
15. 将这个角色赋给所有GoldenGate用户,包括如下进程相关的用户:Extract, Replicat, GGSCI和Manager
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.txt和marker_remove_set.txt文件,作用和上面的相同