ITPub博客

首页 > 数据库 > Oracle > oracle goldengate 配置DML&DDL实验

oracle goldengate 配置DML&DDL实验

Oracle 作者:湖湘文化 时间:2013-12-18 14:17:29 0 删除 编辑
 

Oracle Goldengate

关于DML与DDL复制模拟环境搭建

1.      Read Me

此文档的内容为搭建Oracle Goldengate(OGG)的DML复制、以及DDL复制。从生产端到容灾端的配置(主到从)。主要模拟的是生产端正常工作,容灾端作为灾备库;当生产端出现问题后,应用切换至容灾端,并由容灾端数据库接管业务;在生产端恢复后,将数据从容灾端重新通过OGG同步到生产端的一个过程。文档中并没有双向配置的描述,相信大家了解这些配置过程之后,参考Admin文档实现双向复制应该问题不大。此文档为实验性质的文档,肯定存在一些不足,欢迎大家批评指正。

2.      实验环境以及OGG架构介绍:

平台:Red Hat 5.4 (32bit)

数据库版本: Oracle 10GR2(10.2.0.1)

OGG version: 11.1.1.0.0

OGG实现原理是通过对生产端数据库中redo log或者archive log的内容进行抽取、投递、复制,使生产端数据库实现同容灾端数据库的数据同步。以下是OGG的技术架构:

OGG相关进程介绍:

序号

进程名

说明

1

Manager

Goldengate软件的管理进程,用于管理生产端或者容灾端OGG相关进程。以下简称为MGR。

2

Extract

GoldenGate软件的抽取进程,又叫Capture进程,一般用于抽取数据库日志抓取数据变化或将本地队列中数据传递到目标端。以下简称为ext_ylqa。

3

Replicat

GoldenGate软件的投递进程,又称为Delivery进程,用于将队列文件中的数据变化转换为sql应用到目标库。以下简称为repylqa。

4

Data Pump

专指将本地队列中数据传递到目标端的Extract进程,区别于读取日志的主Extract进程。以下简称为dpylqa。

● Primary Extract: The primary Extract process captures data and DDL from the database

source.

● Data pump: The data pump is a secondary Extract process that reads captured data from

a local trail on the source system and sends it over the network to the target. The data

pump adds storage flexibility and isolates the primary Extract process from TCP/IP

activity. For an illustration of how a data pump fits into the capture configuration, see

Figure 1 on page 38.

● Replicat: The Replicat process reads a remote trail and applies the transactional

changes to the target database.

3.      生产端数据库环境准备

3.1 创建ggate用户以及表空间

-- Create tablespace

SQL>  create tablespace ggs datafile '/home/app/oradata/node1/ggs01.dbf' size 50m;

-- Create the user

CREATE USER ggate IDENTIFIED BY ggate default tablespace ggs temporary tablespace temp quota unlimited on ggs ;

-- Grant/Revoke role privileges

grant resource,connect,dba to ggate;

3.2   查看归档信息

生产端需要是归档模式

--查看是否归档

Archive log list;

--修改归档模式

shutdown immediate

startup mount;

alter database archivelog;

alter database open;

3.3 配置oracle环境变量

在oracle环境变量中添加以下内容(如果不添加,将无法启动通过./ggsci启动ggsci界面):

export OGG_HOME=/home/oracle/ggate

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$OGG_HOME:$LD_LIBRARY_PATH

3.4 开启数据库附件日志

检查附件日志情况

select

SUPPLEMENTAL_LOG_DATA_MIN

,SUPPLEMENTAL_LOG_DATA_PK

,SUPPLEMENTAL_LOG_DATA_UI

,SUPPLEMENTAL_LOG_DATA_FK

,SUPPLEMENTAL_LOG_DATA_ALL from v$database;

开启数据库附件日志

alter database add supplemental log data;

alter database add supplemental log data (primary key, unique,foreign key) columns;

alter system switch logfile;

--回退

alter database drop supplemental log data (primary key, unique,foreign key) columns;

alter database drop supplemental log data;

3.5 开启数据库强制日志模式

alter database force logging;

3.6 生产端OGG软件安装

上传安装介质到生产端服务器,并解压:

(本次试验将OGG的安装目录放在/home/oracle/ggate下)

--安装软件

cd /home/oracle/ggate

tar zxvf *.gz

