风之舞原创,转载请注明来源。
=====================================================
最近尽做一些过期的咚咚,郁闷之余,也重新复习了一下N年以前的知识。
闲话少说,进入正题。
SCO Openerver 5.0.6 Ni
IDS 731 for OSR5
SCO OpenServer 5.0.6 Ni 的安装(略)
【注意事项:网卡的地址一定要配置成静态地址,为下面讲解方便,此处我们安装时设置机器的主机名为 webs109,主机域名是 unix-dr.com , 主机地址是 192.168.18.200】
IDS 731 for OSR5 的安装。
安装顺序为
a、sql
b、esql
c、4gl
d、online
e、lszh
安装方法:
step 1)
创建 informix 用户组和用户
groupadd informix
useradd -d /opt/informix -g informix -s /bin/sh -m -c "Informix Users" informix
step 2)
修改环境变量配置文件 .profile
添加如下内容:
INFORMIXDIR=/opt/informix
PATH=${PATH}:${INFORMIXDIR}/bin:.
TERMCAP=${INFORMIXDIR}/etc/termcap
export INFORMIXDIR PATH TERMCAP
step 3)
用 informix 用户登录系统,并切换到 root 用户。
Login:informix
Password:
$ su root 【特别注意,此处千万不能用 su - root 来切换用户,这样做的目的是为了保留前面所做的环境变量的值】
#
step 4)
依次进行安装
# ./installsql
# ./installesql
# ./install4gl
# ./installserver
# ./installzhcn
【特别注意:您的安装介质可能是压缩的包,需要展开,如果您的软件包是 .tar 的文件,使用 tar xvf <文件名>z展开,如果是 .cpi 或 cpio 的文件名,使用 cpio -ivcdBum <文件名> 展开。】
step 1)
创建 account 服务用户和用户组(你也可以就使用 informix 用户,不过俺不建议这样,还是分开的好)
# groupadd account
# useradd -d /usr/account -s /bin/sh -g account -G informix -c "Account Users" -m account
step 2)
修改环境变量配置文件 .profile
添加如下内容:
INFORMIXDIR=/opt/informix
PATH=${PATH}:${INFORMIXDIR}/bin:.
TERMCAP=${INFORMIXDIR}/etc/termcap
LD_LIBRARY_PATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:
ONCONFIG=onconfig.webs109
INFORMIXSERVER=webs109_sys
INFORMIXSERVERALIAS=webs109_sys_ali
export INFORMIXDIR PATH TERMCAP LD_LIBRARY_PATH ONCONFIG INFORMIXSERVER INFORMIXSERVERALIAS
step 3)
修改操作系统,添加IDS 的 tlitcp 服务的端口号
# vi /etc/serivces
在最后添加如下内容
webs109_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
【注意:如果重链内核时报错,请仔细检查拼写是否错误,如没有拼写错误,请修改 mtune 文件,在其中修改相应内容,然后再重新链接】
step 5)
配置 IDS 的通讯配置文件。
# vi /opt/informix/etc/sqlhosts
将其中的内容用 '#' 注释掉,然后添加如下内容:
webs109_sys ontlitcp webs109 webs109_comm
webs109_sys_alias onipcshm webs109 sqlexec
【第一列:是 IDS 服务名,即 INFORMIXSERVER 和 INFORMIXSERVERALIAS 定义的部分,第二列是通讯类型名,ontlitcp 为 tcpip 方式,onipcshm 为共享内存方式,第三列是你的服务器名称,就是你在安装的时候的服务器的名称,第四列是对应的服务动作的名称,webs109_comm 对应的是 /etc/services 文件中前面定义的部分,表示是通过网络端口 webs109_comm端口 来访问 ids 服务,sqlexec 表示是直接在服务器上执行 sql 访问ids服务。】
step 6)
配置 IDS 共享内存配置文件 onconfig.webs109 (就是你在环境变量 ONCONFIG 中定义的文件名)
# cd /opt/informix/etc
# cp onconfig.std onconfig.webs109
# vi onconfig.webs109
修改如下内容:
ROOTPATH /usr/account/dbs/rootdbs #【你的数据文件块名称,如果是使用的裸设备,请在这里指定具体的裸设备文件名。】
ROOTSIZE 2000000 #【数据文件的大小,这里俺设置的是 2GB,需要注意的是,在 OSR5 中单个文件的大小不能超过 2GB】
MSGPATH /usr/account/log/online.log #【系统日志文件定义】
CONSOLE /dev/null #【控制台消息输出,原来是指向 /dev/console 的,这里俺把它重定向到了 /dev/null ,控制台输出信息将不会再输出了。】
ALARMPROGRAM /opt/informix/etc/log_full.sh #【log 脚本文件位置】
SYSALARMPROGRAM /opt/informix/etc/evidence.sh #【系统设备启动脚本文件位置】
TAPEDEV /dev/null #【数据库备份设备,这里俺是一个实验环境,所以定义到了空设备,如果是生产环境,你需要定义成磁带机,这样会保险得多,最起码你应该定义代一个物理磁盘设备,这样有利于数据备份。】
LTAPEDEV /dev/null # 【日志文件备份设备,这里俺是一个实验环境,所以定义到了空设备,如果是生产环境,你需要定义成磁带机,这样会保险得多,最起码你应该定义代一个物理磁盘设备,这样有利于数据备份。】
SERVERNUM 1 # 【服务编号,通常情况下,你的机器上也许不只一个 IDS 服务,这时候,你需要保证该值的唯一性。】
DBSERVERNAME webs109_sys # 【数据服务名,与你的环境变量中的 INFORMIXSERVER 参数定义的内容相对应。】
DBSERVERALIASES webs109_sys_alias # 【数据服务别名,与你的环境变量中的 INFORMIXSERVERALIAS 参数定义的内容相对应。】
NETTYPE tlitcp,1,20,NET # 【数据服务类型定义,与 sqlhost 文件中的相应部分对应,此处对应的是 ontlitcp 方式。】
NETTYPE ipcshm,1,20,CPU # 【数据服务类型定义,与 sqlhost 文件中的相应部分对应,此处对应的是 onipcshm 方式。】
DRLOSTFOUND /opt/informix/etc/dr.lostfound # 【这个定义不知道是干嘛的,俺只是将 /usr/informix/etc/dr.lostfound 改成了 /opt/informix/etc/dr.lostfound 】
step 7)
添加数据服务的日志目录和数据块文件。
用 account 用户注册,进入系统。
Login: account
Password:
$ mkdir dbs
$ cd dbs
$ > rootdbs
$ cd ..
$ chmod -R g+rwx dbs
$ chown -R informix:informix dbs
$ mkdir log
$ mkdir bin
step 8)
初始化共享内存,并启动服务。
$ oninit -iy
$ onmode -ky
$ oninit -y
$ onstat -a
用 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 value (1,'aaaa','bbbbbb','11/12/2011');
【注意:有关如何建库建表,请参考 informix 相关书籍,其实大多数的数据库建库建表的 sql 语句都相同的】
以下部分以 C 语言编写例子:
编写如下程序代码进行数据访问
test.ec
- #include <libSDK.h>
-
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;
-
-
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 <stdlib.h>
-
#include <stdio.h>
-
#include <string.h>
-
#include <sys/stat.h>
-
#include <ustat.h>
-
#include <signal.h>
-
#include <setjmp.h>
-
#include <malloc.h>
-
#include <math.h>
-
#include <ctype.h>
-
#include <sys/types.h>
-
#include <time.h>
-
-
#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../incl -I$(INFORMIXDIR)/incl -I$(INFORMIXDIR)/incl/esql
-
-
ESQL = $(INFORMIXDIR)/bin/esql
-
-
TARGET = test
-
-
all:$(TARGET)
-
-
test:test.ec
-
$(ESQL) -o test $(INCL) test.ec
-
mv test $(HOME)/bin
在 src 目录下执行 gmake ,编译 test 【注意,这个 Makefile 文件是针对 gmake 3.8.1 写的,系统自带的 make 可能不支持这种写法,请参阅相关的 Make 文档】
执行 test 将输出信息。
$ test
==0001
===aaaa
==bbbbb
==2011/11/12
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 目录下。