db2 client连接db2 server的若干问题
第一个问题:远程创建Database近段时间项目的原因,需要通过远程方式在DB2 server上创建DB,执行创建表格插入数据等操作,创建表格和插入数据等功能可以通过ant提供的SQL完成,而创建DB却不行,于是采用了DB2 client这个工具,它的理念是通过在本地创建一个node,连接到远程DB2 server上,然后就可以本地进行操作了。
其实远程创建DB可以通过SSH的方式解决,命令:ssh -l {remote user name} {remote host} {cmd}, 例如 ssh -l db2inst1 9.186.113.102 "db2 list db directory",但是这种方式的缺陷是需要交互两次,第一次是将远程机器添加入本机的know host,第二次则是输入密码,这对于自动化来说并不合适。
如果不需要输入密码,那么需要先建立信任,参照这篇文章(SSH Without Password):http://www.linuxhorizon.ro/ssh-wo-passw.html, 此种方法并没有验证,因为个人觉得如果你需要连接数十台DB2 server,那么就需要在这数十台机器上执行(SSH Without Password)这篇文章中提到的操作,对于自动化来说也是不能满足的,所以最终选择了DB2 client这个工具。
第二个问题:DB2 client的用户混淆
DB2 client的安装过程(应该有silent安装和non-silent安装,本人采用的是non-silent安装)中设计到设置用户名密码,这是本机上用来登陆DB2 client使用的,比如创建了名字为db2user的用户,那么在连接远程DB2 server之前,需要执行如下操作:
su db2user
db2 catalog tcpip node $nodeName remote $db2Server server $db2PortNumber
db2 attach to $nodeName user $db2ServerUserName using $db2ServerUserPassword
这里的su db2user需要创建sub-shell脚本,那么剩下的两句在当前shell脚本中就无法执行,这里碰到的情况是在su db2user这里挂起了,可以改为su - db2user -c 'command1&&command2&&command3&&exit‘这样的方式执行,由于command中有很多很多变量传进来,显得比较臃肿,(其实这条路我当时没有走通,不过我认为是个人的问题,这个应该是可以work的),还有leader试了试这样的方式:
su - db2user -c 'db2catalog tcpip node resnode remote 9.125.70.48 server 50000'
db2 attach to resnode user db2inst1 using respassword
db2 create db res
这里只是在-c中执行了一条语句,然后下面的语句照样执行,这点有点让我困惑,下面的db2 命令也应该是使用db2user这个用户执行啊,怎么就没有su - db2user -c作为前缀呢?
这是第二种尝试,第三种尝试则是通过修改环境变量,在db2 client的用户目录下/home/db2user/sqllib下有这么一个文件:db2profile
通过这种执行方式来改变环境变量,这种改变只是临时的,那么重启以后必须重新执行这条命令:
. ./db2profile
这里两个标点的执行方式应该是shell多种执行方式中的source的执行方式,至于shell的执行方式在另外的文章中进行解释
然后执行命令就如这样:
. ./db2profile
db2 catalog tcpip node $nodeName remote $serverName server $serverPort
db2 attach to $nodeName user $userName using $userPassword
cd /opt/ibm/ae/AS
. ./createDatabase.sh $userName $userPassword $dbName
db2 -tvf createTable.sql
这是第三个尝试,是work的。
第三个问题:在以某个名字比如dbName创建了某个DB之后,重新再创建这个dbName的database,总是提示这个dbName已经存在了,但是呢又找不到这个dbName,这个很可能是catalog的原因,需要先recatalog才行,具体的操作见文章(Recataloging nodes and databases using TCP/IP protocol):http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=%2Fcom.ibm.db2.udb.uprun.doc%2Fdoc%2Ft0023402.htm
大致操作如下:
db2 LIST NODE DIRECTORY
--找到你的node-name,然后uncatalog
db2 UNCATALOG NODE node-name
db2 LIST DATABASE DIRECTORY
--找到你创建的database-name,然后uncatalog
db2 UNCATALOG DATABASE database-name
对于这些我的理解是,虽然你在远程DB2 server上删除了名为database-name的database,但是本机的node-name有这个database的备份,你以这个node-name连接到远程DB2 server上创建同样名字的database-name时,就会出现错误,所以必须在本地的node-name上uncatalog这个database的备份。
页:
[1]