xiaui520 发表于 2018-9-23 10:32:28

异构库环境的ETL,oracle VS mssql

  1、环境需求描述:
  用户内网有一台oracle 10g库,外网有一台oracle 9i。用户通过内网发布人才招聘相关信息,所有的信息在一张表里面,运行一个export/import脚本把内网该表同步到外网表,内网和外网之间应该 是建立了临时表lb_retain,这张表是作为外网应用使用。该用户开发的新CMS系统(ASP.NET),数据库是采用MSSQL SERVER 2005 X64,该数据库也是位于外网环境中。由于用户发布招聘信息不想在新CMS平台上进行,所以不得不对这一信息进行整合。最终要使该招聘信息能在新网站上显 示给最终用户。
  2、解决思路:
  分析以上需求,即源oracle库同 步到目标mssql 2005,为了达到异构库环境的表与表之间的数据同步,本次解决方案是采用了MSSQL商业智能解决方案,用SQL Server Business Intelligence Development Studio工具创建Integration Services 项目创建DTS包,该包可以处理非常复杂的数据挖掘工作(如果源是mssql,目标是oracle的话,可以使用oracle的透明网关)。其中,我建立 从oracle抽取数据并插入到新网站所对应的MSSQL表招聘里面。这样就达到了整合的效果,只要拿到了数据插入到新应用所在的库里面去,就可以整合到 了新应用的所有功能,而不需要二次开发,也不需要写应用层代码来操作oracle库了。
  3、解决过程
  (1)新建Integration services项目

  (2)SSIS导入导出向导--建立基本的数据库连接串以及基本的SQL,选择源

  (3)选择目标

  (4)编写SQL语句

  (5)建立源列到目标表的列的映射

  (6)下一步,警告先不管

  (7)分别添加“数据转换”、“派生列”、“脚本组件”
  “数据转换”把源ORACLE的varchar2列转换为MSSQL所兼容的列

  (8)“派生列”
  根据你的业务不同配置也是不太一样的,这里所要添加“派生列”是因为源ORACLE库没有与目标库对应的列,所以要在同步的过程中生成新列并赋初值

  (9)“脚本组件”
  “脚本组件”是为了处理比较复杂的业务流程,比如本方案有一个字段是要自增的,所以要编写脚本
  设置输入列
  设计脚本:
  ScriptMain:
  ' Microsoft SQL Server Integration Services user script component
  ' This is your new script component in Microsoft Visual Basic .NET

  ' ScriptMain is the entrypoint>  Imports System
  Imports System.Data
  Imports System.Math
  Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
  Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

  Public>  Inherits UserComponent
  Dim intCounter As Integer = 1 'Set intial value here
  Public Overrides Sub 输入0_ProcessInputRow(ByVal Row As 输入0Buffer)
  Row.Taxis = intCounter
  intCounter = intCounter + 1 ' Set the incremental value here
  End Sub

  End>  BufferWrapper
  ' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
  ' Microsoft SQL Server Integration Services buffer wrappers

  ' This module defines>  ' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
  Imports System
  Imports System.Data
  Imports Microsoft.SqlServer.Dts.Pipeline
  Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

  Public>  Inherits ScriptBuffer
  Public Sub New(ByVal Buffer As PipelineBuffer, ByVal BufferColumnIndexes As Integer())
  MyBase.New(Buffer, BufferColumnIndexes)
  End Sub
  Public Property () As Int32
  Get
  Return CType(Me(0), Int32)
  End Get
  Set
  Me(0) = Value
  End Set
  End Property
  Public Property As Boolean
  Get
  Return IsNull(0)
  End Get
  Set
  SetNull(0)
  End Set
  End Property
  Public Function NextRow() As Boolean
  NextRow = MyBase.NextRow()
  End Function
  Public Function EndOfRowset() As Boolean
  EndOfRowset = MyBase.EndOfRowset
  End Function

  End>  ComponentWrapper
  ' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
  ' Microsoft SQL Server Integration Services component wrapper

  ' This module defines the base>  ' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
  Imports System
  Imports System.Data
  Imports Microsoft.SqlServer.Dts.Pipeline
  Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
  Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

  Public>  Inherits ScriptComponent
  Public Connections As New Connections(Me)
  Public Variables As New Variables(Me)
  Public Overrides Sub ProcessInput(ByVal InputID As Integer, ByVal Buffer As PipelineBuffer)
  If InputID = 1572 Then
  输入0_ProcessInput(New 输入0Buffer(Buffer, GetColumnIndexes(InputID)))
  End If
  End Sub
  Public Overridable Sub 输入0_ProcessInput(ByVal Buffer As 输入0Buffer)
  While Buffer.NextRow()
  输入0_ProcessInputRow(Buffer)
  End While
  End Sub
  Public Overridable Sub 输入0_ProcessInputRow(ByVal Row As 输入0Buffer)
  End Sub

  End>
  Public>  Dim ParentComponent As ScriptComponent
  Public Sub New(ByVal Component As ScriptComponent)
  ParentComponent = Component
  End Sub

  End>
  Public>  Dim ParentComponent As ScriptComponent
  Public Sub New(ByVal Component As ScriptComponent)
  ParentComponent = Component
  End Sub

  End>  (10)打开“目标”的数据流
  建立映射关系

  (11)设置一下ETL包,不然等下添加JOB的时候有可能出错
  “项目属性”-“调试”-“调试选项”-Run64BitRuntime=false(后面讲解释原因)
  包的加密方式用-EncryptSensitiveWithPassword

  (12)直接执行该包,看结果,没有错误,成功后就开始把它加入到MSSQL的JOB
  打开SQL Server Management Studio并开启SQL SERVER代理,新建作业,详细怎么去创建可以做官网去查文档,这里只讲关键步骤:

  在命令窗口里面输入:

[*]"C:\Program Files (x86)\Microsoft SQL Server\90\DTS\Binn\DTExec.exe" /FILE "C:\ETL\ETL\ETL.dtsx" /DECRYPT 123456 /MAXCONCURRENT " -1 " /CHECKPOINTING OFF
  让DTExec.exe这个应用程序去调用刚刚创建好的ETL.DTSX包,/DECRYPT 123456为该包的密码。
  最后,对(11)中的Run64BitRuntime=false做解释,这样操作表示将包做为32位处理。按官方说法我们只能创建一个32位的ETL.DTSX包
  官方说法:
  此外,某些 OLE DB 提供程序和某些 ADO.NET 提供程序不可用的 64 位版本。如果在包中使用这些提供程序,64 位 SQL Server 代理程序通过使用 64 位 DTExec.exe 实用程序运行包时出现连接的各种问题。
  然后,调度 64 位 SQL Server 代理程序必须通过使用 32 位版本的 DTExec.exe 实用程序运行包。
  官方理解,调度 64 位 SQL Server 代理程序:http://support.microsoft.com/kb/934653/zh-cn

页: [1]
查看完整版本: 异构库环境的ETL,oracle VS mssql