Db2
HADR 主數據庫上的 ibm_db?
昨天我發現了一個奇怪的東西,它看起來像一個錯誤,但我會把它貼在這里以防有人看到它。測試腳本:
#!/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”無論如何都不起作用。