1 在sqlserver中建立linkedserver, 以便可以从sqlserver中直接访问Oracle。
2 在sqlserver中建立dts/ssis数据传输任务,并进行定数调度。
他们两个之间没有直接同步的方法,这个依赖于你的架构设计
1,插入时同步,比如先更新了oracle,再更新redis,这个要靠代码逻辑来做。谁先谁后得看设计了。
2,查询时同步,这时你的redis是做缓存来用,那么它的更新依赖于你设定的逻辑,比如查询一条记录,先查redis,redis中没有此数据,那么查询oracle,查询完毕后,把数据插入到redis,这样以后再查询此记录,先查redis就可以获取了,速度更快一些。
3,定时同步,根据你后台的同步逻辑,根据某些条件,把数据插入到redis,比如每天某个时刻,把oracle中的某些数据,插入到redis。
4, 完整同步, 就是你的redis和oracle存储同样数据量的数据,这个建立过程上面的第一条可以做到,前提是在没有数据应用的时候都是同时上线,这样数据就都一致了,但如果已经用了oralce,现在增加了redis,那么第一条方式就不满足了,可以通过第二,第三两个情况来逐步满足。
源表中有没有一个自然增长的、与写入顺序相关的字段,比如ID、写入时间?如果有,就做一个定时运行的JOB,如每小时或每6小时,间隔根据你的需要而定;再建一个同步记录表,记录每次同步时已经同步的数据,比如ID、时间,下次JOB运行时,从上次同步过的记录往后继续追加到新库。
如果是唯一的ID,可以在JOB启动时读取源表当前最大的ID,然后追加上次同步的ID+1到最大ID范围的数据到新库,成功后在同步记录里记录当前最大的ID,作为下次同步的起始依据。
如果有时间,那就根据你的JOB运行间隔,每次只追加在时间间隔内写入的数据,比如12:00:00000到12:00:00999时间范围内的数据,然后下次追加13:00:00000到13:00:00999。
如果啥都没有,那就只好定时全表刷新,先TRUNCATE目标表,然后源表整个复制过来,不过这样做随着时间推移数据激增,效率是相当可怕的。
有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据。不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现。假设我们这边(SQLServer2005)有一个合同管理系统,其中有表contract 和contract_project是需要同步到一个MIS系统中的(Oracle9i)那么,我们可以按照以下几步实现数据库的同步。
1在Oracle中建立对应的contract 和 contract_project表,需要同步哪些字段我们就建那些字段到Oracle表中。
这里需要注意的是Oracle的数据类型和SQLServer的数据类型是不一样的,那么他们之间是什么样的关系拉?我们可以在SQLServer下运行:
SELECT
FROM msdbdboMSdatatype_mappings
SELECT
FROM msdbdbosysdatatypemappings
来查看SQLServer和其他数据库系统的数据类型对应关系。第一个SQL语句是看SQL转Oracle的类型对应,而第二个表则更详细得显示了各个数据库系统的类型对应。根据第一个表和我们的SQLServer中的字段类型我们就可以建立好Oracle表了。
SQLServer和Oracle的对应
2建立链接服务器。我们将Oracle系统作为SQLServer的链接服务器加入到SQLServer中。
具体做法参见我以前的文章>
软件说明
通过etl工具定时将SqlServer指定的表数据同步到oracle数据库
在数据库建立增删改的触发器。触发器将变更放到临时表里。
通过etl工具读取临时表同步给oracle
优点:比较实时
缺点:影响到业务系统,因为需要在业务系统建立触发器
实例说明:
例如在sqlserver有一张用户表(sys_user)需定时同步oracle数据库的用户表,
包括新增、删除、修改同步
给同步的表建三类触发器:
insert触发器:向表中插入数据时被触发;
update触发器:修改表中数据时被触发;
delete触发器:从表中删除数据时被触发。
以sqlserver的用户表举例,
Sqlserver的sys_user表,有两个字段id,name
具体流程:
以新增数据举例
Ø 一、在sqlserver新建触发器trigger_sysuser_insert
if (object_id('trigger_sysuser_insert') is not null)
drop trigger trigger_sysuser_insert
go
create trigger trigger_sysuser_insert
on sys_user --表名
for insert --插入后触发
--instead of insert --插入前触发,使用插入前触发时,不执行默认插入
as
--开始执行逻辑
declare @id int, @name varchar(20);
select @id = id, @name = name from sys_user; -------------- inserted 存放了当前插入的值
--select @name,@age
---创建临时表
if not exists (select from sysobjects where id = object_id('##sys_user_insert')
and OBJECTPROPERTY(id, 'IsUserTable') = 1)
create table ##sys_user_insert
(
id int,
name varchar(32)
);
insert into ##sys_user_insert (id,name) values(@id,@name);
go
在sys_user新增数据时会被触发,将新增的数据加入临时表##sys_user_insert,此时
的临时表 ##sys_user_insert会增加一条记录
Ø 二、配置elt流程
节点1 从临时表读取数据,写入数据流
节点2 从数据流获取数据写入oracle
节点3 从sqlserver的临时表删除已经被同步的记录
Ø 三、建立作业调度
设置调度周期
适用增量数据同步
在要同步的源表里有时间戳字段,每当数据发生新增,时间戳会记录发生变化的时间,etl工具根据时间范围定时同步数据
优点:基本不影响业务系统
缺点:要求源表必须有时间戳这一列,适用增量场景,修改、删除不太适用
定时清空oracle数据源,将sqlserver的数据全盘拷贝到oracle数据源。一般用于数据量不大,实时性要求不高的场景。
优点:基本不影响业务系统,开发、部署都很简单
缺点:效率低
Etl流程
结论
准能现场数据同步,涉及增、删、改的同步,比较适用触发器的方式进行数据同步,但触发器仍会存在失效的情况,若现场有数据质量系统,定期数据稽核,查缺补漏,保证两边数据库的一致性;
以上就是关于如何实现sqlserver中的部分表的数据定时同步到oracle全部的内容,包括:如何实现sqlserver中的部分表的数据定时同步到oracle、redis与oracle之间怎么实现数据同步、oracle10 数据库单表如何进行同步到另外一个oracle10数据库中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)