首页 > 数据库 > MySQL > 正文

GoldenGate从oracle迁移数据到mysql

2024-07-24 12:31:42
字体:
来源:转载
供稿:网友
        GoldenGate从oracle迁移数据到mysql:
1 软件简介
      安装时应该选择最为稳定的安装版本,现在官方发布的版本主要为:
 
        Oracle GoldenGate 11.2.1.0.1
 
       对应不同的数据库和版本,有不同的安装介质。下面是根据现网情况使用的两个安装介质:
 
       ogg112101_fbo_ggs_Linux_x64_ora10g_64bit.zip
 
       ggs_Linux_x64_MySQL_64bit.tar
 
        Oracle Golden Gate软件是一种基于日志的结构化数据复制备份软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。Oracle Golden Gate可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,从而在可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾、数据库升级和移植、双业务中心等多个场景下应用。同时,Oracle Golden Gate可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构。
 
2  整体架构
和传统的逻辑复制一样,Oracle GoldenGate实现原理是通过抽取源端的redo log或者archive log,然后通过TCP/IP投递到目标端,最后解析还原应用到目标端,使目标端实现同源端数据同步。以下是OracleGoldenGate的技术架构
 
Manager进程
 
Manager进程是GoldenGate的控制进程,运行在源端和目标端上。它主要作用有以下几个方面:启动、监控、重启Goldengate的其他进程,报告错误及事件,分配数据存储空间,发布阀值报告等。
 
Extract进程
  
Extract运行在数据库源端,负责从源端数据表或者日志中捕获数据。
  
Pump进程
  
pump进程运行在数据库源端。其作用是如果源端使用了本地的trail文件,那么pump进程就会把trail以数据块的形式通过TCP/IP协议发送到目标端,这通常也是推荐的方式。pump进程本质是extract进程的一种特殊形式,如果不使用trails文件,那么就是extract进程在抽取完数据以后,直接投递到目标端。
  
Trail文件
  
       为了更有效、更安全的把数据库事务信息从源端投递到目标端。GoldenGate引进trail文件的概念。前面提到extract抽取完数据以后Goldengate会将抽取的事务信息转化为一种GoldenGate专有格式的文件。然后pump负责把源端的trail文件投递到目标端,所以源、目标两端都会存在这种文件。trail文件存在的目的旨在防止单点故障,将事务信息持久化,并且使用checkpoint机制来记录其读写位置,如果故障发生,则数据可以根据checkpoint记录的位置来重传。
  
Replicat进程
  
       Replicat进程,通常我们也把它叫做应用进程。运行在目标端,是数据传递的最后一站,负责读取目标端trail文件中的内容,并将其解析为DML或DDL语句,然后应用到目标数据库中。
 
GGSCI
  
       GGSCI是GoldenGate Software Command Interface 的缩写,它提供了十分丰富的命令来对Goldengate进行各种操作,如创建、修改、监控GoldenGate进程等等
 
灵活的拓扑结构:
 
GoldenGate从oracle迁移数据到mysql
 
2.1   GoldenGate支持列表
Databases
 
OS and Platforms
 
Capture:
 
Windows 2000,2003,xp
 
Oracle
 
Linux
 
DB2 UDB
 
Sun Slolaris
 
Microsoft SQL Server
 
HP NonStop
 
Sybase ASE
 
HP Ux
 
Teradata
 
HP TRU64
 
Ingres
 
IBM AIX
 
Enscribe
 
IBM z/OS
 
SQL/MP
   
SQL/MX
  
Delivery:
  
All listed above
  
Mysql,hp neoview,Netezza
  
And ODBC compatible databases
  
3       GoldenGate软件安装
3.1 组和用户创建
源端是oracle生产数据库,已经存在oracle和dba,复用该用户和组。
 
目标端是mysql,已经存在mysql和dba,复用该用户和组。
 
3.2 GoldenGate安装目录检查
安装Oracle GoldenGate软件前,需要事先确认安装目录属主权限正确,且所在文件系统有足够的空间存放Oracle GoldenGate软件并能支撑日常运维使用。对于存放dirdat数据目录,至少需要100GB以上的空间。对于源库是oracle rac模式,必须设置ogghome的目录的存储能让rac两台主机识别,只是mount在一个任务较轻的节点上,若是该节点出现故障,能及时挂载到另外一个节点上,增加高可用性。
 
