標籤:
問題背景:
剛進入公司不久的BI新手,最近接部門的一個交接項目,需要在SQL Server上通過openquery來擷取Oracle資料庫的資料。各種配置,各種設定折騰了一周之久。在此,將自己的問題解決過程拿出來與大家分享。這裡需要強調一點,網路資源雖然強大,但是每個人的問題一定是specific的,切忌生搬硬套。
系統配置:Windows server 2012 R2,64bit Intel Xeon 8 threads,48GB Memory;
預裝軟體:VS 2012 32bit,SQL Server 2014 64bit,Oracle Client 11g 32bit;其中,所有盤符及其子檔案均已設定SQL SERVER\Agent均有讀寫、可執行許可權。
在以上條件下,SSMS中的Linked server無法顯示Oracle provider,ODBC中也沒有Oracle home的驅動。因此,無法直接通過openquery來操作Oracle資料庫的表。
解決方案:
問題的解決從一周前說起。
剛開始,本人資訊檢索能力比較差,很久都沒有找到有效資訊。基本在Oracle Community、MSDN、Stackoverflow這三個社區找到點資訊。但試了一下均不奏效。其中有一個文章說在安裝64bit的Oracle database後問題解決了,但是不知道是何原因。
接下來,一位同事遇到相同的問題,我給他說,我聽說過database的解決方案但沒有嘗試。接下來,他在Work station上安裝了database也成功在SSMS中通過openquery連結了Oracle資料庫。但是,當我想自己裝的時候,他說不確定自己裝的是哪個版本的database。經確認他裝的是32bit,並在2008版的SSMS上。接下來他推薦我先安裝32bit的database試一下。
1)安裝32bit Oracle資料庫 (失敗)
我首先嘗試公司軟體庫中的32bit資料庫,結果安裝成功後,SSMS、ODBC中均無任何反應。在網上又經過搜尋,什麼system32檔案夾dll檔案的檢查、註冊表的修改都做過,沒有效果。最後結論,32bitSSMS-->32bitOracle,64bitSSMS-->64bitOracle,所以我想不明白為什麼那個同事的是32bit的。
然後,我就卸載Oracle 32bit的資料庫。。。各種坑。。。(按照網上完全卸載來做的)
2)安裝64bit Oracle資料庫 (無法安裝)
按照網上的卸載過程,註冊表需要刪除,但是由於Oracle的註冊表系列對32bit Client端和database是通用的,所以卸載完成後,Client端也不能用了。連帶構建的SSIS包也無法使用,32bit的Oracle Provider失效。於是,就必須重裝32bit Client端。。。
Oracle 11g安裝包的通病是,它無法相容Win7及以上版本,於是,調整setup.exe檔案為Vista相容模式。最終,安裝成功。測試後32Bit Oracle Provider亦能正常使用。那麼,就接著安裝64bit的database。
新的問題又出現了!database安裝包的setup.exe點擊後出現黑框後,接下來就沒有反應了!!!無論是否設定相容模式,均是這種情況。接下來,分別測試了64bit Client端、32bit database、32bit Client端、64bit instant Client、32bit instant Client均出現類似情況,令人苦悶至極!最後,回到很久以前使用的方法,ODAC 64bit Xcopy,然而並沒有什麼卵用,命令提示字元下安裝ODAC竟然Access denied。
3)轉機,命令提示字元下安裝64bit Client端
在此時,我已十分沮喪,在網上搜尋解決方案,然而也是令人失望。。。網上建議大致為重裝系統、盤符空間大小問題、重裝32bit SSMS、問答無結果。然而,由於伺服器牽涉使用者較多且我費了九牛二虎之力方將現有的job在SSMS上部署成功,因此,上述解決方案均不適用。無意中,看見部落格園袁曉平關於64bit SSMS通過ODBC連結32bit Oracle的文章(http://www.cnblogs.com/yuanxiaoping_21cn_com/archive/2013/11/20/3433020.html),讓我重新燃起希望。裡面提到要同時安裝32bit和64bit Client端,然後,修改註冊表,構建ODBC DSN,在SSMS中利用ODBC進行連結。其中,兩種Client端是同時安裝的,而我的情況是已經安裝了32bit。
先不管,試試64bit Client端。然後,開啟安裝包,setup.exe一閃而過。。。我瞬間石化,彷彿又回到了問題的起點,始終無法進入Universal Installation介面。設定相容模式亦是如此。不過,我還是決定試試通過命令提示字元來啟動.exe檔案。首先,將所有的相容模式disable掉,然後在命令提示字元下cd到安裝資料夾,直接安裝。UI介面出來了,這一刻我激動萬分。
4)修改設定檔改變相容性
就在高興的時候,安裝檢測,系統版本不相容。我將相容性設定後,再用命令提示字元開啟,結果一閃而過。然後,我就拚命搜尋有關Oracle安裝,相容性設定問題。有一個部落格園文章提到,在安裝database時,可以添加當前系統版本到設定檔xxx.xml,就可以通過系統檢測。我想Client端必定也存在此類檔案,果不其然,被我找到了。
首先,進入解壓後安裝包路徑,進入\client\stage\prereq目錄,找到prerequisite.properties設定檔,開啟。有如下資訊:
prerequisite_input=client/client_prereq.xml
rulemap=oui/rulemap.xml;common/rulemap.xml
knowledgesource=oui/knowledgesrc.xml
reffiles=client/refhost.xml;client/refhost_instantClient.xml
javalibs=oui/OraPrereqChecks.jar; client/clientprereq.jar
每行等號相當於指向了一個具體設定檔的位置,下來,檢查系統版本的設定檔最可能在黑色標記的行。但是最好還是一個個找。根據第一行,猜測檔案應在\client目錄下,於是找到\client\stage\prereq\client目錄下果真有client_prereq.xml,然後,開啟檢查。發現refhost.xml檔案夾中有這麼一段
<CERTIFIED_SYSTEMS>
<OPERATING_SYSTEM>
<!--Microsoft Windows 2000-->
<VERSION VALUE="5.0"/>
<SERVICE_PACK VALUE="1"/>
</OPERATING_SYSTEM>
</CERTIFIED_SYSTEMS>
於是,我根據自己系統版本,添加記錄為
<OPERATING_SYSTEM>
<!--Windows Server 2012 R2-->
<VERSION VALUE="6.2"/>
<SERVICE_PACK VALUE="1"/>
</OPERATING_SYSTEM>
然後,用命令提示字元安裝setup.exe檔案,結果安裝成功。
5)配置ODBC,配置SSMS Linked Server (成功)
最後,在64bit ODBC中可以找到Oracle home1的driver,於是,修改Oracle Client安裝目錄下的tns檔案,ODBC測試連接成功。
在SSMS中,建立Linked Server,直接選擇Oracle provider for ole db,輸入相應配置,在Security選項輸入使用者名稱、密碼,測試成功。修改Linked server中Oraoledb.provider的配置,選中Allow in process,利用openquery測試,成功。回過頭在測試原來32bit下的SSIS包和已部署的agent job,均不影響。
至此,64bit SSMS串連並擷取32bit Oracle資料全部成功結束。
SQL Server 2014 64位版本連結32位Oracle資料庫