安装时应该选择最为稳定的安装版本,现在官方发布的版本主要为:
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可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构。
和传统的逻辑复制一样,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进程等等
灵活的拓扑结构:
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 |
|
源端是oracle生产数据库,已经存在oracle和dba,复用该用户和组。
目标端是mysql,已经存在mysql和dba,复用该用户和组。
安装Oracle GoldenGate软件前,需要事先确认安装目录属主权限正确,且所在文件系统有足够的空间存放Oracle GoldenGate软件并能支撑日常运维使用。对于存放dirdat数据目录,至少需要100GB以上的空间。对于源库是oracle rac模式,必须设置ogghome的目录的存储能让rac两台主机识别,只是mount在一个任务较轻的节点上,若是该节点出现故障,能及时挂载到另外一个节点上,增加高可用性。
检查安装目录所在文件系统空间信息,通过下述命令实现:
df -g /home/ogghome
确认安装目录属主权限信息,通过下述命令实现:
ls –ld /home/ogghome
Oracle GoldenGate软件通过解压缩方式实现安装,
解压缩GoldenGate安装文件,通过下述命令实现:
unzip ggs_*.zip
tar -xvf ggs_*.tar
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
进入安装路径,创建相关目录(源端和目标端都执行),源端使用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
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
注意,由于上面命令涉及停止数据库应用,应结合业务实际情况进行操作。
在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;
SQL>alter database force logging;
SQL>SELECT FORCE_LOGGING FROM V$DATABASE;
源端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';
./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.
由于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)
)
)
由于归档是使用文件系统,需要使用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
ggsci> EDIT PARAMS MGR
PORT 7809
PURGEOLDEXTRACTS ./dirdat,USECHECKPOINTS
ggsci> START MGR
ggsci> INFO MGR
add extract ext_cal, tranlog, begin now, THREADS 2
EXTRACT added.
add exttrail ./dirdat/ca, extract ext_cal, megabytes 100
EXTTRAIL added.
下面******替换成密码:
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
add extract dp_cal, exttrailsource ./dirdat/ca
add rmttrail ./dirdat/ca, extract dp_cal
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
在源端编辑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 [email protected]
Connecting to 192.168.61.131...
[email protected]'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
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
使用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
创建数据库:
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);
ggsci> EDIT PARAMS ./GLOBALS
CHECKPOINTTABLE goldengate.ggschkpt
ggsci> exit
ggsci> dblogin sourcedb [email protected]:3306,userid goldengate, password password
ggsci> add checkpointtable cal.checkpt
Successfully created checkpoint table cal.checkpt.
add replicat rep_cal, exttrail ./dirdat/ca ,checkpointtable cal.checkpt
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
源端开启相关进程
GGSCI> start mgr
GGSCI> start ext_cal
GGSCI> start dp_cal
目标端开启相关进程
GGSCI> start mgr
GGSCI> start rep_cal
从oracle同步到mysql,属于异构架构,不支持ddl同步,包括添加和删除字段,添加和删除索引,重命名表,表分析统计数据。
若是涉及到源端和目标端ddl操作,需要进行源端和目标端同时手工操作。
从oracle同步到mysql,支持DML同步。
CALENDAR_20131213_LOTTERY共有647581条记录,没有主键的表,每次进行插入和删除是按照100000条记录进行批处理,该值是由参数决定。
插入从15:18:43开始,到15:21:22结束,共使用159秒。
删除从15:25:07开始,到15:28:42结束,共使用215秒。
在全同步期间的产生的DML,在开始增量后,数据同步是一致。批量同步会有部分延迟,每秒同步的数据插入是4072条记录,删除是3012条记录。
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;<
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29114615/viewspace-1220532/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29114615/viewspace-1220532/