使用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中列出的用户是:
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和非超级用户运行./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
答案 0 :(得分:0)
不太确定真正的修复是什么,但我最终能够使用Python将服务器上的DB2连接到客户端计算机,并执行以下步骤。
更改了安全文件的所有权, db2chpw 和 db2ckp w
chmod 4511 db2chpw
chmod 4511 db2ckpw
更改 db2irct 配置文件(在〜/ sqllib / instance目录中)以允许以下内容(NO为YES):
ENABLE_OS_AUTHENTICATION=YES
RESERVE_REMOTE_CONNECTION=YES
运行配置文件
./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
我能够远程连接客户端计算机,但调整了端口并使用显式端口参数略微更改了第二个连接字符串。以下两个版本都能正常工作:
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
和RESERVE_REMOTE_CONNECTION
还原为NO,然后重新运行配置文件,我仍然能够成功连接!