LINUX下安装ORACLE数据库以及OCI的使用方法

关于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,然后回车。安装完毕之后必须重启系统,然后进入系统à网络,在里面配置IPDNS等。然后激活,就可以上网了。

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);

       }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值