检查安装目录所在文件系统空间信息,通过下述命令实现:
 
df -g /home/ogghome
 
确认安装目录属主权限信息,通过下述命令实现:
 
ls –ld /home/ogghome
 
3.3 解压安装文件
Oracle GoldenGate软件通过解压缩方式实现安装,
 
解压缩GoldenGate安装文件,通过下述命令实现:
 
unzip ggs_*.zip
 
tar -xvf  ggs_*.tar
 
3.4 GoldenGate软件启动测试
Oracle GoldenGate软件通过ggsci命令启动交互界面,当ggsci启动成功则表名安装过程无误。启动ggsci前务必进入Oracle GoldenGate软件的安装目录。
 
启动Oracle GoldenGate的ggsci,通过下述命令实现:
 
cd /home/oracle/ggs/goldengate
 
./ggsci
 
Oracle数据库的账号必须设置LD_LIBRARY_PATH环境变量,否则会报错,
 
LD_LIBRARY_PATH=/oracle/product/10.2/db/lib
 
3.5 、创建GoldenGate软件子目录
进入安装路径,创建相关目录(源端和目标端都执行),源端使用oracle用户,目标端使用mysql用户:
 
cd /home/ogghome
 
./ggsci
 
GGSCI> create subdirs
 
下面是日志:
 
Creating subdirectories under current directory /home/ogghome
 
Parameter files                /home/ogghome/dirprm: already exists
 
Report files                   /home/ogghome/dirrpt: created
 
Checkpoint files               /home/ogghome/dirchk: created
 
Process status files           /home/ogghome/dirpcs: created
 
SQL script files               /home/ogghome/dirsql: created
 
Database definitions files     /home/ogghome/dirdef: created
 
Extract data files             /home/ogghome/dirdat: created
 
Temporary files                /home/ogghome/dirtmp: created
 
Stdout files                   /home/ogghome/dirout: created
 
4       GoldenGate部署
4.1 初始化源端数据库
4.1.1             开启归档模式
GoldenGate是基于oracle日志变化的捕获,所以为了完整的捕获到oracle数据库的变化,有必要将归档模式开启。
 
SQL>      alter system set log_archive_dest_1='location=/arch' scope=both;
 
  SQL>  shutdown immediate
 
  SQL>  startup mount
 
  SQL>  alter database archivelog
 
  SQL>  alter database open
 
  SQL>  archive log list
 
注意,由于上面命令涉及停止数据库应用,应结合业务实际情况进行操作。
 
4.1.2             开启附加日志
在oracle中我们可以通过rowid来定位某条记录,但是目标端的数据库和源端数据库的数据库可能完全不一样,所以无法通过rowid来确定源端数据库的逻辑变化,这时附件日志supplemental log便登上了表演的舞台。数据库在开启附加日志功能后,对于源端的修改操作,oracle会同时追加能够唯一标示记录的列到redo log。这样目标端数据库就可以知道源端发生了哪些具体的变化。
 
   SQL>       alter database add supplemental log data;
 
   SQL>       alter system switch logfile;
 
   SQL>       select supplemental_log_data_min from v$database;
 
4.1.3             开启强制日志模式
SQL>alter database force logging;
 
 SQL>SELECT FORCE_LOGGING FROM V$DATABASE;
 
4.1.4             goldengate创建用户并授权
源端oracle数据库创建账号:
 
create tablespace data_goldengate datafile '+DG_DATA1' size 10240m autoextend on;
 
create user goldengate identified by password default tablespace data_goldengate temporary tablespace temp;
 
赋予goldengate相关权限(想简单的话,可以赋予DBA权限,若是涉及安全问题,dba权限不能随便赋予)
 
grant CONNECT,RESOURCE to goldengate;
 
grant CREATE SESSION,ALTER SESSION to goldengate;
 
grant SELECT ANY DICTIONARY,SELECT ANY TABLE to goldengate;
 
