找回密码
 FreeOZ用户注册
查看: 3019|回复: 14
打印 上一主题 下一主题

[数据库] 如果同步Oracle的数据到MS SQL?

[复制链接]
跳转到指定楼层
1#
发表于 11-8-2010 22:48:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除, 无法发言

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
很多种方法, BCP, DTS, SSIS, Linked Server, Snapshot, Replication........我们逐个看。
回复  

使用道具 举报

2#
 楼主| 发表于 11-8-2010 22:53:04 | 只看该作者

看看我工作的几个公司的解决方案

提示: 作者被禁止或删除, 无法发言
CommSec:BCP。
Suncorp:BCP。
CUNA:DTS。

DTS是SSIS的前身,推荐更新到 SSIS。
回复  

使用道具 举报

3#
 楼主| 发表于 11-8-2010 22:54:04 | 只看该作者

这个人用Linked Server

提示: 作者被禁止或删除, 无法发言
http://www.cnblogs.com/dutguoyi/articles/700081.html

现在有两个系统,一个主要系统使用Oracle,就叫它OracleProject。 另外一个系统使用SQL Server,就叫它SQLServerProject。现在需要将它们的数据进行同步。主要数据库为Oracle,SQL Server是需要Update的。两个数据库中的数据表结构不相同。
有什么方法?
自己以前没有做过,会逐渐把解决方法写出来。大家有什么建议,请不吝赐教。:) 谢谢。
现在使用的方法是: SQLServer数据库-->Security-->linked servers,在这里将Oracle数据库添加进来。例如,linked server的名字为LS,Oracle的schema是LSschema,数据表为table1。那么通过下面的语句就可以在SQLServer中查询Oracle的数据表了。

select * from LS..LSschema.table1
回复  

使用道具 举报

4#
发表于 11-8-2010 23:05:16 | 只看该作者
ETL类的工作: http://en.wikipedia.org/wiki/Extract,_transform,_load#Tools

我在HP时维护过ConnectIT这个工具,就是把各种数据源之间转来转去
回复  

使用道具 举报

5#
发表于 11-8-2010 23:07:27 | 只看该作者
提示: 作者被禁止或删除, 无法发言
楼主指的是实时同步吗?
回复  

使用道具 举报

6#
发表于 11-8-2010 23:37:50 | 只看该作者
Biztalk
回复  

使用道具 举报

7#
 楼主| 发表于 12-8-2010 07:33:59 | 只看该作者
提示: 作者被禁止或删除, 无法发言
回复  

使用道具 举报

8#
 楼主| 发表于 12-8-2010 07:34:38 | 只看该作者
提示: 作者被禁止或删除, 无法发言
原帖由 trisun 于 11-8-2010 23:37 发表
Biztalk


没有第三方的软件,只有Oracle 和 MS SQL 自带的那些服务可以用。
回复  

使用道具 举报

9#
 楼主| 发表于 12-8-2010 07:35:20 | 只看该作者
提示: 作者被禁止或删除, 无法发言
原帖由 coredump 于 11-8-2010 23:05 发表
ETL类的工作: http://en.wikipedia.org/wiki/Extract,_transform,_load#Tools

我在HP时维护过ConnectIT这个工具,就是把各种数据源之间转来转去



如果只能用SQL自带的工具呢?
回复  

使用道具 举报

10#
 楼主| 发表于 12-8-2010 07:41:52 | 只看该作者

我目前的想法

提示: 作者被禁止或删除, 无法发言
在Oracle上建立prod database 的 Snapshot,还不是知道让不让我建立呢,然后所有的同步对着这个snapshot进行。

在SQL上建立一个 Linked Serverr指向Oracle

在SQL使用SSIS或者SP更新 datawarehouse

=================================================================

我觉得 snapshot是比较可行的方法,可是如果Oracle上面不允许我建立数据库的话,我就只能连接到SQL,在SQL上建立,那不就等于搬移整个数据库数据部分到SQL么?这是不是太傻了?

如果我用SSIS逐个表去查询Linked Server 或不会更好一些?不过这个查询肯定是对着生产数据表进行的,也不好。

同步表的时候,我还没想好到底是用SSIS呢,还是直接用SP呢?哪一个好一点?里面的内容都差不多,使用三条SQL语句:

Update 更新的数据
Insert 新数据
Delete 在Prod上被删除的数据

这样我就有了一份生产数据表的同步备份。然后在用这个表去更新我Datawarehouse里面的表。
回复  

使用道具 举报

11#
发表于 12-8-2010 10:46:53 | 只看该作者
原帖由 xblues 于 2010-8-12 07:41 发表
在Oracle上建立prod database 的 Snapshot,还不是知道让不让我建立呢,然后所有的同步对着这个snapshot进行。

