GoldenGate OGG常见问题及解决方法

本文永久链接: https://www.askmaclean.com/archives/goldengate-ogg-issues.html

GoldenGate OGG Extract常见问题

Extract: Application failded to initializeWin

错误描述:

run ggsci command but the Alert window report “Application failded to initialize(0xc000026e)”

错误分析:

–GoldenGate在Windows平台上需要安装Microsoft Visual C ++ 2005 SP1 Redistributable Package

–如果是Microsoft Itanium平台,需要安装vcredist_IA64.exe

–Windows 2008需以下额外操作

  • 右击‘cmd‘ (DOS), 选择’run as administrator’,然后在该命令行窗口中启动mgr和extract才能够读取数据库日志;
  • 将OGG安装为服务 时(即运行“install ADDSERVICE”),需要使用管理员权限.这样启动服务后即能访问日志。
  • 通过以下方法为运行mgr和extract的用户添加读取日志文件的权限.
    右键点击文件 ->property->security->Edit->add

 

Extract: Cannot load program ./ggsci . . .

错误描述:

./ggsci  exec(): 0509-036 Cannot load program ./ggsci because of the following errors:

        0509-150   Dependent module libclntsh.a(shr.o) could not be loaded.

        0509-022 Cannot load module libclntsh.a(shr.o).

        0509-026 System error: A file or directory in the path name does not exist.

错误分析:

–请首先检查该OGG Build是否与操作系统和数据库相符

–其次如果是Aix请检查xLC版本是否符合10.0以上

–检查环境变量中动态库路径是否包含了数据库动态库目录,

例如:export LD_LIBRARY_PATH=$ORACLE_HOME/lib

–不同平台下的环境变量不同:

  • Aix: LIBPATH
  • Solaris、Linux等: LD_LIBRARY_PATH
  • HP-Unix:SHLIB_PATH

–重设环境变量需重启Mgr和Ext/Rep进程

 

 

Extract: Block size mismatch (8192/512) …

错误描述:

 2010-04-22 17:58:23.872  Redo thread 2: No positions processed, Block size mismatch (8192/512) reading redo log /dev/rora_redo22_256m for sequence 11812, …

错误分析:

–裸设备的偏移量各操作系统默认为0,但AIX默认为4096.

–当创建裸设备时使用了-TO选项时,Oracle不会跳过4096字节而是直接从0开始读写。

–因此在AIX下使用裸设备时,出现此错误需要指定OGG从偏移量0开始读取

tranlogoptions rawdeviceoffset 0

–该参数其在实际环境中使用几率非常高

  • 在9.0以前是公开参数,目前版本只存在于内部文档中
  • 在以前版本中如果缺少此参数Extract立即终止,但新版本Extract会持续进行尝试,并不自动终止,需检查报告文件

 

Extract: ORA-15000 ASM connection error

错误描述:

 GGS ERROR       182  Oracle GoldenGate Capture for Oracle, extbill.prm:  OCI Error beginning session (status = 15000-ORA-15000: command disallowed by current instance type).

错误分析:

–该错误为OCI错误,表示Extract是在连接数据库时出现问题,根据错误信息判断为权限问题

–首先在Extract参数中检查ASM相关参数

tranlogoptions asmuser sys@+ASM1, asmpassword oracle

–检查tnsnames.ora和listener.ora验证ASM实例配置正确

–确认ASM用户具有SYSDBA 权限;如果使用SYS,需要将ASM实例的init.ora中REMOTE_LOGIN_PASSWORDFILE参数设置为SHARED. (多个数据库可以使用一个password文件,只有SYS用户可以远程登录.)

–使用sqlplus验证

sqlplus sys/oracle@asm1 as sysdba;可以登录

sqlplus sys/oracle@asm1 ;报告15000错误

 

 

Extract: Could not find archived log…

错误描述:

 Redo thread 2: Could not find archived log for sequence 5242 thread 2 under default destinations SQL <SELECT  name    FROM gv$archived_log   WHERE sequence# = :ora_seq_no AND         thread# = :ora_thread AND         resetlogs_id = :ora_resetlog_id AND         archived = ‘YES’ AND         deleted = ‘N>, error retrieving redo file name for sequence 5242, archived = 1, use_alternate = 0…

错误分析:

–OGG会缺根据gv$archived_log查找归档日志位置.

–可以通过参数指定归档日志目录

 tranlogoptions PRIMARY altarchivelogdest instance ora1 /arch1, altarchivelogdest instance ora2 /arch2

