创建ogg文件 c语言,OGG双向条件复制的部署与测试

一、部署环境说明

设计需求:

本地有两个节点,节点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、必要时可删除进程并重建。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值