在SQL上建立一个 Linked Serverr指向Oracle

在SQL使用SSIS或者SP更新 datawarehouse

======== ...


Linked server 是最不好的方法,如果数据量大的话儿会有很多问题,如果oracle 和sql server 跨网络也会有麻烦。

我没有很多 异构数据源之间同步的经验,但是仅从sql server这方面考虑,我觉得ssis是解决异构数据同步的 比较好的方式
回复  

使用道具 举报

12#
发表于 12-8-2010 11:12:05 | 只看该作者
sql server 有replication, log shipping可以用来进行数据同步,不过我只知道用他们做 同构数据,不知道异构的能不能用replication
回复  

使用道具 举报

13#
发表于 12-8-2010 11:22:34 | 只看该作者
这篇文章 不错,希望可以解决你的问题


利用SQLServer2005复制功能实现与Oracle数据库同步
http://blog.csdn.net/studyzy/archive/2007/02/05/1502426.aspx

利用SQLServer2005复制功能实现与Oracle数据库同步 收藏
在项目中经常会遇到一个项目操作几个数据库的情况,若是同种类型的数据库也还好说,可以直接链接两个数据库,也可以用数据库的同步功能。若我们的项目使用SQLServer2005进行开发,而且项目中要用到Oracle数据库中的数据,那么又该怎么实现拉?一般来说方案有以下几种。
1.分别建立链接对数据库进行操作,SQLServer可以用ADO.NET,操作Oracle可以用OLEDB或者用System.Data.OracleClient(需要添加引用才能用)
这种方案的优点就是简单,各自写各自的数据库操作代码,缺点就是不能将两个数据库中的表直接进行联合查询,链接Oracle的每台机器必须安装OracleClient才可以使用。
2.使用同义词操作Oracle数据库。
这种方法的具体操作我在以前的文章中已经写清楚了,这样做一来可以进行表的联合查询二来不需要每台机器都安装OracleClient,但是还是有一个缺点:效率低,比如对同义词使用like去查找需要的数据,如果是直接连Oracle数据库也许只要0.1秒就可以找到答案,但是用同义词可能就要等10秒20秒或更久。原来SQLServer并不是直接把查询语句传递给Oracle,让Oracle执行操作,而是将所有数据都取到SQLServer服务器上,边取数据边分析,直到满足查询条件为止。其实这种数据放在两个服务器上还有一个缺点就是一旦Oracle服务器宕机,即使我们这边的所有服务器都是好的,那么我们的程序中用到Oracle数据的地方就无法使用。
3.直接链接Oracle数据库+同义词+作业+异常跳转 方式。
这种方法具体讲就是我们的程序直接用OLEDB(OracleClient)链接Oracle数据库,同时SQLServer服务器也建立了同义词指向Oracle,在SQLServer上建立作业,将同义词中的数据拷贝到SQLServer服务器的表中。一旦Oracle宕机,程序中就会捕捉到异常,于是就使用SQLServer中的数据。这样做比较复杂,需要一定的编程,效率也不是特别高,但是优点也是明细的,平时链接Oralce服务器,异常情况下链接SQLServer中的备份数据,保证了程序的正常运行。
4.直接编写一个程序,以服务或自启动方式一直运行,每隔一段时间将Oracle数据库中的数据写到SQLServer数据库中。
这种方法就是编程复杂,具有很大难度。
5.利用SQLServer2005的复制功能将Oracle数据库中的数据同步到SQLServer服务器中,程序只操作SQLServer,不链接Oracle数据库。
这种方法不需要编写任何代码,由于只对SQLServer进行查询,所以查询效率高可以做多表链接,开发人员也不需要再装OracleClient,也不用害怕Oracle服务器宕机导致我们的相关程序无法使用。优点倒是很多,那么有没有缺点拉?缺点还是有的,主要是取得的数据不是实时的数据,Oracle那边的数据更新了,我们这边还有可能是老数据。
前面的四种方法我就不用多讲了,这次主要是讲第五种方法的具体实现:

