首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

解決 DB2 建立 Nickname 導致 Crash 的問題 (DB2 II V8.2 / WebSphere II)

     編輯:DB2 教學

問題背景

在使用 DB2 Information Integrator for Oracle (II4O,現稱 WebSphere II) 時,建立 Wrapper 與 User Mapping 皆正常,但執行 CREATE NICKNAME 指令瞬間導致 DB2 實例崩潰 (Crash)。此問題發生於 DB2 II V8.2 搭配 Oracle 9i/10g Client 的 Linux 環境,屬於已知的相容性問題。

錯誤日誌分析

在 db2diag.log 中可見嚴重錯誤 (Level: Severe),關鍵訊息如下:

  • ADM0503C:發生非預期的內部處理錯誤,所有相關 DB2 進程已關閉。
  • 堆疊追蹤 (Call Stack) 指向 Oracle Client 函式庫 libclntsh.so 內的 A_X931RandomUpdate、ztcrseed3 等函式,顯示為 Oracle 客戶端程式庫與 DB2 進程間的符號衝突導致 Segment Fault (Signal 11)。

解決方案:Oracle 9i 環境

  1. 備份 $ORACLE_HOME/lib/libclntsh.so 與 $ORACLE_HOME/bin/genclntsh。
  2. 編輯 genclntsh,在連結器指令行加入 -Wl,-Bsymbolic 參數,例如:
    LD="gcc -shared -Wl,-relax -L${ORACLE_HOME}/lib -Wl,-Bsymbolic"
  3. 執行 genclntsh 重新產生 libclntsh.so。
  4. 執行 DB2 的 djxlinkOracle 腳本更新連結。
  5. 重啟 DB2 實例 (db2stop; db2start)。

解決方案:Oracle 10g 環境

  1. 備份 $ORACLE_HOME/bin/genclntsh、$ORACLE_HOME/lib/libclntsh.so.10.1、$ORACLE_HOME/lib32/libclntsh.so.10.1。
  2. 將 $ORACLE_HOME/lib/libnnz10.so 改名為 libnnz10.so.orig (若不存在則略過)。
  3. 編輯 genclntsh:
    • 在連結器指令加入 -Wl,-Bsymbolic (注意逗號後無空格)。
    • 將連結行中的 libnnz10.so 改為 libnnz10.a (靜態連結)。
  4. 執行 genclntsh 重建共享庫。
  5. 執行 djxlinkOracle 並重啟實例。

總結

此問題核心在於 Oracle Client 共享庫的符號可見性與 DB2 進程空間衝突。透過 -Bsymbolic 強制符號綁定至庫內部,並調整 libnnz10 連結方式,即可避免 Crash,恢復 Nickname 建立功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved