跨平台、异构数据库之间的数据同步,方案有限,Oracle OGG算比较靠谱的一个:
优点:性能好,大数据量速度快,对线上库性能的影响忽略不计;此外,源和目标各有1个manager进程负责全局配置。
盗个图:
mgr:
PORT 7809
DYNAMICPORTLIST 7810-7820
ACCESSRULE, PROG *, IPADDR 192.168.*.*, ALLOW
--AUTOSTART ER *
--AUTORESTART ER *, RETRIES 3, WAITMINUTES 3
STARTUPVALIDATIONDELAY 5
PURGEOLDEXTRACTS /backup/ggs12/dirdat/*, USECHECKPOINTS, MINKEEPHOURS 2
initext1:
EXTRACT initext1
SETENV (ORACLE_HOME = "/u01/app/oracle/product/11.2.0/dbhome_1")
SETENV (ORACLE_SID = "myora")
USERID system PASSWORD mypasswprd
RMTHOST 10.10.10.2, MGRPORT 7809
RMTTASK REPLICAT, GROUP initrep1
TABLE schema_name.table_name;
ext1:
EXTRACT ext1
SETENV (ORACLE_HOME = "/u01/app/oracle/product/11.2.0/dbhome_1")
SETENV (ORACLE_SID = "myora")
USERID system PASSWORD mypwd
LOGALLSUPCOLS
EXTTRAIL /backup/ggs12/dirdat/aa
TABLE myschema.mytable;
pump:
EXTRACT pump1
USERID system PASSWORD mypassword
RMTHOST 10.10.10.2, MGRPORT 7809
RMTTRAIL /data1/ggs/dirdat/aa
TABLE myschema.myname;
--目标端--
mgr:
PORT 7809
DYNAMICPORTLIST 7810-7820
#AUTOSTART ER *
#AUTORESTART ER *, RETRIES 3, WAITMINUTES 3
STARTUPVALIDATIONDELAY 5
PURGEOLDEXTRACTS /data1/ggs/dirdat/*, USECHECKPOINTS, MINKEEPHOURS 2
initrep1:
REPLICAT initrep1
TARGETDB [email protected]:3306, USERID root, PASSWORD mypassword
MAP myschema.mytable, TARGET mydb.mytable, COLMAP(USEDEFAULTS, source_cola = target_cola, source_colb = target_colb);
rep1:
REPLICAT rep1
TARGETDB [email protected]:3306, USERID root, PASSWORD mypassword
MAP myschema.mytable, TARGET mydb.mytable, COLMAP(USEDEFAULTS, source_cola = target_cola, source_colb = target_colb);
ggsci > add extract initext1, sourceistable
ggsci > add extract ext1, tranlog, begin now
ggsci > add exttrail /backup/ggs12/dirdat/aa, extract ext1
ggsci > add ext pump1, exttrailsource /backup/ggs12/dirdat/aa
ggsci > add rmttrail /data1/ggs/dirdat/aa, ext pump1
--目标端--
ggsci > add replicat initrep1, specialrun
ggsci > add rep rep1, exttrail /data1/ggs/dirdat/aa, checkpointtable mydb.ggs_checkpoint
source:
ggsci > start ext1
ggsci > start pump1
target
rep1设置HANDLECOLLISIONS
source:
ggsci > start initext1
target:
ggsci > view report initrep1
确认initrep1执行完成
ggsci > start rep1
ggsci > info rep1
rep1配置文件删除HANDLECOLLISIONS?配置
ggsci > send replicat rep1, nohandlecollisions
ggsci > start rep rep1
(1).OGG不能识别复合唯一键,因此有复合键的需要用keycols指定,否则以所有字段作为key;
(2).调整源或目标表的字段步骤:
停止ext\pump\rep进程启动ext\pump\rep进程
为了防止DBA或运维误操作,在oracle相关表上创建触发器,提醒这是ggs table:
create or replace trigger tri_ddl_ggstab_permission
before drop or truncate or alter on database
begin
if ORA_DICT_OBJ_NAME in ('TABNAME1','TABNAME2') then
raise_application_error(-20001,'GGS table, Contact DBA.');
end if;
end;
(3).万事离不开监控,ggs的监控可以通过创建心跳表监控实时同步情况
说明:
在源和目标表建心跳表;
源通过JOB自动更新心跳表;
目标表定时检查心跳表的时间与当前时间之差;
目标表中now() - update_time,反应了ggs同步情况;
目标表中auto_time - update_time,反应了ggs延时情况;
source:
create table ggs_monitor(ggs_process varchar2(100), update_time date) tablespace lbdata;
alter table ggs_monitor add constraint pk_ggsmonitor primary key(ggs_process);
insert into ggs_monitor(ggs_process,update_time) values ('ext1',sysdate);
begin
dbms_scheduler.create_job(job_name => 'job_ggs_monitor',
job_type => 'PLSQL_BLOCK',
job_action => 'begin update ggs_monitor set update_time=sysdate; commit; end;',
start_date => sysdate,
enabled => true,
repeat_interval => 'Freq=Secondly;Interval=10');
end;
target:
create table ggs_monitor (
ggs_process varchar(100) COLLATE utf8_bin DEFAULT NULL,
update_time datetime DEFAULT NULL,
auto_tim` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
primary key(ggs_process)
);
GGS配置注意事项:
ext1: TABLE system.ggs_monitor, WHERE (ggs_process = 'ext1');
zabbix
UserParameter=ggsAvail[*],/etc/zabbix/script/ggsAvail.sh $1
UserParameter=ggsDelay[*],/etc/zabbix/script/ggsDelay.sh $1
ggsAvail.sh
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage:$0 extname"
exit
fi
extname=$1
rootPath=/etc/zabbix/script
tmpLog=$rootPath/tmpGgsAvail${extname}.log
mysql -u root -pmypwd < ${tmpLog} 2>/dev/null
select concat('RESULTLINE#',now() - update_time,'#') message from dbadmin.ggs_monitor where ggs_process='${extname}';
EOF
sed -i '/RESULTLINE/!d' ${tmpLog}
resultLine=`cat ${tmpLog} | wc -l`
if [ $resultLine -ne 1 ]; then
echo 3600
exit
fi
echo `cat ${tmpLog} | cut -d "#" -f 2`
exit
ggsDelay.sh
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage:$0 extname"
exit
fi
extname=$1
rootPath=/etc/zabbix/script
tmpLog=$rootPath/tmpGgsDelay${extname}.log
mysql -u root -pmypwd < ${tmpLog} 2>/dev/null
select concat('RESULTLINE#',auto_time - update_time,'#') message from dbadmin.ggs_monitor where ggs_process='${extname}';
EOF
sed -i '/RESULTLINE/!d' ${tmpLog}
resultLine=`cat ${tmpLog} | wc -l`
if [ $resultLine -ne 1 ]; then
echo 3600
exit
fi
echo `cat ${tmpLog} | cut -d "#" -f 2`
exit
zabbix监控效果