【发布时间】: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 是:
- 服务器机器的root超级用户
- DB2 安装的唯一实例名称(不是
db2inst1) - 模式数据库的名称所在
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:dbstop 和 dbstart。
解决方案 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-id,s,对于这两个安全文件,db2chpw 和 db2ckpw,没有任何区别,因为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
【问题讨论】:
-
我可能说的很明显,但
"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 上以实例所有者身份运行。