1.安装SQLServer复制功能。
在安装SQLServer数据库的时候选上“复制”,将“复制”功能安装到服务器。微软说如果第一次安装的时候没有装,以后再想添加该功能只需要运行安装程序将“复制”选上就可以了,不过说是这么说,我试了几次都不行,我也不知道怎么回事,为了安装上复制,所以将SQLServer卸载了,重新安装!这种方法很笨,不过我实现想不出其他办法了,希望高手指点。
2.设置Oracle服务器端的权限。
创建一个用于复制用的用户,授予下列权限:
CREATE PUBLIC SYNONYM 和 DROP PUBLIC SYNONYM
CREATE PROCEDURE
CREATE SEQUENCE
CREATE SESSION
还必须直接为用户授予下列权限(不是通过角色):
CREATE ANY TRIGGER。
CREATE TABLE
CREATE VIEW
同时该用户还必须对要发布的表所在表空间有UNLIMITED的权限,还要针对每个要用于同步的表设置Select权限。
3.SQLServer服务器上安装OracleClient10g
必须安装了才可以链接Oracle服务器,不推荐安装Oracle9i,即使我们要链接的Oracle是9i的。安装完成以后重启SQLServer服务器。用PLSQL或其他工具测试一下是否可以链接到Oracle服务器。
4.设置SQLServer Agent权限
在SQLServer服务器上 新建用户,将该用户加为管理员,在“服务”中找到“SQLServer Agent”,将其启动用户改为该用户,重启该服务。
5.配置分发
打开ManagementStudio右键“复制”节点,选中“配置分发”,按向导一步一步操作,将快照文件夹路径指定为一个专门的共享文件夹,其他都不用修改,完成配置分发。
6.添加Oracle发布
右键“本地发布”->“新建Oracle发布”,启动Oracle发布向导,添加Oracle服务器,将在Oracle服务器上新建的用户密码输入,一直下一步,选快照发布,选中需要发布的表,选中“立即创建快照发布”和“计划运行快照代理”,计划时间就自己根据需要设定,“快照代理”选择“代理服务帐户”,发布名称填写需要的名称,比如“Test1”,然后点击完成。这样就完成了发布工作。
7.添加Oracle订阅
右键“本地订阅”->“新建订阅”运行向导,选中刚才新建的Test1发布,一般选中“推送订阅”,指定要订阅的数据库(比如:mis),也就是要用来存储Oracle数据的数据库,订阅属性中选中用SQLServer代理用户运行,代理计划“连续运行”,初始化时间“立即”,然后创建订阅完成。
这个时候我们打开订阅的数据库mis,我们可以看到其中添加了Oracle发布出来的表,而且这些内容会按照计划隔段时间同步Oracle数据一次。
到此我们的同步完成。
8.测试是否同步成功
用PLSQL往Oracle中写入数据,修改数据,删除数据,如果发布时候选中的是每一分钟运行快照代理一次,那么隔一分钟后,我们再去打开SQLServer中的表,我们可以看到其中的内容和Oracle一样进行了变化。
PS:在“本地发布”下选中我们的发布,右键,“查看代理运行状态”可以看到我们的发布是否成功。

评分

参与人数 1威望 +49 收起 理由
xblues + 49 谢谢分享!

查看全部评分

回复  

使用道具 举报

14#
 楼主| 发表于 13-8-2010 07:10:59 | 只看该作者

目前的想法

提示: 作者被禁止或删除, 无法发言
我现在已经得到了Oracle的账号。

方法一:
建立ODBC数据源
在DTS中通过ODBC数据源调用Oracle的表进行数据copy操作

方法二:
不需要从控制面板先建立ODBC连接,而是在SSIS中直接输入Oracle账号信息,通过ODBC调用

方法三:
不需要从控制面板先建立ODBC连接,而是在Linked Servers中直接输入Oracle账号信息,建立一个Linked Server到Oracle
用SQL查询这个Linked Server

方法四:
在Oracle建立发布
在SQL上建立订阅

  • DTS是老的方法,应该用SSIS代替,适合Copy数据
  • Linked Server也是不错的方法,适合实时查询
  • 方法四需要在Oracle上做操作,我目前没有Oracle数据库的操作权限
  • 所以目前我使用 SSIS 和 Linked Server


昨天实验SSIS调用成功了
Linked Server没有成功,可能是我账号的权限问题?

评分

参与人数 1威望 +30 收起 理由
ubuntuhk + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

15#
发表于 13-8-2010 09:47:08 | 只看该作者
我觉得方法四  比较好,

linked server 最好 不要用在生产环境里,这个对环境依赖很大,网络 状况不好,会导致数据无法同步,而且每次,sql server 不是把脚本 送到远端执行, 会把所有的数据拷贝到本地,然后 再做筛选比较,效率极低,极不稳定。我现在就有个应用系统用 linked server,带来了很多麻烦。

SSIS方法,你要自己处理数据更新的问题,例如 要copy的数据是不是已经在本地数据库了,是要update还是insert,怎么确定哪些字段变化了,都是问题....

评分

参与人数 1威望 +49 收起 理由
xblues + 49 谢谢分享!

查看全部评分

回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 24-4-2024 16:28 , Processed in 0.055626 second(s), 35 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表