grant CREATE TABLE,ALTER ANY TABLE to goldengate;
 
grant unlimited tablespace to goldengate;
 
目标端mysql创建账号,赋予dba权限:
 
grant ALL PRIVILEGES on *.* to goldengate@'%';
 
grant ALL PRIVILEGES on *.* to goldengate@'localhost';
 
update mysql.user set password=password('password') where user='goldengate';
 
4.1.5             对需要同步的表确认是否开启表级附加日志
./ggsci
 
GGSCI (localhost.localdomain) 1> dblogin userid goldengate password password
 
Successfully logged into database.
 
GGSCI (localhost.localdomain) 2> info trandata xianyezhao.CALENDAR_DETAIL
 
Logging of supplemental redo log data is disabled for table XIANYEZHAO.CALENDAR_DETAIL.
 
GGSCI (localhost.localdomain) 3> add trandata xianyezhao.CALENDAR_DETAIL
 
Logging of supplemental redo data enabled for table XIANYEZHAO.CALENDAR_DETAIL.
 
GGSCI (localhost.localdomain) 4> info trandata  XIANYEZHAO.CALENDAR_DETAIL
 
Logging of supplemental redo log data is enabled for table XIANYEZHAO.CALENDAR_DETAIL.
 
Columns supplementally logged for table XIANYEZHAO.CALENDAR_DETAIL: SEQNO.
 
4.2 配置ASM访问方式
由于oracle redo 日志文件在ASM存储上,goldengate软件需要访问ASM,
 
配置asm实例的tns连接字符串,由于监听状态是BLOCKED,必须添加(UR=A)才能通过ogg远程登录asm实例。下面是官方详细说明:
 
ASM instances appear with a blocked status from the 'lsnrctl services'command (see below). To remotely access a 'blocked service' you need toadd (UR=A) to the tns connect string (plus you will need a password filefor the asm instance).
 
Tnsnames.ora entry:----
 
下面是监听状态,使用lsnrctl status查看:
 
Service "+ASM" has 1 instance(s).
 
  Instance "+ASM2", status BLOCKED, has 1 handler(s) for this service...
 
下面是具体的tns连接字符串:
 
ASM =
 
 (DESCRIPTION =
 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.219.6)(PORT = 1521))
 
    (CONNECT_DATA =
 
      (SERVER = DEDICATED)
 
      (SERVICE_NAME = +ASM)
 
      (INSTANCE_NAME = +ASM2)
 
      (UR=A)
 
    )
 
  )
 
4.3 配置NFS文件系统
由于归档是使用文件系统,需要使用nfs文件模式,把另外一个节点的归档挂载到本地。
 
a.开启nfs服务:
 
service nfs start
 
查看nfs状态:
 
service nfs status
 
b.开启nfs权限:
 
编辑权限列表:
 
vi /etc/exports
 
/archivelog1    *(rw)
 
更新权限:
 
exportfs –a
 
c.创建/archivelog1,更改权限为oracle和dba,
 
chown oracle:dba /archivelog1
 
使用root用户mount上:
 
mount 192.168.219.3:/archivelog1 /archivelog1
 
4.4 在源端和目标端配置MGR
ggsci>     EDIT  PARAMS  MGR
 
PORT   7809
 
PURGEOLDEXTRACTS  ./dirdat,USECHECKPOINTS
 
ggsci>     START   MGR
 
ggsci>    INFO      MGR
 
4.5 创建Extract: ext_cal
4.5.1             增加extract
add extract ext_cal, tranlog, begin now, THREADS 2
 
EXTRACT added.
 
4.5.2             设定exttrail
add exttrail ./dirdat/ca, extract ext_cal, megabytes 100
 
EXTTRAIL added.
 
4.5.3             配置extract
下面******替换成密码:
 
edit params ext_cal
 
/********************************************************************/
 
EXTRACT ext_cal                                                          
 
SETENV (NLS_LANG="AMERICAN_AMERICA.ZHS16GBK")                                                    
 
SETENV (ORACLE_SID="g139bak2")                                                 
 
userid goldengate, password password
 
