一、环境介绍
| Item | Source System | Target System |
| Platform | CentOS 6.5 | CentOS 6.5 |
| Hostname | rac1 | rac2 |
| Database | Oracle 11.2.0.4 | Oracle 11.2.0.4 |
| Character Set | AL32UTF8 | AL32UTF8 |
| ORACLE_SID | PROD | TEST |
| Listener Name/Port | LISTENER/1521 | LISTENER/1521 |
| Goldengate User | ogg | ogg |
| Goldengate Version | ogg112101_fbo_ggs_Linux_x64_ora11g_64bit.zip | ogg112101_fbo_ggs_Linux_x64_ora11g_64bit.zip |
| IP | 192.168.87.130 | 192.168.87.131 |
二:准备工作,在source和target端都安装好oracle数据库
1.启动监听
2.确定数据库运行在归档模式,开启数据库附加日志,打开force logging,创建用于复制的数据库账号ogg,为了方便,这里直接赋予dba权限,如果对数据库安全要求高,可以去查询ogg文档,赋予复制需要的最小权限!(source和target端做相同的操作)
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /bk
Oldest online log sequence 10
Next log sequence to archive 12
Current log sequence 12
SQL> select supplemental_log_data_min from v$database;
SUPPLEME
--------
NO
SQL> alter database add supplemental log data;
Database altered.
SQL> select supplemental_log_data_min from v$database;
SUPPLEME
--------
YES
SQL> alter database force logging;
Database altered.
SQL> create tablespace tbs_ogg;
Tablespace created.
SQL> create user ogg identified by ogg default tablespace tbs_ogg temporary tablespace temp account unlock;
User created.
SQL> grant connect,resource,dba to ogg;
Grant succeeded
备注: 在oracle中可以通过rowid来定位某条记录,但是目标端的数据库和源端数据库的数据库可能完全不一样,所以无法通过rowid来确定源端数据库的逻辑变化,这时附加日志supplemental log便登上了表演的舞台。数据库在开启附加日志功能后,对于源端的修改操作,oracle会同时追加能够唯一标示记录的列到redo log。这样目标端数据库就可以知道源端发生了哪些具体的变化。
三:安装ogg软件,启动mgr管理进程,source和target端做相同的操作
[root@rac1 ~]$ mkdir ogg
[oracle@rac1 ~]$ cd ogg
[oracle@rac1 ogg]$ unzip ogg112101_fbo_ggs_Linux_x64_ora11g_64bit.zip
[oracle@rac1 ogg]$ ./ggsci
GGSCI (rac1) 1> create subdirs
Creating subdirectories under current directory ogg
Parameter files /ogg/dirprm: already exists
Report files /ogg/dirrpt: created
Checkpoint files ogg/dirchk: created
Process status files ogg/dirpcs: created
SQL script files /ogg/dirsql: created
Database definitions files /ogg/dirdef: created
Extract data files ogg/dirdat: created
Temporary files /ogg/dirtmp: created
Stdout files ogg/dirout: created
GGSCI (rac1) 2> edit params mgr
GGSCI (rac1) 3> view params mgr
PORT 7809
PURGEOLDEXTRACTS ogg/dirdat, USECHECKPOINTS
GGSCI (rac1) 4> start mgr
Manager started.
GGSCI (rac1) 5> info mgr
Manager is running (IP port rac1.7809).
四:准备测试用户和表
SQL> conn as sysdba
Connected.
SQL> create user hr identified by hr account unlock;
User altered.
SQL> grant connect,resource,select_catalog_role to hr;
Grant succeeded.
SQL> conn hr/hr
Connected.
SQL> create table t1 as select * from dba_objects;
Table created.
SQL> alter table t1 add constraint pk_t1 primary key(object_id);
Table altered.
//source端
SQL> select count(*) from t1;
COUNT(*)
----------
86291
//target端,只复制表结构和主键,不填充数据
SQL> select count(*) from t1;
COUNT(*)
----------
0
备注:source端和target端的表必须建立主键,否则会有异常,这里特殊情况下的没有主键的情况暂不做说明
五:初始化加载数据,在异构数据库平台(例如oracle-mysql),这个功能显得非常的有用!而在oracle-oracle的数据复制条件下,oracle推荐使用expdp/impdp工具
1.source端添加extract进程
GGSCI (rac1) 1> add extract einig1,sourceistable //sourceistable代表直接从表中读取数据
EXTRACT added.
GGSCI (rac1) 2> edit params einig1 einig1代表extract initial load group 1缩写
GGSCI (rac1) 3> view params einig1
extract einig1
setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
userid ogg,password ogg
rmthost 192.168.87.131,mgrport 7809
rmttask replicat,group rinig1
table hr.t1;
2.target端添加replicat进程
GGSCI (rac2) 1> add replicat rinig1,specialrun //specialrun代表只运行一次
REPLICAT added.
GGSCI (rac2) 2> edit params rinig1 //rinig1代表replicat initial load group 1缩写
GGSCI (rac2) 3> view params rinig1 //rinig1的名字必须同source端定义的group名字相同
replicat rinig1
setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
assumetargetdefs
userid ogg,password ogg
discardfile ogg/dirrpt/rinig1.dsc,purge
map hr.*,target hr.*;
3.source端启动extract进程,查看日志输出
GGSCI (rac1) 4> start extract einig1
Sending START request to MANAGER ...
EXTRACT EINIG1 starting
GGSCI (rac1) 5> view report einig1
2017-08-07 11:02:03 INFO OGG-01017 Wildcard resolution set to IMMEDIATE because SOURCEISTABLE is used.
***********************************************************************
Oracle GoldenGate Capture 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:42:16
......省略不计
4.target端验证
[oracle@rac2 ogg]$ sqlplus hr/hr
SQL> select count(*) from t1;
COUNT(*)
----------
86291
六:配置rac1,rac2间的实时同步复制
1.在source上配置extract进程,进程的名字不能超过8个字符
GGSCI (rac1) 1> edit params eora_t1
GGSCI (rac1) 2> view params eora_t1
extract eora_t1
setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
userid ogg,password ogg
exttrail ogg/dirdat/aa
table hr.*;
2.开启hr用户下所有表的附加日志
GGSCI (rac1) 3> dblogin userid ogg, password ogg
Successfully logged into database.
GGSCI (rac1) 4> add trandata hr.*
3.添加extract进程,添加trail文件,文件名前缀不能超过2个字符
GGSCI (rac1) 5> add extract eora_t1,tranlog,begin now
EXTRACT added.
GGSCI (rac1) 6> add exttrail ogg/dirdat/aa,extract eora_t1,megabytes 100 添加trail文件
EXTTRAIL added.
GGSCI (rac1) 7> start extract eora_t1
Sending START request to MANAGER ...
EXTRACT EORA_T1 starting
GGSCI (rac1) 8> info extract eora_t1
EXTRACT EORA_T1 Last Started 2017-08-07 10:05 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:01 ago)
Log Read Checkpoint Oracle Redo Logs
2017-08-07 15:12:57 Seqno 12, RBA 13398016
SCN 0.1087121 (1087121)
GGSCI (rac1) 9> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EORA_T1 00:00:00 00:00:09
4.添加pump进程
GGSCI (rac1) 10> edit params pora_t1
GGSCI (rac1) 11> view params pora_t1
extract pora_t1
setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
passthru
rmthost 192.168.87.131,mgrport 7809
rmttrail ogg/dirdat/pa
table hr.*;
GGSCI (rac1) 12> add extract pora_t1,exttrailsource ogg/dirdat/aa //这里aa文件名同前面extract进程参数文件中定义的trail文件名一致
EXTRACT added.
GGSCI (rac1) 13> add rmttrail ogg/dirdat/pa,extract pora_t1,megabytes 100 //添加传输到target数据库的trail问文件名,应该同参数文件中描述的一致
RMTTRAIL added.
GGSCI (rac1) 14> start extract pora_t1
Sending START request to MANAGER ...
EXTRACT PORA_T1 starting
GGSCI (rac1) 15> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EORA_T1 00:00:00 00:00:04
EXTRACT RUNNING PORA_T1 00:00:00 00:00:02
5.在target端添加检查表,配置replicat进程
GGSCI (rac2) 1> edit params ./GLOBALS
GGSCI (rac2) 2> view params ./GLOBALS
checkpointtable ogg.ggschkpt
GGSCI (rac2) 3> exit //这里需要退出ggsci终端
[oracle@rac2~]$ sqlplus ogg/ogg
SQL> select tname from tab;
no rows selected
[oracle@rac2 ogg]$ ./ggsci
GGSCI (rac2) 1> dblogin userid ogg,password ogg
Successfully logged into database.
GGSCI (rac2) 2> add checkpointtable
No checkpoint table specified, using GLOBALS specification (ogg.ggschkpt)...
Successfully created checkpoint table ogg.ggschkpt.
SQL> select tname from tab;
TNAME
------------------------------
GGSCHKPT
GGSCHKPT_LOX
GGSCI (rac2) 3> edit params rora_t1
GGSCI (rac2) 4> view params rora_t1
replicat rora_t1
setenv (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
userid ogg,password ogg
handlecollisions
assumetargetdefs
discardfile /ogg/dirrpt/rora_t1.dsc,purge
map hr.* ,target hr.*;
GGSCI (rac2) 5> add replicat rora_t1,exttrail /ogg/dirdat/pa
REPLICAT added.
GGSCI (rac2) 6> start replicat rora_t1
Sending START request to MANAGER ...
REPLICAT RORA_T1 starting
GGSCI (rac2) 7> info replicat rora_t1
REPLICAT RORA_T1 Last Started 2017-08-08 11:00 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:08 ago)
Log Read Checkpoint File /ogg/dirdat/pa000000
2017-08-08 14:01:25.195330 RBA 43175818
GGSCI (rac2) 8> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING RORA_T1 00:00:00 00:00:06
备注:
在target端配置replicat进程之前,通常需要在目标端的数据库中创建一个checkpoint表,这个表是基于ogg checkpoint文件的,它记录了所有ogg可恢复的checkpoint以及sequence,这个操作不是必须的,但oracle强烈建议使用它,因为它可以使得checkpoint包含在replicat的事务中,保证了可以从各类失败场景中恢复!
七:测试同步
1.insert同步测试
source端插入数据
SQL> select max(object_id) from t1;
MAX(OBJECT_ID)
--------------
87406
SQL> insert into t1 (object_id,object_name) values (88888,'ogg_test');
1 row created.
SQL> commit;
Commit complete.
target端验证数据
SQL> select max(object_id) from t1;
MAX(OBJECT_ID)
--------------
88888
2.delete同步测试
source端删除数据
SQL> delete from t1 where object_id > 1000;
85295 rows deleted.
SQL> commit;
Commit complete.
SQL> select max(object_id) from t1;
MAX(OBJECT_ID)
--------------
1000
target端验证数据
SQL> select max(object_id) from t1;
MAX(OBJECT_ID)
--------------
1000
3.同理,update操作也如上操作进行验证,这里就不再进行演示




