因為有個業務場景需要訪問客戶DB2資料庫的資料,我們使用的Oracle,百度一下是有方法的,本來以為很簡單,沒想到搞了一天,因為資料庫版本都太老,使用的也少走了不少彎路,在此記錄下來給需要的人借鑑。
我們客戶使用的是DB2 V9.7,我需要自己先本地測試再去連線客戶資料庫。IBM官網已經不再提供DB2 V9.7,網上找了很久找到一個這個版本IBM.DB2.Express-C.9.7資料庫.db2exc_970_WIN_x86,將就用。win10系統安裝不了,我是虛擬機器win7安裝成功。
按步驟安裝好DB2。Oracle連線DB2是通過ODBC然後建立dblink連線,而且DB2 9.7 最高只支援Oracle 11C連線。
配置ODBC
-
解壓並把驅動放到自己想安裝到目錄,進入到目錄下的
\clidriver\bin
路徑裡開啟CMD執行命令安裝驅動
db2oreg1.exe -i
如果是powellshell則是
./db2oreg1.exe -i
-
安裝成功後通過win7的搜尋開啟ODBC可以看到剛才已經安裝的驅動,如下圖
-
新增系統DSN
選擇對應的驅動新增
新增ip、埠、資料庫名稱
-
-
測試連線是否成功
連線成功。
-
新增cfg配置檔案,如果沒有這個檔案,在dblink連線時會報錯:連線ORACLE到非Oracle系統時返回此資訊:
[IBM][CLI Driver] SQL1531N...
找到剛才安裝odbc驅動的主目錄下找到
\clidriver\cfg
路徑下新建一個db2dsdriver.cfg
配置檔案,內容如下<!-- db2dsdriver.cfg data source --> <configuration> <dsncollection> <!-- alias=odbc資料來源名稱 其他自己依自己的情況填寫 --> <dsn alias="testdb2" name="test" host="localhost" port="50000"> <parameter name="UserID" value="***"/> <parameter name="Password" value="***"/> </dsn> </dsncollection> </configuration>
檔案建立好後重啟DB2,測試檔案是否無誤,開啟CMD進入到驅動安裝目錄下的
\clidriver\bin
# 停止 db2stop # 啟動 db2start # 檢查配置 後面的testdb2自己改成自己的資料來源名稱 db2cli validate -dsn testdb2
出現如下提示說明無誤,不然請根據提示排查問題
[ Parameters used for the connection ] Keywords Valid For Value --------------------------------------------------------------------------- DATABASE CLI,.NET,ESQL test HOSTNAME CLI,.NET,ESQL localhost PORT CLI,.NET,ESQL 50000 USERID CLI,.NET ******** PASSWORD CLI,.NET ********
配置Oracle連線
-
配置
initdg4odbc.ora
找到Oracle安裝目錄下
\product\11.2.0\dbhome_1\hs\admin
路徑的initdg4odbc.ora
複製一份命名為inittestdb2.ora
,名稱就用init+資料來源名稱.ora
。配置內容如下:# This is a sample agent init file that contains the HS parameters that are # needed for the Database Gateway for ODBC # # HS init parameters # HS_FDS_CONNECT_INFO = testdb2 # 自己配置的odbc資料來源名稱 HS_FDS_TRACE_LEVEL = off # 是否開啟日誌記錄 on off # # Environment variables required for the non-Oracle system # #set <envvar>=<value>
-
配置
listener.ora
找到Oracle安裝目錄下
\product\11.2.0\dbhome_1\NETWORK\ADMIN
路徑的listener.ora
檔案開啟,裡面原來的配置不要動在標識後面新增一條配置。配置內容如下:# listener.ora Network Configuration File: C:\**\**\product\11.2.0\dbhome_1\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = C:\**\**\product\11.2.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:C:\**\**\product\11.2.0\dbhome_1\bin\oraclr11.dll") ) # 在這裡新增一條配置 (SID_DESC= (SID_NAME=testdb2) # 這裡改成自己配置的inittestdb2.ora檔案裡的名稱 (ORACLE_HOME=C:\**\**\product\11.2.0\dbhome_1) # **號自己替換成自己的路徑 (PROGRAM=dg4odbc) ) # 這裡結束 ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) ) ADR_BASE_LISTENER = C:\app\Administrator
-
配置
tnsnames.ora
找到Oracle安裝目錄下
\product\11.2.0\dbhome_1\NETWORK\ADMIN
路徑的tnsnames.ora
檔案開啟,裡面原來的配置不要動在標識後面新增一條配置。配置內容如下:# tnsnames.ora Network Configuration File: C:\**\**\product\11.2.0\dbhome_1\network\admin\tnsnames.ora # Generated by Oracle configuration tools. LISTENER_ORCL = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ORACLR_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (CONNECT_DATA = (SID = CLRExtProc) (PRESENTATION = RO) ) ) ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) # 這裡新增一條配置 testdb2 = # 名稱可以自定義 (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)) # 不用修改 (CONNECT_DATA=(SID=testdb2)) # sid改成和listener.ora配置檔案一樣的sid名稱 (HS=OK) )
-
測試配置檔案是否都正常
開啟CMD依次執行如下指令重啟Oracle監聽服務,如果沒有報錯就是正常的
lsnrctl stop lsnrctl start
服務摘要.. 服務 "CLRExtProc" 包含 1 個例項。 例項 "CLRExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式... 服務 "testdb2" 包含 1 個例項。 例項 "testdb2", 狀態 UNKNOWN, 包含此服務的 1 個處理程式... 命令執行成功
建立dblink並測試連線
-
建立dblink
-- 引數依次為:dblink名稱、使用者名稱、密碼、tnsnames.ora檔案配置的服務名稱 create database link "oradb2" connect to "user" identified by "pwd" using 'testdb2';
-
測試連線
select * from dual@oradb2
查詢到資料,大功告成。
自己整了好久才搞定,因為找資料很多都是不太一樣的,所以記錄下來給需要的人蔘考。