TRANLOGOPTIONS ASMUSER sys@asm,ASMPASSWORD ******
 
EXTTRAIL ./dirdat/ca    
 
TRANLOGOPTIONS LOGRETENTION DISABLED
 
TRANLOGOPTIONS BUFSIZE 2048000
 
tranlogoptions altarchivedlogformat threadid 1 g139bak_%S_%T_%R.log
 
tranlogoptions altarchivedlogformat threadid 2 g139bak_%S_%T_%R.log
 
tranlogoptions altarchivelogdest instance g139bak1 /archivelog1/g139bak_archivelog, altarchivelogdest instance g139bak2 /archivelog2/g139bak_archivelog
 
--DDL INCLUDE mapped
 
--DDLOPTIONS ADDTRANDATA
 
DISCARDFILE ./dirrpt/ext_cal.dsc,APPEND,MEGABYTES 1000
 
DISCARDROLLOVER AT 6:00
 
REPORTROLLOVER AT 6:00
 
REPORTCOUNT EVERY 1 HOURS,RATE
 
TRANLOGOPTIONS ALTARCHIVELOGDEST /archivelog2
 
FETCHOPTIONS MISSINGROW ABEND
 
STATOPTIONS REPORTFETCH
 
WARNLONGTRANS 1H,CHECKINTERVAL 10m
 
DYNAMICRESOLUTION        
 
TABLE XIANYEZHAO.CALENDAR_DETAIL;
 
TABLE XIANYEZHAO.CALENDAR_INFO;
 
/********************************************************************/
 
下面是查看内容:
 
GGSCI (gb139bak02) 5> view report ext_cal
 
4.6 创建投送进程: dp_cal
4.6.1             增加extract
add extract dp_cal, exttrailsource ./dirdat/ca
 
4.6.2             设定extract投递rmttrail
add rmttrail ./dirdat/ca, extract dp_cal
 
4.6.3             配置extract
edit params dp_cal
 
/********************************************************************/
 
EXTRACT dp_cal
 
passthru
 
DYNAMICRESOLUTION
 
RMTHOST 192.168.219.35, MGRPORT 7809, COMPRESS
 
RMTTRAIL ./dirdat/ca
 
TABLE XIANYEZHAO.CALENDAR_DETAIL;
 
TABLE XIANYEZHAO.CALENDAR_INFO;
 
/********************************************************************/
 
由于没有配置目标端的mgr进程,7809没有打开,网络报错,导致进程挂掉。
 
GGSCI (localhost.localdomain) 48> view report dp_cal
 
GGSCI (gb139bak02) 65> view report dp_cal
 
4.7 创建定义文件
在源端编辑defgen文件
 
su - oracle
 
cd ./dirprm
 
$ vi cal.prm
 
DEFSFILE /home/ogghome/dirdef/cal.def
 
USERID goldengate PASSWORD password
 
TABLE XIANYEZHAO.CALENDAR_DETAIL;
 
TABLE XIANYEZHAO.CALENDAR_INFO;
 
通过执行defgen命令生成定义文件
 
/home/ogghome/defgen PARAMFILE /home/ogghome/dirprm/cal.prm
 
***********************************************************************
 
        Oracle GoldenGate Table Definition Generator for Oracle
 
      Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230
 
   Linux, x64, 64bit (optimized), Oracle 10g on Apr 23 2012 05:09:39
 
Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
 
                    Starting at 2014-06-09 15:24:08
 
***********************************************************************
 
Operating System Version:
 
Linux
 
Version #1 SMP Thu Sep 5 21:21:44 EDT 2013, Release 2.6.18-371.el5
 
Node: gb139bak02
 
Machine: x86_64
 
                         soft limit   hard limit
 
Address Space Size   :    unlimited    unlimited
 
Heap Size            :    unlimited    unlimited
 
File Size            :    unlimited    unlimited
 
CPU Time             :    unlimited    unlimited
 
Process id: 2014
 
***********************************************************************
 
**            Running with the following parameters                  **
 
***********************************************************************
 
DEFSFILE /home/ogghome/dirdef/cal.def
 
USERID goldengate PASSWORD ********
 
