Oracle連線Db2

yehai發表於2020-06-16

因為有個業務場景需要訪問客戶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

  1. 下載驅動v10.5fp1_ntx64_odbc_cli

  2. 解壓並把驅動放到自己想安裝到目錄,進入到目錄下的\clidriver\bin路徑裡開啟CMD

    執行命令安裝驅動

    db2oreg1.exe -i
    

    如果是powellshell則是

    ./db2oreg1.exe -i
    
  3. 安裝成功後通過win7的搜尋開啟ODBC可以看到剛才已經安裝的驅動,如下圖

    ODBC

    1. 新增系統DSN

      選擇對應的驅動新增

      odbc配置

    新增ip、埠、資料庫名稱

    配置odbc

  4. 測試連線是否成功

    測試連線

    連線成功。

  5. 新增cfg配置檔案,如果沒有這個檔案,在dblink連線時會報錯:連線ORACLE到非Oracle系統時返回此資訊:[IBM][CLI Driver] SQL1531N...

    error

    找到剛才安裝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連線

  1. 配置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>
    
    
  2. 配置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
    
    
    
  3. 配置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)
      ) 
    
    
  4. 測試配置檔案是否都正常

    開啟CMD依次執行如下指令重啟Oracle監聽服務,如果沒有報錯就是正常的

    lsnrctl stop
    lsnrctl start
    
    服務摘要..
    服務 "CLRExtProc" 包含 1 個例項。
      例項 "CLRExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
    服務 "testdb2" 包含 1 個例項。
      例項 "testdb2", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
    命令執行成功
    

建立dblink並測試連線

  1. 建立dblink

    -- 引數依次為:dblink名稱、使用者名稱、密碼、tnsnames.ora檔案配置的服務名稱
    create database link "oradb2" connect to "user" identified by "pwd" using 'testdb2';
    
    
  2. 測試連線

    select * from dual@oradb2
    

    查詢到資料,大功告成。

自己整了好久才搞定,因為找資料很多都是不太一樣的,所以記錄下來給需要的人蔘考。

參考內容

  1. DB2安裝教程
  2. Oracle通過DBlink連線DB2資料庫
  3. ORACLE通過透明閘道器連線DB2
  4. db2 odbc配置

相關文章