在 Xinuos OpenServer 6系统上安装 Informix Dynamic Server 9.21 数据库

0阅读 0评论2026-02-03 snow888
分类:DB2/Informix

在 Xinuos OpenServer 6 Definitive 系统上安装 Informix Dynamic Server 9.21 数据库
======================================================================================


前言:
    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 的共享内存。



上一篇:从 Windows 桌面转向Unix/Linux,我们需要准备什么?
下一篇:关于Informix初始化时出现“Check INFORMIXDIR and DBLANG”问题的解决