我有一个Oracle数据库和一个SQL Server数据库 . 有一个表说 Inventory
,它在两个数据库表中都包含数百万行,并且不断增长 .
我想比较Oracle表数据和SQL Server数据,以找出每天在SQL Server表中缺少哪些记录 .
哪种方法最好?
-
创建SSIS包 .
-
创建Windows服务 .
我想消耗更少的资源来实现这个功能,这需要更少的时间和更少的资源 .
例如:oracle中有1800万条记录,SQL Server中有16/17百万条记录
这两种不同数据库的情况出现是因为两种不同的应用程序在线和离线
EDIT :如何将SQL Server从Oracle通过Oracle Gateway连接到SQL Server
1)从Oracle直接查询到SQL服务器,第一次更新SQL Server中的缺失记录 .
2)在Oracle上创建一个触发器,当从Oracle删除记录并在新的oracle表中插入已删除的记录时执行该触发器 .
3)创建SSIS包以将新创建的oracle表映射到SQL服务器以更新SQL服务器记录 . 这样,只有少数记录必须通过SSIS每天处理 .
您如何看待这种方法?
5 回答
我将创建一个SSIS包,并使用数据流/ OLE DB数据源从Oracle表加载数据 . 如果您有SQL Enterprise,Attunity连接器会更快一些 .
然后我将SQL Server表中的密钥加载到Lookup转换中,在那里我将匹配密钥上的2个源,并将不匹配的行引导到单独的输出中 .
最后,我将不匹配的行输出定向到OLE DB命令,以更新SQL Server表 .
这个SSIS包需要大量内存,但由于匹配是在内存中以最小的IO完成的,因此速度可能会优于其他解决方案 . 它需要足够的可用内存来缓存SQL Server表中的所有密钥 .
SSIS还具有以下优点:如果您以后需要它,它还有许多其他转换功能 .
我认为最好的方法是使用oracle网关 . 只需按照步骤操作即可 . 我有类似的经历 .
安装和配置SQL Server的Oracle数据库网关 . https://docs.oracle.com/cd/B28359_01/gateways.111/b31042/installsql.htm
现在您可以创建从oracle到sql server的dblink .
创建一个过程,比较oracle数据库中缺少的记录并插入到sql server数据库中 .
例如,您可以在过程中使用此语句 .
当两个数据库都联机时,将丢失的记录插入到sql server中 . 否则调度程序失败或您可以手动执行该过程 . 它需要最少的资源 .
您基本上想要做的是从Oracle复制到SQL Server .
您可以在SSIS,Windows服务或多个平台中执行此操作 . 真正的诀窍是使用正确的设计模式 .
有两种通用的设计模式
你从两个系统中获取 all 记录并在某处比较它们(到目前为止,我们有建议在SSIS中进行比较或在Oracle上进行比较但尚未建议在SQL Server上进行比较,尽管这是有效的)
你在这里比较1800万条记录,所以这是很多工作
您记录自上次复制后发布者(即Oracle)中的更改,然后将这些更改应用于订阅者(即SQL Server)
您可以通过在Oracle端实现触发器和日志表来手动执行此操作,然后使用可能在SQL Agent中安排的常规ETL过程(SSIS,命令行工具,文本文件等)将这些应用于SQL Server .
或者您可以使用现成的复制功能将Oracle设置为发布者,将SQL设置为订阅者:https://msdn.microsoft.com/en-us/library/ms151149(v=sql.105).aspx
你将不得不尝试其中的一些,看看哪些对你有用 .
鉴于此目标:
事务复制效率更高但更复杂 . 出于维护目的,您最熟悉哪些平台(.Net,SSIS,Python等)?
我建议使用自制的ETL解决方案 .
安排oracle job导出源表数据(基于应用程序逻辑的日常方式)to plain CSV格式 .
安排SQL-Server job(从第一个oracle作业可接受的延迟)读取此CSV文件并使用BULK INSERT将其导入sql-servter内的中型表 .
SQL-Server作业的最后一部分将是读取中型表数据并执行逻辑(插入,更新目标表) . 我建议另外一个表来存储这个日常工作结果的报告 .
其他选择:
如果可以将Oracle网关用于SQL Server,则无需传输数据即可直接进行查询 .
如果你不能使用在Oracle网关中,您可以使用Pentaho数据集成或其他ETL工具来比较表并获得结果 . 很容易使用 .