OGG实现两台Oracle数据库的同步

今天通过最简单的一个例子,给大家讲解下 goldengate 实现两台Oracle数据库的同步。
内容如下:
1.配置数据库信息。
2.安装golden gate.
3.配置golden gate.
4.测试同步情况


首先我们看看实验环境

环境

源端是一个单实例
Oracle Enterprise 5 + ORACLE 10.2.0.4 
IP :10.4.128.100 

目标端是一个单实例
Oracle Enterprise 5 + ORACLE 10.2.0.4 
IP :10.4.128.101

两台主机均已创建数据库,sid分别为devdb 和 emrep

配置devdb 到 emrep的数据同步

goldengate版本11.2.1.0

1.配置数据库信息

 

在源端数据库中打开归档模式

 

SQL> archive log list

Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/archive1
Oldest online log sequence     180
Next log sequence to archive   181
Current log sequence           181

若处于非归档模式,则改为归档模式:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.

 

在源端数据库中打开force logging

 

SQL> select force_logging from v$database;
FOR
---
NO
SQL> alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FOR
---
YES 

在源端数据库中打开supplemental log

SQL> select supplemental_log_data_min from v$database;

SUPPLEME
--------
NO

SQL> alter database add supplemental log data;

Database altered.
切换日志,使更改生效
SQL> alter system switch logfile;
System altered.

SQL> select supplemental_log_data_min from v$database;

SUPPLEME
--------
YES 

 

在源端数据库中关闭回收站


官方的说明是,由于一个已知的问题,回收站会对DDL触发器产生影响,因此需要关闭。由此可见,我们只需要在源库中关闭回收站即可。

SQL> show parameter recyclebin

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on


SQL> alter system set recyclebin=off;

System altered.

SQL> show parameter recyclebin

NAME TYPE                                VALUE
------------------------------------ -------------------------------
recyclebin string                          OFF

 

创建goldengate数据库用户(源和目标)

 

注意:源和目标端都需要

