OGG单向实时同步Oracle数据
1.整体搭建
Oracle:11.2.0.4
OGG:11.2.1.0.1
1.1安装OGG
1.2解压安装目录
源端和目标端都使用oracle用户进行下列操作:
创建ogg目录并安装:
mkdir -p /u01/ogg
tar xvf fbo_ggs_Linux_x64_ora11g_64bit.tar -C /u01/ogg
1.3添加环境变量
在源端和目标端编辑oracle用户环境变量,在文件~/.bash_profile中加入下列行:
export PATH=/u01/ogg:
P
A
T
H
e
x
p
o
r
t
L
D
L
I
B
R
A
R
Y
P
A
T
H
=
/
u
01
/
o
g
g
:
PATH export LD_LIBRARY_PATH=/u01/ogg:
P
A
T
He
x
p
or
t
L
D
L
I
BR
A
R
Y
P
A
T
H
=
/
u
01/
o
gg
:
LD_LIBRARY_PATH
并使其生效:
source ~/.bash_profile
1.4使用ggsci创建目录
在源端和目标端都执行:
[oracle@oraclesrc ogg]$ ggsci
GGSCI (oraclesrc) 1> create subdirs
1.5配置源端数据库强制归档
查看源端数据库归档情况:
SQL> select log_mode,supplemental_log_data_min,force_logging from v$database;
LOG_MODE SUPPLEME FOR
NOARCHIVELOG NO NO
修改归档模式:
SQL>shutdown immediate
SQL>startup mount
SQL>alter database archivelog;
SQL>alter database open;
SQL>alter database force logging;
SQL>alter database add supplemental log data;
1.6开启DDL同步
配置DDL同步需要在源端执行以下操作
创建存放DDL信息的user
SQL> create user ogg identified by ogg default tablespace users temporary tablespace temp;
User created.
SQL> grant connect,resource,dba to ogg;
Grant succeeded.
SQL> grant create table,create sequence to ogg;
Grant succeeded.
SQL> grant execute on utl_file to ogg;
Grant succeeded.
在目标端同样创建一次该用户,用来存放同步相关信息。
1.7执行解压脚本
进入OGG目录执行以下脚本:
[oracle@oraclesrc ~]$ cd /u01/ogg
以dba身份进入oracle
SQL> @marker_setup.sql
MARKER SEQUENCE
OK
Script complete.
SQL> @ddl_setup.sql
SUCCESSFUL installation of DDL Replication software components
Script complete.
SQL> @role_setup.sql
PL/SQL procedure successfully completed.
SQL> grant GGS_GGSUSER_ROLE to ogg;
Grant succeeded.
SQL> @ddl_enable.sql;
Trigger altered.
至此DDL同步配置完成。
1.8配置OGG进程
1.8.1 配置Manager进程
在源端和目标端配置Manager进程并启动:
注意当前目录为ogg。
[oracle@oraclesrc ogg]$ ggsci
Oracle GoldenGate Command Interpreter for Oracle
Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Apr 23 2012 08:32:14
Copyright © 1995, 2012, Oracle and/or its affiliates. All rights reserved.
GGSCI (oraclesrc) 1> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER STOPPED
GGSCI (oraclesrc) 2> edit params mgr
输入:
PORT 7809
这里输入了端口号,保存退出。
GGSCI (oraclesrc) 3> start manager
Manager started.
1.8.2 配置源数据库的extract进程
测试登录数据库:
GGSCI (oraclesrc) 4> dblogin userid ogg,password ogg
Successfully logged into database.
配置extract进程
GGSCI (oraclesrc) 5> add extract ext1,tranlog,begin now
EXTRACT added.
GGSCI (oraclesrc) 6> add rmttrail /u01/ogg/dirdat/lt,extract ext1
EXTTRAIL added.
GGSCI (oraclesrc) 7> edit params ext1
加入如下行:
extract ext1
userid ogg, password ogg
rmthost 172.26.181.103, mgrport 7809
rmttrail /u01/ogg/dirdat/lt
ddl include mapped objname ogg.*;
table ogg.*;
GGSCI (oraclesrc) 8> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT STOPPED EXT1 00:00:00 00:03:26
1.8.3配置目标数据库的replicat进程
测试连接:
GGSCI (oracledest) 3> dblogin userid ogg,password ogg
Successfully logged into database.
GGSCI (oracledest) 4> add checkpointtable ogg.checkpoint
Successfully created checkpoint table ogg.checkpoint.
GGSCI (oracledest) 5> add replicat rep1,exttrail /u01/ogg/dirdat/lt,checkpointtable ogg.checkpoint
REPLICAT added.
GGSCI (oracledest) 6> edit params rep1
添加如下行:
replicat rep1
ASSUMETARGETDEFS
userid ogg,password ogg
discardfile /u01/ogg/dirdat/rep1_discard.txt,append,megabytes 10
DDL
map ogg.
,target ogg.
;
1.9启动同步
源数据库:
GGSCI (oraclesrc) 1> start extract ext1
Sending START request to MANAGER …
EXTRACT EXT1 starting
GGSCI (oraclesrc) 2> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXT1 00:16:47 00:00:00
目标数据库:
GGSCI (oracledest) 7> start replicat rep1
Sending START request to MANAGER …
REPLICAT REP1 starting
GGSCI (oracledest) 8> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REP1 00:00:00 00:00:01
1.10测试效果
此时源库和目标库ogg用户数据如下:
SQL> conn ogg/ogg
Connected.
SQL> select * from t1;
no rows selected
在源库插入数据并创建新表:
SQL> insert into t1 values(1);
1 row created.
SQL> commit;
Commit complete.
在目标库查看数据同步情况:
SQL> select * from t1;
C1
1
同步正常。
注意事项
实际部署生产系统时,可能需要在目标端replicat参数中添加以下行,来禁止triggers和constraint deferred:
DBOPTIONS SUPPRESSTRIGGERS —禁用触发器
DBOPTIONS DEFERREFCONST —禁用约束
在更早的Oracle版本下,就需要手动禁止trigger和constraint deferred了。
最后还需要在源端配置pump进程。
2.问题整理
2.1新增源端表结构
a.当修改源端表增加了字段时,目标端复制进程立即报错即停止,原因是源端和目标端表结构不一致导致进程挂掉
解决办法:
在源端复制进程中添加参数:HANDLECOLLISIONS,添加字段进程不报错
b.出现数据乱序
解决办法:
源端操作表必须有唯一主键,否则新增字段并赋值时会出现数据乱序问题
2.2修改源端表数据
当修改表源端中的数据时,目标表中之前原始数据依旧保存,新增数据只有修改那一条数据中的修改字段,其余为null
需求:自动补全没有修改的数据,不出现null值
解决办法:
在OGG源端目录下ggsci进入GGSCI (oradb) 59>命令行,以dblogin userid ogg,password ogg命令登陆用户,执行命令:add trandata OGG.T1(库名.表名)为表增加附加日志,这里测试只做了一张表,根据自己具体需求对表进行如上操作
2.3删除源端表数据
当删除源端表数据,进程不会挂掉,目标表中无任何新增记录
解决办法:同2.2解决办法
2.4两端字符集不一致乱码问题:
查看数据库字符集编码SQL语句:
SQL>select value from v$nls_parameters where parameter=‘NLS_CHARACTERSET’
1.AL32UTF8–>ZHS16GBK:
针对源端字符集为AL32UTF8 与 目标端ZHS16GBK的情况,需将源端的抽取进程和目标端的复制进程中的参数setenv(NLS_LANG=“AMERICAN_AMERICA.AL32UTF8”)设置为源端数据库字符集编码一致,才不会发生乱码。
2.ZHS16GBK–>AL32UTF8:
源端抽取进程和目标端复制进程都配置:
setenv(NLS_LANG=“AMERICAN_AMERICA.ZHS16GBK”)
2.5源端历史表在目标端自动创建测试
源端历史表在目标端自动创建并同步数据研究:
1.将源端接入业务库中
2.启动所有进程
3.目标端迟迟没有将表建立出来也没有任何数据
4.关掉源端管理进程、抽取进程和目标端管理进程、复制进程
5.在源端业务库中创建表并赋予数据
6.开启源端管理进程、抽取进程和目标端管理进程、复制进程
7.刷新目标端表目录,等待数据复制过来,会出现跟源端业务库中新建的同样表名的表,查看表数据均正常(经测成功)
总结:
经过上述测试,新建表能够在目标端自建并同步成功,而业务库之前已经存在的表未能在目标端自建成功的原因,个人认为是日志问题,因为OGG本身就是监听日志的变化的,同步数据的原理就是自动解析日志在目标端建表并赋予数据,而业务库的表建立已经有很长时间了,日志数据可能早已经被删除,OGG无法找到日志数据进行解析,导致目标端不能自动建表。而停掉所有进程后在源建表并赋予数据,打开所有进程后在目标端能够自动建表并成功同步数据,原因是日志存在还有没被删除,OGG能找到日志进行解析