--创建子目录

在/home/oracle/ggate目录下,运行以下命令:  --如果没有修改oracle环境变量,会在此步骤报错

./ggsci

--在GGSCI命令行为复制表添加transdata

(Enabling schema-level supplemental logging)

DBLOGIN USERID ggate, PASSWORD ggate

ADD TRANDATA SCOTT.*   

--在sqlplus下查看是否完整添加

select table_name from all_tables where owner='SCOTT' and table_name not in (select distinct table_name from dba_log_group_columns where owner='SCOTT');

4.      生产端OGG进程配置

4.1 配置GLOBALS参数

GGSCI>EDIT PARAMS ./GLOBALS

GGSCHEMA ggate—指定进行DDL复制的数据库用户,DML可不配置

CHECKPOINTTABLE ggate.oggchkpt

4.2   配置MGR进程

GGSCI>edit params mgr

PORT 7839

DYNAMICPORTLIST  7840-7849

--AUTOSTART EXTRACT *

--AUTORESTART EXTRACT *, RETRIES 5, WAITMINUTES 7

PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7

LAGREPORTHOURS 1

LAGINFOMINUTES 30

LAGCRITICALMINUTES 45

以下两句用于DDL,单独配置DML时,可不添加

PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7

PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7

4.3   配置ext_scot进程(OGG抽取进程)

GGSCI> edit params ext_scot

EXTRACT ext_scot

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

DBOPTIONS   ALLOWUNUSEDCOLUMN

USERID ggate, PASSWORD ggate

--GETTRUNCATES这个参数可以在开启DDL复制时注销掉

REPORTCOUNT EVERY 1 MINUTES, RATE

NUMFILES 5000

DISCARDFILE ./dirrpt/ext_scot.dsc, APPEND, MEGABYTES 100

DISCARDROLLOVER AT 2:00

WARNLONGTRANS 2h, CHECKINTERVAL 3m

EXTTRAIL ./dirdat/ga, MEGABYTES 200

DYNAMICRESOLUTION

TRANLOGOPTIONS CONVERTUCS2CLOBS

TRANLOGOPTIONS RAWDEVICEOFFSET 0

以下部分是DDL的配置,DML复制可以不配置

-----------------------------------------

DDL &

INCLUDE MAPPED OBJTYPE 'table' &

INCLUDE MAPPED OBJTYPE 'index' &

EXCLUDE OPTYPE COMMENT

DDLOPTIONS  NOCROSSRENAME  REPORT

------------------------------------------------------

TABLE      SCOTT.* ;

4.4 配置dpescot进程

GGSCI>edit params dpescot

EXTRACT dpescot

RMTHOST 192.168.150.129, MGRPORT 7839, COMPRESS

PASSTHRU

NUMFILES 5000

RMTTRAIL ./dirdat/ga

DYNAMICRESOLUTION

TABLE      SCOTT.* ;

注:配置文件中的IP是目标端,也就是容灾端的IP。

4.4   配置repscob进程

(此进程用于主从切换,即原来的生产端变成目标端,原来的目标端变成生产端)

GGSCI>edit params repscob

REPLICAT repscob

SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

USERID ggate, PASSWORD ggate

REPORT AT 00:59

REPORTCOUNT EVERY 1 MINUTES, RATE

REPORTROLLOVER AT 02:00

REPERROR DEFAULT, ABEND

NUMFILES 5000

GROUPTRANSOPS 10000

--HANDLECOLLISIONS

ASSUMETARGETDEFS

DISCARDFILE ./dirrpt/repylqb.dsc, APPEND, MEGABYTES 200

DISCARDROLLOVER AT 02:00

GETTRUNCATES

ALLOWNOOPUPDATES

以下部分是DDL的配置,DML复制可以不配置

-----------------------------------------

DDL include mapped

DDLOPTIONS report

-----------------------------------------

MAP SCOTT.*, TARGET  SCOTT.*;

4.5  建立OGG的DDL对象

进入OGG安装目录下

cd /home/oracle/ggate

sqlplus "/ as sysdba"

SQL> @marker_setup.sql

Enter GoldenGate schema name:ggate

SQL> @ddl_setup.sql

Enter GoldenGate schema name:ggate

SQL> @role_setup.sql

Grant this role to each user assigned to the Extract, Replicat, GGSCI, and Manager processes, by using the following SQL command:

