1. SQL SERVER2012同步Oracle数据
我理解的是,你的需求是将oracle中变化的数据同步到sqlserver中。
我提供的解决方案是使用oracle的ogg,就是goldengate来实现。
首先,这个需求是跨库跨平台的,一般sqlserver都装在win上,而oracle都装在linux上(当然,也有linux版的sqlserver,oracle也能装在win上,但是实现的方法和结果是一样的),但是对于ogg来讲无所谓,ogg的特点就是可以跨库跨平台跨版本来同步数据。
源端是oracle,目标端是sqlserver,可以使用11版本的ogg来同步数据,该版本功能够用,bug也相对少了,我做运维也经常用。
使用ogg的注意事项如下:
源端oracle库的同步表必须有主键。
源端oracle库必须是force logging,必须开附加日志。
初始化数据的时候,可以使用ogg自己的initload功能,省的还得用sqlserver的同步助手,费劲。
oracle和sqlserver支持的字段类型不要太特殊了,比如oracle的lob字段,sqlserver的各种text字段啥的,这些特有的字段,ogg支持不是很好,而对于int、varchar等通用的字段就没问题了。
最后,希望能帮到你,但是ogg这个东西对你来说可能是新的,所以你要用的话,得先学学,有问题可以问我。
2. oracle ogg是什么
Golden Gate(简称OGG)提供异构环境下交易数据的实时捕捉、变换、投递。
1、OGG原理
OGG是一种基于日志的结构化数据复制软件,通过捕获源数据库online redo log (在线重做日志)或archive log(归档日志)获得数据变化,形成tail(队列文件 ),再将这些tail通过网络协议,传输到目标数据库,目标端通过解析,插入至目标端数据库,从而实现源端与目标端数据同步。
2、OGG的特性:
1)、对生产系统影响小:实时读取交易日志,以低资源占用实现大交易量数据实时复制;
2)、以交易为单位复制,保证交易一致性:只同步已提交的数据;
3)、高性能,智能的交易重组和操作合并,使用数据库本地接口访问,并行处理体系,灵活的拓扑结构:支持一对一、一对多、多对一、多对多和双向复制等。
3、工作机制
(2)ogg可以连接什么数据库扩展阅读
1)、每个GoldenGate实例可支持5000个Extract和Replicat进程;
2)、每个Extract和Replicat需要25-50M或更多的内存,这取决于系统的事物量和事物大小;
3)、GoldenGate实际使用的物理内存由操作系统控制和管理,GoladenGate 缓存管理器利用操作系统内存管理功能的优势,确保GoladenGate进程持续和有效的工作;
参考资料
Oracle官网-Golden Gate
3. 不同版本的数据库可以使用ogg吗
可以的。。。
4. OGG现状是有两个源端 两个源数据库,一个目标端一个目标数据库,两个
跨数据源访问可以使用OPENDATASOURCE
下面是个跨SQLServer查询的示例
Select TableA.*,TableB.* From OPENDATASOURCE(
'SQLOLEDB',
'Data Source=ServerA;User ID=UserID;Password=Password'
).databaseAName.dbo.TableA
Left Join
OPENDATASOURCE(
'SQLOLEDB',
'Data Source=ServerB;User ID=UserID;Password=Password'
).databaseBName.dbo.TableB On TableA.key=TableB.key
下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
-------------------------------------
SQL语句实现跨Sql server数据库操作实例 - 查询远程SQL,本地SQL数据库与远程SQL的数据传递
(1)查询192.168.1.1的数据库(TT)表test1的数据select * from opendatasource('sqloledb','server=192.168.1.1;uid=sa;pwd=123456;database=TT').TT.dbo.test1
(2)从192.168.1.2的数据库(TT)表test2插入192.168.1.1数据库(TT)的表test1去insert into opendatasource('sqloledb','server=192.168.1.1;uid=sa;pwd=123456;database=TT').TT.dbo.test1 (id,[name],password) select id,[name],password
from opendatasource('sqloledb','server=192.168.1.2;uid=sa;pwd=123456;database=TT').TT.dbo.test2
希望对你有帮主,望采纳,谢谢!
5. ogg12.2.0.1.1可以用与oracle11.2.0.1的同步吗
ogg 版本和 oracle数据库版本不需要统一,ogg 12.2.0.1.1可以用于 oracle 11.2.0.1的同步,不过,如果你要使用集成模式,数据库版本必须高于11.2.0.3的版本。经典模式不限制。
6. Oracle goldengate ogg要怎么实现主备库切换啊
Oracle Goldengate目前支持主被动式的双向配置,换而言之OGG可以将来自于激活的主库的数据变化完全复制到从库中,从库在不断同步数据的同时已经为计划内的和计划外的outages做好了故障切换的准备,也就是我们说的Live Standby。这里我们重点介绍一下配置Oracle Goldengate Live Standby系统的步骤,和具体的故障切换过程。
如果自己搞不定可以找ASKMACLEAN专业ORACLE数据库修复团队成员帮您恢复!
SQL>connclinic/clinic
Connected.
SQL>droptabletv;
createtabletv(t1intprimarykey,t2int,t3varchar2(30));
Tabledropped.
SQL>
Tablecreated.
SQL>dropsequenceseqt1;
;
Sequencedropped.
SQL>SQL>
Sequencecreated.
declare
rndnumber(9,2);
begin
foriin1..100000loop
insertintotvvalues(seqt1.nextval,i*dbms_random.value,'MACLEANISTESTING');
commit;
endloop;
end;
/
/*以上脚本在primary主库的某个应用账户下创建了测试用的数据,
接着我们可以使用各种工具将数据初始化到从库中,如果在这个过程中
希望实时在线数据迁移的话,可以参考《Goldengate实现在线数据迁移》
*/
/*注意我们在LiveStandby的环境中往往需要复制sequence序列,以保证切换到备库时业务可以正常进行*/
/*初始化备库数据后,确保已与主库完全一致*/
primary:
SQL>selectsum(t2)fromtv;
SUM(T2)
----------
2498624495
SQL>selectlast_numberfromuser_sequences;
LAST_NUMBER
-----------
100001
standby:
SQL>selectsum(t2)fromtv;
SUM(T2)
----------
2498624495
SQL>selectlast_numberfromuser_sequences;
LAST_NUMBER
-----------
100001
以上完成准备工作后,我们可以进入到正式配置Goldengatelivestanby的阶段,包括以下步骤:
配置由主库到备库的extract、replicat、datapump,该步骤同普通的单向复制没有太大的区别
配置由备库到主库的extract、replicat、datapump
启动由主库到备库的extract、replicat、datapump
接下来我们会实践整个配置过程:
1.
创建由主库到备库的extract、datapump、replicat
GGSCI(rh2.oracle.com)10>dbloginuseridmaclean
Password:
.
GGSCI(rh2.oracle.com)11>addtrandataclinic.*
.TV
GGSCI(rh2.oracle.com)4>addextractextstd1,tranlog,beginnow
EXTRACTadded.
GGSCI(rh2.oracle.com)5>addexttrail/d01/ext/cl,megabytes100,extractextstd1
EXTTRAILadded.
GGSCI(rh2.oracle.com)7>viewparamsextstd1
--IdentifytheExtractgroup:
EXTRACTextstd1
--:
useridmaclean,passwordmaclean
--:
EXTTRAIL/d01/ext/cl
--Specifysequencestobecaptured:
SEQUENCEclinic.seqt1;
--Specifytablestobecaptured:
TABLEclinic.*;
--:
--TABLEEXCLUDE
GGSCI(rh2.oracle.com)17>addextractpumpstd1,exttrailsource/d01/ext/cl,beginnow
EXTRACTadded.
GGSCI(rh2.oracle.com)98>addrmttrail/d01/rmt/cl,megabytes100,extractpumpstd1
RMTTRAILadded.
GGSCI(rh2.oracle.com)129>viewparamspumpstd1
--Identifythedatapumpgroup:
EXTRACTpumpstd1
useridmaclean,passwordmaclean
--:
useridmaclean,passwordmaclean
RMTHOSTrh3.oracle.com,MGRPORT7809
--:
RMTTRAIL/d01/rmt/cl
--Passdatathroughwithoutmapping,filtering,conversion:
PASSTHRU
sequenceclinic.seqt1;
Tableclinic.*;
在备库上配置由主库到备库的replicat:
GGSCI(rh3.oracle.com)4>addreplicatrepstd1,exttrail/d01/rmt/cl,beginnow
REPLICATadded.
GGSCI(rh3.oracle.com)49>viewparamsrepstd1
--IdentifytheReplicatgroup:
REPLICATrepstd1
--:
ASSUMETARGETDEFS
--:
useridmaclean,passwordmaclean
--Specifytablesfordelivery:
MAPclinic.*,TARGETclinic.*;
--:
--MAPEXCLUDE
2.
创建由备库到主库的extract、datapump、replicat
GGSCI(rh3.oracle.com)51>dbloginuseridmaclean
Password:
.
GGSCI(rh3.oracle.com)52>addtrandataclinic.*
.TV.
/*不要忘记在备库端的相关表加上追加日志*/
GGSCI(rh3.oracle.com)53>addextractextstd2,tranlog,beginnow
EXTRACTadded.
GGSCI(rh3.oracle.com)54>addexttrail/d01/ext/cl,megabytes100,extractextstd2
EXTTRAILadded.
GGSCI(rh3.oracle.com)58>viewparamsextstd2
--IdentifytheExtractgroup:
EXTRACTextstd2
--:
useridmaclean,passwordmaclean
--:
EXTTRAIL/d01/ext/cl
--Specifysequencestobecaptured:
SEQUENCEclinic.seqt1;
--Specifytablestobecaptured:
TABLEclinic.*;
--:
--TABLEEXCLUDE
GGSCI(rh3.oracle.com)59>addextractpumpstd2,exttrailsource/d01/ext/cl,beginnow
EXTRACTadded.
GGSCI(rh3.oracle.com)60>addrmttrail/d01/rmt/cl,megabytes100,extractpumpstd2
RMTTRAILadded.
GGSCI(rh3.oracle.com)63>viewparamspumpstd2
--Identifythedatapumpgroup:
EXTRACTpumpstd2
useridmaclean,passwordmaclean
--:
useridmaclean,passwordmaclean
RMTHOSTrh2.oracle.com,MGRPORT7809
--:
RMTTRAIL/d01/rmt/cl
--Passdatathroughwithoutmapping,filtering,conversion:
PASSTHRU
sequenceclinic.seqt1;
Tableclinic.*;
在主库上配置replicat:
GGSCI(rh2.oracle.com)136>addreplicatrepstd2,exttrail/d01/rmt/cl,beginnow,checkpointtablemaclean.ck
REPLICATadded.
GGSCI(rh2.oracle.com)138>viewparamsrepstd2
--IdentifytheReplicatgroup:
REPLICATrepstd2
--:
ASSUMETARGETDEFS
--:
useridmaclean,passwordmaclean
--Specifytablesfordelivery:
MAPclinic.*,TARGETclinic.*;
--:
--MAPEXCLUDE
3.
完成以上OGG配置后,可以启动主库到备库的extract、pump、以及replicat:
GGSCI(rh2.oracle.com)141>startextstd1
SendingSTARTrequesttoMANAGER...
EXTRACTEXTSTD1starting
GGSCI(rh2.oracle.com)142>startpumpstd1
SendingSTARTrequesttoMANAGER...
EXTRACTPUMPSTD1startingGGSCI(rh3.oracle.com)70>startrepstd1
SendingSTARTrequesttoMANAGER...
REPLICATREPSTD1starting
/*如果你是在offline状态下配置的话,那么此时可以启用应用了*/
接下来我们尝试做有计划的主备库切换演练:
1.
首先停止一切在主库上的应用,这一点和DataGuardSwitchover一样。在保证没有活动事务的情况下,才能切换干净。
2.
在主库端使用LAG等命令了解extract的延迟,若返回如"AtEOF,nomorerecordstoprocess"的信息,则说明所有事务均已被抽取。
GGSCI(rh2.oracle.com)144>lagextstd1
...
Lastrecordlag:0seconds.
AtEOF,nomorerecordstoprocess.
在EOF的前提下关闭extract:
GGSCI(rh2.oracle.com)146>stopextstd1
...
Requestprocessed.
3.
同样对pump使用LAG命令,若返回如"AtEOF,nomorerecordstoprocess"的信息,则说明已抽取的数据都被发送到备库了。
GGSCI(rh2.oracle.com)147>lagpumpstd1
...
Lastrecordlag:3seconds.
AtEOF,nomorerecordstoprocess.
在EOF的前提下,关闭datapump
GGSCI(rh2.oracle.com)148>stoppumpstd1
...
Requestprocessed.
3.
检查备库端replicat的同步情况,如返回"AtEOF,nomorerecordstoprocess.",则说明所有记录均被复制。
GGSCI(rh3.oracle.com)71>lagrepstd1
...
Lastrecordlag:5seconds.
AtEOF,nomorerecordstoprocess.
在EOF的前提下关闭replicat
GGSCI(rh3.oracle.com)72>stoprepstd1
...
Requestprocessed.
4.
紧接着我们可以在备库上为业务应用用户赋予必要的insert、update、delete权限,启用各种触发器trigger及cascadedelete约束等;
以上手段在主库上对应的操作是收回应用业务的权限,disable掉各种触发器及cascadedelete约束,
之所以这样做是为了保证在任何时候扮演备库角色的数据库均不应当接受任何除了OGG外的手动的或者应用驱动的业务数据变更,
以保证主备库间的数据一致。
5.
修改原备库上的extract的启动时间到现在,已保证它不去抽取那些之前的重做日志
GGSCI(rh3.oracle.com)75>alterextstd2,beginnow
EXTRACTaltered.
GGSCI(rh3.oracle.com)76>startextstd2
SendingSTARTrequesttoMANAGER...
EXTRACTEXTSTD2starting
若之前没有启动由备库到主库的pump和replicat的话可以在此时启动:
GGSCI(rh3.oracle.com)78>startpumpstd2
SendingSTARTrequesttoMANAGER...
EXTRACTPUMPSTD2starting
GGSCI(rh2.oracle.com)161>startrepstd2
SendingSTARTrequesttoMANAGER...
REPLICATREPSTD2starting
6.此时我们可以正式启动在原备库现在的主库上的应用了
接下来我们尝试回切到原主库上:
1.前提步骤与之前的切换相似,首先停止在原备库上的任何应用,
之后使用LAG命令确认extract和replicat的进度,在确认后关闭extract和replicat。
完成在主库上的维护工作:包括赋予权限,启用触发器等等。
2.修改原主库上的extract的开始时间为当前,保证它不去处理之前的重做日志:
GGSCI(rh2.oracle.com)165>alterextractextstd1,beginnow
EXTRACTaltered.
3.此时我们已经可以启动在原主库现在的主库上的应用了
4.启动最早配置的由主库到备库的extract、pump、replicat:
GGSCI(rh2.oracle.com)166>startextstd1
SendingSTARTrequesttoMANAGER...
EXTRACTEXTSTD1starting
GGSCI(rh2.oracle.com)171>startpumpstd1
SendingSTARTrequesttoMANAGER...
EXTRACTPUMPSTD1starting
GGSCI(rh3.oracle.com)86>startrepstd1
SendingSTARTrequesttoMANAGER...
REPLICATREPSTD1starting
以上完成了OGG的LiveStandby中主备库之间的计划内的切换Switchover,That'sGreat!
7. dblink与ogg的区别
兄弟,我也是因为需求,需要在同一个库中为两个库中建立dblink,但是一直提示,解析失败,你是怎么建的