ITPub博客

首页 > 数据库 > Oracle > ExpertOracleGoldenGate - BasicReplication (1)

ExpertOracleGoldenGate - BasicReplication (1)

翻译 Oracle 作者:SnowDBA 时间:2014-11-06 22:47:20 0 删除 编辑
第三篇 基础复制

文章出处来自Expert Oracle GoldenGate。本人英语水平有限,按照自己对OGG的理解和书面表达的含义写下了这篇博客,为自己的学习之路做个纪念。由于本篇内容较多,今天先放出第一部分。


本篇提供了一个易于理解的GoldenGate基础复制,包括一个复制human resources schema的范例。我们能看到如何安装、启动、确认基础复制的配置,包括初始化数据加载进程。无论该范例是运行在Linux在的Oracle还是运行在Windows上的SQL Server2008, GlodenGate的命令和概念适用于所有平台。

预览

这一篇覆盖了安装、配置GoldenGate基本单向复制。为了持续同步变化还添加了local Extract, data-pump Extract和Replicat。更多的高级配置以后的篇章中介绍。

Prerequisites for Setting Up Replication
安装Relication的基础条件

开始安装replication之前我们需要具备下面的基础条件
  • 在源端和目标端安装GoldenGate软件的安装
  • 在源端和目标端创建数据库user ID
  • 目标端数据库服务器配置了正确的服务器名或IP地址
  • 源端和目标端的GoldenGate管理进程(manager)已经启动并处于运行状态(running)
  • TCP/IP网络可以连接源端服务器到目标端服务器的GoldenGate管理进程端口。
  • 数据通行(Data currency):数据多久会被更新?允许数据复制的延时是多久?如果不允许有延时或者数据变化量很大时,我们需要多花些时间来专门设计和调优复制期间出现的延时。记住数据更新频率和系统能容忍的延时,还有目标数据库的时间不需要完全的同源端一致。
  • 数据量:有多少数据需要被复制?数据更新的频率?从源端的数据库事务日志文件中可以研究出源数据的变化量。数据变化量将直接影响到源端与目标端的网络带宽和磁盘空间。
  • trail文件
  • 数据需求:我们应该明白任何独有的活着特殊的数据需求,使它们能够在GoldenGate中正确处理。比如在目标端需要禁用一些触发器(trigger)。如果序列(sequences)需要复制就需要为它们添加特殊的参数。某些数据类型可能经过特殊处理也无法支持。比如在GoldenGate 11中BFILE和ANYDATA就不支持。有些其他类型的数据能被支持,但是会收到限制。一定要在GoldenGate产品文档中查看并确认使用的数据类型是否被支持。
  • 安全需求:复制过程中有多少安全性的要求?复制数据是否加密?GoldenGate在数据保存到trail文件和从源端发送到目标端的过程都可以加密。是否需要为数据库中的数据加密?数据库数据的加密方法叫做TDE(Transparent Data Encryption),如果使用该功能需要为replication定义特殊的解密数据。
  • 网络需求:replication需要防火墙开启那些端口?源端到目标端的距离有多远? 处理这些数据量需要多少带宽,有多少带宽是可用的?

Table 4-1 描述了本章所需的环境。其中部分设置是Windows下SQL Server数据库环境使用的。记住,GoldenGate支持源端和目标端采用不同类型的数据库。



源端和目标端使用的Human Resources或者HR都来自于Oracle安装时自带的范例。下面的列表就是来自范例中HR模式(也可以理解为用户)里的Employees表。
SQL> desc employees;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPLOYEE_ID                               NOT NULL NUMBER(6)
 FIRST_NAME                                         VARCHAR2(20)
 LAST_NAME                                 NOT NULL VARCHAR2(25)
 EMAIL                                     NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                       VARCHAR2(20)
 HIRE_DATE                                 NOT NULL DATE
 JOB_ID                                    NOT NULL VARCHAR2(10)
 SALARY                                             NUMBER(8,2)
 COMMISSION_PCT                                     NUMBER(2,2)
 MANAGER_ID                                         NUMBER(6)
 DEPARTMENT_ID                                      NUMBER(4)

单项复制拓扑结构

这一篇我们采用的拓扑结构是单项复制,如下图所示。上一篇博客中提到的最简单的单项复制拓扑结构常用来做报表查询或卸载数据。只有源端数据库产生数据变化,然后在目标端上复制。




基本的复制步骤

当具备了所有先决条件后,建立基本的单项复制需要4个步骤,如同下图描述的那样。这些步骤包含了初始化数据后的同步工作。稍后介绍每一步的详细内容。



下面来描述图中的各个步骤

1. 开始抽取。配置并启动抽取进程来捕获数据库变化,并且将这些变化写入源端队列(source trail)

2. 开始投递。配置和启动投递进程,将源source trail中捕获到的数据库变化通过网络发送到目标数据库所在服务器,然后将变化写入目标端队列(remote trail)

3. 执行数据初始化加载。可以采用Goldengate或者其他工具。目的是使目标端数据库适时同步源端数据库之前,保持数据一致。推荐使用exp/imp或者RMAN

4. 开始复制。配置和启动复制进程开始应用远端队列(remote trail)中的变化,直到两边数据同步。


从抽取进程开始,让我们看看每一个步骤的细节

抽取进程

当我们确认前提条件都已经具备就可以开始进行复制操作的第一步,启动Extract。


本节介绍了多种Extract的配置选项,在这之后会看到怎样启动Extract并确认可以它可以正确的获取变化。


确认开启了数据库级别“补充日志”(supplemental logging)


当开始从数据库复制之前,需要保证源端数据库开启了数据库级补充日志(supplemental logging)。如果是双向复制就需要在源端和目标端都开启补充日志。追加日志提供为Goldengate提供了redo log的补充信息。


