最近研究了一下oracle Goldengate异构同步的过程, 真是几天不用手生,敲命令竟然如此生疏。不过还算顺利,经过一番折腾终于好了。
环境描述:
192.0.2.101( Oracle ) —>192.0.2.102 (Mysql )
版本:
操作系统:redhat6.5
Oracle : 12.1.0.2.0
Mysql: 5.6.25
goldgate:
Version 12.2.0.1.1 for oracle
Version 12.2.0.1.1 formysql
测试用户:
在oracle创建2个用户,并创建了2张表,同步到mysqltest数据库下。
Oracle to Mysql 需要注意的地方:
Supported data types for mysql :
|
CHAR |
DOUBLE |
TINYTEXT |
|
VARCHAR |
DATE |
MEDIUMTEXT |
|
INT |
TIME |
LONGTEXT |
|
TINYINT |
YEAR |
BLOB |
|
SMALL INT |
DATETIME |
TINYBLOB |
|
MEDIUM INT |
TIMESTAMP |
MEDIUMBLOB |
|
BIG INT |
BINARY |
LONGBLOB |
|
DECIMAL |
VARBINARY |
ENUM |
|
FLOAT |
TEXT |
BIT(M) |
Oracle GoldenGate supports InnoDB storageengine for a source MySQL database goldengate 对mysql只支持innodb引擎 所以,在创建mysql端的表的时候,要指定表为innodb引擎。但是5.6默认的存储引擎就是InnoDB。
一:Oracle端的基础配置
初始化ogg
/u01/ogg/dbhome
[oracle@host01 dbhome]$ ./ggsci
Oracle GoldenGate Command Interpreter for Oracle
Version 12.2.0.1.1 OGGCORE_12.2.0.1.0_PLATFORMS_151211.1401_FBO
Linux, x64, 64bit (optimized), Oracle 12c on Dec 12 2015 02:56:48
Operating system character set identified as UTF-8.
Copyright (C) 1995, 2015, Oracle and/or its affiliates. All rightsreserved.
GGSCI (host01.example.com) 1>
GGSCI (host01.example.com) 9> create subdirs
1.1. 修改oracle数据库的参数
1.2 修改数据库为归档模式
1.3 打开辅助日志
alter database add supplemental log data
1.34 关闭回收站
alter system set recyclebin=off scope=both; (10g以后可以不关闭)
下面报错以上由于没设参数以及授予权限,
OGG REPLICAT abend:
ERROR OGG-01820 Could not enable workspace.
ERROR OGG-01668 PROCESS ABENDING.
通过设置alter system setenable_goldengate_replication=true scope=both ;解决
1.5 创建复制用的用户,并授权
create tablespaceoggtb datafile'/u01/app/oracle/oradata/PROD4/oggtb01.dbf' size 1g ;
create tablespaceoggtb datafile'/u01/app/oracle/oradata/EMREP/oggtb01.dbf' size 1g ;
create user ogg identifiedby ogg default tablespace oggtb;
grant connect,resource toogg;
grant unlimited tablespaceto ogg;
grant execute on utl_fileto ogg;
在ogg的安装目录下登陆sqlplus,使用sys登陆sqlplus,然后执行如下配置
[oracle@local ~]$ sqlplus /nolog
SQL> conn / as sysdba
SQL> @marker_setup.sql
SQL> @ddl_setup.sql;
SQL> @role_setup.sql;
SQL> grant GGS_GGSUSER_ROLE to ogg;
SQL> @ddl_enable.sql;
进入ogg控制台,测试用户是否创建成功
GGSCI (local) 1> dblogin userid ogg
Password: ogg
Successfully logged into database.
由于异构数据库之间不支持ddl复制,mysql也没有Oracle使用的 sequence ,所以数据库上不需要启用DDL 复制支持和 Sequence 复制支持。(上边步骤可以省略)
二:target 端(Mysql)
2.1 配置Mysql参数
Mysql 的引擎很多,但是OGG只支持Innodb 的引擎,所以需要修改mysql的配置文件开启 binary logging, 在 / etc / my.conf 文件中添加如下内容
log-bin=/u01/mysql/log/binary-log
log-bin-index=/u01/mysql/log/binary-log.index binlog_format = row
说明: 1 . 设为 row 使得dml语句以 binary 格式记入日志,任何其他日志格式(mixed或 statement )将引起 extract 进程停止。因为ogg支持InfoDB。 2 . 这里直接将Mysql默认的引擎改成INNODB了,当然也可以在创建表的时候修改。
- - 重启mysql数据库:
[root@host02 ~]# msyqladmin shutdown
[root@host02 ~]# mysqld_safe &
创建测试数据库test和表 zw,tt
createtable zw(id integer primarykey,name varchar(20));
mysql> create table tt (id varchar(1));
Query OK, 0 rows affected (0.07 sec)
2.2 修改ogg参数
GGSCI(host02.example.com) 1> dblogin sourcedb test,userid root,password root123
GGSCI(host02.example.com) 1> edit params mgr
port7808
GGSCI(host02.example.com) 2> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
三、配置同步source
GGSCI(host01.example.com) 1> add extract extmy3,tranlog,begin now
ADDEXTTRAIL /u01/ogg/dbhome/dirdat/E3, EXTRACT EXTMY3, megabytes 100
GGSCI(host01.example.com) 2> view param extmy3
extractextmy3
useridogg,password ogg
exttrail/u01/ogg/dbhome/dirdat/E3
tabletest.zw;
tablehr.tt;
--fetchoptionsfetchpkupdatecols
GGSCI(host01.example.com) 3>
在source 端添加 datapump进程
GGSCI(host01.example.com) 3> add extract pumpmy3,exttrailsource/u01/ogg/dbhome/dirdat/E3
addrmttrail /u01/oggmysql/dirdat/R3,extractpumpmy3
GGSCI(host01.example.com) 4> view param pumpmy3
extractpumpmy3
rmthost192.0.2.102,mgrport 7808
rmttrail/u01/oggmysql/dirdat/R3
passthru
gettruncates
tabletest.zw;
tablehr.tt;
infoall
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT ABENDED DPEA 00:00:00 95:05:49
EXTRACT ABENDED EXTA 00:00:00 95:05:54
EXTRACT RUNNING EXTMY3 00:00:00 00:00:08
EXTRACT ABENDED HRDPEA 00:00:00 95:05:49
EXTRACT ABENDED HREXTA 00:00:00 95:05:54
EXTRACT RUNNING PUMPMY3 00:00:00 00:00:05
配置 defegn 因为这里是oracle到mysql的同步,所以要生成异构的文件,并将文件复制到target端的dirdef目录下 在Oracle数据库执行
GGSCI(host01.example.com) 7> edit param defgen
useridogg,password ogg
defsfile/u01/ogg/dbhome/dirdef/oracle.def
tabletest.zw;
tablehr.tt
出现如下错:
OGG-00396 Command not terminated by semi-colon.
ERROR OGG-01668 PROCESS ABENDING.
原因是配置文件中没有以分号结尾;
解决办法:修改配置文件。
defgenparamfile /u01/ogg/dbhome/dirprm/defgen.prm
scp oracle.def root@192.0.2.102:/u01/oggmysql/dirdef/
四: target 端配置replicat进程
修改mysql密码
target 端配置replicat进程
mysqladmin-u root password "root123"
- - 创建 checkpoint table
GGSCI(host02.example.com DBLOGIN as root) 4> dblogin sourcedb test,useridroot,password root123
Successfullylogged into database.
addcheckpointtable test.checkpoint
GGSCI(host02.example.com DBLOGIN as root) 5> add replicat r3,exttrail/u01/oggmysql/dirdat/R3,checkpointtable test.checkpoint
-- 修改参数
GGSCI(host02.example.com DBLOGIN as root) 6> view param R3
replicat R3
dboptionshost localhost,connectionport 3306
targetdbtest,userid root,password root123
sourcedefs/u01/oggmysql/dirdef/oracle.def
handlecollisions
assumetargetdefs
discardfile/u01/oggmysql/dirrpt/R3.dsc,append,megabytes 50
maptest.zw,target test.zw;
map hr.tt,target test.tt;
GGSCI(host02.example.com DBLOGIN as root) 7> start r3
五: 测试
SQL>insert into hr.tt values ('3');
1row created.
SQL>
SQL>commit ;
mysql>select * from test.tt;
+------+
|id |
+------+
|2 |
|2 |
|3 |
+------+
3rows in set (0.00 sec)
select* from test.zw ;
ID NAME
------------------------------
1 missa
2 rita
3 ardu
SQL>insert into test.zw values (5,'ogg');
1row created.
SQL>commit ;
Commitcomplete.
SQL>select * from test.zw ;
ID NAME
------------------------------
1 missa
2 rita
3 ardu
5 ogg
select* from test.zw;
+----+------+
|id | name |
+----+------+
| 3 | ardu |
+----+------+
1row in set (0.00 sec)
mysql>select * from test.zw;
+----+------+
|id | name |
+----+------+
| 3 | ardu |
| 5 | ogg |
+----+------+
2rows in set (0.00 sec)
deletefrom test.zw where id='3';
1row deleted.
SQL>commit ;
Commitcomplete.
SQL>/
Commitcomplete.
SQL>select * from test.zw ;
ID NAME
------------------------------
1 missa
2 rita
5 ogg
mysql>select * from test.zw;
+----+------+
|id | name |
+----+------+
| 5 | ogg |
+----+------+
1row in set (0.00 sec)
至此,配置完毕。
