GlodenGate的数据初始化(原创)

概述

在进行GoldeGate数据同步之前,我们往往需要对数据进行初始化,以获得数据同步的基础点。由于选择数据同步的方法不同,数据初始化的源库既可以是正在进行读写操作的数据库,也可以是对外只读的数据库。数据同步的方法主要有以下几种:

Loading data with a database utility,由数据库工具进行目标端数据的初始化,在oracle平台下,常见的有RMAN,exp/imp和expdp/impdp,该方法无法使用多个GoldenGate进程进行并行数据同步
Loading data from file to Replicat,抽取进程将数据抽取到文件中,再从文件中复制数据到目标数据库,可用于ETL处理。这种方式速度最慢。
Loading data from file to database utility,抽取进程以ASCII格式写入到抽取文件中,再通过数据库工具进行批量导入,导入所需的控制文件由复制进程生成和管理。
Loading data with an Oracle GoldenGate direct load,抽取进程直接通过TCP/IP协议将数据传输给复制进程进行处理,不在需要Collector进程和中间文件。
Loading data with a direct bulk load to SQL*Loader,抽取进程以ASCII格式写入到抽取文件中,再通过SQL*Loader进行批量导入,导入所需的控制文件由复制进程生成和管理。 官方文档中声称这种方式是Oracle数据库之间初始化数据最快的,个人认为,如果是进行全库的初始化,rman速度会更快,如果只是针对个别表或者对 象,该方式应该是最快的。这种方式原理和前面提到的Loading data from file to database utility类似。
Loading data with Teradata load utilities, 用于两个teradata数据库之间进行数据同步,同步的工具为multiLoad

数据同步前的前提

禁用DDL同步

目标表应满足的条件,注意:仅为建议,能提高同步速度和避免错误,非必须: 
数据:确认目标表为空,否则可能导致与以存在数据行发生冲突或报错。
约束:禁用外键约束和检查约束。外键约束容易引起报错,检查约束会减慢同步速度,可以在数据同步成功后重新激活约束
索引:删除目标表的索引,索引并非插入操作所必须的,且会明显的降低导入速度。可以在数据初始化同步成功后另外建立索引

注意:主键索引是db2 for z/OS平台所必须的,故不应删除该平台数据库的主键索引 
在源端和目标端配置manager进程 
在目标端参数文件中加入HANDLECOLLISIONS参数来解决数据冲突,但需要有主键或唯一索引,如果没有主键或唯一索引,则需在table和map参数中使用keycols选项
利用RMAN 初始化数据

架构

RMAN和exp/imp都是利用数据库自带工具copy源端的数据库,然后再建立目标端建立数 据库。在copy数据库的过程中GoldenGate启动一组抽取进程来获取在copy过程中源端数据库的数据变化,copy完成后启动目标端的 replicat进程吧copy数据库过程中的交易再在目标端执行一遍。初始化过程完成后,extract和replicat进程持续运行来保证目标端和 源端数据一致。

RMAN在线初始化是使用RMAN工具备份源端的数据库,然后在目标端恢复数据库到一个SCN, 从这个SCN以后启动REPLICAT进程,所以这种方法不需要冲突处理,在备份和恢复过程中需要启动Extract进场组来获取在backup和 recover过程中的数据变化,目标端恢复完成后启动replicat进程。此后Extract和Replicat持续运行,保证源端和目标端数据一 致。

查看数据库所有事务的开始时间,直到其大于Extract进程的启动时间再开始备份数据库,因为 GoldenGate只获取Extract启动以后的交易变化,在Extract启动之前开始而在Extract启动后完成的交易GoldenGate将 会忽略这些交易,这些被忽略的交数据就会丢失,所以应等数据库所有的交易都在extract启动之后开始时才能开始备份数据。可以通过如下SQL查看交易 开始时间

SQL>select min(start_time) from v$transaction
MIN(START_TIME)
------------------------------------------------------------
07/22/12 10:18:53

关于GoldenGate的安装与配置可以查看笔者的如下文章
http://czmmiao.iteye.com/admin/blogs/1554857

源端GoldenGate配置如下

GGSCI (rac1) 43> view params mgr
port 7500
GGSCI (rac1) 44> view params eora
extract eora
userid ogg,password ogg
exttrail ./dirdat/et
rmthost 192.168.1.112, mgrport 7500
rmttrail ./dirdat/rt
table hr.*;
GGSCI (rac1) 46> info exttrail *
       Extract Trail: ./dirdat/et
             Extract: EORA
               Seqno: 2
                 RBA: 1038
           File Size: 100M
       Extract Trail: ./dirdat/rt
             Extract: EORA
               Seqno: 2
                 RBA: 69000
           File Size: 100M
