将Python连接到远程DB2服务器

时间:2017-12-17 20:41:40

标签: python linux 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. 架构数据库的名称位于
  4. 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 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 link

    为这两个安全文件 db2chpw db2ckpw 更改所有权级别以允许set-user-id s ,差异,因为错误持续存在于Python。

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

    实例所有者 IBM link

    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
    

1 个答案:

答案 0 :(得分:0)

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

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

    chmod 4511 db2chpw
    
    chmod 4511 db2ckpw
    
  2. 更改 db2irct 配置文件(在〜/ sqllib / instance目录中)以允许以下内容(NO为YES):

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

    ./db2rfe -f db2rfe.cfg
    

    这也启动了db2 svcename, db2c_oem ,位于配置文件后面列出的另一个端口48000。在之前的尝试修复中,我手动在dbm cfg文件中输入了 db2c_inst1 svcename,我在此处删除了该文件。也许那是真正的问题?

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

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