将生成的该文件拷贝到目标端相同位置:
[root@zlm ~]# scp /u01/app/oracle/gg11/dirdef/oratomy.def dg1:/ggmysql/dirdef The authenticity of host 'dg1 (192.168.1.99)' can't be established. RSA key fingerprint is e4:1f:12:e6:63:13:3a:2a:ad:52:e3:4a:68:b6:33:e0. Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'dg1,192.168.1.99' (RSA) to the list of known hosts. root@dg1's password:
oratomy.def 100% 1079 1.1KB/s 00:00 [root@zlm ~]#
5.3 一致性抽取源端数据到目标端
由于是异构数据库之间复制数据,初始化不能采用rman、dexpdp/impdp、传输表空间等oracle的方式来完成,这里选用Goldengate推荐的的初始化方式完成 5.3.1 源端增加用户对象的trandata日志
GGSCI (zlm) 1> dblogin userid ogg,password ogg GGSCI (zlm) 2> add trandata sender.* 5.3.2 源端配置初始化抽取组eini
GGSCI (zlm) 1> add extract eini,sourceistable GGSCI (zlm) 2> edit params eini extract eini
userid ogg,password ogg rmthost dg1,mgrport 7809 rmttask replicat,group rini table sender.*;
5.3.3 目标端配置复制组rini
GGSCI (dg1) 1> add replicat rini,specialrun GGSCI (dg1) 2> edit params rini replicat rini
sourcedb test userid root,password 123456 sourcedefs ./dirdef/oratomy.def
discardfile ./dirrpt/rini.dsc,append,megabytes 5 map sender.*, target test.*;
5.3.4 运行源端manager和extract抽取组进程 GGSCI (zlm) 1> start mgr GGSCI (zlm) 2> start eini 5.3.5 运行目标端manager进程 GGSCI (zlm2) 1> start mgr
注意:当使用OGG推荐方式初始化数据时,目标端replicat复制组进程会自动运行,不用手动启动,就可以完成一次性抽取
当启动进程后,源端ggserr.log里提示有错误:
2013-08-31 17:43:13 WARNING OGG-01194 Oracle GoldenGate Capture for Oracle, eini.prm: EXTRACT task RINI abended : Problem at line 27. Expecting file, table, or record definition.
2013-08-31 17:43:13 ERROR OGG-01203 Oracle GoldenGate Capture for Oracle, eini.prm: EXTRACT abending.
2013-08-31 17:43:13 ERROR OGG-01668 Oracle GoldenGate Capture for Oracle, eini.prm: PROCESS ABENDING.
目标端的ggserr.log里也有同样的提示:
2013-08-31 17:43:12 INFO OGG-00995 Oracle GoldenGate Delivery for MySQL, rini.prm: REPLICAT RINI starting.
2013-08-31 17:43:12 ERROR OGG-00303 Oracle GoldenGate Delivery for MySQL, rini.prm: Problem at line 27. Expecting file, table, or record definition.
2013-08-31 17:43:17 ERROR OGG-01668 Oracle GoldenGate Delivery for MySQL, rini.prm: PROCESS ABENDING
从该提示看来,应该是def文件的问题,但是之前已经创建并复制到目标库了,应该没有什么问题啊,查看了MOS上的文章才知道,原来这是由于目标端的OGG软件版本比源端版本低的缘故:
Replicat abend with ERROR OGG-00303 Problem at line xx. Expecting file, table, or record definition. (Doc ID 1455370.1)
In OGG 11.2, there is a new parameter NOEXTATTR. This is used in DEFGEN. When the OGG version in a target site is lower than the source site, defgen needs to use parameter NOEXTATTR to generate a sourcedef file which target site can read . If using a sourcedef file generated without NOEXTATTR, a replicat will abend with error 00303.
So there are two ways to get around the issue:
1. Use a defgen paramfile with NOEXTATTR option, or
2. Generate definition file with the same OGG version as the OGG target site version. 此处采用办法1,添加NOEXTATTR参数选项,重新生成def文件,并复制到目标端,注意先把原来的def文件删除再添加。在用了新的def文件之后,之前的问题已经解决 重启两端mgr和源端的eini后,源端eini的report没有任何错误提示,但目标端rini的report报了一个错误:
ERROR OGG-00770 Failed to connect to MySQL database engine for HOST localhost, DATABASE test, USER root, PORT 3306. ERROR OGG-01668 PROCESS ABENDING. 查看源端eini的report继续报错:
WARNING OGG-01194 Oracle GoldenGate Capture for Oracle, eini.prm: EXTRACT task RINI abended : Failed to connect to MySQL database engine for HOST localhost, DATABASE test, USER root, PORT 3306.
查看目标端并没有生成rini的report,因为在eini先abending了 GGSCI (dg1) 5> view report rini ERROR: REPORT file RINI does not exist. 直接登录也是报错:
GGSCI (dg1) 9> dblogin sourcedb test,userid root,password 123456
WARNING OGG-00769 MySQL Login failed: . SQL error (2002). Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2). 解决办法:
修改/etc/my.cnf文件,将server和client的socket修改为:/tmp/mysql.sock 重启mysql:/etc/init.d/mysql stop/start
GGSCI (dg1) 3> dblogin sourcedb test,userid root,password 123456 Successfully logged into database.
GGSCI (dg1) 9> dblogin sourcedb test@localhost.localdomain,userid root,password 123456
Successfully logged into database. 这两种都可以登录方式登录都成功
但是这样改了以后,又碰到一个问题,就是无法登录mysql了 [root@dg1 ggmysql]# service mysql start
Starting MySQL [ OK ] [root@dg1 ggmysql]# mysql -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
于是只好再改回socket为注释状态,似乎碰到了一个无解的状态 MYSQL的SOCKET问题还真是麻烦,把socket文件重新链接一下: [root@dg1 ~]# locate mysql.sock /var/lib/mysql/mysql.sock
[root@dg1 ~]# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
或者定义一下用户的MYSQL_UNIX_PORT变量,指向MySQL数据库文件的目录即可,即: export MYSQL_UNIX_PORT=/var/lib/mysql/mysql.sock
GGSCI (dg1) 1> dblogin sourcedb test userid root,password 123456 Successfully logged into database.
接着再启动源端、目标端进程,又出现错误:
WARNING OGG-01223 TCP/IP error 111 (Connection refused). WARNING OGG-01223 TCP/IP error 104 (Connection reset by peer).
WARNING OGG-01223 TCP/IP error 107 (Transport endpoint is not connected). 原因是必须等Target 端的GG进程(mrg进程)启动以后才能启动 之前的问题都已经逐步解决掉了,现在又碰到一个报错: ERROR OGG-01389 File header failed to parse tokens. File INITIALDATALOAD, last offset 815, data: Google到一篇老外写的关于这个问题的解决方法:
http://gavinsoorma.com/2012/06/using-the-format-release-parameter-to-handle-goldengate-version-differences/
解决方法与MOS上的文章差不多:
OGG v11.1.1.0.0 JMS Adapter reading OGG v11.2.1.x trails (文档 ID 1477046.1) Cause:
JMS EXTRACT v11.1.1.0.0 user-exit is compatible with v11.2.x EXTRACT but there are certain configuration steps you must follow for backwards compatibility. Solution:
1. Generate the sourcedefs with the NOEXTATTR option to create a backwards compatible sourcedefs file:
os> DEFGEN paramfile …., NOEXTATTR
2. Use FORMAT RELEASE 9.5 in the source EXTRACT and any EXTRACT PUMP to write trails that are in v9.5 format
exttrail /u01/app/goldengate/dirdat/ae,format release 9.5 rmttrail /u01/app/goldengate/dirdat/ae, format release 9.5 See KM Doc ID 1395761.1.
3. The EXTRACT used to execute the v11.1.1.0.x Adapter must be OGG v11.1.x. Do not use v11.2 EXTRACT to execute v11.1.1.x Adapter.
You can use FORMAT RELEASE 11.1 if using JMS Adapter v11.1.1.0.10+ with properties value of \
这里都提到了在用到trail文件时,通过添加release version xx.x 来降低源端的trail文件版本,但是对于初始化数据时碰到的这个情况,并没有给出解决方法
由于OGG FOR MYSQL目前最高版本官网只提供到11.1,看来要做初始化的ORACLE->MYSQL只有降低源端OGG版本才能解决了 无奈只能重新去官网下载11.1版本的OGG
官网链接:https://edelivery.oracle.com/EPD/Search/handle_go
介质名称:Oracle GoldenGate V11.1.1.1.2 for Oracle 11g on Linux x86-64 安装过程参考之前11.2版本的步骤,此处略
重新运行目标端、源端相应进程后,查看eini的report信息: Database Language and Character Set:
NLS_LANG environment variable specified has invalid format, default value will be used. NLS_LANG environment variable not set, using default value
AMERICAN_AMERICA.US7ASCII. NLS_LANGUAGE = \NLS_TERRITORY = \NLS_CHARACTERSET = \
Warning: your NLS_LANG setting does not match database server language setting. Please refer to user manual for more information. 提示环境变量字符集与数据库字符集不一致
在源端环境变量中添加:export NLS_LANG=’AMERICAN_AMERICA.AL32UTF8’
WARNING OGG-00869 Oracle GoldenGate Capture for Oracle, eini.prm: No unique key is defined for table TEST2. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.
字符集的问题解决了,但是从ggserr.log中的提示看来,测试表还没有唯一键定义,难道这是造成不能同步的原因吗?来测试一下,给测试表加上主键约束: SQL> alter table test2 add constraint pk_test2 primary key(id);
注意:因为增加了主键,表结构已经变化了,要重新生成def文件并复制到目标端 做完以上步骤以后,目标端的rini的report依然报错:No records were replicated. 说明没有主键并不是导致不同步的原因,应该是在ORACLE->MYSQL的时候,表名没有匹配,做了一个默认的转换,因为我在eini的report中发现了这么一条: TABLEWildcard resolved (entry SENDER.*): table SENDER.TEST2;
明明配置的是table setender.*,现在变成经过通配符转换以后,变成大写的了,那目标端的rini参数里是否也要改写成大写才行呢? 修改目标端rini参数,注意:一定要这么改!!! map SENDER..TEST2,target test.test2; 关于这个map target转换参数的总结:
1、由于MYSQL的数据库是大小写敏感的,不像ORACLE数据库那样会自动进行转换(创建时用的小写表名,在OGG传递的时候用大写的进行转换),这里由于在源端的eini进程做了一个转换,所以在目标端的replicat参数中一定要写成一样的,否则就是No recoerds were replicated的提示
2、这里还要注意一个问题,taget和之前的“,”之间必须要写一个空格,否则也会提示No recoerds were replicated,并且会报一个错:
ERROR OGG-00212 Invalid option for MAP: test.test2.
发现这个错误不要误以为是teest.test2名字写错了,只是因为少了一个空格,在目标端rini参数中修改以上2处错误以后,提示已经正常同步了,困扰我1天ORACLE->MYSQL的初始化问题终于得到解决:
*********************************************************************** ** Run Time Messages **
***********************************************************************