参考博客:https://blog.csdn.net/sunansheng/article/details/51854786
和传统的逻辑复制一样,Oracle GoldenGate 实现原理是通过抽取源端的redo log 或者 archive log ,然后通过TCP/IP投递到目标端,最后解析还原应用到目标端,使目标端实现 同源端数据同步。图1-1 是Oracle GoldenGate 的技术架构。
Manager进程是GoldenGate 的控制进程。如果把所有的 Oracle 进程比喻为军队,那么 Manager 就相当于司令。Manager 进程运行在源端和目标端上,它主要有以下几个方面的 作用:启动、监控、重启GoldenGate 的其他进程,报告错误及事件,分配数据存储空间, 发布阈值报告等。
每个源端或者目标端有且只能存在一个 Manager 进程。其运行状态有两种即 RUNNING(正在运行)和STOPPED(已经停止)。
在Windows 系统上,Manager进程是作为一个服务来启动的,而在类UNIX 系统中, Manager则是一个操作系统进程。
Extract 运行在数据库源端,负责从源端数据表或者日志中捕获数据。在早期的 GoldenGate 版本中,它通常被称为Collect 进程。按照其所处的阶段不同,Extract 的作用 可以按照时间来划分。
初始数据装载阶段:在初始数据装载阶段,Extract 进程直接从源端的数据表中抽取数据。 同步变化捕获阶段:初始数据同步完成以后,Extract 进程负责捕获源端数据的变化 (DML和DDL)。
Extract 进程利用其内在的checkpoint 机制,周期性地检查并记录其读写的位置,通常 是写入到一个本地的trail 文件。这种机制是为了保证如果Extract 进程终止或者操作系统 宕机,重新启动 Extract 进程后,GoldenGate 能够恢复到以前的状态,从上一个断点处继续 往下运行,而不会有任何数据损失。
Extract 进程的状态包括STOPPED(正常停止)、STARTING (正在启动)、RUNNING (正在运行)、ABENDED (Abnomal End 的缩写,表示异常结束)。
Pump 进程运行在数据库源端,其作用非常简单。如果源端使用了本地的trail 文件, 那么Pump 进程就会把trail 以数据块的形式通过TCP/IP协议发送到目标端,这通常也是推 荐的方式。Pump 进程本质是Extract 进程的一种特殊形式,如果不使用trail 文件,那么就 是Extract 进程在抽取完数据以后,直接投递到目标端。
与Pump 进程相对应的叫做Server Collector 进程,这个进程不需要引起人们的关注, 因为在实际操作过程中无需对其进行任何配置,所以对人们来说它是透明的。它运行在目 标端,其任务就是把 Extract/Pump 投递过来的数据块重新组装成trail 文件,人们称之为远 程trail 文件。
为了更有效、更安全地把数据库事务信息从源端投递到目标端,GoldenGate 引进trail 文件的概念。前面提到Extract 抽取完数据以后GoldenGate 会将抽取的事务信息转化为一 种GoldenGate 专有格式的文件,然后Pump 负责把源端的trail 文件投递到目标端,所以源、 目标两端都会存在这种文件,源端存放的trail 文件叫本地trail 文件,目标端存放的trail 文件叫远程trail 文件。trail 文件存在的目的旨在防止单点故障,将事务信息持久化,并且 使用checkpoint 机制来记录其读写位置,如果故障发生,则数据可以根据checkpoint 记录 的位置来重传。
值得一提的是,trail 文件并不总是必须的。人们可以在配置Extract 进程的时候通过 TCP/IP协议直接把日志的信息投递到目标端。但通常并不推荐这么做,因为一旦发生系统 宕机或者网络故障,则有可能造成数据的丢失。
Replicat 进程,通常也把它叫做应用进程。运行在目标端,是数据传递的最后一站, 负责读取目标端trail 文件中的内容,并将其解析为 DML或DDL语句,然后应用到目标数 据库中。
和Extract 进程一样,Replicat也有其内部的checkpoint 机制,保证进程重新启动后可 以从上次记录的位置开始恢复,而无数据损失的风险。 它的运行状态和 Extract 进程一致,包括 STOPPED、STARTING 、RUNNING 、 ABENDED 。
GGSCI是GoldenGate Software Command Interface的缩写,它提供了十分丰富的命令 来对GoldenGate 进行各种操作,如创建、修改、监控GoldenGate 进程等。
绝大部分的操作都是通过它来完成的。当然如果您需要GUI 方式的图形界面来管理, 则需要购买GoldenGate Director。
GoldenGate 的模式包括图1-2 中描述的几种,其中“一对一”是 GoldenGate 最简单的 一种模式,也是最常用的模式。
这种模式的一种典型应用就是用于数据容灾,通常源端数据库为生产端,目标端数据 库为容灾端。
另外一种应用场景是把源端的OLTP系统产生的交易日志传送到目标端,使用BI数据 仓库或者是OLAP。
1.高可用性与容灾
2.主数据 数据库移植、升级
3.实时数据集成
--------------------------------------------------------------------------------------------------------------------------------------
本人准备了两台虚拟机,进行ogg配置的模拟测试,分别为:
192.168.213.131:目标端
192.168.213.132:源端
Oracle GoldenGate 基于读取数据库的交易日志提供了快速的异构数据库之间的复制功能。在GOLDEN GATE12C中提供了INTEGRATED REPLICAT的全新的复制方式(由于我使用的测试数据库环境为Oracle 11.2.0.1.0,不支持INTEGRATED方式)。
在INTEGRATED CAPTURE的模式下,GoldenGate 的抽取进程直接与数据库的日志服务器进行交互读取数据库的REDO日志并且使用Logical Change Records(LCRs) 的方式来捕捉数据的改变。LCRs 被写到GoldenGate的trail文件中。
在配置过程中,需要在数据库中创建以下用户并赋予相应权限.
- ogguser - Password: ogguser. GoldenGate用户,这个用户需要具有管理员权限。并且需要进行复制的目标不包括在这个用户的SCHEMA下。GoldenGate使用这个用户进行从源端的SCHEMA到目标端的SCHEMA进行复制。
- oggsrc - Password: oggsrc.源端端SCHEMA.这个用户只具有CONNECT 和 RESOURCE 的权限。它的SCHEMA定义了所有需要复制的源端的对象。
- oggtrg - Password: oggtrg.目标端SCHEMA.这个用户只具有CONNECT 和 RESOURCE 的权限。它的SCHEMA定义了所有需要复制的目标端端的对象。
* 管理用户需要设置dba权限
create user ogguser identified by ogguser;
grant dba to ogguser;
1. 以管理员的身份登录数据库之后,确认数据库是否运行在ARCHIVELOG模式下
Select log_mode FROM v$database;
2. 如果不是归档模式,则开启数据库归档模式并重启数据库
shutdown immediate
startup mount
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
备注:ORACLE12C在重启之后还要对PDB进行重新启动操作。
3. 检查数据库是否为归档模式
Select log_mode FROM v$database;
至此,数据库已是归档模式。
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
SQL> ALTER DATABASE FORCE LOGGING;
Database altered.
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
SQL> SELECT supplemental_log_data_min, force_logging FROM v$database;
SUPPLEME FORCE_LOGGING
-------- ---------------------------------------
YES YES
确保REDO和ARCHIVELOG包含SUPPLEMENTAL LOG数据,通过以下命令转换日志
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
1. 创建用户表空间
源端:
SQL> create tablespace srcdata datafile 'C:\app\LeBron\oradata\orcl\srcdata01.dbf'size 50M autoextend on extent management local uniform size 256k;
目标端:
create tablespace trgdata datafile 'C:\app\Administrator\oradata\orcl\trgdata01.dbf'size 50M autoextend on extent management local uniform size 256k;
2. 创建用户并赋予相应表空间及权限信息
分别创建oggsrc 和oggtrg数据库用户,默认的表空间分别为上面创建的SRCDATA和TRGDATA,这两个用户只需要CONNECT和RESOURCE这两个权限。ORACLE 12C把unlimited quota这个权限从RESOURCE这个角色中移除了,所以在ORACLE 12C中必须将unlimited quota赋予用户:
源端:SQL> create user OGGSRC identified by oggsrc default tablespace SRCDATA temporary tablespace TEMP;
User created.
SQL> grant CONNECT, RESOURCE to OGGSRC;
Grant succeeded.
SQL> alter user OGGSRC quota unlimited on SRCDATA;
User altered.
目标端:
SQL> create user OGGTRG identified by oggtrg default tablespace TRGDATA temporary tablespace TEMP;
User created.
SQL> grant CONNECT, RESOURCE to OGGTRG;
Grant succeeded.
SQL> alter user OGGTRG quota unlimited on TRGDATA;
User altered.
3. 创建用户测试表
源端:
SQL> conn oggsrc/oggsrc;
已连接。
SQL> create table user_info(
2 id number not null,
3 name varchar2(32) not null,
4 age number(2),
5 gender char(1),
6 create_time date,
7 PRIMARY KEY (id)
8 );
表已创建。
SQL>
目标端:
SQL> conn oggtrg/oggtrg;
已连接。
SQL> create table trg_user_info(
2 yid number not null,
3 uname varchar2(32) not null,
4 age number(2),
5 gender char(1),
6 create_time date,
7 PRIMARY KEY (id)
8 );
表已创建。
SQL>
1. 分别在源端和目标端设置系统环境变量LD_LIBRARY_PATH,一定要指向${ORACLE_HOME}/lib文件夹,在启动GGSCI之前要确保这个环境变量妥善的设置。
2. 进入到OGG的安装目录中启动GGSCI程序.
3. 配置ogg管理进程
(1)看进程是否起来
GGSCI (source) 1> info mgr
Manager is running (IP port ologg.example.com.7809, Process ID 17583).
(2)如果进程启动,关掉
GGSCI (source) 1> stop mgr
(3)配置管理进程(源端)
在源端的GGSCI中,用edit params mgr编辑MANAGER的参数文件。首先指定MANAGER使用的TCP/IP端口,要求清除以前的抽取数据,当MANAGER启动时自动启动所有的抽取进程。最后是每分钟尝试1次重启停止的任务,共三次。
GGSCI(source) 2>edit param mgr
PORT 7809
DynamicPortList 20000-20099
PurgeOldExtracts ./dirdat/*, UseCheckPoints, MinKeepHours 2
Autostart Extract E*
AUTORESTART Extract *, WaitMinutes 1, Retries 3
在windows中执行edit param xxx 命令,会弹出记事本编辑的prm进程配置,我们在记事本中写入进程配置信息,然后保存关闭即可。
配置管理进程(目标端)
在目标端同样打开GGSCI,将同样的参数添加到MANAGER的参数中。需要注意的是,在源端为EXTRACT的参数,在目标端,需要改变成REPLICAT.
GGSCI(target) 2>edit param mgr
Port 7809
DynamicPortList 20100-20199
PurgeOldExtracts ./dirdat/pe*, UseCheckPoints, MinKeepHours 2
Autostart Replicat R*
AUTORESTART Replicat *, WaitMinutes 1, Retries 3
ACCESSRULE, PROG *, IPADDR 192.168.213.*, ALLOW -- (12c 新特性)
注:有时候在执行edit param mgr 命令时会报错
这是由于我们没有创建必要的目录造成的。我们可以手动去新建目录,也可以直接在ggssci命令行中执行命令创建:
GGSCI(source) 2> create subdirs
(4)启动管理进程
在源端和目标端都重启MANAGER进程,使MANAGER重新读取参数。view ggsevt查看告警日志信息。
GGSCI (source) 6> start mgr
1. 在源端的GGSCI中,创建一个WALLET,添加一个CREDENTIAL STORE,然后将用户的账号密码加入到OGGUSER中。
GGSCI 7> Create Wallet
Created wallet at location 'dirwlt'.
Opened wallet at location 'dirwlt'.
GGSCI 8> Add CredentialStore
Credential store created in ./dircrd/.
GGSCI 9> Alter CredentialStore Add User ogguser@orcl
Password ogguser Alias ogguser@orcl
Credential store in ./dircrd/ altered.
GGSCI 10> Info CredentialStore
Reading from ./dircrd/:
Domain: OracleGoldenGate
Alias: ogg_user@orcl
Userid: ogguser@orcl
2. 确认可以使用别名登陆数据库
GGSCI 8> DBLogin UserIDAlias ogguser@orcl
当然,我们也可以不配置免密码登录,直接使用账号+密码的方式登录。
GGSCI 9> DBLogin UserID ogguser, password ogguser
在源端数据库中必须对特定表开启SUPPLEMENTALLOGGING选项。在实时的数据抽取之前,当行发生变化时,ORACLE数据库必须记录表的关键值,OGG才能在REDO中发现这些操作。在默认情况下,日志只会记录列值的变化。所以这个操作是OGG定位到正确行来进行更新和删除动作所必须的。
选择源端的GGSCI窗口,并登录数据库:
GGSCI 9> DBLogin UserID ogguser, password ogguser
在成功登陆数据库之后,对所有OGG要使用的表使用ADDTRANDATA命令:
Add TranData 用户.表名 【*代表所有表】
GGSCI 13> Add TranData oggsrc.user_info
GGSCI 14> info TranData oggsrc.user_info
由于Oracle11.2.0.1.0 不支持集成(integrated)模式,所以这里使用经典模式。
在源端配置抽取进程:
1. 选择源端GGSCI来创建主要的Extract参数文件
GGSCI 10> edit param einta【备注,einta是自定义的抽取进程名称】
Extract einta
SETENV (ORACLE_SID='orclcn')
userid ogguser@orcl,password ogguser --【ogg管理用户】,也可以使用别名登录:useridalias ogguser@orcl
TranlogOptions IntegratedParams (max_sga_size 256) -- 一体化
Exttrail ./dirdat/in
LOGALLSUPCOLS
UPDATERECORDFORMAT COMPACT
Table schema.用户名.表名;
Table schema.用户名.表名;
Extract euser
SETENV (ORACLE_SID='orcl')
userid ogguser, password ogguser
-- TranlogOptions IntegratedParams (max_sga_size 256) -- 传统模式没有这个IntegratedParams参数
Exttrail ./dirdat/kk/in -- 生成文件的目录,如果有指定深层的目录结构,需要先手动创建对应的文件夹。比如这里需要在dirdat目录下创建kk文件夹
LOGALLSUPCOLS
UPDATERECORDFORMAT COMPACT
Table oggsrc.user_info;
保存参数退出编辑器
其中LOGALLSUPCOLS和UPDATERECORDFOMAT,在ORACLE 12C中,这两个新参数是在目标端的Integrated Replicat进程复制数据所必须的。
创建文件夹:
登陆数据库,注册Extract进程和Extract组还有本地的Extract trail文件
GGSCI >dblogin userid 用户名,password 密码【userid是ogg管理用户】
Successfully logged into database.
GGSCI > register extract einta database -- 如果是传统模式,是不需要执行这句的。
Extract EINTA successfully registered with database at SCN 1905933.
GGSCI > add extract einta, integrated tranlog, begin now -- 传统模式不是integrated tranlog, 而是tranlog
EXTRACT added.
GGSCI > add exttrail ./dirdat/in, extract einta, megabytes 10
EXTTRAIL added.
当我执行register extract euser database 的时候,报了一个找不到表或视图的错误,这个是权限的原因(如果是传统模式,不需要执行这一步)。
如果想使用DDL功能,需要在之前运行支持DDL的相关脚本。
脚本:
1.@marker_setup.sql
2.@ddl_setup.sql mode of installation:initialsetup
3.@role_setup.sql
4.GRANT GGS_GGSUSER_ROLE TO gguser
5.@ddl_enable.sql
其中执行到@ddl_setup.sql脚本的时候报错,错误信息说明,我们需要给ogguser用户创建单独的表空间。
至此,我们先创建一个新的表空间,并且修改ogguser的表空间为这个新建的:
SQL> create tablespace ggsdata datafile 'C:\app\LeBron\oradata\orcl\ggsdata01.db
f'size 50M autoextend on extent management local uniform size 256k;
表空间已创建。
SQL>
SQL> alter user ogguser default tablespace ggsdata;
用户已更改。
SQL>
1. @marker_setup.sql
2. @ddl_setup.sql
3.@role_setup.sql
4. GRANT GGS_GGSUSER_ROLE TO ogguser
5.@ddl_enable.sql
GGSCI > Edit Param pinta
Extract pinta
SETENV (ORACLE_SID='orcl')
Userid system@orclcn, password Admin123 -- 账号密码
rmthost 目标端的ip地址, mgrport 7809
rmttrail ./dirdat/pn
Table PDBBFFL.用户名.表名;【目标还是源端需要再确认】
Table PDBBFFL.用户名.表名;
……
Extract puser5
SETENV (ORACLE_SID='orcl')
UseridAlias ogguser@orcl
rmthost 192.168.213.131, mgrport 7809
rmttrail ./dirdat/kk5/pn
Table oggsrc.user_info;
创建DATA PUMP组然后添加远程EXTRACT TRAIL文件
GGSCI > add extract 进程名, exttrailsource ./dirdat/kk5/in -- 对应抽取进程的路径和前缀
EXTRACT added.
GGSCI > add rmttrail ./dirdat/kk5/pn, extract 进程名, megabytes 10 -- 对应生成投递文件的路径和前缀,如果指定下级的目录,需要在目标端dirdat目录下创建对应的文件夹,比如这里,我就需要手动创建kk5的文件夹
RMTTRAIL added.
GGSCI > add extract puser5, exttrailsource ./dirdat/kk5/in
EXTRACT added.
GGSCI > add rmttrail ./dirdat/kk5/pn, extract puser5, megabytes 10
RMTTRAIL added.
现在次级的EXTRACT进程已经配置和创建好了,但是还没有启动。
在目标端创建对应的文件夹:
启动目标端mgr管理进程:
然后启动源端抽取和投递进程,并使用info all查看进程状态:
GGSCI (WIN-M0UVT17SJ7H) 48> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
JAGENT STOPPED
EXTRACT STOPPED EUSER5 00:00:00 00:00:05
EXTRACT STOPPED PUSER5 00:00:00 00:00:04
GGSCI (WIN-M0UVT17SJ7H) 49> start euser5
Sending START request to MANAGER ...
EXTRACT EUSER5 starting
GGSCI (WIN-M0UVT17SJ7H) 50> start puser5
Sending START request to MANAGER ...
EXTRACT PUSER5 starting
GGSCI (WIN-M0UVT17SJ7H) 51> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
JAGENT STOPPED
EXTRACT RUNNING EUSER5 00:00:00 00:00:01
EXTRACT RUNNING PUSER5 00:00:00 00:00:21
GGSCI (WIN-M0UVT17SJ7H) 52>
然后去目标端对应目录查看trail文件是否已经过来:
至此,我们源端的所有进程都已经配置完成了。那么接下来就是配置目标端的进程,并使之处理trail文件并更新数据库操作使之生效。
配置REPLICAT 进程
1. 在目标端打开GGSCI,执行以下操作
GGSCI >Edit Param 进程名
Replicat 进程名
SETENV(ORACLE_SID='orcl') -- 环境变量
DBOPTIONS INTEGRATEDPARAMS(parallelism 6) -- 集成模式参数
AssumeTargetDefs
DiscardFile ./dirrpt/rpdw.dsc, Purge
userid system@pdbbffl,password oracle12c -- 账号,密码
Map 用户名.表名, target 用户名.表名; -- 左边是目标表,右边是源端表。如果两边字段一致,则可默认只写表名即可。如果有复杂的:转码、获取生成序列、常量值等,而下面是一个简单的实现
map 用户名.表名,target 用户名.表名,SQLEXEC(ID lookup,QUERY '执行的sql脚本(比如查询生成序列)',NOPARAMS),COLMAP(ID=@GETVAL(lookup.目标用户.序列名.nextval),目标表字段=源表字段,目标表字段=@CASE(源表字段,'原值1','实际值1','原值2','实际值2',....,'默认值'),目标字段='常量值');
我们先对比下目标端和源端表结构:
其中我故意把表字段设置成不一样的,而且多了一个ID,和BZ常量字段,ID我们就用序列好了。
那么先在目标端创建一个序列:seq_users
C:\Users\Administrator>sqlplus oggtrg/oggtrg
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 5月 8 13:11:52 2018
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create sequence seq_users start with 1 increment by 1 nomaxvalue nocache;
序列已创建。
SQL>
配置复制进程参数:
GGSCI >Edit Param ruser
Replicat ruser
SETENV(ORACLE_SID='orcl')
DBOPTIONS INTEGRATEDPARAMS(parallelism 6)
AssumeTargetDefs
DiscardFile ./dirrpt/rpdw.dsc, Purge
userid oggtrg,password oggtrg
map oggsrc.user_info,target oggtrg.TRG_USER_INFO,SQLEXEC(ID lookup,QUERY 'select seq_users.nextval from dual',NOPARAMS),COLMAP(ID=@GETVAL(lookup.oggtrg.seq_users.nextval),YID=ID,UNAME=NAME,AGE=AGE,GENDER=@CASE(GENDER,'1','2','0','1','3'),CREATE_TIME=CREATE_TIME,BZ='1');
2. 在GGSCI中登陆数据库,加入REPLICAT服务并将它连接到EXTTRAIL之后启动服务
Successfully logged into database.
GGSCI > Add Replicat ruser [integrated] exttrail ./dirdat/kk5/pn --
REPLICAT (Integrated) added.
GGSCI > Start Replicat ruser
Sending START request to MANAGER ...
REPLICAT RUSER starting
GGSCI > info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING RUSER 00:00:00 00:00:39
如果启动报错:
则说明想使用DDL功能,需要在之前运行支持DDL的相关脚本。
脚本:
1.@marker_setup.sql
2.@ddl_setup.sql mode of installation:initialsetup
3.@role_setup.sql
4.GRANT GGS_GGSUSER_ROLE TO ogguser
5.@ddl_enable.sql
其中执行到@ddl_setup.sql脚本的时候报错,错误信息说明,我们需要给ogguser用户创建单独的表空间。