使用下面的SQLPLUS命令来去人Oracle数据库是否已经开启了补充日志模式:

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

SUPPLEMENTAL_LOG_DATA_MIN
-------------------------
NO

如果上面的输出结果是NO,可以使用下面的命令开启补充日志模式:

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

再次确认结果

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

SUPPLEMENTAL_LOG_DATA_MIN
————————————

YES

记住,Oracle9i中SUPPLEMENTAL_LOG_DATA参数必须为YES,Oracle10g以后SUPPLEMENTAL_LOG_DATA参数必须为YES或是IMPLICIT


开启表级补充日志

通常情况下,数据库所记录的日志信息不能完全满足Goldengate复制目标数据库的需求。数据产生变化时OGG还需要一个键值将变化应用到目标数据库时。添加补充日志到源端数据库表,确保在目标端可以正确的应用更新操作。

可以使用GoldenGate ADD TRANDATA命令强制为源端数据库的更新操作记录一个主键列。在单向复制中,不需要在目标端数据库开启补充日志。在Goldengate命令接口GGSCI中输入下列命令来开启补充日志

GGSCI (sourceserver) 1> dblogin userid gger password userpw
Successfully logged into database.

GGSCI (sourceserver) 2> add trandata hr.employees
Logging of supplemental redo data enabled for table HR.EMPLOYEES.

DBLOGIN命令为OGG管理用户建立了一个数据库连接。ADD TRANDATA命令使数据库为HR.EMPLOYEES表的所有更新操作记录了一个主键列。

可以使用下面的查询语句来验证补充日志是否添加成功

SQL> select owner, log_group_name, table_name
    from dba_log_groups where owner = 'HR';

OWNER  LOG_GROUP_NAME      TABLE_NAME
-----  -------------------  ----------
HR    GGS_EMPLOYEES_19387  EMPLOYEES

如果数据库中有很多表都需要添加补充日志,可以使用SQL脚本来生成ADD TRANDATA命令

set echo off
set verify off
set pagesize 2000
set linesize 250
set trim on
set heading off
set feedback off

spool &&SCHEMA..add_trandata.obey

select 'add trandata &SCHEMA..'||table_name
  from dba_tables where owner = '&SCHEMA' ;

spool off


前面的脚本生成了一个Oracle spool文件,以后可以在GGSCI使用OBEY命令来执行它。

GGSCI (sourceserver) 1> dblogin userid gger password userpw
Successfully logged into database.

GGSCI (sourceserver) 2> obey diroby/HR.add_trandata.obey


ADD TRANDATA命令执行过一次之后,使用下面的SQLPLUS命令来验证是否生效

SQL> select owner, log_group_name, table_name
    from dba_log_groups where owner = 'HR';

OWNER  LOG_GROUP_NAME        TABLE_NAME
-----  ---------------------  -----------
HR    GGS_REGIONS_19375      REGIONS
HR    GGS_COUNTRIES_19377    COUNTRIES

HR    GGS_LOCATIONS_19379    LOCATIONS
HR    GGS_DEPARTMENTS_19382  DEPARTMENTS
HR    GGS_JOBS_19385         JOBS
HR    GGS_EMPLOYEES_19387    EMPLOYEES
HR    GGS_JOB_HISTORY_19391  JOB_HISTORY


下面的步骤是禁用所有的触发器或者级联删除约束。

禁用触发器和级联删除约束

我们需要禁用目标端表上的所有数据库触发器或者级联删除完整性约束。以为我们已经从源端复制了触发器和级联删除所产生的数据,而目标端也应用了这些变化。如果不禁用它们,会再次触发其操作,导致数据错误。

禁用触发器和级联删除约束有以下方法。第一种方法是针对高版本的数据库,在Replicat配置文件中添加一个参数。第二种方法是使用脚本来禁用它们。

从Goldengate 11版本之后,Replicat配置文件中的DBOPTIONS参数多了一个新的选项SUPPRESSTRIGGERS,可以自动的阻止触发器。该参数需要数据库的版本是10.2.0.5或者11.2.0.2以上。如果使用的时Oracle9.2.0.7版本数据库,可以使用DBOPTIONS参数配合DEFERREFCONST选项来延缓完成性验证,指导Replicat提交事务。

当然也可以是用SQL脚本来禁用触发器和级联删除约束。从数据中动态的生成该脚本既快速又准确。

set echo off
set verify off
set pagesize 2000
set linesize 250
set trim on
set heading off
set feedback off

spool &&SCHEMA..disable_cascade_delete_constraints.sql

select 'alter table '||owner||'.'||table_name||
' disable constraint '||constraint_name||';'
from all_constraints
where delete_rule = 'CASCADE'

and owner = '&SCHEMA';


spool off
spool &SCHEMA..disable_triggers.sql

select 'alter trigger '||owner||'.'||trigger_name||
' disable ;'
from all_triggers
where owner = '&SCHEMA';

spool off
spool &SCHEMA..enable_cascade_delete_constraints.sql

select 'alter table '||owner||'.'||table_name||
' enable constraint '||constraint_name||';'
from all_constraints
where delete_rule = 'CASCADE'

and owner = '&SCHEMA';
spool off
spool &SCHEMA..enable_triggers.sql

select 'alter trigger '||owner||'.'||trigger_name||
' enable;'
from all_triggers
where owner = '&SCHEMA';

spool off


脚本生成了4个spool文件,可以在SQLPLUS中执行该脚本来禁用触发器和级联删除约束


未完待续...




















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

下一篇: 升级会搞定么?
请登录后发表评论 登录
全部评论

注册时间:2014-06-21

  • 博文量
    223
  • 访问量
    1633600