TABLE XIANYEZHAO.CALENDAR_DETAIL;
 
Retrieving definition for XIANYEZHAO.CALENDAR_DETAIL
 
TABLE XIANYEZHAO.CALENDAR_INFO;
 
Retrieving definition for XIANYEZHAO.CALENDAR_INFO
 
Definitions generated for 2 tables in /home/ogghome/dirdef/cal.def
 
把生成的def文件传输到mysql端
 
[oracle@localhost dirdef]$ sftp mysql@192.168.61.131
 
Connecting to 192.168.61.131...
 
mysql@192.168.61.131's password:
 
sftp> cd /home/ogghome/dirdef
 
sftp> !ls
 
sftp> put cal.def
 
Uploading cal.def to /home/ogghome/dirdef/cal.def
 
cal.def                                                                                         100% 1001     1.0KB/s   00:00
 
修改mysql端定义文件的权限
 
chown mysql:dba /home/ogghome/dirdef/cal.def
 
chmod 755 /home/ogghome/dirdef/cal.def
 
4.8 初始化数据
4.8.1             Oracle到oracle导出方式
1、查看系统改变号:
 
col current_scn for 999999999999999999999999999999
 
select current_scn from v$database;
 
--1138506
 
2、导出导入数据:
 
set linesize 133
 
col directory_path format a50
 
select * from dba_directories;
 
SYS                            DATA_PUMP_DIR                  /opt/oracle/app/admin/test/dpdump/
 
expdp /'/ as sysdba /' DIRECTORY=DATA_PUMP_DIR DUMPFILE=t3.dmp LOGFILE=t3.log TABLES=test.t3 FLASHBACK_SCN=1138506
 
impdp /'/ as sysdba /' DIRECTORY=DATA_PUMP_DIR DUMPFILE=t3.dmp LOGFILE=t3_imp.log TABLES=test.t3 REMAP_TABLESPACE=DATA_TEST:DATA_TEST
 
--REMAP_SCHEMA=TEST:TEST
 
3、启动应用进程的时候,需要指定aftersn号,下面是具体例子:
 
用SCN 启动Replicat
 
start rep_cal, aftercsn 1138506
 
4.8.2             Oracle到mysql方式
使用goldengatedirect load的方式:
 
源端:
 
ADD EXTRACT einixyz, SOURCEISTABLE
 
EXTRACT einixyz
 
userid goldengate, password password
 
RMTHOST 192.168.219.35, MGRPORT 7809, COMPRESS
 
RMTTASK REPLICAT, GROUP RINIXYZ
 
TABLE XIANYEZHAO.T_INI;
 
创建定义文件
 
在源端编辑defgen文件
 
su - oracle
 
cd ./dirprm
 
$ vi cal_xyz.prm
 
DEFSFILE /home/ogghome/dirdef/cal_xyz.def
 
USERID goldengate PASSWORD password
 
TABLE XIANYEZHAO.T_INI;
 
通过执行defgen命令生成定义文件
 
/home/ogghome/defgen PARAMFILE /home/ogghome/dirprm/cal_xyz.prm
 
sftp上传到目标端服务器/home/ogghome/dirdef/目录下。
 
目标端:
ADD REPLICAT rinixyz, SPECIALRUN
 
 
replicat RINIXYZ
 
sourcedefs /home/ogghome/dirdef/cal_xyz.def
 
SETENV (MYSQL_UNIX_PORT=/mysql/dbdata/mysql.sock)
 
sourcedb cal@localhost userid goldengate, password password
 
reperror default, discard
 
discardfile ./dirrpt/ext_in.dsc,APPEND,MEGABYTES 1000
 
MAP XIANYEZHAO.T_INI , TARGET CAL.T_INI;
 
启动数据初始化,只是需要在源端启动抽取进程即可:
 
start einixyz
 
4.9 目标端创建Replicat
4.9.1             手工创建数据库和表语句
创建数据库:
 
create database cal;
 
创建表,需要把oracle格式转化为mysql格式,下面是部分内容:
 
1.number需要转化成DECIMAL
 
2.varchar2需要转化成varchar
 
3.date需要转换成datetime
 
