将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. 服务器计算机的root超级用户
  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和密码连接到数据库(使用Server Machine 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链接

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

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

然后添加sudo comamnd, sudo ./db2iupdt -k OEM,我收到以下内容:

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.

解决方案2 IBM链接

将所有权级别更改为允许set-user-id s ,对于这两个安全文件, db2chpw db2ckpw 来自Python。

请建议我需要做的任何事情来诊断并最终解决连接问题。是DB2的新手,我还要求您澄清诸如 node catalog 之类的项目。


实例所有者 ibm链接

db2 connect to MYDB
db2 "values SYSPROC.AUTH_GET_INSTANCE_AUTHID()"
1              
----------------
OEM   

sqllib许可

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
...

身份验证参数

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

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

  1. 更改了安全文件的所有权, db2chpw db2ckp w

    chmod 4511 db2chpw
    chmod 4511 db2ckpw
    
  2. 更改了 db2irct config file(in〜/sqllib/实例目录)允许以下内容(否至yes):

    ENABLE_OS_AUTHENTICATION=YES
    RESERVE_REMOTE_CONNECTION=YES
    
  3. 运行配置文件

    ./db2rfe -f db2rfe.cfg
    

    这也启动了DB2 SVCENAME, db2c_oem ,在另一个端口,48000,在配置文件中稍后列出。在以前的尝试修复程序中,我已经在DBM CFG文件中手动输入了 db2c_inst1 svcename。也许那是真正的问题?

随着上述更改,我能够在服务器机上本地连接:

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

,我能够与客户端机器远程连接,但使用explicit 端口参数调整了端口,并稍微更改了第二个连接字符串。下面的两个版本都正确工作:

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_AUTHENTICATIONRESERVE_REMOTE_CONNECTION恢复为否,然后重新运行了配置文件,我仍然能够成功连接!

最新更新