GGSCI (rac1) 47> info rmttrail *
       Extract Trail: ./dirdat/et
             Extract: EORA
               Seqno: 2
                 RBA: 1038
           File Size: 100M
       Extract Trail: ./dirdat/rt
             Extract: EORA
               Seqno: 2
                 RBA: 69120
           File Size: 100M

用如下匿名包向hr用户下的testgg的每20s插入数据

SQL> grant dba to hr;  
Grant succeeded.

SQL> conn hr/hr;    
Connected.
SQL> create table testgg(id int);
Table created.
SQL> begin 
  2     for i in 1..100000 loop
  3       insert into testgg values(i);
  4       commit;
  5       dbms_lock.sleep(20);
  6     end loop;
  7  end;
  8  /

启动extract进程

GGSCI (rac1) 42> start eora
Sending START request to MANAGER ...
EXTRACT EORA starting

GGSCI (rac1) 45> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
EXTRACT     RUNNING     EORA        00:00:00      00:00:00   

备份源端数据库, 注意,一定要在抽取进程启动后进行数据备份

RMAN> run{
2> backup database format '/home/oracle/full_%U.dbf';
3> sql 'alter system archive log current';
4> backup archivelog all format '/home/oracle/arch_%U.dbf';
5> } 
将备份文件拷贝到目标端

$scp full_0*  192.168.1.112:/home/oracle/
$scp arch_0*  192.168.1.112:/home/oracle 

恢复目标端数据库,这里涉及到了RMAN的异机恢复,不清楚的读者可以参考笔者的如下文章
http://czmmiao.iteye.com/blog/1602553

目标端GoldenGate配置
GGSCI (rac2) 15> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
REPLICAT    STOPPED     PORA        00:00:00      00:00:03    
GGSCI (rac2) 16> view params mgr
port 7500
GGSCI (rac2) 17> view params pora
replicat pora
setenv(ORACLE_SID=orcl)
userid ogg, password ogg
assumetargetdefs

handlecollisions
discardfile ./dirrpt/pora.dsc, purge
map hr.*, target hr.*;

GGSCI (rac2) 147> view params ./GLOBALS

checkpointtable ogg.checkczm

GGSCI (rac2) 149> add checkpointtable ogg.checkczm

Successfully created checkpoint table ggs.checkczm.

GGSCI (rac2) 161> add replicat pora ,exttrail ./dirdat/rt, checkpointtable ogg.checkczm

REPLICAT added.

恢复控制文件

SQL>startup nomount; 

RMAN> restore controlfile from '/home/oracle/full_02ngko20_1_1.dbf';
Starting restore at 21-JUL-12 
......省略若干行......
output filename=/u01/app/oradata/orcl/control03.ctl
Finished restore at 21-JUL-12 
RMAN> sql 'alter database mount';
sql statement: alter database mount
released channel: ORA_DISK_1 
RMAN> run{             
2> allocate channel c1 type disk;
3>  allocate channel c2 type disk;
4> restore database;
5> recover database;
6> }
allocated channel: c1
channel c1: sid=156 devtype=DISK
......省略若干行...... 
channel c1: restore complete, elapsed time: 00:01:15
Finished restore at 21-JUL-12
Starting recover at 21-JUL-12
starting media recovery
......省略若干行...... 
released channel: c2
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 07/21/2012 09:02:32
RMAN-06054: media recovery requesting unknown log: thread 1 seq 4 lowscn 480661 
由于没有指定SCN,故报错RMAN-06054,这里可以忽略

SQL> alter database open resetlogs

查看数据库启动时的SCN,并从这个SCN之后启动Replicat进程

SQL> select checkpoint_change#,file# from v$datafile_header;
CHECKPOINT_CHANGE#      FILE#
------------------ ----------
            480661          1
            480661          2
            480661          3
            480661          4
            480661          5 

GGSCI (rac2) 162> start pora,aftercsn 480661

Sending START request to MANAGER ...

REPLICAT PORA starting

验证数据一致性
源端

SQL> select count(*) from testgg
  COUNT(*)
----------
       141 

目标端

SQL> select count(*) from testgg
  COUNT(*)
----------
       141

这种方法可以使用传输表空间或者基于备份的传输表空间来实现,这样就不需要对整个目标端数据库进行同步了,只需要同步所需的数据。

利用exp/imp 初始化数据

使用exp/imp(当然expdp/impdp同理)进行数据初始化的架构图和GoldeGate配置方法和使用RMAN是一致的,这里不再赘述,这里读者需要注意以下几个步骤

导出前,查看源端获得当前的scn号
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
    4 92124

确认Extract进程已经启动

GGSCI (rac1) 45> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
EXTRACT     RUNNING     EORA        00:00:00      00:00:00   

导出数据

