关于LINUX系统下安装ORACLE数据库的一点总结
写在前面:
因为之前做一个GPS车辆监控系统,是基于LINUX系统的C语言开发的用OCI驱动连接ORACLE数据库的应用程序,里面要引入一个头文件,而这个头文件必须要安装ORACLE的客户端,其实在LINUX系统下,ORACLE客户端和服务器的安装复杂度并没有多大区别,甚至流程都完全相同。在LINUX系统下安装ORACLE数据库是件颇令人头痛的事情,网上的安装资料也很多,但是要么是互相转载,要么是不完整的,我充分了解作为没有安装经验的人员安装的心情,把我的一点安装经验写出来,作为抛砖引玉。因为没有时间,对于安装的过程未求甚解,下面以在3850服务器上的LINUX5.0系统下安装ORACLE10G客户端为例,详述安装过程。
1、 在3850上安装了LINUX5.0系统后,如果网卡是双网卡的话,系统安装完成之后是识别不了网卡的,必须要安装brcm_dd_nic_bnx2-1.7.6b_rhel5_32-64.tgz,网上去下载这个安装包,注意是tgz压缩文件,解压方法网上很多。解压完了之后会有一个install.sh的文件,在终端里进入该目录,输入./install.sh –update –force,然后回车。安装完毕之后必须重启系统,然后进入系统à网络,在里面配置IP和DNS等。然后激活,就可以上网了。
2、 要准备一些软件包,
compat-gcc-32-3.2.3-47.3.i386.rpm
compat-libgcc-296-2.96-132.7.2.i386.rpm
compat-libstdc++-33-3.2.3-47.3.i386.rpm
compat-libstdc++-296-2.96-132.7.2.i386.rpm
gcc-3.2.2-5.i386.rpm
j2sdk-1_4_1_02-fcs-linux-i586.rpm
libxml2-tests-2.7.2.tar.gz
把系统盘放进去,上面这些包有的能在系统盘里找到,有的需要网上下载。安装完毕之后,运行rpm –q gcc make binutils openmotif,一般情况下能看到有一个openmotif的软件包没有安装,在安装这个包之前,要先在系统盘里找到一个libXp的软件包,要先安装了这个包之后才能解决依赖关系,才能安装openmotif.
3、 验证系统的要求,一般来说现在服务器的配置都是比较高的,所以我觉得这一步可以免去。要查看可用RAM和交换空间的大小,可以用以下命令:
#grep MemTotal /proc/meminfo
#grep SwapTotal /proc/meminfo
4、 创建ORACLE组和账户
在root账户下输入
#/user/sbin/groupadd oinstall
#/usr/sbin/groupadd dba
#usr/sbin/useradd –m –g oinstall –G dba oracle
#id oracle
设置ORACLE账户的密码
#passwd oracle
Changing password for user oracle.
New passwd:
Retype new passwd:
Passwd:all authentication tokens update successfully
5、 创建目录:
#mkdir –p /u01/app/oracle/product/10.2.0/db_1 //此目录是存储安装软件的目录
#mkdir –p /u02/oradata //此目录存放安装程序的位置
#chown –R oracle:oinstall /u01 /u02
#chmod –R 775 /u01 /u02
6、 配置LINUX内核参数
cat >> /etc/sysctl.conf <<EOF
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
EOF
/sbin/sysctl -p
7、 为ORACLE用户设置Shell限制
#cat >> /etc/security/limits.conf <<EOF
>oracle soft nproc 2047
>oracle hard nproc 16384
>oracle soft nofile 1024
>oracle hard nofile 65536
EOF
#cat >> /etc/pam.d/login <<EOF
>session required /lib/security/pam_limits.so
EOF
8、 环境变量:如果按照上面流程进行安装的话,下面的环境变量完全复制过去就可以用了,该环境变量配置文件包含了时间格式、汉字编码格式、libxml。
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
#export C_ALL=C
export NLS_LANG="AMERICAN_AMERICA.UTF8"
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
#export LANG=zh_CN.GB2312
export LANGUAGE=zh_CN.GB2312:zh_CN.GB2312:zh_CN
export SUPPORTED=zh_CN.GB2312:zh_CN:zh:zh_TW.Big5:zh_TW:zh:en_US.UTF-8:en_US:en
9、 如果你的LINUX系统是redhat-5版本的话,请进入/etc/redhat-release打开,将Red Hat Enterprise Linux Server release 5(Tikanga) 替换成redhat-4。
在此目录下找到此文件
/etc/selinux/config,找到这段:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
把 SELINUX=enforcing 注释掉:#SELINUX=enforcing ,然后新加一行为:
SELINUX=disabled
保存,关闭。
编辑/etc/sysconfig/selinux,找到:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
如果SELINUX已经是 SELINUX=disabled,那么就不用改了,否则就把SELINUX=enforcing 注释掉,新加一行:
SELINUX=disabled
保存,退出。
{
如果你碰到其他类似提示:
cannot restore segment prot after reloc: Permission denied
哪应该是SELinux的问题,可以考虑把它关闭。
-------------------------------------------------------------------------------------
郁闷的是.我把SELinux关闭后还是不行.于是到google上search.发现这个很有用.
在你保证SElinux 被disable后.还执行下
chcon -t texrel_shlib_t
如: chcon -t texrel_shlib_t /路径/路径/名字.so (这个文件视具体执行文件.)
}
在/etc/ld.so.conf中加入
/u01/app/oracle/product/10.2.0/db_1/lib
/usr/local/lib
这两行。然后执行#/sbin/ldconfig –v。
到此,配置基本结束了,接下来就是安装了。
10、 将安装程序拷进/u02/oradata,进行解压,如果是10201_client_linux_x86_64.cpio这样的cpio压缩文件,用这的解压方法 #cpio -idmv < 文件名.cpio进行解压。完成之后重启系统,进入ORACLE账户下(注:安装ORACLE必须要在ORACLE账户下)
11、 到oradata目录下会发现一个client的文件夹,$cd /u02/oradata/client,然后运行$./runInstaller回车,默认安装。接下来都是下一步了。安装完了之后输入$netca进行网络配置。如果是服务器端安装流程和配置完全一样,结束之后输入$sqlplus,然后输入system/manager@orcl,进去再查询ORACLE默认的表select * from user_tables,会发现很多的数据。如果重启之后,有可能数据库没有启动起来,则输入$isqlplusctl start.
附录:
1、 LINUX安装序列号:a56eb0c3a4e54ab0
2、 用OCI执行一个简单的SQL查询语句完整代码(注意:查询的字段为一个)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int ocisql(char sql[]);
int CheckErr(OCIError *pErr, sword lStatus);
int ocisql(char sql[])
{
//数据库服务名
static char* dbname = (char*) "gpsdb";
//用户及密码
static char* username = (char*) "gpsuser";
static char* password = (char*) "xxzxgpsserver";
OCIEnv *envhp; // 环境句柄
OCIServer *srvhp; //服务器句柄
OCIError *errhp; //错误句柄
OCIError *errhp1; //错误句柄
OCIError *errhp2; //错误句柄
OCISession *usrhp; //用户会话句柄
OCISvcCtx *svchp; //服务上下文句柄
OCIStmt* stmthp; //语句句柄
//三个定义句柄,用于定义输出结果
OCIDefine* defhp1 = (OCIDefine *) 0;
//OCIDefine* defhp2;
//OCIDefine* defhp3;
//OCIDefine* defhp4;
//输出变量
p_sli3=(char *)malloc(200);
memset(p_sli3,0,200);
//使用线程和对象模式来创建环境句柄
OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid *)0,
0, 0, 0, (size_t) 0, (dvoid **)0);
//分配服务器句柄
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&srvhp,
OCI_HTYPE_SERVER, 0, (dvoid **) 0);
//分配错误句柄
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&errhp,
OCI_HTYPE_ERROR, 0, (dvoid **) 0);
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&errhp1,
OCI_HTYPE_ERROR, 0, (dvoid **) 0);
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&errhp2,
OCI_HTYPE_ERROR, 0, (dvoid **) 0);
//创建服务器上下文句柄,"orcl"为建立连接的数据库名
if (OCIServerAttach (srvhp, errhp, (char *)dbname,
strlen ((char*)dbname), OCI_DEFAULT) == OCI_SUCCESS)
printf("/nconnect successfull/n");
else //终止程序
{
printf("/n数据库名字不对,连接数据库失败!/n");
return -1;
}
//分配服务器上下文句柄
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&svchp,
OCI_HTYPE_SVCCTX, 0, (dvoid **) 0);
//设置服务器上下文句柄的服务器句柄属性
OCIAttrSet ((dvoid *)svchp, OCI_HTYPE_SVCCTX,
(dvoid *)srvhp, (ub4) 0, OCI_ATTR_SERVER, errhp);
//分配用户会话句柄
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&usrhp,
OCI_HTYPE_SESSION, 0, (dvoid **) 0);
//为用户会话句柄设置用户名和密码属性
OCIAttrSet ((dvoid *)usrhp, OCI_HTYPE_SESSION,
(dvoid *)username, (ub4)strlen((char*)username),
OCI_ATTR_USERNAME, errhp);
OCIAttrSet ((dvoid *)usrhp, OCI_HTYPE_SESSION,
(dvoid *)password, (ub4)strlen((char*)password),
OCI_ATTR_PASSWORD, errhp);
if (OCISessionBegin ( svchp, errhp, usrhp,
OCI_CRED_RDBMS, OCI_DEFAULT) == OCI_SUCCESS)
{
printf("session successful!/n");
}
else
{
printf("建立用户会话失败!/n");
return -1;
}
//在服务器上下文环境中设置用户会话属性
OCIAttrSet ( (dvoid *)svchp, OCI_HTYPE_SVCCTX,
(dvoid *)usrhp, (ub4) 0, OCI_ATTR_SESSION, errhp);
//分配语句句柄
CheckErr(errhp,OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0));
//准备SQL语句
CheckErr(errhp,OCIStmtPrepare(stmthp, errhp, sql, strlen((char*)sql),
OCI_NTV_SYNTAX, OCI_DEFAULT));
//定义输出
// CheckErr(errhp, OCIDefineByPos(stmthp, &defhp1, errhp, 1, &nID, sizeof(nID),
// SQLT_INT, 0, 0, 0, OCI_DEFAULT));
CheckErr(errhp,OCIDefineByPos(stmthp, &defhp1, errhp, 1, p_sli3, 33,
SQLT_STR, 0, 0, 0, OCI_DEFAULT));
// CheckErr(errhp, OCIDefineByPos(stmthp, &defhp3, errhp, 3, &nAge, sizeof(nAge),
// SQLT_INT, 0, 0, 0, OCI_DEFAULT));
// CheckErr(errhp,OCIDefineByPos(stmthp, &defhp1, errhp, 2, szAddress, 129,
// SQLT_STR, 0, 0, 0, OCI_DEFAULT));
//rc = OCIDefineByPos(p_sql, &p_dfn, p_err, 3, (dvoid *) gps.strClxh,
// (sword) 20, SQLT_STR, (dvoid *) 0, (ub2 *)0,
// (ub2 *)0, OCI_DEFAULT);
//提取结果
CheckErr(errhp,OCIStmtExecute(svchp, stmthp, errhp, 0, 0, NULL, NULL,
OCI_DEFAULT));
while( OCI_NO_DATA != OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT))
{
printf("p_sli3 is %s/n",p_sli3);
}
printf("结束会话和数据库连接!/n");
//结束会话
OCISessionEnd(svchp, errhp, usrhp, OCI_DEFAULT);
//断开连接
OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
//释放环境句柄
OCIHandleFree((void*)envhp, OCI_HTYPE_ENV);
return 0;
}
int CheckErr(OCIError *pErr, sword lStatus)
{
sb4 m_s_nErrCode = 0;
char m_s_szErr[512];
switch (lStatus)
{
case OCI_SUCCESS:
strcpy(m_s_szErr,"OCI_SUCCESS");
break;
case OCI_SUCCESS_WITH_INFO:
strcpy(m_s_szErr, "OCI_SUCCESS_WITH_INFO");
printf("OCI Error: %s/n", m_s_szErr);
break;
case OCI_ERROR:
OCIErrorGet((dvoid *)pErr, (ub4)1, (text *)NULL, &m_s_nErrCode,
(unsigned char*)m_s_szErr, (ub4)sizeof(m_s_szErr), OCI_HTYPE_ERROR);
printf("OCI Error: %s/n", m_s_szErr);
break;
case OCI_NEED_DATA:
strcpy(m_s_szErr, "OCI_NEED_DATA");
printf("OCI Error: %s/n", m_s_szErr);
break;
case OCI_NO_DATA:
strcpy(m_s_szErr, "OCI_NO_DATA");
printf("OCI Error: %s/n", m_s_szErr);
break;
case OCI_INVALID_HANDLE:
strcpy(m_s_szErr, "OCI_INVALID_HANDLE");
printf("OCI Error: %s/n", m_s_szErr);
break;
case OCI_STILL_EXECUTING:
strcpy(m_s_szErr, "OCI_STILL_EXECUTING");
printf("OCI Error: %s/n", m_s_szErr);
break;
case OCI_CONTINUE:
strcpy(m_s_szErr, "OCI_CONTINUE");
printf("OCI Error: %s/n", m_s_szErr);
break;
default:
break;
}
if (lStatus != OCI_SUCCESS && lStatus != OCI_SUCCESS_WITH_INFO)
{
return 0; //确实有错误
}
else
{
return 1; //没有检查到错误
}
}
int main()
{
static char *selectl = "select simcard, zdh from gps_vehicle";
ocisql(selectl);
}