将Python连接到远程DB2服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Python连接到远程DB2服务器相关的知识,希望对你有一定的参考价值。

使用Python的DB2 API,ibm_db,我正在尝试连接到远程DB2服务器(IP地址10.0.0.001,我可以成功地进入ssh)。客户端和服务器都是Linux / Ubuntu 16.0 LTS。在我的所有尝试和解决方案中,我不断遇到常规的SQL1639N错误。

Python 3.5(尝试两种连接版本)

import ibm_db
import ibm_db_dbi

# DB CONNECT
#dsn = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=MYDB;HOSTNAME=10.0.0.001;PORT=50000;PROTOCOL=TCPIP;UID=OEM;PWD=****;"
#db = ibm_db.connect(dsn, "", "")

db = ibm_db.connect("Server=127.0.0.1:50000;Hostname=10.0.0.001;Database=MYDB;UID=OEM;PWD=****;", "", "")

错误

[IBM] [CLI驱动程序] SQL1639N数据库服务器无法执行身份验证,因为服务器上与安全相关的数据库管理器文件没有所需的操作系统权限。 SQLSTATE = 08001 SQLCODE = -1639

用户

上面连接字符串OEM中列出的用户是:

  1. 服务器机器的超级用户
  2. DB2安装的唯一实例的名称(不是db2inst1
  3. 架构数据库的名称驻留在

OEM维护DBADM权限。以下是MYDB数据库的所有受助者。如果OEM需要CONNECT属性,请告诉我如何授予它,因为我无法与任何其他用户连接,包括db2admin

GRANTEE  TYPE DBADM CREATETAB BINDADD CONNECT NOFENCE IMPLSCHEMA LOAD EXTROUTINE QUIESCECONN LIBADM SECURITYADM
-------- ---- ----- --------- ------- ------- ------- ---------- ---- ---------- ----------- ------ -----------
OEM      U    Y     N         N       N       N       N          N    N          N           N      Y          
PUBLIC   G    N     Y         Y       Y       N       Y          N    N          N           N      N          

服务器

相关地,在服务器上,我无法使用OEM和密码连接到数据库(使用服务器机器root的密码)。但是,我可以没有任何指定的用户。

失败

db2 connect to MYDB user OEM
Enter current password for OEM: <entered anonymously>

SQL1639N  The database server was unable to perform authentication because 
security-related database manager files on the server do not have the required 
operating system permissions.  SQLSTATE=08001

成功

db2 connect to MYDB

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.1.2.2
 SQL authorization ID   = OEM
 Local database alias   = MYDB

以下是我根据IBM自己的指南尝试的解决方案。是的,我确实停止并使用命令启动DB2:dbstopdbstart

解决方案1 ​​IBM link

尝试为OEM和非超级用户运行./db2iupdt -k OEM,我收到以下内容。

DBI20127E  The command failed because it is not supported or is invalid. 

然后添加sudo命令,qazxsw poi,我收到以下内容:

sudo ./db2iupdt -k OEM

解决方案2 DBI1152E To run this program, you can not be root user. Explanation: db2iupdt can not be run by users with root authority. User response: Rerun the command as a non-root user.

更改所有权级别以允许IBM link,s,这两个安全文件db2chpw和db2ckpw没有区别,因为Python持续存在错误。

请告知我需要做的任何事情来诊断并最终解决连接问题。作为DB2的新手,我还会要求您澄清节点和目录等项目,如果您的答案的一部分。


实例所有者set-user-id

IBM link

sqllib权限

db2 connect to MYDB
db2 "values SYSPROC.AUTH_GET_INSTANCE_AUTHID()"

1              
----------------
OEM   

验证参数

ls -l /home/oem/sqllib

drwxr-xr-x  2 oem oem  4096 Jun 10  2017 acs
drwxr-xr-x  2 oem oem  4096 Oct 29 10:18 adm
drwxr-xr-x  2 oem oem  4096 Jun 10  2017 adsm
drwxr-x---  2 oem oem  4096 Oct 29 10:18 backup
drwxr-xr-x  3 oem oem  4096 Jun 10  2017 bin
drwxr-xr-x  2 oem oem  4096 Jun 10  2017 bnd
-rw-r--r--  1 oem oem     0 Oct 29 10:18 cat
drwxrwsr-t  3 oem oem  4096 Nov 14 19:47 cfg
drwxrwsr-t  2 oem oem  4096 Oct 29 10:18 cfgcache
drwxr-xr-x  4 oem oem  4096 Jun 10  2017 conv
drwxrwsr-t  2 oem oem  4096 Nov 14 19:49 ctrl
drwxrwxr-x  3 oem oem  4096 Nov 14 19:47 ctrlha
drwxrwxr-x  2 oem oem  4096 Oct 29 10:18 ctrlhamirror
-rwxr-xr-x  1 oem oem 12891 Oct 29 10:18 db2cshrc
drwxrwsrwt  5 oem oem  4096 Nov 16 21:06 db2dump
-rwxr-xr-x  1 oem oem  9017 Oct 29 10:18 db2profile
-rw-rw-r--  1 oem oem 28672 Dec 17 13:38 db2systm
drwxr-xr-x  5 oem oem  4096 Jun 10  2017 desktop
drwxr-xr-x  3 oem oem  4096 Jun 10  2017 doc
drwxr-xr-x  8 oem oem  4096 Jun 10  2017 dsdriver
drwxr-xr-x  5 oem oem  4096 Oct 29 10:18 function
-rw-r--r--  1 oem oem   277 Oct 29 10:18 global.reg
drwxr-xr-x  3 oem oem  4096 Jun 10  2017 gskit
drwxr-xr-x  5 oem oem  4096 Jun 10  2017 ha
drwx------  3 oem oem  4096 Oct 29 10:18 hmonCache
drwxr-xr-x  2 oem oem  4096 Jun 10  2017 include
drwxr-xr-x  4 oem oem  4096 Jun 10  2017 infopop
drwxr-xr-x  4 oem oem  4096 Oct 29 10:25 install
drwxr-xr-x  4 oem oem  4096 Oct 29 10:18 instance
...
答案

不太确定真正的修复是什么,但我最终能够使用Python将服务器上的DB2连接到客户端机器,并执行以下步骤。

  1. 更改了安全文件db2chpw和db2ckpw的所有权 db2 get dbm cfg | grep -i auth GSS Plugin for Local Authorization (LOCAL_GSSPLUGIN) = Server Connection Authentication (SRVCON_AUTH) = NOT_SPECIFIED Database manager authentication (AUTHENTICATION) = SERVER Alternate authentication (ALTERNATE_AUTH_ENC) = NOT_SPECIFIED Cataloging allowed without authority (CATALOG_NOAUTH) = NO Trusted client authentication (TRUST_CLNTAUTH) = CLIENT Bypass federated authentication (FED_NOAUTH) = NO
  2. 更改了db2irct配置文件(在〜/ sqllib / instance目录中)以允许以下内容(NO为YES): chmod 4511 db2chpw chmod 4511 db2ckpw
  3. 跑配置文件 ENABLE_OS_AUTHENTICATION=YES RESERVE_REMOTE_CONNECTION=YES 这也启动了db2 svcename,db2c_oem,位于配置文件中稍后列出的另一个端口48000。在之前的尝试修复中,我手动在dbm cfg文件中输入了db2c_inst1 svcename,我在此处删除了该文件。也许那是真正的问题?

通过以上更改,我能够在服务器计算机上进行本地连接:

./db2rfe -f db2rfe.cfg

我能够远程连接客户端计算机,但调整了端口并使用显式Port参数略微更改了第二个连接字符串。以下两个版本都正常工作:

db2 connect to MYDB 
Enter current password for OEM: <entered anonymously>

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.1.2.2
 SQL authorization ID   = OEM
 Local database alias   = MYDB

有趣的是,我将import ibm_db import ibm_db_dbi # DB CONNECT #dsn = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=MYDB;HOSTNAME=10.0.0.001;PORT=48000;PROTOCOL=TCPIP;UID=OEM;PWD=****;" #db = ibm_db.connect(dsn, "", "") db = ibm_db.connect("Server=127.0.0.1;Port=48000;Hostname=10.0.0.001;Database=MYDB;UID=OEM;PWD=****;", "", "") ENABLE_OS_AUTHENTICATION恢复为NO,然后重新运行配置文件,我仍然能够成功连接!

以上是关于将Python连接到远程DB2服务器的主要内容,如果未能解决你的问题,请参考以下文章

通过 JDBC 连接到远程 db2 数据库失败

远程 db2 服务器连接到 R studio

使用 cli 连接到 db2 失败,错误代码为 -1531

将远程服务器连接到 spyder 以运行 Python 代码

如何远程连接到db2数据库

通过SSL将IBM DB2 JDBC连接到编目数据库