–配置该参数并加入primary选项可以避免Extract持续查询归档日志位置,降低对主库的压力,建议无论归档日志是否放在数据库中指定位置均应配置此参数

 

 

Extract: Encountered SCN That Is Not Greater Than The Highest SCN Already Processed …

错误描述:

 GGS ERROR    180  encountered commit SCN 2187.3361189672 that is not greater than the highest SCN already processed

原因分析:

–在Oracle RAC环境中,Extract会启动一个coordinator线程对各个节点上的操作进行根据SCN进行排序,它在交易提交后会等待THREADOPTIONS MAXCOMMITPROPAGATIONDELAY 参数所定义时间来确认空闲节点没有交易,然后再收集交易数据;写入该交易后如果空闲节点后来又读到了一个SCN号要小的交易,则会报告该错误

–可能原因:

  • 各节点之间没有配置时钟同步
  • 一个节点比另外一个节点慢(IO问题可能性较大)

解决方法:

–在各节点之间配置时钟同步(如NTP服务)

(Q:为什么RAC环境下一个Extract最多可占用N+1个CPU?)

 

 

解决方法(续):

–调整Extract参数

THREADOPTIONS MAXCOMMITPROPAGATIONDELAY <msec> IOLATENCY <msec>

  • MAXCOMMITPROPAGATIONDELAY有效范围是0-90000ms,缺省为3s(即3000ms).
  • GGS V9.x多了一个IOLATENCY参数,可以与上面参数一起加大等待时间。IOLATENCY缺省为1.5s,最大值为180000
  • 建议出现180错误后可以将此二参数设置为较大值,然后逐步降低获取最佳设置

–说明:

  • 出现此错误后,因后面的交易可能已被写入日志,重启Extract可成功启动,但是可能出现如下问题:

–Extract会重写当前队列覆盖前面的交易数据,后面的Data Pump进程可能会出现abend with incompatible record errors错误终止(旧版本可能出现)

 

Extract: Encountered SCN That Is Not Greater …
& GGS ERROR    ZZ-0RG  The previous run
abended due to an out of order transaction…

  • 在新版本的OGG(10.0+)中,如果出现Encountered SCN That Is Not Greater 后,Extract重启可能出现错误:

–GGS ERROR    ZZ-0RG  The previous run abended due to an out of order transaction. Issue ALTER ETROLLOVER…

–此错误是出现Encountered SCN That Is Not Greater错误后Extract无法自动修复(当前正在开发自动修复功能),需通过人工操作予以恢复,修复方法可以参照Doc ID 987379.1,也可参考下述方法

  • 恢复步骤(非正式)

–停止所有Data Pump和Replicat

–针对所有的Extract记录其Write Checkpoint的队列Seqno;

–对于每个Extract向下滚动一个队列

ALTER EXTRACT [name], ETROLLOVER

–启动Extract查看是否滚动到了下一个队列,记录其新队列seqno,应当是旧队列号+1

 

  • 恢复步骤(续)

–修改Data Pump从新的队列开始传输

ALTER EXTRACT [pump_name], EXTSEQNO ##### EXTRBA 0

–重启Data Pump查看是否能够重启成功并从新的队列传输

–修改replicat参数文件,加入或者打开HANDLECOLLISIONS,如果有GROUPTRANSOPS和MAXTRANSOPS请注释掉

–启动Replicat,观察其是否能够读取新传输过来的队列

–如Replicat无法自动滚动到下一个队列,需要通过alter replicat [replicat_name], EXTSEQNO ##### EXTRBA 0手工滚动。

–等待Replicat处理到结尾没有延迟时,可以关闭HANDLECOLLISIONS和恢复原来的GROUPTRANSOPS和MAXTRANSOPS参数

–重新启动Replicat即可恢复正常复制。

 

 

Extract: GGS ERROR 146  NUMCNV_getNumeric

错误描述(askmaclean.com):

2010-05-26 10:05:05  GGS ERROR       146  NUMCNV_getNumeric(char *, size_t, int64_t *, short *, BOOL): Buffer overflow, needed: 20, allocated: 19

错误分析:

–该问题一般出现在sequence复制中(也曾出现在表复制中)

–参考Bug 9734755: OGG EXTRACT CAUSES GGS ERROR 146 – NUMCNV_GETNUMERIC: BUFFER OVERFLOW

