一、部署环境说明
设计需求:
本地有两个节点,节点1和节点2,其SCOTT方案的表数据需要同步上传到主服务器端做数据归并,主服务器端的DDL操作和HR方案的所有对象和数据需要同步发布到本地各节点,且数据要按照筛选条件来分发。
主服务器端:
计算机名:ora11g-1
IP:192.168.0.105
操作系统:Windows Server 2008 R2 Enterprise SP1 64位
数据库:Oracle
11g 11.2.0.4.0 64位
本地节点1:
计算机名:ora11g-2
IP:192.168.0.103
操作系统:Win7 旗舰版
SP1 64位
数据库:Oracle 11g 11.2.0.4.0
64位
本地节点2:
计算机名:ora11g-3
IP:192.168.0.104
操作系统:Win7旗舰版SP1 64位
数据库:Oracle
11g 11.2.0.4.0 64位
在这里,本地节点和主服务器端同时即作为源端,也作为目标端,一部分表由多个本地节点向一个主服务器端复制,另一部分表由主服务器端向多个本地节点复制,并且要按照一定条件进行数据筛选分发。
二、OGG软件下载
因为是在Windows系统下Oracle数据库之间的复制,因此我们选择for Oracle的64位Windows版本
(450 MB)
三、OGG软件安装
1、系统环境准备,需要安装VC2010可再发行组件包(Source & Target DB)
<>
下载地址:
2、安装OGG软件,选择for Oracle 11g,选择安装路径c:\ogg,定位Oracle主目录,管理端口用默认7809(Source & Target DB)
3、设置永久性环境变量,根据实际情况设置
setx /m
ORACLE_BASE C:\oracle
setx /m
ORACLE_HOMEC:\oracle\product\11.2.0\dbhome_1
setx /m
ORACLE_SID mes
setx /m PATH
"%PATH%;C:\ogg"
4、创建OGG目录(Source & Target DB)
进入OGG控制台
ggsci
创建OGG目录,如果目录已经存在,则会提示
create subdirs
四、数据库准备
1、源端修改数据库为归档模式(Source DB)
检查源端数据库当前日志模式
archive log
list;
如为非归档模式,则需要重启数据库到mount,将数据库修改为归档模式。
首先设置好归档路径和归档日志文件名,这里在闪回恢复区中创建一个目录archivelog用于存放归档日志
alter
system set log_archive_dest_1='location=E:\fast_recovery_area\mes\archivelog';
alter
system set log_archive_format='arc_%d_%t_%r_%s.log' scope = spfile;
然后重新加载数据库
shutdown
immediate;
startup mount;
设置数据库为归档模式
alter database
archivelog;
alter database
open;
确认模式已更改
archive log
list;
2、源端数据库开启最小化补充日志和强制日志(Source DB)
开启最小化补充日志
alter database
add supplemental log data;
开启数据库强制日志
alter database
force logging;
确认最小补充日志和强制日志已开启
select
supplemental_log_data_min, force_logging from v$database;
SUPPLEME FORCE_LOGGING
--------
---------------------------------------
YES YES
3、禁用源端与同步对象相关的所有触发器,此条保证数据不会在目标端重复复制。(Source
DB)
4、创建OGG专有表空间和用户并授权(Source & Target DB)
create
tablespaceoggdatafile
'D:\oradata\mes\ogg01.dbf' size
100m;
create
useroggidentified byoggmes01default tablespaceogg;
grant
dba toogg;
grant execute
on utl_file to ogg;
exec
dbms_goldengate_auth.grant_admin_privilege('ogg','*',true);
5、对于Oracle11.2.0.4及以后版本,需要修改初始化参数(Source & Target DB)
alter system
set enable_goldengate_replication = true;
6、为方便测试,在部署OGG之前,分别在本地节点和主服务器上创建测试表。
在两个本地节点源端的SCOTT模式下各创建一张测试表,主服务器目标端也创建一张测试表,源端、目标端中这些表的数据可能是不同的。
节点1:
create table
scott.emp1 as select * from scott.emp;
alter table
scott.emp1 add constraint pk_emp1 primary key (empno);
节点2:
create table
scott.emp1 as select * from scott.emp;
alter table
scott.emp1 add constraint pk_emp1 primary key (empno);
主服务器端:
create table
scott.emp1 as select * from scott.emp;
alter table
scott.emp1 add constraint pk_emp1 primary key (empno);
在主服务器源端的HR模式下创建一张测试表,在两个本地节点目标端也各创建一张测试表,并以不同数据范围划分。
主服务器端:
create table
hr.employees1 as select * from hr.employees;
alter table
hr.employees1 add constraint pk_employees1 primary key (employee_id);
节点1:
create table
hr.employees1 as select * from hr.employees where department_id = 30;
alter table
hr.employees1 add constraint pk_employees1 primary key (employee_id);
节点2:
create table
hr.employees1 as select * from hr.employees where department_id = 60;
alter table
hr.employees1 add constraint pk_employees1 primary key (employee_id);
五、OGG部署
1、进入OGG管理界面并登录数据库(Source & Target DB)
进入OGG管理界面
ggsci
登录数据库
dblogin
userid oggpassword oggmes01
2、源端开启表的最小附加日志(Source DB)
本地节点开启模式下的所有表
add trandata
scott.*
查看开启信息
info trandata
scott.*
主服务器端因为需要根据表的字段值来分发数据,因此需要独立说明各个表的附加日志,这里要分发的数据是测试表employees1,并且是根据department_id来筛选
add
trandatahr.countries
add trandata
hr.departments
add trandata
hr.employees
add trandata
hr.employees1, cols(department_id)
add
trandatahr.jobs
add
trandatahr.job_history
add
trandatahr.locations
add
trandatahr.regions
查看开启信息
info trandata
hr.*
可查看OGG日志组信息
本地节点:
col owner for a10
col log_group_name for
a20
col table_name for a20
select * from
dba_log_groups where owner = 'SCOTT';
OWNER LOG_GROUP_NAME TABLE_NAME LOG_GROUP_TYPE ALWAYS GENERATED
----------
-------------------- -------------------- ----------------------------
----------- --------------
SCOTT GGS_32198 BONUS USER LOG GROUP ALWAYS USER NAME
SCOTT SYS_C0010002 BONUS PRIMARY KEY LOGGING ALWAYS GENERATED NAME
SCOTT SYS_C0010003 BONUS UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT SYS_C0010004 BONUS FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT GGS_32194 DEPT USER LOG GROUP ALWAYS USER NAME
SCOTT SYS_C0010006 DEPT PRIMARY KEY LOGGING ALWAYS GENERATED NAME
SCOTT SYS_C0010007 DEPT UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT SYS_C0010008 DEPT FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT GGS_32196 EMP USER LOG GROUP ALWAYS USER NAME
SCOTT SYS_C0010010 EMP PRIMARY KEY LOGGING ALWAYS GENERATED NAME
SCOTT SYS_C0010011 EMP UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT SYS_C0010012 EMP FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT GGS_33827 EMP1 USER LOG GROUP ALWAYS USER NAME
SCOTT SYS_C0010014 EMP1 PRIMARY KEY LOGGING ALWAYS GENERATED NAME
SCOTT SYS_C0010015 EMP1 UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT SYS_C0010016 EMP1 FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT GGS_32199 SALGRADE USER LOG GROUP ALWAYS USER NAME
SCOTT SYS_C0010018 SALGRADE PRIMARY KEY LOGGING ALWAYS GENERATED NAME
SCOTT SYS_C0010019 SALGRADE UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT SYS_C0010020 SALGRADE FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
主服务器端:
col owner for a10
col log_group_name for
a20
col table_name for a20
select *
from dba_log_groups where owner = 'HR';
OWNER LOG_GROUP_NAME TABLE_NAME LOG_GROUP_TYPE ALWAYS GENERATED
----------
-------------------- -------------------- ------------------- -----------
--------------
HR GGS_91276 COUNTRIES USER LOG GROUP ALWAYS USER NAME
HR SYS_C0021574 COUNTRIES PRIMARY KEY LOGGING ALWAYS GENERATED NAME
HR SYS_C0021575 COUNTRIES UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
HR SYS_C0021576 COUNTRIES FOREIGN KEY LOGGING CONDITIONAL
GENERATED NAME
HR GGS_91281 DEPARTMENTS USER LOG GROUP ALWAYS USER NAME
HR SYS_C0021578 DEPARTMENTS PRIMARY KEY LOGGING ALWAYS GENERATED NAME
HR SYS_C0021579 DEPARTMENTS UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
HR SYS_C0021580 DEPARTMENTS FOREIGN KEY LOGGING CONDITIONAL
GENERATED NAME
HR GGS_91286 EMPLOYEES USER LOG GROUP ALWAYS USER NAME
HR SYS_C0021582 EMPLOYEES PRIMARY KEY LOGGING ALWAYS GENERATED NAME
HR SYS_C0021583 EMPLOYEES UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
HR SYS_C0021584 EMPLOYEES FOREIGN KEY LOGGING CONDITIONAL
GENERATED NAME
HR GGS_92582 EMPLOYEES1 USER LOG GROUP ALWAYS USER NAME
HR SYS_C0021586 EMPLOYEES1 PRIMARY KEY LOGGING ALWAYS GENERATED NAME
HR SYS_C0021587 EMPLOYEES1 UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
HR SYS_C0021588 EMPLOYEES1 FOREIGN KEY LOGGING CONDITIONAL
GENERATED NAME
HR GGS_91284 JOBS USER LOG GROUP ALWAYS USER NAME
HR SYS_C0021590 JOBS PRIMARY KEY LOGGING
ALWAYS GENERATED NAME
HR SYS_C0021591 JOBS UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
HR SYS_C0021592 JOBS FOREIGN KEY LOGGING
CONDITIONAL GENERATED NAME
HR GGS_91290 JOB_HISTORY USER LOG GROUP ALWAYS USER NAME
HR SYS_C0021594 JOB_HISTORY PRIMARY KEY LOGGING ALWAYS GENERATED NAME
HR SYS_C0021595 JOB_HISTORY UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
HR SYS_C0021596 JOB_HISTORY FOREIGN KEY LOGGING CONDITIONAL
GENERATED NAME
HR GGS_91278 LOCATIONS USER LOG GROUP ALWAYS USER NAME
HR SYS_C0021598 LOCATIONS PRIMARY KEY LOGGING ALWAYS GENERATED NAME
HR SYS_C0021599 LOCATIONS UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
HR SYS_C0021600 LOCATIONS FOREIGN KEY LOGGING CONDITIONAL
GENERATED NAME
HR GGS_91274 REGIONS USER LOG GROUP ALWAYS USER NAME
HR SYS_C0021602 REGIONS PRIMARY KEY LOGGING ALWAYS GENERATED NAME
HR SYS_C0021603 REGIONS UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
HR SYS_C0021604 REGIONS FOREIGN KEY LOGGING CONDITIONAL
GENERATED NAME
可查看OGG日志组列信息
本地节点:
col owner for a10
col
table_name for a20
col column_name for a20
select *
from dba_log_group_columnswhereowner = 'SCOTT';
OWNER LOG_GROUP_NAME TABLE_NAME COLUMN_NAME POSITION LOGGIN
----------
-------------------- -------------------- -------------------- ----------
------
SCOTT GGS_32196 EMP EMPNO 1 LOG
SCOTT GGS_33827 EMP1 EMPNO 1 LOG
SCOTT GGS_32199 SALGRADE GRADE 1 LOG
SCOTT GGS_32199 SALGRADE LOSAL 2 LOG
SCOTT GGS_32199 SALGRADE HISAL 3 LOG
SCOTT GGS_32198 BONUS ENAME 1 LOG
SCOTT GGS_32198 BONUS JOB 2 LOG
SCOTT GGS_32198 BONUS SAL 3 LOG
SCOTT GGS_32198 BONUS COMM 4 LOG
SCOTT GGS_32194 DEPT DEPTNO 1 LOG
主服务器端:
col owner for a10
col
table_name for a20
col column_name for a20
select *
from dba_log_group_columnswhereowner = 'HR';
OWNER LOG_GROUP_NAME TABLE_NAME COLUMN_NAME POSITION LOGGIN
----------
-------------------- -------------------- -------------------- ----------
------
HR GGS_92582 EMPLOYEES1 EMPLOYEE_ID 1 LOG
HR GGS_92582 EMPLOYEES1 DEPARTMENT_ID 2 LOG
HR GGS_91276 COUNTRIES COUNTRY_ID 1 LOG
HR GGS_91281 DEPARTMENTS DEPARTMENT_ID 1 LOG
HR GGS_91286 EMPLOYEES EMPLOYEE_ID 1 LOG
HR GGS_91284 JOBS JOB_ID 1 LOG
HR GGS_91290 JOB_HISTORY EMPLOYEE_ID 1 LOG
HR GGS_91290 JOB_HISTORY START_DATE 2 LOG
HR GGS_91278 LOCATIONS LOCATION_ID 1 LOG
HR GGS_91274 REGIONS REGION_ID 1 LOG
注意到employees1表除了主键employee_id外,department_id列也被加入附加日志,因为主服务器端要依据该列向节点分发数据。
如要取消表的最小附加日志
delete
trandata scott.*
如要直接在模式级别上开启附加日志
add
schematrandata scott
注:
1)如不执行add
trandata,insert同步没有问题,但在同步update或delete操作时,会因为丢失主键报同步错误。不开启表级的最小附加日志,redo信息不记录没有进行更新的字段,如主键不更新的话主键不记录在redo中,导致同步失败。
2)对于11.2.0.4以下的Oracle版本,执行add
schematrandata命令时会报错:
OGG-06522 Cannot verify existence of table function
that is required to ADD schema level supplemental logging, failed to find
function.
此为Oracle自身bug,解决办法是需要安装bug13794550相关的patch补丁。
3)在OGG同步环境搭建好之后再新建的表需要及时添加add trandata,否则同步时update操作将失败。
3、为支持DDL复制,主服务器源端从OGG安装目录进入sqlplus,执行以下脚本,期间会提示键入OGG用户名(Source DB)
@marker_setup.sql
@ddl_setup.sql
@role_setup.sql
@ddl_enable.sql
@marker_status.sql
grant
ggs_ggsuser_role to ogg;
注:如果在10g中使用DDL复制,需要关闭回收站,11g不需要。
4、配置全局参数和checkpoint表(Source DB & Target DB)
全局参数文件的路径应放置在OGG根目录下,且无扩展名,这一点和其他参数文件是不一样的
文件c:\ogg\globals,内容如下
ggschema ogg
checkpointtable
ogg.checkpoint
allowoutputdir
c:\ogg\dirdat
添加checkpoint表
add checkpointtable
ogg.checkpoint
确认表已创建,包含了checkpoint和checkpoint_lox两张表
conn
ogg/oggmes01
select * from
cat;
TABLE_NAME TABLE_TYPE
--------------------
-----------
CHECKPOINT TABLE
CHECKPOINT_LOX TABLE
GGS_DDL_COLUMNS TABLE
GGS_DDL_HIST TABLE
GGS_DDL_HIST_ALT TABLE
GGS_DDL_LOG_GROUPS TABLE
GGS_DDL_OBJECTS TABLE
GGS_DDL_PARTITIONS TABLE
GGS_DDL_PRIMARY_KEYS
TABLE
GGS_DDL_RULES TABLE
GGS_DDL_RULES_LOG TABLE
GGS_DDL_SEQ SEQUENCE
GGS_MARKER TABLE
GGS_MARKER_SEQ SEQUENCE
GGS_SETUP TABLE
GGS_STICK TABLE
GGS_TEMP_COLS TABLE
GGS_TEMP_UK TABLE
5、配置管理进程(Source & Target DB)
编辑参数文件
edit param mgr
内容如下
port 7809
autostart er *
autorestart er *, retries
3, waitminutes 5, resetminutes 60
purgeoldextracts
c:\ogg\dirdat\*, usecheckpoints, minkeepdays 3
可以查看管理进程的参数文件内容
view param mgr
Windows需要将管理进程加入到服务中
cd c:\ogg
install addservice
对于目标端,在Windows服务管理器services.msc中将GGSMGR服务的启动类型改为自动(延迟启动),以协调进程之间的顺序关系。
如要删除该服务
sc delete ggsmgr
6、配置源端提取进程(Source DB)
两个本地节点到主服务器端的复制是多对1的关系,因此本地节点不能包含相同的DDL,否则主服务器端将对DDL试图应用两次导致出错。从业务上讲,多个本地节点是将不同的DML数据归并到主服务器端的相同表中的,而表结构等的DDL应是由主服务器端向各个本地节点分发的,因此本地节点的各进程参数不应包含对DDL的应用。
本地节点编辑参数文件
edit param
ext1
内容如下
extract ext1
userid
ogg, password oggmes01
exttrail
c:\ogg\dirdat\e1
table
scott.*;
查看提取进程的参数文件内容
view param
ext1
增加提取进程
add
extract ext1,tranlog, begin now
add
exttrail c:\ogg\dirdat\e1,
extract ext1
主服务器端应配置两套提取进程,分别对应两个本地节点的数据提取,包含DDL操作,部分表按照刷选条件选取数据。
主服务器端对应节点1
edit param
ext1
内容如下
extract
ext1
userid
ogg, password oggmes01
exttrail
c:\ogg\dirdat\e1
ddl include
all
tablehr.countries;
table
hr.departments;
table
hr.employees;
table
hr.employees1, filter(department_id = 30);
table hr.jobs;
table
hr.job_history;
table
hr.locations;
table
hr.regions;
主服务器端对应节点2
edit param
ext2
内容如下
extract
ext2
userid
ogg, password oggmes01
exttrail
c:\ogg\dirdat\e2
ddl include
all
tablehr.countries;
table
hr.departments;
table
hr.employees;
table
hr.employees1, filter(department_id = 60);
table hr.jobs;
table
hr.job_history;
table
hr.locations;
table
hr.regions;
查看提取进程的参数文件内容
view param
ext1
view param
ext2
增加提取进程
add
extract ext1,tranlog, begin now
add
exttrail c:\ogg\dirdat\e1,
extract ext1
add
extract ext2,tranlog, begin now
add
exttrail c:\ogg\dirdat\e2,
extract ext2
将提取进程做成Windows后台服务,方法如下:
1)下载instsrv.exe和srvany.exe两个Windows后台服务制作程序,两个程序复制到OGG安装目录
<>
下载地址:
2)Windows命令行中执行该工具,要求必须写全路径,本地节点生成名为GGSEXT1的后台服务,主服务器端则需要配置两个服务
c:\ogg\instsrv.exeGGSEXT1c:\ogg\srvany.exe
c:\ogg\instsrv.exeGGSEXT2c:\ogg\srvany.exe
3)在Windows注册表中挂接服务执行的程序
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下找到GGSEXT1服务,右击新建项,名为Parameters,单击该项,在右边新建两个字符串值:
Application,值为c:\ogg\extract paramfile
c:\ogg\dirprm\ext1.prm
AppDirectory,值为c:\ogg
同理对于GGSEXT2服务,注册表Application值为c:\ogg\extract
paramfile c:\ogg\dirprm\ext2.prm。
在Windows服务管理器services.msc中修改GGSEXT1和GGSEXT2服务的启动类型为自动(延迟启动),使得提取进程的启动在管理进程之后。
7、配置源端传输进程(Source DB)
源端本地节点编辑参数文件,其中IP地址是目标端的地址
edit param pump1
节点1
extract pump1
userid
ogg, password oggmes01
rmthost
192.168.0.105, mgrport 7809, compress
rmttrail
c:\ogg\dirdat\p1
table
scott.*;
节点2
extract pump1
userid
ogg, password oggmes01
rmthost
192.168.0.105, mgrport 7809, compress
rmttrail
c:\ogg\dirdat\p2
table
scott.*;
可以查看传输进程的参数文件内容
view param
pump1
本地节点1增加传输进程
add
extract pump1, exttrailsource c:\ogg\dirdat\e1
add
rmttrailc:\ogg\dirdat\p1,
extract pump1
本地节点2增加传输进程
add
extract pump1, exttrailsource c:\ogg\dirdat\e1
add
rmttrailc:\ogg\dirdat\p2,
extract pump1
对于主服务器端,分别编辑不同参数文件指向不同节点,参数文件中包含了对DDL的应用
对应节点1
edit
param pump1
内容如下
extract
pump1
userid
ogg, password oggmes01
rmthost
192.168.0.103, mgrport 7809, compress
rmttrail
c:\ogg\dirdat\p1
ddl include
all
tablehr.*;
对应节点2
edit
param pump2
内容如下
extract
pump2
userid
ogg, password oggmes01
rmthost
192.168.0.104, mgrport 7809, compress
rmttrail
c:\ogg\dirdat\p2
ddl include
all
tablehr.*;
可以查看传输进程的参数文件内容
view param
pump1
view param
pump2
主服务器端分别增加2个传输进程
add
extract pump1, exttrailsource c:\ogg\dirdat\e1
add
rmttrailc:\ogg\dirdat\p1,
extract pump1
add
extract pump2, exttrailsource c:\ogg\dirdat\e2
add
rmttrailc:\ogg\dirdat\p2,
extract pump2
8、配置目标端复制进程(Target DB)
多个源端时,目标端需要对应配置多个不同的复制进程。对于同一个源端过来的不同trail,也需要配置不同的复制进程。
主服务器端对应本地节点1,编辑复制进程参数文件
edit param
rep1
内容如下
replicat
rep1
useridogg,passwordoggmes01
mapscott.*,targetscott.*;
主服务器端对应本地节点2,编辑复制进程参数文件
edit param
rep2
内容如下
replicat
rep2
useridogg,passwordoggmes01
mapscott.*,targetscott.*;
查看配置
view param
rep1
view param
rep2
主服务器端添加复制进程
add
replicat rep1, exttrail
c:\ogg\dirdat\p1, checkpointtable ogg.checkpoint
add
replicat rep2, exttrail
c:\ogg\dirdat\p2, checkpointtable ogg.checkpoint
两个本地节点编辑复制进程参数文件
edit param
rep1
内容如下
replicat
rep1
useridogg,passwordoggmes01
maphr.*,targethr.*;
查看配置
view param
rep1
两个本地节点添加复制进程,分别对应主服务器端传来的不同trail文件
节点1
add
replicat rep1, exttrail
c:\ogg\dirdat\p1, checkpointtable ogg.checkpoint
节点2
add
replicat rep1, exttrail
c:\ogg\dirdat\p2, checkpointtable ogg.checkpoint
9、进程的启动
按照以下顺序分别启动目标端和源端各进程。
1)目标端
启动管理进程,可在Windows服务管理器services.msc中启动服务,或在Windows命令行中启动服务
scstartggsmgr
查看进程启动状态
sc query
ggsmgr
确认管理进程已启动,并且复制进程也被自动启动
info all
2)源端
启动管理进程,可在Windows服务管理器services.msc中启动服务,或在Windows命令行中启动服务
scstartggsmgr
查看管理进程启动状态
sc query
ggsmgr
确认管理进程已启动,并且传播进程也被自动启动
info all
启动提取进程,可在Windows服务管理器services.msc中启动服务,或在Windows命令行中启动服务
scstartggsext1
查看提取进程启动状态
sc query
ggsext1
确认提取进程已启动
info all
注:
1)一些进程如传输进程可能不会随管理进程一次性启动成功,按照管理进程中参数的配置,未启动成功的进程间隔一定时间后会自动尝试重新启动直至成功。
2)实测在Windows中直接使用OGG命令start mgr和start ext1是不能启动管理进程和提取进程的。
3)如果不将提取进程做成后台服务,而直接在Windows命令行中启动提取进程,则窗口必须一直保持打开不能关闭,否则进程终止。
c:\ogg\extract paramfile c:\ogg\dirprm\ext1.prm
六、各种对象的同步测试
1、表
// insert
主服务器源端插入数据
insert into employees1
values(1001, 'liu', 'luning', 'liuln', '', sysdate, 'IT_PROG', 0, '', 100, 30);
insert into employees1
values(1002, 'Zhang', 'san', 'zhangs', '', sysdate, 'IT_PROG', 0, '', 100, 60);
commit;
检查本地节点目标端数据被同步,应当是第一条记录被同步到节点1,第二条记录被同步到节点2。
本地节点1源端插入数据
insert
intoscott.emp1 values('1001', 'zhang', 'clerk', '7902',
sysdate, 1000, '', '20');
commit;
本地节点2源端插入数据
insert
intoscott.emp1 values('1002', 'wang', 'clerk', '7902',
sysdate, 1000, '', '20');
commit;
注意因为需要将两个源端的数据同步合并到目标端,因此插入的主键值需要跳开,不能一样。
检查主服务器目标端数据被同步合并。
// update
主服务器源端更新数据
update
employees1 set salary = 3500
where employee_id = 1001;
update
employees1 set salary =3000
where employee_id = 1002;
commit;
检查本地节点目标端数据分别被同步更新。
本地节点1源端更新数据
update scott.emp1 set
job='manager' where ename='zhang';
commit;
本地节点2源端更新数据
update
scott.emp1 set job='manager' where ename='wang';
commit;
检查主服务器目标端数据被同步更新。
// delete
主服务器源端删除数据
delete from employees1
where employee_id in (1001, 1002);
commit;
检查本地节点目标端数据被同步删除。
本地节点1源端删除数据
delete from
scott.emp1 where ename='zhang';
commit;
本地节点2源端删除数据
delete from
scott.emp1 where ename='wang';
commit;
检查主服务器目标端数据被同步删除。
// modify
column
主服务器源端增加表列的DDL操作
alter
tablehr.employees1add col1 varchar2(20);
检查本地节点目标端表列被同步增加。
主服务器源端删除表列的DDL操作
alter
table hr.employees1 drop column
col1;
检查本地节点目标端表列被同步删除。
// constraint
主服务器源端给表增加非空约束
alter
tablehr.employees1modifyfirst_nameconstraintnn_first_namenot null;
检查本地节点目标端约束已同步
col constraint_name for
a20
col table_name for a20
col r_constraint_name for
a20
col column_name for a20
select
constraint_name, constraint_type, table_name, column_name, r_constraint_name,
status from user_constraints natural join user_cons_columns where table_name =
'EMPLOYEES1';
CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME COLUMN_NAME R_CONSTRAINT_NAME STATUS
--------------------
--------------- -------------------- -------------------- --------------------
--------
SYS_C009996 C EMPLOYEES1 LAST_NAME ENABLED
SYS_C009997 C EMPLOYEES1 EMAIL ENABLED
SYS_C009998 C EMPLOYEES1 HIRE_DATE ENABLED
SYS_C009999 C EMPLOYEES1 JOB_ID ENABLED
PK_EMPLOYEES1 P EMPLOYEES1 EMPLOYEE_ID ENABLED
NN_FIRST_NAME C EMPLOYEES1 FIRST_NAME ENABLED
主服务器源端删除约束
alter table
hr.employees1 drop constraint nn_first_name;
检查本地节点目标端约束被同步删除。
// index
主服务器源端给表添加索引
create
indexhr.idx_first_nameon hr.employees1(first_name);
检查本地节点目标端索引已同步
col column_name for a20
col tablespace_name for
a20
col table_name for a20
select
index_name, index_type, table_name, column_name, tablespace_name, uniqueness,
status from user_indexes natural join user_ind_columns where table_name = 'EMPLOYEES1';
INDEX_NAME INDEX_TYPE TABLE_NAME COLUMN_NAME TABLESPACE_NAME UNIQUENESS STATUS
------------------------------
--------------------------- -------------------- --------------------
-------------------- ---------- --------
PK_EMPLOYEES1 NORMAL EMPLOYEES1 EMPLOYEE_ID USERS UNIQUE VALID
IDX_FIRST_NAME NORMAL EMPLOYEES1 FIRST_NAME USERS NONUNIQUE VALID
主服务器源端删除索引
drop index
hr.idx_first_name;
检查本地节点目标端索引被同步删除。
// create
table
主服务器源端创建表的DDL操作
create table
hr.t1 as select * from hr.employees;
新增表的补充日志
add
trandatahr.t1
修改主服务器源端的两个提取进程参数,添加对表t1的提取
edit param
ext1
添加
table hr.t1;
edit param
ext2
添加
table hr.t1;
在Windows服务程序services.msc中重启两个提取进程GGSEXT1和GGSEXT2的服务。
确认进程恢复运行
info all
插入数据
insert
intot1 values(1001, 'liu',
'luning', 'liuln', '', sysdate, 'IT_PROG', 0, '', 100, 30);
insert
intot1 values(1002, 'Zhang',
'san', 'zhangs', '', sysdate, 'IT_PROG', 0, '', 100, 60);
commit;
检查本地节点目标端,由于t1表没有做数据筛选,所以被全部复制。
更新数据
updatet1 set salary = 3000 where employee_id =
1001;
updatet1 set salary = 2500 where employee_id =
1002;
commit;
检查本地节点目标端,数据被同步更新。
// truncate
截断表
truncate table
hr.t1;
检查本地节点目标端,表被截断。
// drop table
删除表
drop table
hr.t1 purge;
检查本地节点目标端,表被删除。
实测表明,新增表之后,需要及时在源端开启表的补充日志,否则update将失败,并导致目标端复制进程异常终止。但同时也验证了对于没有主键和唯一索引的表,复制可以正常进行。
修改主服务器端两个提取进程参数,取消对t1表的提取,并在Windows服务程序services.msc中重启两个提取进程GGSEXT1和GGSEXT2的服务。
2、存储过程
主服务器源端创建存储过程
create
or replace procedurehr.test1
is
my_count number;
begin
select count(*) into my_count from employees;
dbms_output.put_line('The number of records
in table EMPLOYEESis ' ||
my_count);
end;
/
检查本地节点目标端存储过程已同步创建,可以看到Oracle自动加入了OGG复制的注释
col text
for a80
select line, text from
user_source where name = 'TEST1';
LINE TEXT
----------
--------------------------------------------------------------------------------
1 procedure "TEST1" is
2 my_count number;
3
begin
4 select count(*) into my_count from
employees;
5 dbms_output.put_line('The number of
records in table EMPLOYEES is ' ||
6 my_count);
7
end;
8
9
10
11
/* GOLDENGATE_DDL_REPLICATION */
主服务器源端更新存储过程
create
or replace procedurehr.test1
is
my_count number;
begin
select count(*) into my_count fromjobs;
dbms_output.put_line('The number of records
in tableJOBSis ' ||
my_count);
end;
/
检查本地节点目标端存储过程已同步更新。
主服务器源端删除存储过程
drop procedure
hr.test1;
检查本地节点目标端存储过程已同步删除。
3、序列
主服务器源端创建序列
create
sequence hr.myid start with 1 increment by 10;
检查本地节点目标端序列已同步创建
col sequence_name for a30
select * from
user_sequences;
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY CYCLE_FLAG ORDER_FLAG
CACHE_SIZE LAST_NUMBER
------------------------------
---------- ---------- ------------ ---------- ---------- ---------- -----------
DEPARTMENTS_SEQ 1 9990 10 N N 0 280
EMPLOYEES_SEQ 1 1E28 1 N N 0 207
LOCATIONS_SEQ 1 9900 100 N N 0 3300
MYID 1 1E28 10 N N 20 1
主服务器源端更新序列
alter sequence
hr.myid increment by 20;
检查本地节点目标端序列已同步更新。
主服务器源端删除序列
drop sequence
hr.myid;
检查本地节点目标端序列已同步删除。
4、同义词
主服务器源端创建同义词
create public
synonym e for hr.employees;
检查本地节点目标端确认public同义词也是可以同步的
col owner for
a10
col
synonym_name for a15
col
table_owner for a10
col table_name
for a15
col db_link for a20
select * from
dba_synonyms where synonym_name='E';
OWNER SYNONYM_NAME TABLE_OWNE TABLE_NAME DB_LINK
----------
--------------- ---------- --------------- --------------------
PUBLIC E HR EMPLOYEES
主服务器源端删除同义词
drop public
synonym e;
检查本地节点目标端同义词已同步删除。
5、触发器
主服务器源端创建测试表
create table
hr.employees2 as select * from hr.employees;
新增表的补充日志
add trandata
hr.employees2
修改提取进程,添加对表employees2的提取
edit param
ext1
添加
table
hr.employees2;
edit param
ext2
添加
table
hr.employees2;
重启主服务器端的两个提取进程。
主服务器源端创建触发器
create or replace trigger
hr.tri1
after insert on hr.employees1
for each row
begin
insert into hr.employees2
(employee_id,
first_name,
last_name,
email,
phone_number,
hire_date,
job_id,
salary,
commission_pct,
manager_id,
department_id)
values
(:new.employee_id,
:new.first_name,
:new.last_name,
:new.email,
:new.phone_number,
:new.hire_date,
:new.job_id,
:new.salary,
:new.commission_pct,
:new.manager_id,
:new.department_id);
end;
/
检查本地节点目标端触发器已同步创建
col text
for a50
select line, text from
user_source where name = 'TRI1';
LINE TEXT
----------
--------------------------------------------------
1 trigger
"HR"."TRI1"
2
after insert on "HR"."EMPLOYEES1"
3
for each row
4 begin
5
insert into hr.employees2
6
(employee_id,
7
first_name,
8
last_name,
9
email,
10
phone_number,
11
hire_date,
12
job_id,
13
salary,
14
commission_pct,
15
manager_id,
16
department_id)
17
values
18
(:new.employee_id,
19
:new.first_name,
20
:new.last_name,
21
:new.email,
22
:new.phone_number,
23
:new.hire_date,
24
:new.job_id,
25
:new.salary,
26
:new.commission_pct,
27
:new.manager_id,
28
:new.department_id);
29 end;
30
/* GOLDENGATE_DDL_REPLICATION */
主服务器源端对表employees1插入数据,测试本地节点目标端的同步效果
insert into employees1
values(1001, 'liu', 'luning', 'liuln', '', sysdate, 'IT_PROG', 0, '', 100, 30);
insert into employees1
values(1002, 'Zhang', 'san', 'zhangs', '', sysdate, 'IT_PROG', 0, '', 100, 60);
commit;
结果主服务器源端表employees2中触发新增了两条记录,本地节点目标端表employees2中同步新增了两条记录,但本地节点目标端表employees1的触发器未执行,否则employees2中应该有重复的记录,employees2表本身是没有主键约束和唯一约束的。
主服务器源端删除触发器
drop trigger
hr.tri1;
检查本地节点目标端触发器已同步删除。
删除主服务器端employees2表,修改主服务器端两个提取进程参数,取消对employees2表的提取,并在Windows服务程序services.msc中重启两个提取进程GGSEXT1和GGSEXT2的服务。
6、类型和函数
主服务器源端创建类型
create
or replace typehr.type1as table of varchar2(255);
创建函数
create
or replace functionhr.f1(v_str
varchar2, v_sep varchar2 := ',')
return type1
pipelined is
my_idx
pls_integer;
my_list varchar2(32767) := v_str;
begin
loop
my_idx := instr(my_list, v_sep);
if my_idx > 0 then
pipe row(substr(my_list, 1, my_idx - 1));
my_list := substr(my_list, my_idx +
length(v_sep));
else
pipe row(my_list);
exit;
end if;
end loop;
return;
end;
/
检查本地节点目标端类型和函数已同步
col text
for a50
select line, text from
user_source where name = 'TYPE1';
LINE TEXT
----------
--------------------------------------------------
1 type "TYPE1" as table of
varchar2(255);
2
3
/* GOLDENGATE_DDL_REPLICATION */
col text for
a80
select line, text from
user_source where name = 'F1';
LINE TEXT
----------
--------------------------------------------------------------------------------
1 function "F1"(v_str varchar2, v_sep
varchar2 := ',')
2
return type1
3
pipelined is
4
my_idx
pls_integer;
5
my_list varchar2(32767) := v_str;
6
begin
7
loop
8
my_idx := instr(my_list, v_sep);
9
if my_idx > 0 then
10
pipe row(substr(my_list, 1, my_idx - 1));
11
my_list := substr(my_list, my_idx +
length(v_sep));
12
else
13
pipe row(my_list);
14
exit;
15
end if;
16
end loop;
17
return;
18
end;
19
20
/* GOLDENGATE_DDL_REPLICATION */
主服务器源端删除类型和函数
drop type
hr.type1;
drop function
hr.f1;
检查本地节点目标端类型和函数已同步删除。
7、视图及权限的测试
主服务器源端创建视图,需要给hr用户授权
conn / as
sysdba
grant create
view to hr;
conn hr/hr
create or
replace view v1 as select * from employees1;
检查本地节点目标端视图已同步
col text for
a80
select
view_name, text from user_views where view_name = 'V1';
VIEW_NAME TEXT
------------------------------
--------------------------------------------------------------------------------
V1 select
"EMPLOYEE_ID","FIRST_NAME","LAST_NAME","EMAIL","PHONE_NUMBER","HIRE_DATE"
,"JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID","DEPARTMENT_ID"
from employees1
/*
GOLDENGATE_DDL_REPLICATION */
此时发现已可以在本地节点目标端创建视图,表明权限的授予也是同步复制的
create
or replace view v2 as select * from employees1;
主服务器源端删除视图
drop view v1;
检查本地节点目标端视图已同步删除。
主服务器源端收回权限
conn / as
sysdba
revoke create
view from hr;
本地节点目标端试图再次创建视图,报权限不足
create
or replace view v3as select *
from employees1;
本地节点目标端清理单独创建的视图
drop view v2;
这也表明,在符合逻辑的情况下,对目标端的直接操作不会破坏OGG的复制机制。
8、连接断开的测试
1)测试主服务器断开的情况
关闭主服务器目标端机器,之后可以看到本地节点源端传播进程已经异常终止。
本地节点1源端向表中插入数据
insert
into scott.emp1values('1001',
'zhang', 'clerk', '7902',
sysdate, 1000, '', '20');
commit;
本地节点2源端向表中插入数据
insert
into scott.emp1values('1002', 'wang', 'clerk', '7902', sysdate, 1000, '', '20');
commit;
两个本地节点源端都做三次日志切换,将数据全部归档掉
alter system
switch logfile;
alter system
switch logfile;
alter system
switch logfile;
开启主服务器目标端机器,之后检查各进程恢复正常,目标端数据已同步。
两个本地节点源端删除插入的数据,验证主服务器目标端数据被同步删除。
2)测试本地节点断开的情况
关闭一个本地节点目标端机器,之后可以看到主服务器源端对应的传播进程已经异常终止。
主服务器端创建表
create table
hr.t1 as select * from employees;
修改主服务器源端的两个提取进程参数,添加对表t1的提取
edit param
ext1
添加
table hr.t1;
edit param
ext2
添加
table hr.t1;
在Windows服务程序services.msc中重启两个提取进程GGSEXT1和GGSEXT2的服务。
主服务器源端插入数据
insert
intot1 values(1001, 'liu',
'luning', 'liuln', '', sysdate, 'IT_PROG', 0, '', 100, 30);
insert
intot1 values(1002, 'Zhang',
'san', 'zhangs', '', sysdate, 'IT_PROG', 0, '', 100, 60);
commit;
做三次日志切换,将数据全部归档掉
alter system
switch logfile;
alter system
switch logfile;
alter system
switch logfile;
开启关闭的本地节点,之后检查各进程恢复正常,目标端数据已同步。
主服务器源端删除测试表t1,检查本地节点目标端已同步删除。
修改主服务器源端的两个提取进程参数,取消对表t1的提取。
在Windows服务程序services.msc中重启两个提取进程GGSEXT1和GGSEXT2的服务。
七、参数说明
管理进程参数:
定义动态端口,可以指定最大256个可用端口的动态列表,当指定的端口不可用时,管理进程会从列表中选择一个可用的端口
dynamicportlist 7840-7939
自动启动所有进程
autostart er *
每5分钟尝试重新启动所有进程,共尝试3次,以后每60分钟清零,再按照每5分钟尝试一次共试3次
autorestart er *, retries
3, waitminutes 5, resetminutes 60
定期清理trail文件,超过3天的trail自动删除,但要满足检查点要求,不能删除未处理的队列
purgeoldextracts
c:\ogg\dirdat\*,usecheckpoints,
minkeepdays 3
定义数据延迟的预警机制,mgr进程每隔1小时检查extract的延迟情况,如果延迟超过了30分钟,就把延迟作为信息记录到错误日志中,如果延迟超过了45分钟,则把它作为警告写到错误日志中
lagreporthours 1
laginfominutes 30
lagcriticalminutes 45
提取/传输进程参数:
定义需要排除的表,如果在table参数中使用了通配符,可以使用该参数指定排除掉的表
tableexcludescott.e*;
是否复制update操作,缺省复制
getupdates|ignoreupdates
是否复制delete操作,缺省复制
getdeletes|ignoredeletes
是否复制insert操作,缺省复制
getinserts|ignoreinserts
是否复制truncate操作,缺省复制
gettruncates|ignoretrundates
在extract进程运行时首先运行一个SQL语句
qlexec
复制进程参数:
定义需要排除的表,如果在table参数中使用了通配符,可以使用该参数指定排除掉的表
tableexcludescott.e*;
用于使用在map中使用*匹配时排除掉指定的表
mapexclude
在replicat进程运行时首先运行一个SQL语句
qlexec
八、常见运维处理
1、在c:\ogg\dirrpt里记录了各个进程的运行报告(.rpt)和废弃文件(.dsc)信息,进程启动失败时可以查看,也可以通过OGG控制台命令查看报告
view
report
进程的信息也可以通过info、status、stats等命令来查看
info mgr
info ext1
detail
status ext1
stats ext1
也可以查看OGG安装目录下的ggserr.log,获取OGG日志信息。
2、进程的停止
stop
如遇到源库不能把数据传送到备库,不能停止传送进程的情况,可强行停止进程
send
extract, forcestop
3、进程的删除
删除进程需要登录到数据库
dblogin
userid ogg password oggmes01
delete
4、在确定重新从某个时间点开始提取和复制时需要修改进程的复制点
修改提取进程的提取开始时间
alter,tranlog,begin
2018-03-09 10:00:00
如果是从现在开始提取
alter,tranlog,beginnow
可以根据scn号重新启动复制进程
如查找当前scn号
select
dbms_flashback.get_system_change_number from dual;
重启复制进程
start replicat rep1,
aftercsn
5、因源端和目标端存在某些不一致,如源端更新或删除操作的表在目标端不存在导致的目标端复制进程终止,可考虑重新设定复制起始点
目标端:
停止复制进程
stop
重设复制起始点
alter
begin now
重启复制进程
start
6、必要时可删除进程并重建。