我们定义一下需要数据同步的2台机器
数据源Oracle(这里用的是Oracle10)
IP:172.16.195.48 库名:BILLING75YZJ(一定要注意大小写)
数据目标MySQL(这里用的是ver 5.0.45)
IP:172.16.195.40 库名:test
我们的目的是要把Oracle数据库BILLING75YZJ库中的TBL_TEST表同步到MySQL数据库test库中的TBL_TEST表
A.增量数据同步配置 首先我们先配置Oracle端(数据源) 1:你得需要先下载一个Oracle GoldenGate(以后我们简称ogg),你可以到这里下载
切记,Oracle和MySQL两边所使用的GoldenGate的版本一定要一致,不同的版本所生成的同步文件会无法解析,然后到头来你还得设置过(表示中过枪),版本一致的话就省了很多麻烦事。
2:下载完后解压到目录中(这里我们把ogg放到oracle的安装目录下unzip xxxx /home/oracle/ogg,后面我们会切换到oracle数据库专用角色来配置ogg)
3:编辑 ~/.bash_profile文件,加入如下的内容:
export GGATE=/home/oracle/ogg //我们之前ogg的解压目录
export LD_LIBRARY=/home/oracle/ogg //ggsci等程序需要一些so才能运行
4:反正你肯定已经装了Oracle,那么ORACLE_HOME,ORACLE_BASE等定义肯定已经设置过了(没有的话就设置一下吧)
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=/home/oracle/product/1020
5:首先我们要打开Oracle数据库的ArchiveLog(归档)模式 用sqlplus登录Oracle
[oracle@localhost ~]$ sqlplus /nolog
SQL> conn /as sysdba
Connected. 可以用以下语句查看ArchiveLog的状态
SQL> select log_mode from v$database;

LOG_MODE
------------
NOARCHIVELOG
现在表示还没打开,我们先要关闭Oracle
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shutdown.
关闭过程可能有点慢,等着吧(如果关了这个SSH你后面就只能呵呵了)
然后启动Oracle
SQL> startup mount
ORACLE instance started.

Total System Global Area 285212672 bytes
FixedSize 2095704 bytes
VariableSize 138413480 bytes
DatabaseBuffers 138412032 bytes
RedoBuffers 6291456 bytes
Database mounted.
开启ArchiveLog模式
SQL> alter database archivelog;
Database altered.
SQL> alter database open; Database altered; 如果alter database archivelog;并不是和startup & shutdown在同一个Session执行的话,会出现如下错误
ORA-01126: database must be mounted in this instance and not open in any instance 所以再慢也就只能等着了
好了,到这ArchiveLog模式已经打开了,不过Oracle10默认是把存档终点设置为USE_DB_RECOVERY_FILE_DEST,所以归档日志默认是保存在Oracle系统的闪回恢复区(Flash recovery area)的。默认的db_recovery_file_dest是2G,如果Flash recovery area满了的话,会出现ORA-00257错误
ORA-00257: archiver error. Connect internal only, until freed.
所以满了的话你就需要清一下闪回恢复区的日志了,具体的方法网上很多,这里就不多赘述了。
6:然后我们在Oracle中给ogg建一个用户名为ogg密码为ogg的账户
SQL> create user ogg identified by ogg default tablespace BILLING75YZJ;

User created. 然后设置账户权限
SQL> grant connec,resource to ogg;

Grant succeeded.
SQL> grant select any dictionary,select any table to ogg;

Grant succeeded.

SQL> grant alter any table to ogg;

Grant succeeded.

SQL> grant insert any table to ogg;

Grant succeeded.

SQL> grant update any table to ogg;

Grant succeeded.

SQL> grant delete any table to ogg;

