免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9407 | 回复: 3
打印 上一主题 下一主题

搭建db2学习环境 linux+db2+odbc+php [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-03-04 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-08 21:30 |只看该作者 |倒序浏览
本帖最后由 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 却完全没有问题。 目前初步分析时环境变量的问题。 待处理!!

虽然未完成, 申请加精化! 呵呵。挣点钱钱花!

论坛徽章:
0
2 [报告]
发表于 2010-05-11 15:34 |只看该作者

论坛徽章:
11
数据库技术版块每日发帖之星
日期:2016-06-25 06:20:00数据库技术版块每日发帖之星
日期:2016-06-24 06:20:00数据库技术版块每日发帖之星
日期:2016-05-03 06:20:00数据库技术版块每日发帖之星
日期:2016-04-21 06:20:00数据库技术版块每日发帖之星
日期:2016-01-23 06:20:00数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-19 06:20:00数据库技术版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2016-07-30 06:20:00
3 [报告]
发表于 2010-05-11 15:45 |只看该作者
用PDO或是直连db2的方式都行!

http://publib.boulder.ibm.com/in ... c/doc/t0011926.html

论坛徽章:
0
4 [报告]
发表于 2010-05-11 18:20 |只看该作者
mark一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP