Db2

無法建立從 db2 客戶端到 db2 伺服器 v11.5 的連接

  • April 4, 2022
  1. 我在 Windows 10 上使用 VirtualBox 在我的虛擬 PC 內的 Linux/x86_64 上安裝了 Db2 v11.5.7.0。
  2. 我創建了名為 TEST1 的數據庫
  3. 我使用 Unix 套接字連接到數據庫: db2 connect to TEST1 並且連接成功完成。
  4. 檢查 DB2COMM 設置: db2set DB2COMM 輸出為 DB2COMM=TCPIP
  5. 只是為了確保 TCP/IP 連接對 Db2 有效,我創建了本地節點和目錄數據庫:
db2 catalog tcpip node loctcp remote localhost server 50000
db2 catalog database test1 as tcptest1 at node loctcp
db2 terminate
db2 connect to tcptest1 user db2inst1 using <password>

並成功完成連接。

  1. 現在在我的 PC VirtualBox Windows 10 主機上,我設置埠轉發主機埠:60127 和訪客埠:50000。
  2. 在我的 Windows PC 上: netstat -an -p tcp | find ":60127" 我可以看到連接處於 LISTENING 狀態。
  3. 在我的 Windows PC 上:
db2 catalog tcpip node remtcp remote localhost server 60127
db2 catalog database test1 as tcptest1 at node remtcp
db2 terminate
  1. 在我的 Windows PC 上連接到數據庫

db2 connect to tcptest1 user db2inst1 using <password>

問題:看起來連接掛起。幾分鐘後,我在 Db2 客戶端中遇到錯誤:

SQL30081N 檢測到通信錯誤。正在使用的通信協議:“TCP/IP”。正在使用的通信 API:“SOCKETS”。檢測到錯誤的位置:“127.0.0.1”。檢測錯誤的通信功能:“recv”。協議特定錯誤程式碼:“10054”、“*”、“0”。SQLSTATE=08001

  1. 試圖理解問題。在 Linux 伺服器上:a) 我已經檢查了防火牆並且它被禁用了。b) IPv6 已禁用 c) Db2 正在使用 IPv4 偵聽 50000 埠
  2. Windows 上的 Wireshark 監聽 60127 埠。a) TCP 連接已建立 b) Db2 DRDA 連接從未出現。
  3. Linux 伺服器上的 Tcpdump 擷取 50000 埠網路流量。a) TCP 連接已建立 b) Db2 DRDA 連接從未出現。

Linux 虛擬機內部似乎出現了問題,但第 4 步和第 5 步對於 Db2 TCP/IP 連接應該一切正常。

知道還有什麼可以檢查為什麼 Db2 客戶端連接不起作用嗎?

PS 我與 Db2 v11.1 安裝完全相同,我的 PC 上的 Db2 連接工作正常。

我已經解決了這個問題。這是防火牆問題。

我對第 10 步的假設是錯誤的。我只檢查了 iptables 規則:

sudo iptables -nvL

允許所有策略,所以我假設防火牆被禁用(或沒有效果)。

但是啟用並執行了另一個防火牆firewalld服務:

sudo systemctl status firewalld

我已停止並禁用它:

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask firewalld

或者,我可以添加防火牆異常來允許我的 Db2 服務的 50000 埠,而不是上述三個命令:

firewall-cmd --add-port=50000/tcp

注意:我的步驟 11 和 12 是錯誤的假設。我已經更詳細地分析了網路數據包。我看到僅從 Db2 Windows 客戶端收到 TCP SYN 數據包,並且沒有從 Db2 伺服器機器返回客戶端的 TCP SYN/ACK 響應。沒有建立 TCP 連接(因為它被防火牆阻止了),顯然不能建立任何 DRDA 協議,因為依賴於 TCP 連接。

引用自:https://dba.stackexchange.com/questions/310429