【问题标题】:Connect Python to Remote DB2 Server将 Python 连接到远程 DB2 服务器
【发布时间】:2018-05-31 06:02:53
【问题描述】:

使用 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 Driver] 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 和密码(使用服务器计算机 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 和非 root 超级用户运行 ./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

将所有权级别更改为允许set-user-ids,对于这两个安全文件,db2chpwdb2ckpw,没有任何区别,因为Python 仍然存在错误。

请就我需要做的任何事情来诊断并最终解决连接问题提出建议。作为 DB2 的新手,如果您的回答是其中的一部分,我还要求您澄清诸如 nodecatalog 之类的项目。


实例所有者 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

【问题讨论】:

  • 我可能说的很明显,但"Server=127.0.0.1:50000; 从不远程机器...
  • 直到并且除非它在 ​​Db2 服务器上的命令行上工作,否则它不会在 Python 中工作。您能否确认账户 OEM 是否为实例所有者账户?您能否确认实例所有者帐户是否对 ~$DB2INSTANCE/sqllib 树中的文件和目录具有 755 权限?您还可以确认该树中文件和目录的所有权吗?另外服务器上 AUTHENTICATION dbm cfg 参数的值是多少?
  • 关于“节点”和“目录”。对于任何 Db2-client ,将节点视为“指向 Db2-instance 的指针,它可以是本地或远程的,并且该实例可能位于 Linux/Unix/Windows 或 Z/OS(子系统)上,或者OS/400。然后,Db2 客户端可以声明数据库存在于节点上。您的 Db2 客户端可以定义许多节点和许多数据库(指向数据库的指针)。定义节点的操作,或在节点上定义数据库被称为编目,所以在命令行中你编目一个节点,然后编目节点上的数据库,你也可以取消编目。就像创建/删除指针一样。
  • 查看扩展帖子,希望能回答您的问题。 OEM 看起来是具有所需 sqllib 权限的实例所有者。
  • 在 Db2-server 主机名上,成为 instance-owner ,使用 db2diag -A 归档当前诊断文件,然后使用 db2 update dbm cfg using DIAGLEVEL 4 immediate 完成后,使用 db2 connect to MYDB user OEM using password 并在失败时使用,请研究 db2diag.log 条目并发布相关的 ERROR 和 WARNING 条目。然后将 DIAGLEVEL 恢复为默认值 3。此外,检查 db2iupdt 仅在 server-instance 上以实例所有者身份运行。

标签: python linux db2


【解决方案1】:

不太确定真正的解决方法是什么,但我最终能够使用 Python 通过以下步骤将服务器上的 DB2 连接到客户端计算机。

  1. 更改了安全文件的所有权,db2chpwdb2ckpw

    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 服务名称,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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 2015-06-22
    • 2019-05-13
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多