将Python连接到远程DB2服务器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将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中列出的用户是:
- 服务器机器的超级用户
- 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和非超级用户运行./db2iupdt -k OEM
,我收到以下内容。
DBI20127E The command failed because it is not supported or is invalid.
然后添加sudo命令,qazxsw poi,我收到以下内容:
sudo ./db2iupdt -k OEM
解决方案2 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.
更改所有权级别以允许IBM link,s,这两个安全文件db2chpw和db2ckpw没有区别,因为Python持续存在错误。
请告知我需要做的任何事情来诊断并最终解决连接问题。作为DB2的新手,我还会要求您澄清节点和目录等项目,如果您的答案的一部分。
实例所有者set-user-id
IBM link
sqllib权限
db2 connect to MYDB
db2 "values SYSPROC.AUTH_GET_INSTANCE_AUTHID()"
1
----------------
OEM
验证参数
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
...
不太确定真正的修复是什么,但我最终能够使用Python将服务器上的DB2连接到客户端机器,并执行以下步骤。
- 更改了安全文件db2chpw和db2ckpw的所有权
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
- 更改了db2irct配置文件(在〜/ sqllib / instance目录中)以允许以下内容(NO为YES):
chmod 4511 db2chpw chmod 4511 db2ckpw
- 跑配置文件
ENABLE_OS_AUTHENTICATION=YES RESERVE_REMOTE_CONNECTION=YES
这也启动了db2 svcename,db2c_oem,位于配置文件中稍后列出的另一个端口48000。在之前的尝试修复中,我手动在dbm cfg文件中输入了db2c_inst1 svcename,我在此处删除了该文件。也许那是真正的问题?
通过以上更改,我能够在服务器计算机上进行本地连接:
./db2rfe -f db2rfe.cfg
我能够远程连接客户端计算机,但调整了端口并使用显式Port参数略微更改了第二个连接字符串。以下两个版本都正常工作:
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
恢复为NO,然后重新运行配置文件,我仍然能够成功连接!
以上是关于将Python连接到远程DB2服务器的主要内容,如果未能解决你的问题,请参考以下文章