$ exp system/oracle file=/home/oracle/hr_table.dmp triggers=n flashback_scn=480494 owner=hr
Export: Release 10.2.0.1.0 - Production on Sun Jul 22 11:16:15 2012
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production 
......省略若干行...... 
. exporting statistics
Export terminated successfully without warnings.

复制到目标端

$scp hr_table.dmp   192.168.1.112:/home/oracle/

确认复制进程未启动

GGSCI (rac2) 15> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
REPLICAT    STOPPED     PORA        00:00:00      00:00:03 

导入数据 
$ imp system/oracle file=hr_table.dmp fromuser=hr touser=hr
Import: Release 10.2.0.1.0 - Production on Sun Jul 22 11:22:04 2012
Copyright (c) 1982, 2005, Oracle.  All rights reserved. 
......省略若干行...... 
 "END secure_dml;"
About to enable constraints...
Import terminated successfully with warnings.

有报错,但和本次数据导入无关,忽略

注意:如果数据量较大,则会造成大事务,且导入执行很长时间。如果imp操作被中断,这个中断将导致这个大事物的回滚,回滚会占用更多时间影响启动复制进程的时间,这是读者在日常工作中注意的问题

启动pora进程
GGSCI (rac2) 89> start pora,aftercsn 492124
Sending START request to MANAGER ...
REPLICAT PORA starting
GGSCI (rac2) 90> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
REPLICAT    RUNNING     PORA        00:00:00      00:00:00    
GGSCI (rac2) 91> send replicat pora,report
Sending REPORT request to REPLICAT PORA ...
Request processed. 

验证数据一致性
源端

SQL> select count(*) from testgg
  COUNT(*)
----------
       1013 

目标端

SQL> select count(*) from testgg
  COUNT(*)
----------
       1013

如果只是是某些表由于各种原因造成两边数据不一致,需要重新进行同步,则可以在map参数中增加filter选项解决,如

map hr.testgg, target hr.testgg, filter ( @GETENV ("TRANSACTION", "CSN") >  492124) ;

利用GoldenGate初始化导入数据

架构图

GoldenGate Initial Load直接初始化是GoldenGate Initial Load Extract进程获取的源端记录直接传输给目标端的Initial Load Replicat进程,这个过程由MGR进程动态的启动,不需要Collect进程和文件。

在Initial Load过程中,需要启动Extract和Replicat进程来获取Initial Load过程中的数据变化,然后部署到目标端,从而保证结果的一致。这种方式不支持LOB和LONG类型的数据。GoldenGate会根据MGR进程中的DYNAMICPORTLIST配置的端口列表来为Replicat进程动态的分配端口。

Extract进程和Replicat进程和前文所述的配置一致,这里不再赘述,下面介绍Initial Load进程的配置

源端

GGSCI (rac1) 60> view params extinit
extract extinit
userid ogg, password ogg
rmthost 192.168.1.112, mgrport 7500
rmttask replicat, group porarini
table hr.*;
GGSCI (rac1) 58> add extract extinit,sourceistable
EXTRACT added.
GGSCI (rac1) 59> info extract *,tasks
EXTRACT    EXTINIT   Initialized   2012-07-22 17:21   Status STOPPED
Checkpoint Lag       Not Available
Log Read Checkpoint  Not Available
                     First Record         Record 0
Task                 SOURCEISTABLE
GGSCI (rac1) 61> start extinit
Sending START request to MANAGER ...
EXTRACT EXTINIT starting
GGSCI (rac1) 62> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
EXTRACT     RUNNING     EORA        00:00:00      00:00:03    

目标端
GGSCI (rac2) 115> info all
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
MANAGER     RUNNING                                           
REPLICAT    RUNNING     PORA        00:00:00      00:00:05    
GGSCI (rac2) 116> view params poraini
replicat poraini
assumetargetdefs
userid ogg, password ogg
discardfile ./dirrpt/poraini.dsc, purge
map hr.*, target hr.*;
GGSCI (rac2) 117> add replicat poraini, specialrun 

三种方式的比较
RMAN:速度快,如果是对整个目标库进行数据同步,效果较为理想。如果针对所需数据进行同步,使用传输表空间的话,会造成生产端表空间read only的情况,如果是基于备份的传输表空间,则会造成存储空间的浪费

exp/imp:速度相对较快,同步方式也较为灵活,适用于同步意外终止的故障处理或者针对个别表进行初始化数据同步

Initial Load:速度较慢(网友的测试结果,笔者未做详细测试),但操作简单、灵活。

参考至: 《GoldenGate Windows and UNIX Administrator’s Guide》 
              《叱咤风云:GoldenGate企业级运维实战》戴冠平著

              http://space.itpub.net/25264937/viewspace-716068

              http://andrewliu.blog.51cto.com/3272341/668289

              http://hi.baidu.com/oracle88/blog/item/c2c62408d1782024b0351d61.html
               http://blog.csdn.net/tianlesoftware/article/details/6976551
               http://blog.csdn.net/tianlesoftware/article/details/6982908