4.mysql不支持NUMBER(38,0)转换成DECIMAL(38,0),因此,需要把*转化成oracle最大的数值,38位长,DECIMAL(38,0)。
 
5.由于mysql分区字段必须是int类型,下面HASH (UIN)不能进行hash分区。
 
6.mysql索引没有并发概念,去除parallel选项。
 
CREATE TABLE CALENDAR_DETAIL
 
   ( SEQNO DECIMAL NOT NULL,
 
       DETAILSEQNO DECIMAL,
 
       LABELID DECIMAL,
 
       LABELTYPE DECIMAL(2,0),
 
       MESSTYPE DECIMAL(2,0),
 
       UIN VARCHAR(32),
 
       SERVICEID DECIMAL(8,0),
 
       SPSID VARCHAR(32),
 
       RECTARGET VARCHAR(1024),
 
       STARTSENDTIME DATETIME,
 
       SENDMSG VARCHAR(2000),
 
       CREATETIME DATETIME,
 
       MODIFYTIME DATETIME,
 
       TYPE DECIMAL(38,0) DEFAULT 0
 
   );
 
CREATE INDEX CALENDAR_DETAIL_IDX3_NEW ON CALENDAR_DETAIL (DETAILSEQNO);
 
CREATE UNIQUE INDEX PK_CALENDAR_DETAIL ON CALENDAR_DETAIL (SEQNO);
 
CREATE INDEX CALENDAR_DETAIL_IDX1_NEW ON CALENDAR_DETAIL (STARTSENDTIME);
 
CREATE INDEX CALENDAR_DETAIL_IDX2_NEW ON CALENDAR_DETAIL (UIN);
 
ALTER TABLE CALENDAR_DETAIL ADD CONSTRAINT PK_CALENDAR_DETAIL PRIMARY KEY(SEQNO);
 
CREATE TABLE CALENDAR_INFO
 
   ( SEQNO DECIMAL NOT NULL,
 
       UIN VARCHAR(32),
 
       GID VARCHAR(50),
 
       CREATORUIN VARCHAR(32),
 
       SERVICEID DECIMAL(10,0),
 
       SPSID VARCHAR(32),
 
       TITLE VARCHAR(600),
 
       SITE VARCHAR(200),
 
       ISATTACH DECIMAL(2,0),
 
       CONTENT VARCHAR(1500),
 
       STARTDATE DATETIME,
 
       ENDDATE DATETIME,
 
       STARTTIME DECIMAL(5,0),
 
       ENDTIME DECIMAL(5,0),
 
       STATUS DECIMAL(2,0),
 
       DATEDESCRIPT VARCHAR(128),
 
       ENABLE DECIMAL(2,0),
 
       AUTHSTATUS DECIMAL(2,0),
 
       LABELID DECIMAL,
 
       LABELTYPE DECIMAL(2,0),
 
       SPECIALAPPID DECIMAL,
 
       RECMYSMS DECIMAL(2,0),
 
       RECMYEMAIL DECIMAL(2,0),
 
       RECMOBILE VARCHAR(1024),
 
       RECEMAIL VARCHAR(1024),
 
       CREATETIME DATETIME,
 
       MODIFYTIME DATETIME,
 
       VERSION DECIMAL(8,0),
 
       EXPEND VARCHAR(50),
 
       COMEFROM DECIMAL(5,0),
 
       SPECIALTYPE DECIMAL(2,0) DEFAULT 0
 
   );
 
  
 
CREATE INDEX CALENDAR_INFO_IDX6_NEW ON CALENDAR_INFO (SPECIALAPPID);
 
CREATE INDEX CALENDAR_INFO_IDX1_NEW ON CALENDAR_INFO (UIN);
 
CREATE INDEX CALENDAR_INFO_IDX7_NEW ON CALENDAR_INFO (LABELID);
 
CREATE INDEX CALENDAR_INFO_IDX4_NEW ON CALENDAR_INFO (STARTTIME);
 
CREATE INDEX CALENDAR_INFO_IDX8_NEW ON CALENDAR_INFO (GID);
 
