======================================================================================
前言:
Informix Dynamic Server 9.21 for SCO 是在 SCO OpenServer 系统上{BANNED}最佳高版本的 Informix Dynamic Server 数据库了,与 7.3.x 的版本不同,在 Xinuos OpenServer 6 Definitive 系统上安装 Informix Dynamic Server 9.21 数据库的方法如下:
环境说明:
本安装示例的环境如下:
操作系统: Xinuos OpenServer 6 Definitive
网络环境: 192.168.137.102
主 机 名: sco6
主机域名: unix-dr.org
用户信息:
用户:informix 密码:informix
用户:account 密码:account
需要安装的软件包说明:
1、Informix_Dynamic_Server_2000v9.21UC2_for_OSR6.tgz , 包含 Informix Dynamic Server 软件包。
2、clntsdk.cpio , 包含 ClientSDK 和 ESQL/C 软件包。
1、系统安装
=============
step 1:创建 informix 用户组和用户
# groupadd informix
# useradd -d /usr/informix -g informix -s /bin/bash -m informix
# passwd informix
输入 informix 用户的密码(你可以任意输入 informix 用户的密码,但两次数据的密码必须保持一致)。
step 2:修改 informix 用户的环境变量如下:
# vi /usr/informix/.bashrc
修改添加的内容如下:
INFORMIXDIR=/usr/informix
PATH=${PATH}:${INFORMIXDIR}/bin:.
INFORMIXSERVER=sco6_sys
INFORMIXSERVERALIAS=sco6_sys_alias
ONCONFIG=onconfig.sco6
LD_LIBRARY_PATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:${INFORMIXDIR}/lib/cli
export INFORMIXDIR PATH INFORMIXSERVER INFORMIXSERVERALIAS ONCONFIG LD_LIBRARY_PATH
这里要特别注意 INFORMIXSERVER INFORMIXSERVERALIAS ONCONFIG 这三个环境参数。
INFORMIXSERVER -- 代表你的 INFORMIX 服务名,与 INFORMIXDIR/etc/sqlhosts 文件中和 INFORMIXDIR/etc/onconfig.sco6 中的对应信息相匹配。
INFORMIXSERVERALIAS -- 代表你的 INFORMIX 服务别名,与 INFORMIXDIR/etc/sqlhosts 文件中和 INFORMIXDIR/etc/onconfig.sco6 中的对应信息相匹配。
ONCINFIG -- 定义了你的 INFORMIX 服务进行初始化时的所有信息的配置文件名,本例中指定为 onconfig.sco6 , 你可以根据自己的实际情况进行修改。
step 3:挂载 Xinuos OpenServer 6 Definitive 安装光盘
# mount -r /dev/cd0 /cd-rom
step 4:解压 Informix_Dynamic_Server_2000v9.21UC2_for_OSR6.tgz 文件到 informix 用户目录。
# su - informix
$ /usr/gnu/bin/gtar zxvf /cd-rom/support/DataBase/Informix_Dynamic_Server_2000v9.21UC2_for_OSR6/Informix_Dynamic_Server_2000v9.21UC2_for_OSR6.tgz
step 5:进行安装 Informix Dynamic Server 9.21UC2
$ ./installserver
当显示:Enter your serial number (e.g.INF#X999999,) > 时,输入产品标签上的序列号。
当显示:Enter your serial number KEY (uppercase letters only) > 时,输入产品标签上的序列号键值。
step 6:创建 Informix Dynamic Server 动态链接库到 /usr/lib 的链接及修改相关文件的权限。
以 root 用户执行如下程序
# ./RUN_AS_ROOT.server
step 7: 解压 clntsdk.cpio 文件到 informix 用户目录
$ cpio -ivcdBum
step 8:进行安装 clientsdk
$ ./installclientsdk
当显示:Enter your serial number (e.g.INF#X999999,) > 时,输入产品标签上的序列号。
当显示:Enter your serial number KEY (uppercase letters only) > 时,输入产品标签上的序列号键值。
step 9:创建 Informix Client SDK 动态链接库到 /usr/lib 的链接及修改相关文件的权限。
以 root 用户执行如下程序
# ./RUN_AS_ROOT.clientsdk
2、系统初始化
=========================
step 1:创建 account 服务用户和用户组(你也可以就使用 informix 用户,不过俺不建议这样,还是分开的好)
# mkdir /home
# chmod 0775 /home
# groupadd account
# useradd -d /home/account -s /bin/sh -g account -G informix -c "Account Users" -m account
# passwd account
输入 account 用户的密码(你可以任意输入 account 用户的密码,但两次数据的密码必须保持一致)。
step 2:修改环境变量配置文件 .profile,添加如下内容:
INFORMIXDIR=/usr/informix
PATH=${PATH}:${INFORMIXDIR}/bin:.
LD_LIBRARY_PATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:${INFORMIXDIR}/lib/cli
ONCONFIG=onconfig.sco6
INFORMIXSERVER=sco6_sys
INFORMIXSERVERALIAS=sco6_sys_alias
export INFORMIXDIR PATH LD_LIBRARY_PATH ONCONFIG INFORMIXSERVER INFORMIXSERVERALIAS
step 3:修改操作系统,添加IDS 的 tlitcp 服务的端口号
# vi /etc/services
在{BANNED}最佳后添加如下内容
sco6_comm 50000/tcp
【注意:这个端口名字和端口号是你自己定义的,你可以随意,只要你定义的端口号没有被占用就好了。】
step 4:修改系统内核参数,并重链内核,重启系统。
# cd /etc/conf/cf.d
# vi stune
添加或修改如下内容
SHMMAX 409600000
SHMMIN 1
SHMALL 512
SHMMNI 100
SHMSEG 6
MAXUMEM 524287
SEMMNI 8192
SEMMNS 8192
SEMMAP 8192
SEMMNU 100
SEMMSL 25
# ./link_unix
# reboot
【注意:
1、如果重链内核时报错,请仔细检查拼写是否错误,如没有拼写错误,请修改 mtune 文件,在其中修改相应内容,然后再重新链接。
2、在实际的情况下,除非你修改过 OpenServer 6 的参数,否则一般情况而言,以上这些参数不用进行调整,在默认的情况下,OpenServer 6 的内核参数是大于以上值的。
】
step 5:配置 IDS 的通讯配置文件。
# vi /usr/informix/etc/sqlhosts
将其中的内容用 '#' 注释掉,然后添加如下内容:
sco6_sys ontlitcp sco6 sco6_comm
sco6_sys_alias onipcshm sco6 sqlexec
【{BANNED}中国第一列:是 IDS 服务名,即 INFORMIXSERVER 和 INFORMIXSERVERALIAS 定义的部分,第二列是通讯类型名,ontlitcp 为 tcpip 方式,onipcshm 为共享内存方式,第三列是你的服务器名称,就是你在安装的时候的服务器的名称,如果你不知道你的服务器名称,可以通过 uname 命令进行查看。第四列是对应的服务动作的名称,sco6_comm 对应的是 /etc/services 文件中前面定义的部分,表示是通过网络端口 sco6_comm 端口来访问 ids 服务,sqlexec 表示是直接在服务器上执行 sql 访问ids服务。】
step 6:配置 IDS 共享内存配置文件 onconfig.sco6 (就是你在环境变量 ONCONFIG 中定义的文件名)
# cd /usr/informix/etc
# cp onconfig.std onconfig.sco6
# vi onconfig.sco6
修改如下内容:
ROOTPATH /home/account/dbs/rootdbs #【你的数据文件块名称,如果是使用的裸设备,请在这里指定具体的裸设备文件名。】
ROOTSIZE 2000000 #【数据文件的大小,这里俺设置的是 2GB,需要注意的是,在 OSR5 中单个文件的大小不能超过 2GB】
MSGPATH /home/account/log/online.log #【系统日志文件定义】
CONSOLE /dev/null #【控制台消息输出,原来是指向 /dev/console 的,这里俺把它重定向到了 /dev/null ,控制台输出信息将不会再输出了。】
ALARMPROGRAM /usr/informix/etc/log_full.sh #【log 脚本文件位置】
SYSALARMPROGRAM /usr/informix/etc/evidence.sh #【系统设备启动脚本文件位置】
TAPEDEV /dev/null #【数据库备份设备,这里俺是一个实验环境,所以定义到了空设备,如果是生产环境,你需要定义成磁带机,这样会保险得多,{BANNED}最佳起码你应该定义代一个物理磁盘设备,这样有利于数据备份。】
LTAPEDEV /dev/null # 【日志文件备份设备,这里俺是一个实验环境,所以定义到了空设备,如果是生产环境,你需要定义成磁带机,这样会保险得多,{BANNED}最佳起码你应该定义代一个物理磁盘设备,这样有利于数据备份。】
SERVERNUM 1 # 【服务编号,通常情况下,你的机器上也许不只一个 IDS 服务,这时候,你需要保证该值的唯一性。】
DBSERVERNAME sco6_sys # 【数据服务名,与你的环境变量中的 INFORMIXSERVER 参数定义的内容相对应。】
DBSERVERALIASES sco6_sys_alias # 【数据服务别名,与你的环境变量中的 INFORMIXSERVERALIAS 参数定义的内容相对应。】
NETTYPE tlitcp,1,20,NET # 【数据服务类型定义,与 sqlhost 文件中的相应部分对应,此处对应的是 ontlitcp 方式。】
NETTYPE ipcshm,1,20,CPU # 【数据服务类型定义,与 sqlhost 文件中的相应部分对应,此处对应的是 onipcshm 方式。】
DRLOSTFOUND /usr/informix/etc/dr.lostfound # 【这个定义不知道是干嘛的,俺保留了默认值,没有进行修改 】
step 7:添加数据服务的日志目录和数据块文件。
用 account 用户注册,进入系统。
Login: account
Password:
$ mkdir dbs
$ mkdir log
$ mkdir bin
$ cd dbs
$ > rootdbs
$ chmod 0660 rootdbs
$ cd ..
$ chmod 0666 dbs
$ su root
# chown -R informix:informix dbs
# exit
$
【 这个地方得注意一下,dbs 目录的权限需要修改成 0666 ,rootdbs 文件的权限需要修改成 0660 , dbs 目录和 rootdbs 数据块文件应修改成属于 informix 用户和 informix 用户组 ,如果权限设置错误或者是 dbs 目录和 rootdbs 数据块文件所属的用户和用户组不是 informix 的时候,可能在进行 oninit 初始化实例的时候会报 “oninit: Fatal error in shared memory initialization” 的错误。 】
step 8:初始化共享内存,并启动服务。
用 informix 用户注册,进入系统。
Login: informix
Password:
$ oninit -iy
$ onmode -ky
$ oninit -y
$ onstat -a
3、使用测试
=====================
用 account 用户运行 dbaccess ,创建一个数据库 accountdbs , 并创建一个 test 的表。
test 表的信息如下:
create table test (
id int,
name char(12),
mess char(40),
enabledate date
);
create unique index idx_test_01 on test(id);
插入一条信息:
insert into test values (1,'aaaa','bbbbbb','11/12/2011');
【注意:有关如何建库建表,请参考 informix 相关书籍,其实大多数的数据库建库建表的 sql 语句都相同的】
编程测试使用数据
以下部分以 C 语言编写例子:
编写如下程序代码进行数据访问
ids_test.ec
=========================================
#include
EXEC SQL include sqlca;
EXEC SQL include sqlda;
EXEC SQL include sqlca;
EXEC SQL include sqltypes;
EXEC SQL include decimal;
EXEC SQL include accountdbs.h;
int main ( void )
{
EXEC SQL BEGIN DECLARE SECTION;
struct test rd_test;
EXEC SQL END DECLARE SECTION;
char enabledate[11];
EXEC SQL DATABASE accountdbs;
if ( sqlca.sqlcode )
{
fprintf(stdout," sqlca.sqlcode = %d \n",sqlca.sqlcode );
exit(0);
}
EXEC SQL select * into :rd_test from test where id =1;
if (sqlca.sqlcode)
{
fprintf(stdout,"==%ld==\n",sqlca.sqlcode);
} else {
rfmtdate(rd_test.enabledate,"yyyy/mm/dd",enabledate);
fprintf(stdout,"==%04d\n===%20s\n==%40s\n==%10s\n",rd_test.id,rd_test.name,rd_test.mess,enabledate);
}
EXEC SQL CLOSE DATABASE;
return 0;
}
libSDK.h
============================================
#ifndef __LIBSDK__
#define __libSDK__
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifndef TRUE
#define TRUE 0
#endif
#ifndef FALSE
#define FALSE -1
#endif
#ifndef NULL
#define NULL '\0x00'
#endif
#ifndef NUL
#define NUL '\0x00'
#endif
#endif /* __libSDK__ */
accountdbs.h
=========================================
EXEC SQL BEGIN DECLARE SECTION;
struct test
{
int id;
char name[13];
char mess[41];
date enabledate;
};
EXEC SQL END DECLARE SECTION;
Makefile
================================================
INCL = -I. -I../incl -I$(INFORMIXDIR)/incl -I$(INFORMIXDIR)/incl/esql
ESQL = $(INFORMIXDIR)/bin/esql
TARGET = ids_test
all:$(TARGET)
ids_test:ids_test.ec
$(ESQL) -o ids_test $(INCL) ids_test.ec
mv ids_test $(HOME)/bin
在 src 目录下执行 gmake ,编译 test 【注意,这个 Makefile 文件是针对 gmake 3.8.1 写的,系统自带的 make 可能不支持这种写法,请参阅相关的 Make 文档】
执行 ids_test 将输出信息。
$ ids_test
==0001
===aaaa
==bbbbb
==2011/11/12
{BANNED}最佳后的总结
1、在 ec 文件中使用数据结构体变量,需要在定义结构体的时候就采用标准的 SQL 定义变量的方式定义,不能使用纯 c 的方式定义,否则编译过程中会失败。
2、在 ec 文件中引入定义数据结构体的定义文件的时候,需要采用 SQL 引入头文件的方式,不能使用纯 c 语言的方式引入。
3、在 ec 中定义数据结构体变量的时候,需要采用 SQL 定义变量的方式来定义, 不能使用纯 c 定义变量的方式,否则会造成编译失败。
4、在 informix 的 esql 语句中,rfmtdate 函数用来将一个 date 型变量转换成 char 型的数组变量,有关 rfmtdate 函数的使用方法,请参考 informix 的相关书籍。
5、.h 的文件放置在 ./incl 目录下 , .ec 文件和 Makefile 文件放置在 src 目录下。
使用 Dbeaver 远程访问 Informix Dynamic Server 2000 9.21 的配置方法
========================================================================
使用 dbeaver 创建到 informix 数据库的连接,配置信息如下:
一般:
主 机:192.168.137.102
端 口:50000 # 这个端口号就是我们前面在 /etc/services 文件中配置的端口号。
服 务 器:sco6_sys
数据库/ 模式:accountdbs
认证:
认 证:Database Native
用户名:account
密 码:account
使用 unixODBC 访问 Informix Dynamic Server 2000 9.21 的配置方法
=========================================================================
在需要连接 Informix Dynamic Server 服务器的用户当前目录下配置 .odbc.ini 和 .odbcinst.ini 文件。
$ vi ~/.odbcinst.ini
内容如下:
[Informix]
Description = IBM Informix ODBC Driver for UnixODBC
Driver = /usr/informix/lib/cli/iclit09b.so
Setup = /usr/informix/lib/cli/iclit09b.so
FileUsage = 1
UsageCount = 1
Threading = 0
$ vi ~/.odbc.ini
内容如下:
[accountdbs]
Driver=Informix
Description=Description for your IBM Informix DB
Database=accountdbs
host=192.168.137.102
port=50000
LogonID=informix
pwd=informix
Servername=sco6_sys
ENABLESCROLLABLECURSORS=1
OPTIMIZEAUTOCOMMIT=1
解释与说明:
.odbcinst.ini
—— 是定义数据库连接驱动信息的文件,这里需要注意的要点如下:
1、定义的驱动名称为 Informix , 即:[Informix] 部分,这个名称在定义 .odbc.ini 文件的时候,与其中的 Driver 指向的名称保持一致。
2、Driver 是实际的驱动程序链接库,由于我的 clinet 安装在 /usr/informix 目录下,因此这里我定义为 /usr/informix/lib/cli/iclit09b.so。
3、Setup 是调用驱动链接库时需要首先加载的动态链接库,由于 Informix 而言,就是同一个,这里我们与 Driver 部分保持一致。
.odbc.ini
—— 是定义通过 unixodbc 访问数据库的数据源信息的文件,这里需要注意的要点如下:
1、Driver ,这个是驱动名称,要与 .odbcinst.ini 里面定义的驱动名称保持一致。
2、Database,这个是数据库的名称,需要指向你的 Informix 数据库服务器中创建的有效的数据库名称。
3、host ,你的数据库服务器的 ip 地址。
4、port ,你的数据库服务器进行侦听的端口号,也就是我们前面在初始化的时候在 /etc/services 文件中添加的服务端口号。
5、LogonID ,用于登录你的 informix 服务的用户名,这里我用的是 account
6、pwd , 用于登录你的 informix 服务的用户名所对应的用户密码,我在前面建立 account 用户的时候输入的密码就是 account , 你根据你的实际情况进行设置。
7、Servername , 你的数据库的服务名,也就是你设定的环境变量 INFORMIXSERVER 所对应的服务名。
== 实际测试中,在 .odbc.ini 文件定义的时候,发现 key 与 value 值的定义时,”=“ 两边不得加入空格或者是 TAB ,如:LogonID=informix 的 LogonID 与“=”号之间,以及“=”号与 account 之间,都不能出现空格或者是 TAB , 否则会造成访问失败,这一点与其他的数据库有一定的不同,估计应该是 clntsdk 版本较老(我使用的这个版本是 2.7 的)造成的一个小 BUG。
特别的注意事项:
===========================================================================================
1、在 Xinuos OpenServer 6 Definitive 操作系统中进行 Informix Dynamic Server 2000 9.21 数据库实例的初始化(即:使用 oninit -iy )的时候,只能使用 informix 用户来执行,其他的用户即使赋予了 informix 用户的所有权限,也不能正确执行 oninit -iy 的命令进行数据库实例的初始化。
2、在实际的使用测试中,发现如果设置了 TERMCAP=$INFORMIXDIR/etc/termcap 的环境参数,则在执行 dbaccess 命令的时候,会报“The type of your terminal is unknown to the system” 的错误信息,这应该是由于 Xinuos OpenServer 6 Definitive 操作系统的 termcap 库与 Informix Dynamic Server 2000 9.21 数据库的 termcap 库冲突的原因造成的,我们只需要去掉这个环境参数设置就可以了,这也是我在本文档中没有定义 TERMCAP 环境参数的原因。
3、Informix Dynamic Server 2000 9.21 的部分动态链接库放在 $INFORMIXDIR/lib、$INFORMIXDIR/lib/esql、$INFORMIXDIR/lib/cli 目录下,如果你开发的程序运行时提示无法加载动态链接库时,你需要设置如下的环境变量。
LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$INFORMIXDIR/lib/cli ; export LD_LIBRARY_PATH
4、在使用 unixODBC 访问 Informix Dynamic Server 2000 9.21 数据库的时候,如果报出类似 “[01000][unixODBC][Driver Manager]Can't open lib '/usr/informix/lib/cli/iclit09b.so ' : file not found” 的错误,如果你的 iclit09b.so 文件确实在配置的路径下,且能正常访问,那么你需要设置 LD_LIBRARY_PAYH 的环境变量,设置如下:
LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$INFORMIXDIR/lib/cli ; export LD_LIBRARY_PATH
5、某些特定情况下,执行 oninit 命令的时候,可能会出现 “Fatal error in shared memory creation” 以及 “shared memory already exists” 的情况,即使是系统重启,也无法解决该故障,针对这种情况,解决办法如下:
以 root 用户登录进入系统,执行如下命令查看 informx 用户创建的共享内存情况:
# ipcs -m |grep -v grep |grep informix
一般会输出如下类似的信息:
m 16386 0x52564801 --rw-rw---- root informix
m 16387 0x52564802 --rw-rw---- root informix
m 16388 0x52564803 --rw-rw-rw- root informix
m 12293 0x52564804 --rw-rw---- root informix
这个显示的第二列就是共享内存的序号,我们使用如下命令进行 informix 用户的共享内存
ipcrm -m [共享内存序号] , 如:我们使用 ipcrm -m 16386 , 就会清理了序号为 16386 的共享内存。