- 论坛徽章:
- 1
|
本帖最后由 spender 于 2010-05-13 13:30 编辑
为了学习db2。我在我的虚拟服务器上搭建了一套环境, 目前已经运行成功。 写个文档在这儿,留作纪念!
db2 v9.5 for linxu 学习笔记
Spender: 2010/05/08 周六 14:04:54
一、环境描述
redhat linux AS 4.7 i386 x32 # redhat 5.5 odbc close() 有bug。
db2 V9.5 x32
windwos7 客户端+linux客户端+php script
# rpm –qa|grep php
php-mysql-4.3.9-3.22.9
php-mbstring-4.3.9-3.22.9
php-4.3.9-3.22.9
php-domxml-4.3.9-3.22.9
php-ldap-4.3.9-3.22.9
php-gd-4.3.9-3.22.9
php-xmlrpc-4.3.9-3.22.9
php-imap-4.3.9-3.22.9
php-odbc-4.3.9-3.22.9
php-pear-4.3.9-3.22.9
php-ncurses-4.3.9-3.22.9
php-pgsql-4.3.9-3.22.9
二、搭建环境<略>
windows7 注册节点:
run cmd --> db2cmd
db2cmd> db2 catalog tcpip node rhas47 remote 192.168.2.47 server 60000 remote_instance db2inst
db2cmd> db2 catalog database sample at node rhas47
windows7 使用odbc连接注册-->控制面板--〉管理工具--〉ODBC---〉增加 db2 copy1 dsn, 名称:sample, 连接用户名及密码: db2inst1/db2inst1 [其他可以不用填写],保存密码即可,然后测试连接。ok即完成。
三、创建测试数据库
# su - db2inst1
$ db2sampl
$ db2set
DB2_SKIPINSERTED=on
DB2_EVALUNCOMMITTED=on
DB2_EXTENDED_OPTIMIZATION=ON
DB2_DISABLE_FLUSH_LOG=ON
AUTOSTART=NO
DB2_SKIPDELETED=on
DB2_STRIPED_CONTAINERS=ON
DB2_HASH_JOIN=Y
DB2COMM=tcpip
DB2CODEPAGE=1386 # 针对 中文zh_CN.UTF-8的 codepage
DB2_PARALLEL_IO=*
四、给用户spender(注意它也属于db2inst1所属于的组 dasadm1)授权
db2inst1> db2 "create database MYDB1 using codeset GBK territory zh_CN" # 创建以中文编码的新数据库 MYDB1
db2inst1> db2 connect to mydb1
db2inst1> db2 "grant connect on database to user spender"
db2inst1> db2 "grant createtab on database to user spender"
db2inst1> db2 "grant bindadd on mydb1 to user spender"
db2inst1> db2 "grant connect on mydb1 to user spender"
db2inst1> db2 "grant connect on database to user spender"
db2inst1> db2 "grant createtab on database to user spender"
db2inst1> db2 "grant implicit_schema on database to user spender"
db2inst1> db2 "grant dbadm on database to user spender"
db2inst1> db2 "grant load on database to user spender"
db2inst1> db2 "grant QUIESCE_CONNECT on database to user spender"
db2inst1> db2 "grant SECADM on database to user spender"
db2inst1> db2 connect reset
五、建表, 装载数据
# su - spender
$ id
uid=503(spender) gid=503(spender) groups=503(spender),505(informix),663(dasadm1)
$ echo $LANG
zh_CN.GBK
$ cat .i18n
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="en_US.UTF-8:en_US:en:zh_CN.UTF-8:zh_CN:zh"
SYSFONT="latarcyrheb-sun16"
#LANG="zh_CN.GB18030"
#LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="en_US.UTF-8:en_US:en:zh_CN.UTF-8:zh_CN:zh"
SYSFONT="lat0-sun16"
LC_TIME=C
LC_MESSAGES="en_US.UTF-8"
$ # 在 .bash_profile 中增加 . /home/db2inst1/sqllib/db2profile 环境变量[略]
$ exit
# su - db2inst1
---> 数据文件用php脚本随即生成。
#!/usr/bin/php -q
<?PHP
// 生成下列字段
// 编号|姓名|性别|身份证编号|地址|开户日期|开户时间|金额
function CreateID($sex)
{ //随即生成一个身份证编号 , $sex==1 表示男性 $sex==2表示女性
global $arealist;
$Factor=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
$checkStr=array("1","0","X","9","8","7","6","5","4","3","2" ;
// 随机生成地区代号
setlocale(LC_TIME,"C" ;
$Rareaid=array_rand($arealist);
$areaid=$arealist[$Rareaid][0]; // 随机生成身份证前6位编号
$areaname=$arealist[$Rareaid][1]; // 对应的地区
$areaid_len=strlen($areaid);
if ($areaid_len!=6) { // 补充到6位
for ($i=0;$i>(7-$areaid_len);$i++) { $areaid.="0"; }
}
// 随即生成日期 1960到今天
$beginDate=mktime(0,0,0,1,1,1960);
$endDate =mktime(0,0,0,1,1,1999);
$timestamp=rand($beginDate,$endDate);
$strDate=strftime("%G%m%d",$timestamp); //生日
$beginDate2=mktime(0,0,0,1,1,1990);
$endDate2 =mktime(0,0,0,1,1,2010);
$timestamp2=rand($beginDate2,$endDate2);
$strDate2=strftime("%G/%m/%d,%T",$timestamp2); // 随机开户日期、时间
// 随机生成顺序号(01-99)
$seq=rand(1,90);
$str=sprintf("%s%s%02d%d",$areaid,$strDate,$seq,$sex); // 身份证的前17位
$stra=str_split($str);
//计算校验码
$checksum=0;
for ($i=0;$i<17;$i++) {
$checksum+=(int)($stra[$i])*$Factor[$i];
}
$x=$checkStr[$checksum%11];
$id=$str.$x;
$retstr=sprintf("%-18s,\"%-70s\",%s",$id,$areaname,$strDate2);
return($retstr);
}
// 主程序
// 随即生成数据文件
// 装载姓名特征文件
$firstname=array(); $boyname=array(); $girlname=array();
$fp=fopen("zhcn_name_lib.csv","r" ;
// zhcn_name_lib.csv 为中国人常用姓名列表文件,格式为:
// 每行一个记录,包括姓,男人姓名中常用字,女人姓名中常用字,每行3个字段,字段之间用|分割,可以缺少某一个字段
// 张|汉|芳
// |斌|
// 等
if (!$fp) { die('open "zhcn_name_lib.csv" error!'); }
while ( $buf=fgets($fp,12 ) {
$data=explode('|',$buf);
if ( strlen($data[0])>1 ) array_push($firstname,$data[0]);
if ( strlen($data[1])>1 ) array_push($boyname,$data[1]);
if ( strlen($data[2])>1 ) array_push($girlname,chop($data[2]));
}
$data=null;
fclose($fp);
// 装载身份证地区编号表
$arealist=array();
$fp=fopen("arealist.csv","r" ; // 中国身份证前六位与所在地区名称对照表
if (!$fp) { die('open arealist.csv error!'); }
while ($buf=fgets($fp,256) ) {
$data=explode('|',chop($buf));
array_push($arealist,$data);
}
fclose($fp);
for ( $i=1 ; $i<999; $i++) {
$money=rand(1,999)*100;
$k1=array_rand($firstname);
$Rareaid=array_rand($arealist);
if (rand(1,2)==1) {
$k2=array_rand($boyname,2);
$O_boyname =$firstname[$k1].$boyname[$k2[0]].$boyname[$k2[1]];
$id=CreateID(1);
$outstr=sprintf(",\"%s\",\"男\",%s,%d.00",$O_boyname,$id,$money);
echo $outstr."\n";
} else {
$k3=array_rand($girlname,2);
$O_girlname =$firstname[$k1].$girlname[$k3[0]].$girlname[$k3[1]];
$id=CreateID(2);
$outstr=sprintf(",\"%s\",\"女\",%s,%d.00",$O_girlname,$id,$money);
echo $outstr."\n";
}
}
// 释放内存
$arealist=null;
$firstname=null;
$boyname=null;
$girlname=null;
exit(0);
?>
$ # 共计8个字段《ID, NAME,SEX,UID,ADDRESS,DATE,TIME,MONEY》
spender> db2 " CONNECT TO MYDB1 "
spender> db2 " CREATE TABLE MYTABLE1 ( ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE ) , NAME CHARACTER (10) NOT NULL , SEX CHARACTER (3) NOT NULL , UID CHARACTER (1 NOT NULL , ADDRESS CHARACTER (80) NOT NULL , DATE DATE NOT NULL , TIME TIME NOT NULL , MONEY DECIMAL (8, 2) NOT NULL , CONSTRAINT CC1273126590467 PRIMARY KEY ( ID) ) "
spender> db2 " COMMENT ON TABLE MYTABLE1 IS '客户信息' "
spender> db2 " COMMENT ON MYTABLE1 ( DATE IS '日期', ID IS '编号_自动增加', ADDRESS IS '住址', SEX IS '性别', UID IS '身份证编号', MONEY IS '金额', NAME IS '姓名', TIME IS '时间' ) "
spender> head -4 userdata.unl # 这是一个已经生成好了的数据文件:
,"怀香淑","女",433023196507294920,"湖南省辰溪县 ",1997/03/17,04:25:06,23100.00
,"郁娣婕","女",15040319660814782X,"内蒙古自治区赤峰市元宝山区",2009/01/02,23:41:45,73300.00
,"尤姬妹","女",411481199812193820,"河南省商丘市永城市",1990/03/19,11:01:56,14100.00
spender> db2 "IMPORT FROM \"userdata.unl\" OF DEL MODIFIED BY DATEFORMAT=\"YYYY/MM/DD\" TIMEFORMAT=\"HH:MM:SS\" CODEPAGE=1386 CHARDEL\"\" COLDEL, DECPT. METHOD P (1, 2, 3, 4, 5, 6, 7, MESSAGES \"upload.log\" INSERT INTO MYTABLE1 (ID, NAME, SEX, UID, ADDRESS, DATE, TIME, MONEY) "
返回: Number of rows committed = 999 okey!
spender> db2 "select id,name,address from mytable1 where id<10"
spender> ## 这里应该返回正确的数据。
六、ODBC 连接测试
6.1 修改ODBC环境
修改 /etc/odbcinst.ini, 在最后增加如下行:
# Driver for IBM db2 x32 V9.5
[DB2]
Description = ODBC for IBM DB2
Driver = /opt/ibm/db2/V9.5/lib32/libdb2.so
FileUsage = 1
DontDLClose = 1
TraceFile = /tmp/db2odbc.log
Trace = Yes
修改 /etc/odbc.ini 增加如下内容:
[sample]
Description = Test ODBC for DB2
Driver = DB2
[mydb1]
Description = ODBC connect to db2 database mydb1
Driver = DB2
6.2 测试并选择数据
spender> isql -v mydb1 spender spenderpassword
提示: connect 表示连接正常
isql> select id,uid,name,address from mytable1 where id<50 and id>40
返回需要的纪录个数。。。。。
6.3 PHP 脚本测试:
#!/usr/bin/php -q
<?PHP
$conn=odbc_connect("mydb1","spender","spenderpassword",SQL_CUR_USE_IF_NEEDED );
if (!$conn) { echo $php_errormsg."\n";echo odbc_errormsg($conn); die(odbc_errormsg()); }
$result=odbc_exec($conn,"select ID,UID,name,address from mytable1 where id > 20 and id <30" ;
if (! $result) exit("Error in odbc_exec" ;
while (odbc_fetch_row($result) ) {
$field1=odbc_result($result,"ID" ;
$field2=odbc_result($result,"UID" ;
$field3=odbc_result($result,"NAME" ;
$field4=odbc_result($result,"ADDRESS" ;
echo "id=".$field1.'|'."UID=".$field2."NAME=".$field3."ADDRESS=".$field4."|<br>\n";
}
//odbc_close_all();
odbc_close($conn);
exit(0);
?>
6.4 apache+php+odbc+db2 联合测试
db2test.php 文件内容:
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<TITLE>DB2 TEST SELECT DATA FROM MYDB1</TITLE>
</HEAD>
<BODY>
<?PHP
$conn=odbc_connect("mydb1","spender","spenderpassword",SQL_CUR_USE_IF_NEEDED );
if (!$conn) { echo $php_errormsg."\n";echo odbc_errormsg($conn); die(odbc_errormsg()); }
$result=odbc_exec($conn,"select ID,UID,NAME,SEX,ADDRESS,DATE,TIME,MONEY from mytable1 where id > 20 and id <30");
if (! $result) exit("Error in odbc_exec");
odbc_result_all($result);
odbc_close($conn);
exit(0);
?>
</BODY>
</HTML>
用浏览器访问:http://你服务器地址/目录/db2test.php 测试一下效果。
注: 上述脚本在linux服务器中没有问题。 而在windows的apache中返回:
[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
然而:命令行执行: php db2test.php 却完全没有问题。 目前初步分析时环境变量的问题。 待处理!!
虽然未完成, 申请加精化! 呵呵。挣点钱钱花! |
|