两台服务器都需要创建ogg操作系统用户(此步骤非必须,也可以使用ORACLE用户安装)。
useradd -u 1003 -g oinstall -G dba ogg
passwd ogg
su - ogg
vi .bash_profile
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=XXL1
export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/dbhome_1/lib
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/jdk/bin:$PATH
export GGHOLE=/ogg
source .bash_profil生效
两台服务器都需要做同样的操作。
mkdir /ogg
chown -R ogg:oinstall /ogg
将ogg的11g安装包fbo_ggs_Linux_x64_ora11g_64bit.tar上传到/ogg下
用ogg用户解压
tar -xvf fbo_ggs_Linux_x64_ora11g_64bit.tar
./ggsci测试
[ogg@oracle2 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 (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
GGSCI (oracle2) 1>
ORACLE建议使用单独的表空间存放OGG数据,表空间大小50M就可以,但是最好设置数据文件的自动扩展。
select file_name from dba_data_files;查看表空间的存放目录
create tablespace ogg datafile ‘/u01/app/oracle/oradata/XXL/ogg01.dbf’ size 50M autoextend on;
创建OGG用户
create user ogg identified by ogg default tablespace ogg;
为OGG用户授权,OGG用户需要以下权限,也有人为了省事,直接给OGG用户DBA权限。
grant CONNECT, RESOURCE to ogg;
grant SELECT ANY DICTIONARY, SELECT ANY TABLE to ogg;
grant ALTER ANY TABLE to ogg;
grant FLASHBACK ANY TABLE to ogg;
grant EXECUTE on DBMS_FLASHBACK to ogg;
grant insert any table to ogg;
grant update any table to ogg;
grant delete any table to ogg;
不同的需求,OGG用户需要的权限也不一样,上面的权限基本可以支持大多数情况的数据复制,如上面的权限不足,需根据实际需求授权。
打开数据库的附加日志和force log
SQL> select NAME,OPEN_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN from v$database;
NAME OPEN_MODE FOR SUPPLEME
——— ——————– — ——–
DBDREAM READ WRITE NO NO
上面显示数据库的附加日志和force log都没有开启,使用下面的命令开启。
SQL> alter database force logging;
Database altered.
SQL> alter database add SUPPLEMENTAL log data;
Database altered.
SQL> select NAME,OPEN_MODE,FORCE_LOGGING,SUPPLEMENTAL_LOG_DATA_MIN from v$database;
NAME OPEN_MODE FOR SUPPLEME
——— ——————– — ——–
DBDREAM READ WRITE YES YES
确保最小附件日志,pk,uk,fk附加日志打开,而all columns的附加日志是关闭的。
SQL> select SUPPLEMENTAL_LOG_DATA_MIN a,SUPPLEMENTAL_LOG_DATA_PK b,SUPPLEMENTAL_LOG_DATA_UI c,SUPPLEMENTAL_LOG_DATA_FK d,SUPPLEMENTAL_LOG_DATA_ALL e from v$database;
SUPPLEMENTAL_LOG SUPPLE SUPPLE SUPPLE SUPPLE
YES NO NO NO NO
SQL> alter database add supplemental log data (primary key,unique,foreign key) columns;
Database altered.
SQL> select SUPPLEMENTAL_LOG_DATA_MIN a,SUPPLEMENTAL_LOG_DATA_PK b,SUPPLEMENTAL_LOG_DATA_UI c,SUPPLEMENTAL_LOG_DATA_FK d,SUPPLEMENTAL_LOG_DATA_ALL e from v$database;
A B C D E
YES YES YES YES NO
关闭回收站功能(DDL)必须关闭
SQL> show parameter recyclebin
NAME TYPE VALUE
recyclebin string on
alter system set recyclebin=off scope=spfile;这样就需要重启数据库生效
alter system switch logfile;
查看要是同步的用户的状态,确保是open
select username,account_status from dba_users;
运行OGG支持sequence
运行OGG支持DDL脚本如果要让OGG支持DDL操作,还需要额外运行几个脚本,这些脚本是OGG带的而不是ORACLE带的,在OGG的安装目录都可以找到,如果在OGG的安装目录登录数据库,可以直接@加脚本的名字,源端与目标端都需要运行,如下:
br/>如果要让OGG支持DDL操作,还需要额外运行几个脚本,这些脚本是OGG带的而不是ORACLE带的,在OGG的安装目录都可以找到,如果在OGG的安装目录登录数据库,可以直接@加脚本的名字,源端与目标端都需要运行,如下:
@marker_setup.sql 建立一个DDL标记表 schema name:输入ogg即可
@ddl_setup.sql 在数据库中创建DDL语句的trigger等必要组件
(执行时必须断开ggsci,不然报错)
@role_setup.sql 建立ggs_ggsuser_role角色
@ddl_enable.sql enable ddl捕获触发器
如果没有在OGG的安装目录登录数据库,需要指定脚本的位置,比如我的OGG安装目录为/ogg。
sqlplus / as sysdba@/ogg/marker_setup.sql
br/>@/ogg/marker_setup.sql
br/>@/ogg/role_setup.sql
创建OGG的管理目录
在正式配置OGG之前,首先需要创建OGG的管理目录,源端和目标端都需要创建,登录OGG,只需要执行create subdirs命令就可以了。
源端:
[ogg@dbdream 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 (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
GGSCI (dbdream) 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
目标端:
[ogg@dbdream 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 (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
GGSCI (dbdream) 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
名字 用途
dirprm 存放OGG参数各的配置信息
dirrpt 存放进程报告文件
dirchk 存放检查点文件
dirpcs 存放进程状态文件
dirsql 存放SQL脚本文件
dirdef 存放DEFGEN工具生成的数据定义文件
dirdat 存放Trail文件,也就是Capture进程捕获的日志文件
dirtmp 当事物需要的内存超过已分配内存时,默认存储在这个目录
OGG复制流程
之前所做的只是准备工作,现在就可以正式配置OGG了,在配置OGG之前,先看下OGG的复制流程,OGG和其他传统复制软件一样,也是通过源端捕获/挖掘ORACLE的日志信息,
目标端根据源端传送过来的日志信息进行重塑,实现源端-目标端数据同步
只有commit之后的日志信息才会被Capture进程捕获,未提交的事务OGG不会捕获。
建立测试用户并授权
create user lqh identified by lqh;
grant dba to lqh;
conn lqh/lqh
源
create table test100
(id number primary key,
name1 varchar2(20),
name2 varchar2(20),
name3 varchar2(20));
create table test200
(id number primary key,
name1 varchar2(20),
name2 varchar2(20),
name3 varchar2(20));
create table test300
(id number,
name1 varchar2(20),
name2 varchar2(20),
name3 varchar2(20));
begin
for i in 1..1000
loop
insert into test100 values (i,'name1-'||i,'name2-'||i,'name3-'||i);
insert into test200 values (i,'name1-'||i,'name2-'||i,'name3-'||i);
insert into test300 values (i,'name1-'||i,'name2-'||i,'name3-'||i);
if i mod 2 =0
then
commit;
end if;
end loop;
commit;
end;
/
目标:
create table test100
(id number primary key,
name1 varchar2(20),
name2 varchar2(20),
name3 varchar2(20));
create table test200
(id number primary key,
name1 varchar2(20),
name2 varchar2(20),
name3 varchar2(20));
create table test300
(id number,
name1 varchar2(20),
name2 varchar2(20),
name3 varchar2(20));
源端添加表级TRANDATA
添加表级的trandata可以理解为需要将哪些用户的哪些表同步到目标库,其实也是添加表级的supplemental log,但是只有上文打开的minimal supplemental log后,这个才生效。
用OGG用户从OGG登录源端数据库。
GGSCI (dbdream) 2> DBLOGIN USERID ogg, PASSWORD ogg
Successfully logged into database.
源端添加表级TRANDATA,我们这先使用test一些表。
GGSCI (oracle1) 3> add trandata lqh.test100
Logging of supplemental redo data enabled for table LQH.TEST100.
GGSCI (oracle1) 4> add trandata lqh.test200
Logging of supplemental redo data enabled for table LQH.TEST200.
GGSCI (oracle1) 5> add trandata lqh.test300
2018-04-17 06:13:52 WARNING OGG-00869 No unique key is defined for table 'TEST300'. All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.
Logging of supplemental redo data enabled for table LQH.TEST300.
成功添加表级TRANDATA后,可以通过INFO命令查看哪些表被添加了TRANDATA.
GGSCI (oracle1) 6> info trandata lqh.*
Logging of supplemental redo log data is enabled for table LQH.TEST100.
Columns supplementally logged for table LQH.TEST100: ID.
Logging of supplemental redo log data is enabled for table LQH.TEST200.
Columns supplementally logged for table LQH.TEST200: ID.
Logging of supplemental redo log data is enabled for table LQH.TEST300.
Columns supplementally logged for table LQH.TEST300: ID, NAME1, NAME2, NAME3.
查看lqh.TEST100这张表是否开启了trandata
GGSCI (oracle1) 8> info trandata lqh.TEST100
Logging of supplemental redo log data is enabled for table LQH.TEST100.
Columns supplementally logged for table LQH.TEST100: ID.
源端添加表级附加日志
set heading off;
set pagesize 120
select 'add trandata "'||owner||'"."'||table_name||'"' from dba_tables where owner in('用户');
dblogin userid goldengate,password **
add trandata "用户"."表名"
add trandata "用户"."表名"
add trandata "用户"."表名"
add trandata "用户"."表名"
add trandata "用户"."表名"
info trandata 用户.*
配置MGR管理进程
源端:
GGSCI (dbdream) 5> EDIT PARAMS MGR
加入以下两行内容
PORT 7809
AUTOSTART ER
PURGEOLDEXTRACTS ./ogg/dirdat/, USECHECKPOINTS
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
目标端:
GGSCI (stream) 2> EDIT PARAMS MGR
加入以下两行内容
PORT 7809
AUTOSTART ER
PURGEOLDEXTRACTS ./ogg/dirdat/, USECHECKPOINTS
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
参数说明及参考:
PORT 7809: ---OGG管理进程监控通信端口。生产端和灾备端需要保持一致
AUTOSTART ER * ---自动启动进程
PURGEOLDEXTRACTS: ---清除不需要的trail文件。
/ogg/dirdat: ---trail文件存放位置。
USECHECKPOINTS: ---使用检查点队列。
LAGREPORTHOURS 1 ---每隔一小时检查一次传输延迟情况
LAGINFOMINUTES 30 ---传输延时超过30分钟将写入错误日志
LAGCRITICALMINUTES 45 ---传输延时超过45分钟将写入警告日志,既error
PURGEOLDEXTRACTS ./dirdat/, USECHECKPOINTS, MINKEEPDAYS 3
---清除过期的tail文件,保留3天
STARTUPVALIDATIONDELAY 5 --- 启动时延迟5秒校验
DYNAMICPORTLIST 7840-7914
---用于与goldengate的复制进程,collector进程,ggsci命令进行通信。
AUTORESTART EXTRACT , RETRIES 5, WAITMINUTES 7
----当提取进程中断后尝试自动重启,每隔7分钟尝试启动一次,尝试5次,基本不用
PURGEDDLHISTORY MINKEEPDAYS 7, MAXKEEPDAYS 10,FREQUENCYMINUTES 30
--此参数用于维护GGS_DDL_HIST表,默认清除1小时没有变更过的记录。此处为GGS_DDL_HIST表记录保存7-10天内没有变更过的记录
PURGEMARKERHISTORY MINKEEPDAYS 7, MAXKEEPDAYS 10
--用于维护GGS_MARKER的记录数。默认为超过1小时的记录没有变更即删除。此处的参数含义为7-10天内的记录没有变更,就删除该记录,每30分钟检查并执行一次。
配置完MGR管理进程后,就可以启动MGR管理进程(源端和目标端都需要启动)。
GGSCI (oracle2) 6> start mgr
Manager started.
可以通过INFO命令查看进程的状态(最好每次启动时在两端都查看下)。
GGSCI (oracle2) 7> info mgr
Manager is running (IP port oracle2.7809).
GGSCI (oracle1) 4> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
配置初始化数据进程
由于在创建测试表的时候,源端的测试表有数据,而目标端的测试表只有结构,没有数据,所以需要初始化目标端的数据,所谓初始化,就是让目标端的数据和源端的数据在这个时间点是一模一样的,所以初始化工作并不需要一定使用OGG,也可以使用EXP、EXPDP、SQLLOAD等其他工具,本文主要介绍如何使用OGG进行数据初始化,下面在源端配置捕获进程lqh。
GGSCI (oracle1) 8> add extract lqh, SOURCEISTABLE
EXTRACT added.
查看EINI_1进程状态。
GGSCI (oracle1) 9> INFO EXTRACT *, TASKS
EXTRACT lqh Initialized 2018-04-11 01:01 Status STOPPED
Checkpoint Lag Not Available
Log Read Checkpoint Not Available
First Record Record 0
Task SOURCEISTABLE
由于只是添加了捕获进程lqh,还没有进行配置和启动这个进程,所以现在的状态是STOPPED状态。
查看数据库字符集如下
select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
select userenv('language') from dual;
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
源端编辑捕获进程lqh。
GGSCI (oracle1) 10> EDIT PARAMS lqh
–加入以下内容
EXTRACT lqh
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
USERID ogg PASSWORD ogg
RMTHOST oracle2 MGRPORT 7809
RMTTASK REPLICAT GROUP xixi
TABLE LQH.TEST100;
TABLE LQH.TEST200;
参数介绍:
EXTRACT lqh:说明这是EXTRACT进程,名字是lqh
SETENV:环境变量,一定要设置和数据库字符集一样,否则可能会乱码
USERID:数据库OGG用户
PASSWORD:数据库用户OGG的密码
RMTHOST:目标端地址,如果在/etc/hosts文件里已经设置解析,可以写主机名
MGRPORT:目标端MGR管理进程监听的端口
RMTTASK REPLICAT:目标端REPLICAT应用进程的组和名字
TABLE:源端要初始化数据的表的名字
编辑好捕获进程lqh后,还需要在目标端配置REPLICAT应用进程,名字要和源端的捕获进程lqh里面RMTTASK REPLICAT参数配置的一样,也就是还需要在目标端配置RMTTASK REPLICAT lqh。
配置目标端REPLICAT进程
目标端:
GGSCI (oracle1) 8> add replicat xixi,specialrun
EXTRACT added.
查看lqh进程状态。
GGSCI (oracle2) 7> info replicat *,task
REPLICAT XIXI Initialized 2018-04-17 06:43 Status STOPPED
Checkpoint Lag 00:00:00 (updated 00:00:11 ago)
Log Read Checkpoint Not Available
Task SPECIALRUN
GGSCI (oracle2) 9> EDIT PARAMS xixi
–加入以下内容
REPLICAT xixi
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
ASSUMETARGETDEFS
USERID ogg PASSWORD ogg
DISCARDFILE ./dirrpt/xixi.dsc,PURGE
MAP lqh. TARGET lqh.;
此处的./dirrpt/lqh.dsc一定要这样写,否则会报OGG-01091错误。
之前写的目录是./ogg/dirrpt/xixi.ds,报错如下
ERROR OGG-01091 Unable to open file "./ogg/dirrpt/xixi.dsc" (error 2, No such file or directory).
参数介绍:
REPLICAT xixi:说明这是REPLICAT应用进程,名字叫xixi
SETENV:语言变量,同捕获进程xixi
ASSUMETARGETDEFS:告诉OGG目标端和源端需要同步的表的结构完全一致,不需要OGG去检查表的结构,包括表名、字段名、字段类型、字段长度等,如果目标端和源端同步的表的结构不一样,需要使用SOURCEDEFS参数,详见OGG官方文档。
USERID:数据库OGG用户
PASSWORD:数据库用户OGG的密码
DISCARDFILE:错误信息存放位置及命名规则
MAP:源端捕获的表的名字
TARGET:目标端同步的表的名字,可以不在同一SCHEMA。
初始化数据
配置好目标端的应用进程lqh后,就可以启动源端的捕获进程进行捕获数据了,而目标端的应用进程lqh不需要手动去启动,也就是说目标端lqh进程不需要管。
GGSCI (oracle1) 11> START EXTRACT lqh
Sending START request to MANAGER ...
EXTRACT LQH starting
GGSCI (oracle1) 17> view report lqh
2018-04-17 06:45:18 INFO OGG-03035 Operating system character set identified as UTF-8. Locale: en_US, LC_ALL:.
EXTRACT lqh
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
Set environment variable (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
USERID ogg PASSWORD ***
RMTHOST oracle2 MGRPORT 7809
RMTTASK REPLICAT GROUP xixi
TABLE LQH.TEST100;
Using the following key columns for source table LQH.TEST100: ID.
启动源端的捕获进程lqh后,正常情况下(如果配置没问题),源端的数据已经传送到目标端了,可以通过VIEW命令查看源端捕获进程lqh的工作状态。
如果看不到数据而且没有报错,可以再次重启一遍抽取进程 。
有数据就说明同步成功了,同步完成后服务会自动停止(下面状态是正常的)
GGSCI (oracle1) 33> info extract lqh
EXTRACT LQH Last Started 2018-04-12 23:49 Status ABENDED
Checkpoint Lag Not Available
Log Read Checkpoint Table LQH.TEST100
2018-04-12 23:49:26 Record 1
Task SOURCEISTABLE
如果在上面日志的最后部分出现ERROR,就需要去检查OGG的安装目录下的ggserr.log日志,这个日志相当于数据库的告警日志。
以上我们的数据就都传输到目标端了,但是dml语句是传输不过去的,需要配置数据源库的捕获和传输进程
GGSCI (oracle1) 21> edit params caplqh
–加入以下内容
--capture change from oracle1 to oracle2
EXTRACT caplqh
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
USERID ogg, PASSWORD ogg
EXTTRAIL ./dirdat/qh
TABLE lqh.test100;
TABLE lqh.test200;
其中,EXTTRAIL是指抽取跟踪存放的数据位置。qh是文件的开头字母前缀(该前缀只能
是2个字母) 。
生成ogguser的密码暗文:
GGSCI (oracle2) 6> ENCRYPT PASSWORD ogg BLOWFISH ENCRYPTKEY DEFAULT
Using default key...
Encrypted password: AACAAAAAAAAAAADAHBLDCCIIOIRFNEPB
Algorithm used: BLOWFISH
在配置好之后修改密码记得重新启动进程
Caplqh捕获进程参数
EXTRACT <进程名>
SETENV (NLS_LANG="AMERICAN_AMERICA.ZHS16GBK") 设置字符集
USERID goldengate, PASSWORD AACAAAAAAAAAAGAIF, ENCRYPTKEY default 用户名密码
REPORTCOUNT EVERY 30 MINUTES, RATE ---每30分钟报告一次已经处理的统计数字
DISCARDFILE ./dirrpt/exta.dsc, APPEND, MEGABYTES 256 ---处理中有出错写入到次文件
DISCARDROLLOVER AT 3:00 ---设定每天3点切换队列时间
WARNLONGTRANS 2h, CHECKINTERVAL 3m
---每隔3分钟检查一下大事务,超过2小时还没结束的进行报告
EXTTRAIL ./dirdata/ya, MEGABYTES 256 ---指定写入到哪个队列
DYNAMICRESOLUTION ---动态解析表名,表多的时候不用从数据库中取出表结构
DBOPTIONS ALLOWUNUSEDCOLUMN
---在生产端库表中存在unused列时,需要配置该参数。用于阻止抽取进程抽取数据时由于表含有unused列而导致进程abend。即使使用该参数,抽取进程抽取到unused列时也会向日志文件记录一条警告信息。
FETCHOPTIONSNOUSESNAPSHOT
---默认值为usesnapshot,表示利用数据库闪回读取数据。Nousesnapshot表示直接从原表读取相关数据。
TRANLOGOPTIONS CONVERTUCS2CLOBS
---在解析数据库日志时所需要的特殊参数,CLOB字段。此参数已经v11版本后已经作废
tranlogoptionsasmusersys@asm, asmpasswordAACAAAAAAAAAAGAIF, ENCRYPTKEY default
TRANLOGOPTIONS altarchivelogdest primary instance rac1 /arch2 altarchivelogdest instance rac2 /arch3
---rac使用,解决归档路径不一致的问题;可以在一个实例上面配置多个归档路径,需要保证goldengate能同时读到各节点的归档,一般采用NFS挂载rac另外节点的归档。
THREADOPTIONS MAXCOMMITPROPAGATIONDELAY 60000 THREADOPTIONS IOLATENCY 1000
--- RAC集群中的所有节点必须同步系统时钟。GoldenGate通过比较本地系统的时间和事务提交的时间点来做出关键决策。可以通过NTP来不同系统时间。所有节点上的COMPATIBLE参数设置也必须相同。这个参数在Oracle11.2版本后就不在使用了。
TRANLOGOPTIONS rawdevice offset 0 ---裸设备使用
TRANOPTIONS EXCLUDEUSER goldengate ---排除goldengate用户
--DDL参数区域,所有复制对象,屏蔽对象在源端体现。
DDL &
INCLUDE MAPPED OBJTYPE 'TABLE' &
INCLUDE MAPPED OBJTYPE 'INDEX' &
INCLUDE MAPPED OBJTYPE 'SEQUENCE' &
INCLUDE MAPPED OBJTYPE 'VIEW' &
INCLUDE MAPPED OBJTYPE 'PROCEDURE' &
INCLUDE MAPPED OBJTYPE 'FUNCTION' &
INCLUDE MAPPED OBJTYPE 'PACKAGE' & ---标红参数为应用级灾备新添加的复制内容
EXCLUDE OPTYPE COMMENT
DDLOPTIONS addtrandata REPORT
--匹配table/index/sequence/view/procedure/function/package对象进行DDL复制。此处参数为按对象类型进行匹配复制
TABLE SCHEMA.; ---需要复制的对象列表
Sequence schema.; ---需要复制的sequence对象
GGSCI (oracle1) 22> add extract caplqh,tranlog,begin now
EXTRACT added.
add extract ext_app, tranlog, begin now, threads 2
单实例不需要加 add extract threads 子句;多于两个实例的RAC库, threads 子句指明实际的线程数
GGSCI (oracle1) 23> add exttrail ./dirdat/qh,extract caplqh,megabytes 5
EXTTRAIL added.
意思是将lqh捕获的extract跟踪文件添加到./dirdat 目录,文件最大5M。
add EXTTRAIL ./dirdat/r1, extract ext_app,MEGABYTES 100
GGSCI (oracle1) 10> start extract caplqh
Sending START request to MANAGER ...
EXTRACT CAPLQH starting
GGSCI (oracle1) 18> info extract caplqh
EXTRACT CAPLQH Last Started 2018-04-17 06:51 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:02 ago)
Log Read Checkpoint Oracle Redo Logs
2018-04-17 06:50:59 Seqno 75, RBA 41052160
SCN 0.913524 (913524)
GGSCI (oracle1) 12> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING CAPLQH 00:00:00 00:00:00
配置投递(传输跟踪文件)的pump进程
GGSCI (oracle1) 18> edit params pumplqh
内容如下:
--pump file from oracle1 to oracle2
EXTRACT pumplqh
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
PASSTHRU
RMTHOST oracle2 MGRPORT 7809
RMTTRAIL ./dirdat/md
TABLE lqh.test100;
TABLE lqh.test200;
~
GGSCI (oracle1) 41> add extract pumplqh,exttrailsource ./dirdat/qh
EXTRACT added.
以上是和caplqh一致,qh命名必须和抽取保持一致
datapump进程参数
EXTRACT <进程名>
RMTHOST IP地址, MGRPORT 7809, COMPRESS
---目标端的ip地址,7809为目标端的管理端口,要求配置compress压缩参数,节省网络带宽,但会增加CPU开销
PASSTHRU
---传输进程直接跟抽取进程交互,而不再和数据库进行交互,减少数据库资源的利用
NUMFILES 5000 ---最多处理多少个表
RMTTRAIL ./dirdata/ya ---投递哪个队列,必须和抽取保持一致
DYNAMICRESOLUTION ---动态解析表名
TABLE schema.; ---需要投递的对象列表
Sequence schema.; ---需要投递的sequence对象
如果添加错,下面命令删除
GGSCI (oracle1) 5> DELETE extract pumplqh
我们把qh开头的跟踪文件发送到目标库。然后设置对方的接收路径,并且文件以pu开
头 ,最大5M 。
GGSCI (oracle1) 14> info extract pumplqh
EXTRACT PUMPLQH Initialized 2018-04-13 01:56 Status STOPPED
Checkpoint Lag 00:00:00 (updated 00:00:09 ago)
Log Read Checkpoint File ./dirdat/qh000000
First Record RBA 0
GGSCI (oracle1) 43> add rmttrail ./dirdat/md,extract pumplqh,megabytes 5
RMTTRAIL added.
以上是和pumplqh一致
GGSCI (oracle1) 18> delete extract pumplqh2
Deleted EXTRACT PUMPLQH1.
如果添加错这样删除
GGSCI (oracle1) 44> start extract pumplqh
Sending START request to MANAGER ...
EXTRACT PUMPLQH starting
配置目标库的恢复进程
GGSCI (oracle2) 17> edit params ./GLOBALS
其中的GLOBAS必须大写 。该文件内容是:
checkpointtable ogg.ggschkpt
GGSCI (oracle2) 18> view params ./GLOBALS
checkpointtable ogg.ggschkpt
也就是添加检查点表(实现断点续传) ,配置完成后必须退出重连,让参数生效。
GGSCI (oracle2) 19> quit
[ogg@oracle2 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 (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
GGSCI (oracle2) 1> dblogin userid ogg password ogg
Successfully logged into database.
GGSCI (oracle2) 2> add checkpointtable
No checkpoint table specified, using GLOBALS specification (ogg.ggschkpt)...
Successfully created checkpoint table ogg.ggschkpt.
[oracle@oracle2 ~]$ sqlplus ogg/ogg
SQL*Plus: Release 11.2.0.1.0 Production on Tue Apr 17 07:14:13 2018
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
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> select * from tab;
TNAME TABTYPE CLUSTERID
GGSCHKPT TABLE
GGSCHKPT_LOX TABLE
GGSCI (oracle2) 3> add replicat mrpxixi exttrail ./dirdat/md
REPLICAT added.
此处和oracle1的pumplqh一致
GGSCI (oracle2) 4> edit params mrpxixi
REPLICAT mrpxixi
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
ASSUMETARGETDEFS
HANDLECOLLISIONS
USERID ogg PASSWORD ogg
DISCARDFILE ./dirrpt/mrpxixi.dsc,PURGE
MAP lqh.test100, TARGET lqh.test100;
MAP lqh.test200, TARGET lqh.test200;
其中的HANDLECOLLISIONS参数如果update 命中就insert,delete没命中就不操作,
insert如果存在而且不能重复就变成修改数据,如果存在允许重复就插入新的。如果没这个
参数遇到上述情况会报错。ASSUMETARGETDEFS假定数据源表的结构和目标表相同
创建replicat进程
dblogin userid goldengate,password goldengate
add checkpointtable goldengate.chktable
add replicat reppa,exttrail ./dirdat/r1,checkpointtable goldengate.chktable
配置目标段复制进程参数
REPLICAT <进程名>
USERIDgoldengate, PASSWORD AACAAAAAAAAAAGAIFAAAUDVHCFUGFIYF, ENCRYPTKEY default
SETENV (NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK")
SQLEXEC "ALTER SESSION SET CONSTRAINTS=DEFERRED"
---打开数据库中的延迟约束的特性,避免复制进程因拆分造成插入相关的约束错误
REPORT AT 01:59 ---每天01:59定期生成一个report文件
REPORTCOUNT EVERY 25 MINUTES, RATE
---此参数每隔30分钟,goldengate向日志文件生成一条记录(抽取进程自从启动后处理的记录数与计算处理速率的信息)
REPORTROLLOVER AT 02:00 ---
REPERROR DEFAULT, ABEND
---goldengate遇错的处理原则,即遇到不能处理的错误就自动abend,启动需要人工干预处理
ALLOWNOOPUPDATES ---当源表有排除列情况或者有目标表不存在的列时,当更新这列goldengate默认报错。应用该参数后,即可让goldengate生成一条警告信息而不是报错
ASSUMETARGETDEFS ---
DISCARDFILE ./dirrpt/ya.dsc, APPEND, MEGABYTES 256M ---该参数的路径必须为相对路径,建议该参数的值设置为1024M
DISCARDROLLOVER AT 02:00 ---表示discard文件每天02:00定期轮转
assumetargetdefs ---表示源库与目标库表结构一致
ALLOWNOOPUPDATES ---
--DDL参数区域 需要屏蔽的操作类型在此区域屏蔽
DDL include mapped ---DDL所有操作
ddloptions report
DDLERROR <error1> IGNORE --DDL 错误过滤
MAP schema., TARGET schema.;
修改进程启动的队列文件及rba号
alter <进程名> extseqno <队列文件>,extrba 0
start <进程名>,aftercsn scn号
start <进程名>
GGSCI (oracle2) 3> start replicat mrpxixi
Sending START request to MANAGER ...
REPLICAT MRPXIXI starting
GGSCI (oracle2) 4> info replicat mrpxixi
REPLICAT MRPXIXI Last Started 2018-04-13 02:03 Status RUNNING
Checkpoint Lag 00:00:00 (updated 00:00:09 ago)
Log Read Checkpoint File ./dirdat/md000000
First Record RBA 0
Insert,delete,update测试都没有问题
ddl暂时还不支持,下面我们来弄ddl。
关闭回收站功能(DDL)必须关闭
SQL> show parameter recyclebin
NAME TYPE VALUE
recyclebin string on
alter system set recyclebin=off scope=spfile;这样就需要重启数据库生效
SQL> @marker_setup
Marker setup script
You will be prompted for the name of a schema for the Oracle GoldenGate database objects.
NOTE: The schema must be created prior to running this script.
NOTE: Stop all DDL replication before starting this installation.
Enter Oracle GoldenGate schema name:ogg
Marker setup table script complete, running verification script...
Please enter the name of a schema for the GoldenGate database objects:
Setting schema name to OGG
MARKER TABLE
OK
MARKER SEQUENCE
OK
Script complete.
SQL> @ddl_setup 用户ogg最后出现如下
STATUS OF DDL REPLICATION
SUCCESSFUL installation of DDL Replication software components
如果报错需要执行@marker_remove.sql和@ddl_remove.sql脚本进行
SQL> @role_setup
SQL> grant GGS_GGSUSER_ROLE to ogg;
Grant succeeded.
SQL> @ddl_enable
Trigger altered.
SQL> @marker_status
Please enter the name of a schema for the GoldenGate database objects:
ogg
Setting schema name to OGG
MARKER TABLE
OK
MARKER SEQUENCE
OK
SQL> @?/rdbms/admin/dbmspool 该包是为了防止下面的脚本报错才跑的。
Package created.
Grant succeeded.
SQL> @ddl_pin.sql ogg
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
GGSCI (oracle1) 18> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING CAPLQH 00:00:00 00:00:08
EXTRACT RUNNING PUMPLQH 00:00:00 39:34:33
GGSCI (oracle1) 19> stop EXTRACT CAPLQH
Sending STOP request to EXTRACT CAPLQH ...
Request processed.
GGSCI (oracle1) 20> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT STOPPED CAPLQH 00:00:00 00:00:04
EXTRACT RUNNING PUMPLQH 00:00:00 00:00:08
GGSCI (oracle1) 21> edit params caplqh
内容如下,蓝色是新添加的DDL内容
--capture change from oracle1 to oracle2
dynamicresolution
EXTRACT caplqh
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
USERID ogg, PASSWORD ogg
TRANLOGOPTIONS EXCLUDEUSER ogg
EXTTRAIL ./dirdat/qh
DDL INCLUDE ALL
ddloptions addtrandata, report
TABLE lqh.test200;
GGSCI (oracle1) 23> start EXTRACT CAPLQH
Sending START request to MANAGER ...
EXTRACT CAPLQH starting
GGSCI (oracle1) 26> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING CAPLQH 00:00:00 00:00:10
EXTRACT RUNNING PUMPLQH 00:00:00 00:00:00
修改目标端的replicat 文件
GGSCI (oracle2) 10> edit params mrpxixi
内容如下,蓝色为添加部分
REPLICAT mrpxixi
SETENV (NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252)
ASSUMETARGETDEFS
HANDLECOLLISIONS
USERID ogg PASSWORD ogg
DISCARDFILE ./dirrpt/mrpxixi.dsc,PURGE
dynamicresolution
ddloptions report
DDLERROR DEFAULT IGNORE RETRYOP MAXRETRIES 3 RETRYDELAY 5
DDLERROR DEFAULT DISCARD
DDLERROR DEFAULT IGNORE RETRYOP
MAP lqh.test200, TARGET lqh.test200;
GGSCI (oracle2) 13> stop REPLICAT MRPXIXI
REPLICAT MRPXIXI is already stopped.
如果关不掉直接kill 如kill mrpxixi
GGSCI (oracle2) 14> start REPLICAT MRPXIXI
Sending START request to MANAGER ...
REPLICAT MRPXIXI starting
GGSCI (oracle2) 18> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING MRPXIXI 00:06:25 00:00:13
GGSCI (oracle2) 22> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING MRPXIXI 00:06:25 00:06:11
测试ddl也过来了,没有问题。
ddl同步要谨慎。ogg中ddl和dml机制是分开的,ddl同步不怎么稳定。
执行ddl_remove.sql 移除ddl