在採用 XA 分散式事務架構的系統中,應用透過 Database Link (DBLink) 查詢遠端資料庫時,突然出現 ORA-24777:不允許使用不可移植的資料庫連結 錯誤。經排查確認為 Oracle 11.2.0.4 版本的已知 Bug,本文記錄問題發現、根因分析、解決方案選型與驗證全過程。
ORA-24777:不允許使用不可移植的資料庫鏈路。錯誤堆疊顯示:應用透過 XA 連線,在分散式事務內執行 DBLink 查詢遠端表時拋出。
XA 規範要求分散式事務的所有資源管理器(RM)必須支援「可移植性」(Portability),即能夠在不同交易管理器(TM)間切換。Oracle 11.2.0.4 引入了對 DBLink 在 XA 環境下可移植性的嚴格檢查,若 DBLink 為專用伺服器模式,則判定為「不可移植」,拋出 ORA-24777。
此為 Oracle 已知 Bug:
Oracle 專家提供兩種繞過方案:
| 方案 | 描述 | 影響範圍 | 風險 | 推薦度 |
|---|---|---|---|---|
| 1. 設定 Shared Server (MTS) | 將資料庫啟用 Shared Server 架構,所有連線走 Dispatcher | 整個資料庫實例,影響所有連線 | 高:記憶體模型改變、效能特性改變、可能引發新問題 | ★☆☆☆☆ |
| 2. 將 DBLink 設為 Shared 模式 | CREATE DATABASE LINK ... CONNECT TO ... USING ... SHARED |
僅影響該 DBLink | 低:僅改變該連結的連線池機制,相容性好 | ★★★★★ |
-- 刪除舊 DBLink DROP DATABASE LINK remote_link; -- 重建為 Shared DBLink CREATE SHARED DATABASE LINK remote_link CONNECT TO remote_user IDENTIFIED BY password AUTHENTICATED BY link_user IDENTIFIED BY link_pass USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=remote_host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=remote_svc)))';
關鍵字句:SHARED + AUTHENTICATED BY。Shared DBLink 會在本地建立連線池,符合 XA 可移植性要求。
修改後,應用重新部署測試,XA 事務內透過 DBLink 查詢遠端表正常,ORA-24777 不再出現,業務恢復穩定。