–在OGG的10.4.0.68.002以后版本已经修复

 

filter无法正常工作

错误描述:

TABLE demo_src.people,  FILTER (age > 50);

添加后无法正常工作,updatefilter不起作用

注意:在过滤出现问题时OGG并不报告错误

 

错误分析:

–该配置从语法看没有错误,但是对比的列age如果不是主键,则update在日志中不存在该列值,也就没有办法通过该列进行比较

–解决方法为Add trandata demo_src.people, cols (age)强制为该列加入附加日志

:也可通过fetch从数据库中读取该记录进行比较(只能在源端抽取进程),如下所示(此方法每条记录均需要访问数据库,导致复制效率降低):

TABLE demo_src.people, FETCHBEFOREFILTER, FETCHCOLS (age), FILTER (age > 50);

 

 

Data Pump: ERROR 112 network communication

错误描述:

2010-05-18 10:10:20  GGS ERROR       112  There is a problem in network communication, a remote file problem, encryption keys for target and source do not match (if using ENCRYPT) or an unknown error. (Remote file used is ./dirdat/contact/EC001606, reply received is Unable to lock file “./dirdat/contact/EC001606″ (error 13, Permission denied).

 

错误分析:

–如果使用主机名确认hosts里面包含有该主机IP的解析

–确认可以通过telnet访问参数rmthost配置的远程主机mgr端口

–停止其它所有Data Pump查看目标端是否存在server进程(即collector进程),如果存在则通过kill杀死该进程重启Data Pump

–确认目标端Manager进程中是否配置了dynmaicportlist,有可能因为指定端口范围太小或者被其它应用占用了端口导致无法连接,可以调大端口范围后再试(一般1个Data pump需一个端口,如有Director则需多保留几个端口)

–检查传输是否使用了加密

 

 

Extract:源数据库性能降低,出现大量等待会话

错误描述:

源端数据库主机的ora_lmsora_lmp进程占用大量资源,出现大量control file sequential read等待会话

错误分析:

–Extract参数

EXTRACT mer_ext

USERID ggs, PASSWORD ggs

EXTTRAIL /home/ggs/dirdat/et

FLUSHCSECS 3

EOFDELAYCSECS 3

TABLE orange.ITEMS;

–Data Pump参数

EXTRACT mer_pump

USERID ggs, PASSWORD ggs

RMTHOST cblhprac1, MGRPORT 7810

RMTTRAIL /home/ggs/10.4/dirdat/et

FLUSHCSECS 3

EOFDELAYCSECS 3

TABLE orange.ITEMS;

 

–建议

–Data Pump去掉USERID参数并加入Passthru

–FLUSHCSECS 3 全部去掉或者改为FLUSHSECS 3

–EOFDELAYCSECS 3全部去掉或者改为EOFDELAYSECS 3

 

GoldenGate OGG replicat常见问题

 

数据复制典型错误 GGS ERROR 101 Invalid option for MAP…

错误描述(askmaclean.com):

GGS ERROR 101 Invalid option for MAP: TOKENS(TKN-

USERID=@GETENV(“TRANSACTION”..

错误分析:

–101错误为参数错误,表明当前MAP语句中语法出现问题

–查看该行参数语法没有发现错误,如下所示:

MAP AU.JOBS, TARGET NZ.JOBS,

COLMAP (USEDEFAULTS,

TRAN_TIME = @TOKEN(“TKN-COMMITTIMESTAMP”),

DB_USER = @TOKEN(“TKN-USERID”),

OP_TYPE = @TOKEN(“TKN-OPTYPE”);

–出现错误原因是OGG解析参数文件时可能会把函数等关键字(如TOKEN)和括号等连续在一起的字符认为是一个关键字

–在TOKEN后面和括号之间加入一个空格重启即可

说明:日常要养成在OGG参数文件中关键字和各中符号前后加入空格的良好习惯。

 

 

数据复制典型错误 SQL error 1403 mapping

错误描述(askmaclean.com):

2010-02-25 13:20:08  GGS WARNING     218  Oracle GoldenGate Delivery for

Oracle, rep_stnd.prmSQL error 1403 mapping HR.MY_EMPLOYEE to HR.MY_EMPLOYEE.

错误分析:

–可能原因包括:

  • 两端结构不一致(异构环境,列和主键不同)
  • 两端有不一致记录
  • 附加日志不全

–可以到discard文件中查看具体错误信息,如果为update 或者delete找不到对应记录,并且某几个字段为空,则可认定为缺少了附加日志

Problem replicating GGS1.HISCUSTMER to GGS2.HISCUSTMER

Error  occurred with delete record (target format)…

*

CUST_CODE = 

 *

注意:添加表的附加日志是即时生效,如extract已经将数据抽入队列,则重新添加附加日志后进行重新初始化,旧的队列数据不能被继续使用

 

数据复制典型错误 GGS ERROR 160 Use ALLOWNOOPUPDATES to process the update

错误描述:

2010-05-07 10:16:01  GGS ERROR       160  Encountered an update for target table

 CASEM.BILLING_ERROR_TEMP, which has no unique key defined.  KEYCOLS can be used

 to define a key.  Use ALLOWNOOPUPDATES to process the update without applying i

t to the target database.  Use APPLYNOOPUPDATES to force the update to be applie

d using all columns in both the SET and WHERE clause.

错误分析:

–首先确认该表正确添加了附加日志,若附加日志正确则原因为下说述

–当Update一条记录但是未修改其中某些字段记录时,Oracle会在日志中记录该Update操作,但是由于数据本身没有改变,可能并没有记录其后影像。此时OGG抽取数据后队列中也没有后影像,导致目标端Replicat无法组成正确SQL

  • 例如,表T中有一条记录其字段C原来值为‘a’,如果update t set c=‘a’ where rowid=‘XXXXXXX’即会产生该情形

–解决方法正如错误描述中说述在参数中加入即可继续

ALLOWNOOPUPDATES

注意:该参数是一个内部参数

 

DB2典型错误 SQL0798N  不能对定义为 GENERATED ALWAYS 的列 “ID” 指定值

 

错误描述:

2010-01-13 13:43:31  GGS WARNING     218  Aborting BATCHSQL transaction. Databas

e error -798 ([IBM][CLI Driver][DB2/NT] SQL0798N  不能对定义为 GENERATED ALWAYS

的列 “ID” 指定值。  SQLSTATE=428C9

错误分析:

–检查出错的表结构是否包含IDENTITY类型字段

–在DB2中提供了两种标识列值

  • GENERATED ALWAYS AS IDENTITY –始终生成
  • GENERATED BY DEFAULT AS IDENTITY –缺省情况下生成

–通常IDENTITY字段是定义为第一种,即始终由数据库自行产生的,不允许插入时指定值,例如如下字段:

ID INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY(START WITH 0,INCREMENT BY 1,CACHE 50)

–将该字段改成GENERATED BY DEFAULT AS IDENTITY允许插入值即可。

 

 

使用RANGE时告警 Database error 60 (ORA-00060: deadlock detected…

 

告警描述:

2010-05-28 10:45:05 GGS WARNING 218 Oracle GoldenGate Delivery for Oracle, r_ro_12b.prm: Aborted grouped transaction on ‘SIEBEL.S_ORDER_ITEM’, Database error 60 (ORA-00060: deadlock detected while waiting for resource).

错误分析:

–一般出现在通过RANGE进行拆分的行数特大的表

–各Replicat会根据主键hash值各自负责不同的数据集,不会有多个进程对同一条数据进行操作

–但是,可能出现多个进程修改的记录在同一个块上的情况,此时会引起死锁

–可以通过修改该表的INITRANS参数增大每个块中处理行级锁事务的数量,该参数缺省为1,建议至少设置为拆分出来的Replicat数量

ALTER TABLE TEST MOVE INITRANS 100

alter index index_name rebuild online;

注:修改此项参数建议先停止对应的Replicat。Move操作可以保证对原有数据有效,否则只做用于新增数据;Move之后需要重建索引。

 

Tips 如何获取当前无法执行的SQL

  • 可以通过获取Replicat执行的SQL帮助解决数据错误
  • 在Replicat中加入以下参数

NOBINARYCHARS

NODYNSQL

SHOWSYNTAX

  • 从shell命令行(不是ggsci)启动Replicat

Shell> REPLICAT PARAMFILE dirprm/<Replicat name>.prm

  • 启动后会显示第一个SQL语句

选择Keep Displaying (default)可以执行当前SQL并显示下一条

选择Stop Display停止显示

  • 完成诊断后从参数文件中移除这3个参数

Q:如何持续获取OGG队列中的SQL语句?配置一个使用formatsql参数的Data Pump。

Comment

*

沪ICP备14014813号

沪公网安备 31010802001379号