本文原创,转载请注明出处、作者

如有错误,欢迎指正

邮箱:czmcj@163.com

作者:czmmiao  文章出处:http://czmmiao.iteye.com/blog/1603336

时间: 2024-09-02 22:12:47

GlodenGate的数据初始化(原创)的相关文章

【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化

        本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html 1.前言 声明:此Newlife.XCode非Mac的XCode,避免误会. 1.QQ群:1600800 2.博客论坛 : NewlifeX论坛 (同时也是.Net Micro Framework/ApolloOS的交流论坛,帮

servlet-Struts2怎么做到和Servlet的数据初始化

问题描述 Struts2怎么做到和Servlet的数据初始化 在servlet里面有个Init方法,可是Struts2里面怎么做呢 ? 解决方案 请implements Preparable,这个是在调用方法之前调用的. 解决方案二: Struts 的初始化的过程在StrutsPrepareAndExecuteFilter 这个方法中,有一个Init()方法,其实根本上还是InitOperations init = new InitOperations();这个完成初始化, dispatcher

SSH 数据初始化

问题描述 项目用SSH(Struts2+Hibernate3+Spring2),我想在程序启动以后从数据库中读取数据初始化一下全局变量,也就是说在用户访问之前,只运行一次,该如何实现? 解决方案 <servlet> <servlet-name>jsp</servlet-name> <servlet-class>这里写你的servlet</servlet-class> <load-on-startup>343(只要大于零就行)</

大数据时代,原创音乐的春天来了!

曾几何时,中国原创音乐陷入低迷,没有好作品,成为社会各界的共同质疑.然而,2014年初,刘欢在<中国好歌曲>现场听霍尊演唱<卷珠帘>时留下的泪水,成为中国音乐原创实力的一个佐证.那些说中国观众缺乏参与度,以及那些说中国的原创音乐不堪一击的言论,相形之下,多么苍白.我们的观众很热情,我们的音乐制作人很用心,只需要合适的机会,把这两股力量拧成捻绳,原创音乐将展示出其真正的魅力. 可以说,如今蓬勃发展的互联网,足以让这种设想成为可能.今年通过独播<中国好歌曲>而与原创音乐结缘

微信小程序首页数据初始化失败的解决方法

一. 问题描述 用户首次后再次进入小程序时,我们通常需要通过获取用户openid或unionid用作唯一标示与后台进行数据交流,初始化用户信息.当我们通过第三方服务器跟微信建立请求时,微信需要用户确认是否公开信息.如图1,从console可以看到,在请求的同时,我们的首页index已经加载完成,图中初始化数据显示为空.无论我们将请求信息写在app.js的onload中或者index.js中,当我们点击确认后,请求信息才执行success方法,将第三方服务器返回的数据处理,这样的因需要用户点击而产

浅谈数据建模(原创)g

数据模型 数据模型是指用实体.实体的属性.实体之间的关系对企业在运营活动中涉及到所有业务概念和业务活动进行统一的定义和描述.数据模型是业务人员和技术开发人员之间沟通的平台.这里先解释下两个概念 实体:现实世界中存在的可以相互区分的事务或概念念称为实体.实体可以分为事物实体和概念实体.例如:一个学生.一个工人等是事物实体.一门课.一个班级等称为概念实体.实体的属性:每个实体都有自己的特征,利用实体的属性可以区别不同的实体.例如.学生的属性为姓名.性别.年龄等 数据建模 数据模型是抽象描述现实世界的

Datalist中Dropdownlist数据初始化放在哪里才是正确的?

问题描述 我在DataList的<EditItemTemplate>模式下有一个Dropdownlist用于选择省份<asp:DropDownListid="shengfen"runat="server"></asp:DropDownList>省份从数据库取数据(表[province],列:province_id,province_name)这是我cs部分代码:privatevoidPage_Load(objectsender,S

静态数据初始化和非静态实例初始化顺序的小问题

问题描述 程序1:classBowl{Bowl(intmarker){System.out.println("Bowl("+marker+")");}voidf1(intmarker){System.out.println("f1("+marker+")");}}classTable{staticBowlbowl1=newBowl(1);Table(){System.out.println("Table()"

(NO.00005)iOS实现炸弹人游戏(四):游戏数据的初始化(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们初步看了一下MainScene类的初始化方法里都做了神马事,其中随机化地图是在initGameDataFromGD方法里做的,我们就来深入看看这个方法. 该方法是一个比较长的方法,里面又调用了若干其他方法,我把其中主要的代码在下面列出来: //用游戏数据初始化当前关卡的数据 -(void)initGameDataFromGD{ [_gd loadGam