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

DB2 II V8.2 建立 Oracle Nickname 導致 Crash 根因與 Workaround (Linux)

     編輯:DB2 教學

現象

  • 產品:DB2 Information Integrator V8.2 for Oracle (後更名 WebSphere II)
  • 操作:Wrapper、User Mapping 建立正常,CREATE NICKNAME 瞬間 DB2 實例 Crash
  • 平台:Linux

錯誤證據鏈

db2diag.log 關鍵堆疊


FUNCTION: DB2 UDB, oper system services, sqloEDUCodeTrapHandler, probe:10
MESSAGE: ADM0503C An unexpected internal processing error has occurred.
  ALL DB2 PROCESSES ASSOCIATED WITH THIS INSTANCE HAVE BEEN SHUTDOWN.

RDS UCINTFC: pStatementText = CREATE NICKNAME DB2INST1.ORALOCAL FOR TSH1.DB2INST1."LOCAL"

# Trap 文件 t19883.000 呼叫堆疊
-FRAME-- --CODE-- --LOCATION--
BFFE8E70 83C4286A 0x0083 + A_SHAFinalCommon      (/opt/IBM/db2/V8.1/lib/libdb2e.so.1)
BFFE8F00 8B55E48D 0x00ae + A_X931RandomUpdate    (/home/Oracle/OraHome1/lib/libclntsh.so.9.0)
BFFE8F60 83C40CEB 0x00d0 + ztcrseed3             (/home/Oracle/OraHome1/lib/libclntsh.so.9.0)

根因確認

DB2 II V8.2 與 Oracle 9i/10g 客戶端庫 (libclntsh.so) 符號解析衝突,屬已知相容性缺陷。

Workaround 分版本實施

Oracle 9i 環境


# 1. 備份原文件
cp $ORACLE_HOME/lib/libclntsh.so $ORACLE_HOME/lib/libclntsh.so.bak
cp $ORACLE_HOME/bin/genclntsh $ORACLE_HOME/bin/genclntsh.bak

# 2. 修改 genclntsh 連結行,加入 -Wl,-Bsymbolic
# 原行類似:
# LD="gcc -shared -Wl,-relax -L${ORACLE_HOME}/lib"
# 改為:
LD="gcc -shared -Wl,-relax -L${ORACLE_HOME}/lib -Wl,-Bsymbolic"

# 3. 重新生成 libclntsh.so
$ORACLE_HOME/bin/genclntsh

# 4. 重新鏈接 DB2 Oracle 驅動
djxlinkOracle

# 5. 重啟實例
db2stop && db2start

Oracle 10g 環境


# 1. 備份
cp $ORACLE_HOME/bin/genclntsh $ORACLE_HOME/bin/genclntsh.bak
cp $ORACLE_HOME/lib/libclntsh.so.10.1 $ORACLE_HOME/lib/libclntsh.so.10.1.bak
cp $ORACLE_HOME/lib32/libclntsh.so.10.1 $ORACLE_HOME/lib32/libclntsh.so.10.1.bak

# 2. 移除 libnnz10.so (強制靜態鏈接其符號)
cd $ORACLE_HOME/lib
mv libnnz10.so libnnz10.so.orig

# 3. 修改 genclntsh 兩處
# a) 連結行加 -Wl,-Bsymbolic (注意逗號後無空格)
LD="gcc -shared -Wl,-relax -L${ORACLE_HOME}/lib -Wl,-Bsymbolic"

# b) 將 libnnz10.so 改為 libnnz10.a
# 找到類似:*-r ${OLIB}/libnnz10.so* && LNZ="-lnnz10"
# 改為:*-r ${OLIB}/libnnz10.a* && LNZ="-lnnz10"

# 4. 重新生成
$ORACLE_HOME/bin/genclntsh

# 5. 重新鏈接 DB2
djxlinkOracle

# 6. 重啟實例
db2stop && db2start

驗證

重啟後再次執行 CREATE NICKNAME ...,實例不再 Crash,Nickname 成功建立,後續查詢正常。

原理解析

  • -Wl,-Bsymbolic:強制共享庫內部符號綁定,避免運行時被主程式 (db2sysc) 覆蓋
  • Oracle 10g libnnz10.so 含加密隨機數生成符號 (ztcrseed3, A_X931RandomUpdate) 與 DB2 同名不同實現,移除 .so 改靜態鏈接 .a 徹底隔離符號空間
  • djxlinkOracle:DB2 提供的腳本,將 Oracle 客戶端庫正確鏈接到 DB2 運行環境

避坑提醒

  • 修改前務必備份,生產環境建議維護窗口操作
  • Oracle 客戶端升級/打 Patch 後需重複此操作
  • DB2 9.5+ / InfoSphere Federation Server 9.7+ 已修復此類符號衝突,升級為根治

此類「跨產品共享庫符號衝突」在異構聯邦場景偶發,掌握 ldd/nm 定位衝突符號、-Bsymbolic/靜態鏈接隔離、廠商腳本重鏈接三板斧,可應對大多數類似 Crash。

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