CREATE INDEX SPECIALTYPE_INDEX ON CALENDAR_INFO (SPECIALTYPE);
 
CREATE UNIQUE INDEX PK_CALENDAR_INFO ON CALENDAR_INFO (SEQNO);
 
CREATE INDEX CALENDAR_INFO_IDX5_NEW ON CALENDAR_INFO (ENDTIME);
 
CREATE INDEX CALENDAR_INFO_IDX3_NEW ON CALENDAR_INFO (ENDDATE);
 
CREATE INDEX CALENDAR_INFO_IDX2_NEW ON CALENDAR_INFO (STARTDATE);
 
ALTER TABLE CALENDAR_INFO ADD CONSTRAINT PK_CALENDAR_INFO PRIMARY KEY (SEQNO);
 
4.9.2             在目标端配置replicat进程
ggsci>     EDIT  PARAMS  ./GLOBALS
 
CHECKPOINTTABLE         goldengate.ggschkpt
 
ggsci>   exit
 
ggsci>   dblogin sourcedb cal@192.168.219.35:3306,userid goldengate, password password
 
ggsci>     add checkpointtable cal.checkpt
 
Successfully created checkpoint table cal.checkpt.
 
4.9.3             创建Replicat
add replicat rep_cal, exttrail ./dirdat/ca ,checkpointtable cal.checkpt  
 
4.9.4             配置replicat
edit params rep_cal
 
/********************************************************************/
 
REPLICAT rep_cal
 
SETENV (MYSQL_UNIX_PORT=/mysql/dbdata/mysql.sock)
 
sourcedb cal@localhost userid goldengate, password password
 
SQLEXEC "select CURRENT_TIME();" EVERY 10 MINUTES
 
REPORT AT  6:00
 
gettruncates
 
STATOPTIONS RESETREPORTSTATS
 
reperror (default,abend)
 
discardrollover at 6:00
 
numfiles 1000
 
MAXLONGLEN 8000
 
dynamicresolution
 
allownoopupdates
 
SOURCEDEFS ./dirdef/cal.def
 
GROUPTRANSOPS 100000
 
MAXTRANSOPS 100000
 
REPORTCOUNT EVERY 1 MINUTES RATE
 
discardfile ./dirrpt/rep_cal.dsc, append, megabytes 1000
 
MAP XIANYEZHAO.CALENDAR_DETAIL             , TARGET CAL.CALENDAR_DETAIL              ,KEYCOLS( SEQNO );
 
MAP XIANYEZHAO.CALENDAR_INFO               , TARGET CAL.CALENDAR_INFO                ,KEYCOLS( SEQNO );
 
 /********************************************************************/
 
若是oracle到oracle同步,则可以使用SCN 启动Replica
 
start rep_cal, aftercsn 1138506
 
若是oracle到mysql,则直接启动:
 
start rep_cal
 
查看命令:
 
GGSCI (mysqldb1) 20> info all
 
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
 
MANAGER     RUNNING                                          
 
REPLICAT    RUNNING     REP_CAL     00:00:00      00:00:08
 
GGSCI (mysqldb1) 21> view report rep_cal
 
5       Goldengate同步测试
5.1 开启同步进程
源端开启相关进程
 
GGSCI> start mgr
 
GGSCI> start ext_cal
 
GGSCI> start dp_cal
 
目标端开启相关进程
 
GGSCI> start mgr
 
GGSCI> start rep_cal
 
5.2 异构不支持ddl同步
从oracle同步到mysql,属于异构架构,不支持ddl同步,包括添加和删除字段,添加和删除索引,重命名表,表分析统计数据。
 
若是涉及到源端和目标端ddl操作,需要进行源端和目标端同时手工操作。
 
5.3 DML测试
从oracle同步到mysql,支持DML同步。
 
5.3.1             没有主键的表同步
CALENDAR_20131213_LOTTERY共有647581条记录,没有主键的表,每次进行插入和删除是按照100000条记录进行批处理,该值是由参数决定。
 
插入从15:18:43开始,到15:21:22结束,共使用159秒。
 
删除从15:25:07开始,到15:28:42结束,共使用215秒。
 