GRANT GGS_GGSUSER_ROLE TO

where is the user assigned to the GoldenGate processes.

手动执行以上授权SQL

GRANT GGS_GGSUSER_ROLE TO ggate;

启动DDL触发器(在OGG安装目录下)

SQL>@ddl_enable.sql

4.6  安装性能提升工具

为了提供OGG的DDL复制的性能,可以将ddl_pin脚本加入到数据库启动的脚本后面,该脚本需要带一个OGG的DDL用户(即安装DDL对象的用户,本例中是ggate)的参数(安装过程中,会提示安装dbms_shared_pool系统包,需要运行$ORACLE_HOME/rdbms/admin/dbmspool.sql)

SQL> @ddl_pin ggate

4.7  添加抽取/投递进程与队列文件

GGSCI> ADD EXTRACT ext_scot,tranlog,begin now

GGSCI> ADD EXTTRAIL ./dirdat/ga, EXTRACT ext_scot, megabytes 100

GGSCI> ADD EXTRACT dpescot, EXTTRAILSOURCE ./dirdat/ga

GGSCI> ADD RMTTRAIL ./dirdat/ga, EXTRACT dpescot, MEGABYTES 100

注:这个需要关注的是,配置并未添加之前配置的repscob进程。

4.8  启动MGR进程

GGSCI> start mgr

4.9  启动ext_scot进程(抽取进程)

GGSCI> start extract ext_scot

记录启动extract进程的时间

可以通过以下方式,获取当前启动extract进程的时间,例如“2012-04-24 10:20:55”

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

======================以下初始化过程由数据泵来实现=================

5.      灾备端数据库的数据初始化

灾备端数据库的数据初始化主要目标是,通过生产端数据库的全库备份,恢复数据库至灾备端。主要采用RMAN备份恢复的方式来初始化数据库。

通过RMAN备份全库之前,需要查看生产端数据库中所有事务的start时间是否晚于启动extract的时间。

可以通过以下的步骤查看生产端数据库中事务start时间

SQL>select  start_time  from v$transaction where to_date(start_time, 'yyyy-mm-dd hh24:mi:ss')

注:只有当所有事务的start时间晚于extract启动的时间,才能进行全库备份。

使用oracle用户登录,通过RMAN进行全库备份

--备份数据库:

$ rman target /

