Oracle——OGG单向实时同步Oracle数据

  • Post author:
  • Post category:其他




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能找到日志进行解析



版权声明:本文为GTmustang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。