Grant succeeded.
账户创建完后可以在ggsci中使用dblogin命令看是否能登录Oracle
dblogin userid ogg, password ogg 如果这样无法登录,可以尝试用以下方式
dblogin userid ogg@ORCL, password ogg ORCL是你的Oracle的Service Name/SID
7:然后开始设置数据库源端的ogg,运行ogg目录下的ggsci
./ggsci运行后你会看到这样的内容:
Oracle GoldenGate Command Interpreter for Oracle
Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230_FBO
Linux, x86, 32bit (optimized), Oracle 10g on Apr 23 2012 07:06:02

Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
建立需要的目录:
GGSCI (test48) 1>create subdirs 如果显示Permission denied,那就是目录权限不够
设置OGG Manager Session
GGSCI (test48) 2>edit params mgr 我们这里使用7809端口,所以编辑内容如下:
PORT 7809
然后启动Manager Session
GGSCI (test48) 3>start mgr
想要确认是否正常运行,可以用info all来确认
GGSCI (test48) 4> info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING
添加一个名为ext-all的ext(我觉得可以理解成数据收集器)
GGSCI (test48) 5> add extract ext-all,tranlog,begin now
把收集到的数据放到/home/oracle/ogg/dirdat/al
GGSCI (test48) 6> add exttrail /home/oracle/ogg/dirdat/al, extract ext-all 然后编辑ext-all这个收集器的参数
GGSCI (test48) 7> edit param ext-all 内容如下:
extract ext-all
userid ogg,password ogg
exttrail /home/oracle/ogg/dirdat/al
discardfile /home/oracle/ogg/discard/ext-all.txt, append, megabytes 1
TABLE BILLING75YZJ.TBL_TEST;
这里我们只选择了TBL_TEST表作为同步对象,你也可以使用BILLING75YZJ.*
内容如下:
extract p-all
userid ogg,password ogg
rmthost 172.16.195.40,MGRPORT 7809
rmttrail /var/lib/mysql/ogg/dirdat/rl
discardfile /home/oracle/ogg/discard/p-air.txt, append, megabytes 1
TABLE BILLING75YZJ.TBL_TEST; rmttrail这个上面已经说明了,这里就不多描述了,rmthost是MySQL机器的IP地址MGRPORT是MySQL机器OGG Manager Session设置的PORT
现在我们需要将数据源所使用到的表导出成一个def文件(Oralce->MySQL字段定义有可能不一致)
GGSCI (test48) 10> edit param defgen 编辑内容如下:
defsfile ./dirdef/source.def, purge
userid ogg@ORCL, password ogg
table BILLING75YZJ.TBL_TEST; 生成def文件
[root@localhost ogg]# ./defgen paramfile dirprm/defgen.prm
然后把 ./dirdef/source.def 放到装有MySQL数据库的机器上ogg目录下的dirdef/source.def(这个文件的路径将在之后的MySQL机器上配置replicat时用到)
至此Oracle部分的配置就结束了,至于运行,我们放到MySQL端配置完全后再一起运行好了
接下来我们开始配置MySQL端(数据目的)
8:同样是去这里下载OGG for MySQL的版本,然后解压什么的都和Oracle版本的一样(不过for MySQL版本的我没有设置LD_LIBRARY就能运行./ggsci)
然后同样是建立所需目录
GGSCI (localhost) 1> create subdirs
编辑OGG Manager Session端口,这里我们也使用7809
GGSCI (localhost) 2> edit params mgr 内容如下:
PORT 7809
编辑完了就运行Manage Session
GGSCI (localhost) 3> start mgr
9:现在我们开始配置同步数据的接收
创建一个名叫repl的replicat
GGSCI (localhost) 4> add replicat repl, exttrail /var/lib/mysql/ogg/dirdat/rl,nodbcheckpoint
/var/lib/mysql/ogg/dirdat/rl 这个路径就是我们在配置DataPump时所用到路径,然后我们选择不使用checkpoint(关于checkpoint的使用以及解释这篇文章还不错)
编辑repl这个数据接收器
GGSCI (localhost) 5> edit param repl 内容如下:
replicat repl
DBOPTIONS HOST 127.0.0.1, CONNECTIONPORT 3306
TARGETDB test,userid admin,password admin
sourcedefs ./dirdef/source.def
reperror default,discard
MAP BILLING75YZJ.TBL_TEST, TARGET test.TBL_TEST; 上面这个配置只完成了从BILLING75YZJ.TBL_TEST->test.TBL_TEST的整表同步,那如果我们只需要其中的几个字段呢,这个时候你就需要使用colmap了(关于Oracle->MySQL数据库字段的映射规则看这篇文章)
假设你需要把BILLING75YZJ.TBL_ZYTEST中的A1字段和B1字段分别同步到test.TBL_TEST的A2字段和B2字段,那么你可以这样写
MAP BILLING75YZJ.TBL_ZYTEST, TARGET test.TBL_TEST, COLMAP(a1=a2, b1=b2); 你可能需要使用dblogin命令来确认你是否可以登录到MySQL数据库
dblogin sourcedb test, userid admin, password admin 如果dblogin报了如下的错误
OGG-00769 Oracle GoldenGate Command Interpreter for MySQL: MySQL Login failed: . SQL error (2002). Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’
那么你需要做一个软链接来确保GGSCI能正常登录到数据库
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock //mysql.sock文件位置请自行确认
|