rman> run {

ALLOCATE CHANNEL ch00 TYPE DISK;

ALLOCATE CHANNEL ch01 TYPE DISK;

CROSSCHECK BACKUPSET;

DELETE NOPROMPT EXPIRED BACKUPSET;

sql 'alter system archive log current';

BACKUP AS BACKUPSET SKIP INACCESSIBLE;

TAG hot_db_bk_level0 FORMAT '/rmanbak/ogg/full_%s_%p_%t';

FULL DATABASE;

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

--备份归档日志以及控制文件

run {

ALLOCATE CHANNEL ch00 TYPE DISK;

ALLOCATE CHANNEL ch01 TYPE DISK;

sql 'alter system switch logfile';

sql 'alter system switch logfile';

sql 'alter system switch logfile';

sql 'alter system archive log current';

BACKUP ARCHIVELOG ALL FORMAT '/rmanbak/ogg/ARCH_%U';

BACKUP CURRENT CONTROLFILE FORMAT /rmanbak/ogg/bk_controlfile';

RELEASE CHANNEL ch00;

RELEASE CHANNEL ch01;

}

注:这里要保证最后备份控制文件。

--查看备份集,通过以下命令找到最近备份的归档LOW SCN

$ rman target /

RMAN> list backup;

注:记录此SCN,在恢复的时候需要用到这个SCN

使用oracle用户登录灾备端执行恢复操作

在灾备端创建相同的目录结构,并正确设置:ORACLE_BASE,ORACLE_HOME,ORACLE_SID等环境变量。

拷贝生产端数据库init{ORACLE_SID}.ora文件到目标机,将参数job_queue_processes设置为0。

生成口令文件或者复制生产端数据库口令文件到灾备端。

启动数据库nomount状态

$ rman target /

RMAN> startup nomount;

恢复控制文件

RMAN> restore controlfile from ‘/rmanbak/ogg/bk_controlfile’;

启动数据库到mount状态

RMAN> alter database mount;

恢复数据库

RMAN> crosscheck backup;

RMAN> restore database;

RMAN> run {

set UNTIL SCN ***;   --该SCN为第二步中得到的SCN号

recover database;

}

查询灾备端数据库SCN号(在启动灾备端复制进程时,需要该SCN)

SQL> SELECT CHECKPOINT_CHANGE#,CHECKPOINT_TIME FROM V$DATAFILE_HEADER;

灾备端打开数据库

Alter database open resetlogs;

至此,容灾端数据库已经恢复出来。总结一下原理就是根据SCN将容灾端数据库恢复到生产库的一个时间点。

=====================================================================

6.      灾备端数据库相关参数配置

6.1 检查Goldengate用户信息

一般情况下,通过RMAN恢复出来的库中已经存在ggate用户,如果不存在重新创建该用户,参考生产端创建ggate用户脚本。

6.2   关闭归档模式

archive log list;

shutdown immediate;

startup mount;

alter database noarchivelog;

atler database open;

6.3  关闭数据库强制日志模式

alter database no force logging;

6.4 禁用灾备端数据库触发器

declare

v_sql varchar2(2000);

CURSOR c_trigger IS SELECT 'alter trigger '||owner||'.'||trigger_name||' disable' from dba_triggers where owner='SCOTT';

BEGIN

OPEN c_trigger;

LOOP

FETCH c_trigger INTO v_sql;

EXIT WHEN c_trigger%NOTFOUND;

execute immediate v_sql;

end loop;

close c_trigger;

end;

/

--检查是否全部禁用

select owner||'.'||trigger_name,status from dba_triggers where owner='SCOTT' and STATUS='ENABLED';

6.5  禁用外键

declare

v_sql varchar2(2000);

CURSOR c_trigger IS SELECT 'alter table '||owner||'.'||table_name||' disable constraint '||constraint_name from dba_constraints where constraint_type='R' and owner='SCOTT';

BEGIN

OPEN c_trigger;

LOOP

FETCH c_trigger INTO v_sql;

EXIT WHEN c_trigger%NOTFOUND;

execute immediate v_sql;

end loop;

close c_trigger;

end;

/

--查看结果

select status, owner||'.'||table_name from dba_constraints where owner='SCOTT' and status='ENABLED' and  constraint_type='R';

6.6 禁用灾备端JOB

在灾备端数据库恢复前,在pfile文件中修改参数job_queue_processes为0,默认值为10。

alter system set job_queue_processes=0 scope=both;

job_queue_processes 0

6.7 配置灾备端oracle用户环境变量

参考生产端oracle环境变量

6.8 安装OGG软件

参考生产端OGG软件的安装,在这建立生产端和容灾端安装OGG软件的家目录一致。

a.      解压文件

b.      创建子目录

c.       卸载DDL配置(这一步跟生产端不一致)

在灾备端的OGG安装目录下执行以下脚本:

SQL>@ddl_disable.sql

SQL>@ddl_remove.sql

SQL>@marker_remove.sql

注:在执行上述脚本的时候,会提示输入安装时所指定的schema名称(这里实验是ggate)。

7.      灾备端OGG相关进程配置

7.1  配置GLOBALS

GGSCI> EDIT PARAMS ./GLOBALS

GGSCHEMA ggate

CHECKPOINTTABLE ggate.oggchkpt

--添加检查表

GGSCI> DBLOGIN USERID ggate, PASSWORD ggate

GGSCI> ADD CHECKPOINTTABLE ggate.oggchkpt

7.2 配置MGR进程

PORT 7839

DYNAMICPORTLIST 7840-7849

--AUTOSTART REPLICAT *

--AUTORESTART REPLICAT *, RETRIES 5, WAITMINUTES 1

PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7

LAGREPORTHOURS 1

LAGINFOMINUTES 30

LAGCRITICALMINUTES 45

注:在DDL复制中,目标端的MGR进程,不需要配置DDL参数。

7.3 配置repscot进程

REPLICAT repscot

SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

USERID ggate, PASSWORD ggate

REPORT AT 00:59

REPORTCOUNT EVERY 1 MINUTES, RATE

REPORTROLLOVER AT 02:00

REPERROR DEFAULT, ABEND

NUMFILES 5000

GROUPTRANSOPS 10000

ASSUMETARGETDEFS

DISCARDFILE ./dirrpt/repscot.dsc, APPEND, MEGABYTES 200

DISCARDROLLOVER AT 02:00

ALLOWNOOPUPDATES

--------------------------------------DDL专用-----------

DDL include mapped

DDLOPTIONS report

----------------------------------

MAP SCOTT.*, TARGET  SCOTT.*;

7.4 配置ext_scob进程(主从切换时使用)

EXTRACT ext_scob

SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")

DBOPTIONS   ALLOWUNUSEDCOLUMN

USERID ggate, PASSWORD ggate

GETTRUNCATES

REPORTCOUNT EVERY 1 MINUTES, RATE

NUMFILES 5000

DISCARDFILE ./dirrpt/ext_scob.dsc, APPEND, MEGABYTES 100

DISCARDROLLOVER AT 2:00

WARNLONGTRANS 2h, CHECKINTERVAL 3m

EXTTRAIL ./dirdat/et, MEGABYTES 200

DYNAMICRESOLUTION

TRANLOGOPTIONS CONVERTUCS2CLOBS

TRANLOGOPTIONS  EXCLUDEUSER ggate

DDL &

INCLUDE MAPPED OBJTYPE 'table' &

INCLUDE MAPPED OBJTYPE 'index' &

EXCLUDE OPTYPE COMMENT

DDLOPTIONS  NOCROSSRENAME  REPORT

TABLE      SCOTT.* ;

7.5 配置dpescob进程(主从切换时使用)

EXTRACT dpescob

RMTHOST 192.168.150.128, MGRPORT 7839, COMPRESS

PASSTHRU

NUMFILES 5000

RMTTRAIL ./dirdat/et

DYNAMICRESOLUTION

TABLE      SCOTT.* ;

7.6  添加repscot进程

GGSCI> ADD REPLICAT repscot, EXTTRAIL ./dirdat/ga , EXTSEQNO 0, EXTRBA 0 , CHECKPOINTTABLE ggate.oggchkpt

7.7 启动生产端以及灾备端OGG相关进程

启动容灾端MGR进程

GGSCI>start mgr

启动生产端dpescot进程

GGSCI> start ext dpescot

启动灾备端repscot进程

GGSCI>start repscot , at csn ****    --这里的SCN就是恢复出来库的那个SCN,本次实验没有使用SCN

到这,两端的OGG配置完成,可以通过以下命令查看OGG各个进程的状态

cd /goldengate

./ggsci

GGSCI>Info all

可以做些测试,比如在生产端scott用户下,新增或者删除数据,以及创建或者Drop表。

删除、增加、修改、drop、创建都试验成功。

源端:

SQL> delete from scott.emp;

14 rows deleted.

SQL> commit;

Commit complete.

目标端:

SQL> select * from scott.emp

no rows selected

各位,到这如果能成功配置,应该对OGG有了一个初步的了解。至于反向的配置(在从将数据重新同步到生产端,让生产端接管业务),需要几个注意的几点,思路如下:要做反向配置同步时,比如,在现在状态是从生产端到灾备端,突然生产端出现问题。这个时候,需要灾备端接管业务,在使用灾备端的数据库之前,要保证先将之前数据库相关参数修改回来,比如开启归档,开启强制日志等等(如果需要DDL复制,需要建立DDL对象并启动DDL全局触发器),接着将之前的复制关系删除,并且灾备端之前配置的抽取进程ext_scob启动的时间要早于灾备端数据库接管业务的时间,不然OGG无法将修改的数据写进trail文件中。如果没有这些trail文件,那么也无法直接通过OGG进程的配置完成数据同步。灾备端的抽取进程启动后,可以去配置生产端数据库以及OGG参数。

=============================报错=================================

2012-04-24 05:00:00  WARNING OGG-00869  No unique key is defined for table SALGRADE. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.

GG的报错说的很明白了,因为原表没有主键或Unique Index,所以GG自动把原表所有的Column都拿来当主键用,但这样会造成传输上的问题,因此GG在这种模式下,只能支持有限数量的Column表,所以报错,建议对原表增加Unique Index,并推荐使用Keycols参数予以确认

源引:No unique key is defined for table BUSINESSSYSTEMSESSIONNUM5MIN. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21256317/viewspace-1063575/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-05-31

  • 博文量
    109
  • 访问量
    1587941