Db2

HADR 主數據庫上的 ibm_db?

  • August 5, 2021

昨天我發現了一個奇怪的東西,它看起來像一個錯誤,但我會把它貼在這里以防有人看到它。測試腳本:

#!/usr/bin/python

import sys
import getopt
import re
import os
import traceback

import ibm_db

"""
Test of ibm_db in a HADR env
"""

def f1(dbname, username, pwd):
   print "start"
   cfg = (dbname, username, pwd)
   conn_str = "DATABASE=%s;HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;UID=%s;PWD=%s" % cfg
   conn1 = ibm_db.connect(conn_str, "", "")
   print "connect done"
   ibm_db.close(conn1)
   conn1 = None
   print "end"


def main():
   dbname = None
   username = None
   pwd = None
   try:
       opts, args = getopt.getopt(sys.argv[1:], "d:u:p:")
   except getopt.GetoptError:
       usage()
   for o, a in opts:
           if (o == "-d"):
               dbname = a
           if (o == "-u"):
               username = a
           if (o == "-p"):
               pwd = a

   f1(dbname, username, pwd)
   f1(dbname, username, pwd)

if __name__ == "__main__":
   try:
       main()
       print('')
   except Exception, e:
       print e
       sys.exit(1)
   sys.exit(0)

在獨立數據庫上執行腳本按預期工作:

./test_hadr.py -d db1 -u user -p pwd
start
connect done
end
start
connect done
end

針對 HADR PRIMARY 執行腳本在第二個連接上掛起

./test_hadr.py -d db1 -u user -p pwd
start
connect done
end
start
# waits for a couple of minutes

我跟踪它,它似乎在第二次嘗試時連接到故障轉移,幾分鐘後:

write(1, "[IBM][CLI Driver] SQL1776N  The "..., 111[IBM][CLI Driver] SQL1776N  The command cannot be issued on an HADR database. Reason code = "1". SQLCODE=-1776
) = 111

任何線索為什麼會發生這種情況,以及如何避免這種情況?多次使用相同的連接似乎可以正常工作,但使用兩個不同的連接會掛起。

看起來,當配置備用伺服器時,CLI 驅動程序更喜歡其正確的主機名而不是“localhost”。如果您在連接字元串中指定機器主機名或 IP 地址而不是“localhost”,則腳本將按預期工作。

測試腳本可以修改為:

[...]
import traceback
import socket
[...]

def f1(dbname, username, pwd):
   print "start"
   ip = socket.gethostbyname(socket.gethostname())
   cfg = (dbname, ip, username, pwd)
   conn_str = "DATABASE=%s;HOSTNAME=%s;PORT=50000;PROTOCOL=TCPIP;UID=%s;PWD=%s" % cfg
   [...]

建議通過將Db2 顯式綁定到 IP 地址nicbinding.cfg,在這種情況下,“localhost”無論如何都不起作用。

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