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

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: PATHexportLDLIBRARYPATH=/u01/ogg: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能找到日志进行解析

你可能感兴趣的:(Oracle,oracle,dba,数据库)