在全同步期间的产生的DML,在开始增量后,数据同步是一致。批量同步会有部分延迟,每秒同步的数据插入是4072条记录,删除是3012条记录。
 
5.3.2             有主键的表同步
CALENDAR_INVITE_INFO表共有14358726条记录,全量同步开始时间16:36:12,在16:56:40时刻,源端插入 6645999,mysql目标端插入3887999,有2758000条记录延迟。源端全部完成插入14358726,mysql目标端插入8545999。在17:19:19时刻,完成全部数据量插入,使用2587秒,每秒插入5550条左右。对比没有主键的表来说,快了36%左右。因此,要求同步的表必须添加主键。
 
 Update操作,calendar_detail表有12042条记录,大概3秒左右完成同步目标端,更新为1.
 
SQL> select count(1) ,type from calendar_detail group by type;
 
  COUNT(1)       TYPE
 
---------- ----------
 
      1783          3
 
     10259          0
 
update calendar_detail set type=1;
 
mysql> select count(1) ,type from calendar_detail group by type;
 
+----------+------+
 
| count(1) | type |
 
+----------+------+
 
|    12042 |    1 |
 
+----------+------+
 
CALENDAR_INVITE_INFO使用下面同步脚本(存储过程P_01):
 
declare
 
     row_num number ;
 
     cursor get_data is
 
       select
 
 SEQNO            ,
 
 CALSEQNO         ,
 
 UIN              ,
 
 INVITERUIN       ,
 
 INVITERALIAS     ,
 
 RECMYSMS         ,
 
 RECMYEMAIL       ,
 
 RECMOBILE        ,
 
 RECEMAIL         ,
 
 STATUS           ,
 
 REFUSERESION     ,
 
 INVITEAUTH       ,
 
 INVITEREMARK     ,
 
 INVITETIME       ,
 
 REMARKTIME       ,
 
 ENABLE           ,
 
 ISDELETED        ,
 
 BEFORETYPE       ,
 
 BEFORETIME       ,
 
 NOTIFYCONF       ,
 
 NEXTSENDDATE    
 
       from calendar01.CALENDAR_INVITE_INFO;
 
begin
 
    row_num := 1;
 
    for rec in get_data loop
 
       insert into CALENDAR_INVITE_INFO(
 
 SEQNO            ,
 
 CALSEQNO         ,
 
 UIN              ,
 
 INVITERUIN       ,
 
 INVITERALIAS     ,
 
 RECMYSMS         ,
 
 RECMYEMAIL       ,
 
 RECMOBILE        ,
 
 RECEMAIL         ,
 
 STATUS           ,
 
 REFUSERESION     ,
 
 INVITEAUTH       ,
 
 INVITEREMARK     ,
 
 INVITETIME       ,
 
 REMARKTIME       ,
 
 ENABLE           ,
 
 ISDELETED        ,
 
 BEFORETYPE       ,
 
 BEFORETIME       ,
 
 NOTIFYCONF       ,
 
 NEXTSENDDATE      
 
   )
 
       values(
 
        rec.SEQNO            ,
 
        rec.CALSEQNO         ,
 
        rec.UIN              ,
 
        rec.INVITERUIN       ,
 
        rec.INVITERALIAS     ,
 
        rec.RECMYSMS         ,
 
        rec.RECMYEMAIL       ,
 
        rec.RECMOBILE        ,
 
        rec.RECEMAIL         ,
 
        rec.STATUS           ,
 
        rec.REFUSERESION     ,
 
        rec.INVITEAUTH       ,
 
        rec.INVITEREMARK     ,
 
        rec.INVITETIME       ,
 
        rec.REMARKTIME       ,
 
        rec.ENABLE           ,
 
        rec.ISDELETED        ,
 
        rec.BEFORETYPE       ,
 
        rec.BEFORETIME       ,
 
        rec.NOTIFYCONF       ,
 
        rec.NEXTSENDDATE
 
      );      
 
      row_num := row_num + 1;
 
      --每2000条提交一次
 
      if mod(row_num, 2000) = 0 then
 
        commit;
 
      end if;
 
   end loop;
 
  commit;<

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表