[oracle@rac1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jan 9 11:56:28 2015
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 32bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create tablespace goldengate;

Tablespace created.

SQL> create user goldengate identified by goldengate default tablespace goldengate;

User created.

SQL> grant connect,resource to goldengate;

Grant succeeded.

SQL> grant execute on utl_file to goldengate;

Grant succeeded.

SQL>


抽取进程使用的数据库用户需要额外的权限,我们将这些权限也授予数据库用户goldengate(在源端数据库中执行)

SQL> exec dbms_streams_auth.grant_admin_privilege('GOLDENGATE');

PL/SQL procedure successfully completed.

SQL> grant insert on system.logmnr_restart_ckpt$ to goldengate;

Grant succeeded.

SQL> grant update on sys.streams$_capture_process to goldengate;

Grant succeeded.

SQL> grant become user to goldengate;

Grant succeeded.

SQL>

为了确保GoldenGate正常运行,特别是在目标端,赋予goldengate用户DBA权限:
SQL> grant dba to goldengate;

 

2.GoldenGate安装环境

 

 

解压goldengate安装文件到安装目录

 

安装GoldenGate软件很简单,解压即可
以goldengate用户登录
[goldengate@rac1 goldengateMedia]$ mkdir /opt/gg/goldengate、
[goldengate@rac1 goldengateMedia]$ cp ggs_Linux_ora10g_.tar /opt/gg/goldengate
[goldengate@rac1 goldengateMedia]$ cd /opt/gg/goldengate
[goldengate@rac1 goldengate]$ tar -xvf ggs_Linux_ora10g.tar

 

 

配置环境变量

 

源端和目标端:
修改goldengate用户的环境变量配置文件(ORACLE_SID按实际情况修改)
cat>>/home/goldengate/.bashrc< ORACLE_HOME=/opt/app/oracle/product/10.2.0/db_1
export ORACLE_HOME
ORACLE_SID=devdb
export ORACLE_SID
GG_HOME=/opt/gg/goldengate
export GG_HOME
PATH=\$ORACLE_HOME/bin:$GG_HOME:\$PATH
export PATH
LD_LIBRARY_PATH=\$ORACLE_HOME/lib:\$GG_HOME:\$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
EOF
应用刚刚修改的环境变量,然后进入GoldenGate安装目录,执行ldd ggsci,确定需要的库文件都能够找到。如果出现共享库文件无法找到,例如libnnz10.so => not found,检查LD_LIBRARY_PATH环境变量的设置
[goldengate@ggdb goldengate]$ source ~/.bashrc
[goldengate@ggdb goldengate]$ cd $GG_HOME
[goldengate@ggdb goldengate]$ ldd ggsci
我们可以认为ogg的安装其实就是一个解压。非常简单。

3.配置goldengate

创建goldengate工作目录

源端和目标端:

[goldengate@rac1 goldengate]$ cd $GG_HOME
[goldengate@rac1 goldengate]$ ./ggsci

GGSCI (rac1) 1> create subdirs

Creating subdirectories under current directory /opt/gg/goldengate

Parameter files /opt/gg/goldengate/dirprm: created
Report files /opt/gg/goldengate/dirrpt: created
Checkpoint files /opt/gg/goldengate/dirchk: created
……

GGSCI (gg1) 2> exit

创建trail文件存放目录

源和目标端:

[goldengate@rac1 ~]$ mkdir /opt/gg/trails
[goldengate@rac1 ~]$ ls -l /opt/gg | grep trails

配置MANAGER

 

源端和目标端:

DYNAMICPORTLIST中配置了GoldenGate(extract和replicat)进程使用的端口范围
PORT参数指定MANAGER使用的端口
AUTORESTART参数使抽取/复制进程失败后自动重启
配置MANAGER的参数,PURGEOLDEXTRACTS参数指定:当根据checkpoint发现已经完成抽取和复制的trail文件将被自动删除,但保留最近10个。
PURGEDDLHISTORY和PURGEMARKERHISTORY分别删除DDL历史表和marker表中的过期数据,以控制它们不会变得过于庞大。

GGSCI (gg1) 1> edit params mgr

PORT 5898
PURGEOLDEXTRACTS /opt/gg/trails/w1*, USECHECKPOINTS, MINKEEPFILES 10
AUTORESTART ER *, RETRIES 3, WAITMINUTES 5
PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5, FREQUENCYMINUTES 30
PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 5, FREQUENCYMINUTES 30


全局参数设置


源端:

GGSCI (rac1) 2> edit params ./globals
GGSCHEMA goldengate

目标端:

创建一个checkpoint表
replicat通过这个表来维护trail文件中的read position。这不是个必须的操作,如果没有这个表,则通过一个磁盘文件来维护

GGSCI (ggdb) 2> dblogin userid goldengate,password goldengate
Successfully logged into database.

GGSCI (ggdb) 3> add checkpointtable goldengate.chkpoint

Successfully created checkpoint table GOLDENGATE.CHKPOINT.

GGSCI (ggdb) 4> edit params ./globals

GGSCHEMA goldengate
CHECKPOINTTABLE goldengate.chkpoint

使用OGG,两个Oracle库之间单向同步数据  http://www.linuxidc.com/Linux/2014-07/104465.htm

GoldenGate单向表DML同步 http://www.linuxidc.com/Linux/2013-04/82942.htm

Oracle GoldenGate 系列:Extract 进程的恢复原理 http://www.linuxidc.com/Linux/2013-04/82563.htm

Oracle GoldenGate安装配置 http://www.linuxidc.com/Linux/2013-02/79455.htm

Oracle goldengate的OGG-01004 OGG-1296错误 http://www.linuxidc.com/Linux/2011-08/40951.htm

Oracle GoldenGate快速入门教程:基本概念和配置 http://www.linuxidc.com/Linux/2014-09/106677.htm

搭建一个Oracle到Oracle的GoldenGate双向复制环境 http://www.linuxidc.com/Linux/2014-11/109101.htm

配置源端extract

 

为了避免primary extract受到网络的影响,我们在源端和目标端之间增加一个data pump,这样的话,primary extract负责将数据从源数据中抽取出来,存在本地的trail文件中,然后data pump进程负责将本地trail文件中的数据传输到目标端的trail文件里。这样能提高更高的灵活性和可用性(当源和目标端之间的网络出现故障时,primary extract会继续抽取数据存到本地的trail中).
我们这里要同步goldengate用户下的所有表.
GGSCI (rac1) 4> add extract w1ext,tranlog,begin now

EXTRACT added.

GGSCI (rac1) 5> info all

Program Status Group Lag Time Since Chkpt
MANAGER STOPPED 
EXTRACT STOPPED DYEXT 00:00:00 00:00:07 

编辑w1ext的参数文件:

1. EXTTRAIL参数指定该抽取进程对应的exttrail
2. DISCARDFILE参数指定一个文件,用来记录不能正常处理的记录,这里使用追加方式,最大为5MB
3. TRANLOGOPTIONS ALTARCHIVELOGDEST指定源数据库归档所在的路径。如果不确定,使用该SQL*Plus命令:show parameter log_archive_dest_1
4. TRANLOGOPTIONS ALTARCHIVEDLOGFORMAT指定了归档文件的命名格式,可以通过SQL*Plus命令show parameter log_archive_format 来确定该格式
5. 由于源数据使用了ASM,这里通过tranlogoptions asmuser来提供登录ASM实例的用户名和密码(用户名必须是SYS)
6. DDL INCLUDE MAPPED表示只捕获MAPPED范围内的DDL操作
7. DDLOPTIONS ADDTRANDATA :当创建新的表时,自动为其启用追加日志
8. FETCHOPTIONS:MISSINGROW REPORT表示当extract需要获取的行在源库中无法定位时,extract进程继续运行,相关的错误信息会保存在discardfile参数指定的文件中;USESNAPSHOT表示extract使用flashback查询来从undo从获取一些数据,比如无法从redo中直接获取的UDT、嵌套表、XMLtype以及9i中的LOB;NOUSELATESTVERSION使得extract当无法从undo中获取数据时,忽略该条件而不是从源表中获取当前值。
9. STATOPTIONS REPORTFETCH:使用ggsci命令stats时,显示获取的行的统计信息
10. WARNLONGTRANS 1H, CHECKINTERVAL 5M:当发现超过1个小时的长事务时,会在错误日志中产生一条warning,5分钟检测一次

GGSCI (rac1) 6> edit params w1ext

EXTRACT w1ext
USERID goldengate, PASSWORD goldengate
EXTTRAIL /opt/gg/trails/w1
DISCARDFILE w1extdsc,APPEND,MEGABYTES 5
DDL INCLUDE MAPPED
DDLOPTIONS ADDTRANDATA
FETCHOPTIONS, USESNAPSHOT, NOUSELATESTVERSION, MISSINGROW REPORT
STATOPTIONS REPORTFETCH
WARNLONGTRANS 1H, CHECKINTERVAL 5M
TABLE goldengate.*;


添加该extract对应的trail文件,用来存储抽取的数据。单个文件大小设置为100MB
GGSCI (rac1) 7> add exttrail /opt/gg/trails/w1,extract w1ext, MEGABYTES 100
EXTTRAIL added.

添加secondary extract group,即data pump:

GGSCI (rac1) 8> ADD EXTRACT w1extdp, EXTTRAILSOURCE /opt/gg/trails/w1, BEGIN now
EXTRACT added.

编辑参数文件
RMTHOST后面跟目标端的ip或主机名(需在hosts文件中有对应ip解析)和manager进程的端口号;RMTTRAIL指定目标端的trail文件所在位置

GGSCI (rac1) 9> edit params w1extdp

EXTRACT w1extdp
USERID GOLDENGATE, PASSWORD GOLDENGATE
RMTHOST 10.4.128.101, MGRPORT 5898
RMTTRAIL /opt/gg/trails/w1
DISCARDFILE w1extdpdsc,APPEND,MEGABYTES 5
TABLE goldengate.*;

添加该rmttrail

GGSCI (rac1) 10> add rmttrail /opt/gg/trails/w1,extract w1extdp, megabytes 100
RMTTRAIL added.


 

配置目标端replicat


回到目标端,使用goldengate用户登录到ggsci命令行中,对应前面的两组extract和data pump增加两个replicat

GGSCI (ggdb) 6> add replicat w1rep,exttrail /opt/gg/trails/w1,checkpointtable goldengate.chkpoint
REPLICAT added.

这里的handlecollisions参数在目标端数据初始化并同步之后去掉

编辑参数文件:
1. assumetargetdefs:由于在这里我们源端和目标端的表结构是完全一致的,因此使用这个参数来使replicat不用去查看相关的定义文件,从而提高效率
2. DDLOPTIONS REPORT:将ddl的具体信息写入到报告文件中
3. BATCHSQL:将相似的SQL语句放到一个数组中以加快执行速度。在normal模式下,repliat同一时间只应用一条sql语句。
4. DBOPTIONS DEFERREFCONST:将完整性约束推迟到replicat事务提交以后再检测
5. 如果数据库版本在10.2.0.5或11.2.0.2以后,可以使用DBOPTIONS SUPPRESSTRIGGERS在replicat会话中禁用触发器。如果不是,应该在目标端数据库中禁用触发器(触发器产生的DML操作会从源端同步到目标端)
6. DBOPTIONS LOBWRITESIZE :将要写入目标库的LOB数据缓存在内存中,当达到参数中指定的大小时写入数据,以减少I/O。这个值的范围是2KB到1MB,默认为32KB
7. DDLERROR DEFAULT DISCARD RETRYOP MAXRETRIES 5 RETRYDELAY 20:当出现DDL错误,重试5次,时间间隔为20秒。如果失败,replicat会继续运行,但相关信息会记录在discardfile中。
8. HANDLECOLLISIONS:当replicat往表中插入一条记录,而该记录已经存在,则进行覆盖;当replicat在表中试图更新或删除一条记录,而该记录不存在,则该操作被丢弃。这个参数一般在initial-data load中使用,在源和目标端的数据同步之后应该将该参数删除
9. MAP TARGET:源表和目标表之间的映射,可以使用通配符

GGSCI (ggdb) 7> edit params w1rep

REPLICAT w1rep
ASSUMETARGETDEFS
USERID GOLDENGATE, PASSWORD GOLDENGATE
DISCARDFILE w1repdsc,APPEND,MEGABYTES 5
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
BATCHSQL
DBOPTIONS DEFERREFCONST
DBOPTIONS LOBWRITESIZE 102400
HANDLECOLLISIONS
DDLERROR DEFAULT DISCARD RETRYOP MAXRETRIES 5 RETRYDELAY 20
MAP goldengate.* , TARGET goldengate.* ;


ADD TRANDATA

 

在启动goldengate相关进程之前,使用trandata对源数据库中需要同步的表启用对象级别的追加日志

--在源端
GGSCI (rac1) 17> dblogin userid goldengate,password goldengate
Successfully logged into database.
--GGSCI (xxx) 2> list tables goldengate.*


GGSCI (rac1) 18> add trandata goldengate.*

如果表中没有主键和唯一键,会产生一条警告,例如:
2011-12-08 22:53:11 WARNING OGG-00869 No unique key is defined for table UDPPACKPORTSET. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.

 

在源端和目标端打开MANAGER


在源端和目标端执行ggsci命令start mgr,启动manager进程
GGSCI (rac1) 34> start mgr

在源端,打开extract进程
GGSCI (rac1) 35> start ext w1ext

Sending START request to MANAGER ...
EXTRACT W1EXT starting

GGSCI (rac1) 36> start ext w1extdp

Sending START request to MANAGER ...
EXTRACT W1EXTDP starting

GGSCI (rac1) 37> info all

在目标端,启动复制进程

 
GGSCI (ggdb) 51> start rep w1rep

Sending START request to MANAGER ...
REPLICAT DYREP starting

4.测试同步情况

 源端,目标端都创建一个表
源端
SQL> create table test(id int);

Table created.

SQL> insert into test values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into test values(2);

1 row created.

SQL> commit;

Commit complete.
目标端
SQL> create table test(id int);

Table created.

SQL> select  * from test;

 ID
----------
  1
  2

ok ,结束了。


你可能感兴趣的:(LINUX,ORACLE,文档,oracle,goldengate,oracle,linux)