異構庫環境的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項目

clip_image001

(2)SSIS導入導出嚮導--建立基本的數據庫連接串以及基本的SQL,選擇源

clip_image002

(3)選擇目標

clip_image003

(4)編寫SQL語句

clip_image004

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

clip_image005

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

clip_image006

(7)分別添加“數據轉換”、“派生列”、“腳本組件”

“數據轉換”把源ORACLE的varchar2列轉換爲MSSQL所兼容的列

clip_image007

(8)“派生列”

根據你的業務不同配置也是不太一樣的,這裏所要添加“派生列”是因爲源ORACLE庫沒有與目標庫對應的列,所以要在同步的過程中生成新列並賦初值

clip_image008

(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 class for script components

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

Public Class ScriptMain

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 Class

BufferWrapper

' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!

' Microsoft SQL Server Integration Services buffer wrappers

' This module defines classes for accessing data flow buffers

' 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 Class 輸入0Buffer

Inherits ScriptBuffer

Public Sub New(ByVal Buffer As PipelineBuffer, ByVal BufferColumnIndexes As Integer())

MyBase.New(Buffer, BufferColumnIndexes)

End Sub

Public Property [Taxis]() As Int32

Get

Return CType(Me(0), Int32)

End Get

Set

Me(0) = Value

End Set

End Property

Public Property [Taxis_IsNull] 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 Class

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 class for your component

' 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 Class UserComponent

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 Class

Public Class Connections

Dim ParentComponent As ScriptComponent

Public Sub New(ByVal Component As ScriptComponent)

ParentComponent = Component

End Sub

End Class

Public Class Variables

Dim ParentComponent As ScriptComponent

Public Sub New(ByVal Component As ScriptComponent)

ParentComponent = Component

End Sub

End Class

(10)打開“目標”的數據流

建立映射關係

clip_image009

(11)設置一下ETL包,不然等下添加JOB的時候有可能出錯

“項目屬性”-“調試”-“調試選項”-Run64BitRuntime=false(後面講解釋原因)

包的加密方式用-EncryptSensitiveWithPassword

clip_image010

(12)直接執行該包,看結果,沒有錯誤,成功後就開始把它加入到MSSQL的JOB

打開SQL Server Management Studio並開啓SQL SERVER代理,新建作業,詳細怎麼去創建可以做官網去查文檔,這裏只講關鍵步驟:

clip_image011

在命令窗口裏面輸入:

  1. "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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章