RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解

      RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解

  背景介绍,有项目功能需求是每分钟在局域网内ping 100个不同ip。每个ip绑定一个设备,ping通认为设备在线。将设备是否在线情况统计后存入oracle数据库,为web提供原始数据后显示给用户查看。经分析,程序为B/S架构需要开发Linux后台守护进程不断ping不同ip并写入oracle数据库。

一.RedHat6.0系统安装

1.简介

RedHat(红帽)是桌面虚拟化世界领先的开源解决方案供应商,其发布的redHat系统在服务器架设中有广泛应用。RedHat为收费系统,社区免费版为CentOS。CentOS来自Red Hat Enterprise Linux依照开放源代码规定释放出的源代码编译而成,由于出自同样的源代码,因此有要求高稳定性的服务器可以用CentOS代替RedHat。两者不同在于CentOS不包含封闭源代码软件。

2.安装redHat系统(非虚拟机)

安装方式为制作U盘启动盘进行安装,所需资源系统镜像,UltraISO(镜像刻录软件),4G及以上U盘,电脑。需要装在电脑上安装redHat和其它双系统的电脑磁盘最少需要2个主分区必须挂载redHat Boot和根目录分区,而硬盘出厂时厂商一般有个100M的主分区,扩展分区总共算1个主分区。建议可以需安装redHat尽量不要双系统可以节省很多的时间,如必须双系统可以使用winPE等工具分好盘符。

1)     打开UltraISO软件,文件->打开->选择系统镜像->插入U盘(制作时U盘将被格式化注意备份)->启动->写入磁盘映像->等待5分钟左右写入完成即可

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第1张图片

2)     将U盘插入电脑开机不停按del进入BIOS选择从U盘启动,就可以看到redHat图形界面进行安装。

3)     一定记住安装系统时设置的根密码相当于root su用户密码

4)     选择安装类型可选择使用所有空间不用自己再分盘符后将修改写入盘符,选择安装类型时有基本服务器,数据库服务器,万维网服务器,虚拟主机,桌面,软件开发工作站,最小。几个选项可以根据情况选择安装,如仅自己测试使用建议选择桌面,无图形界面操作在终端或命令行不熟悉很难操作。下方所需软件库有系统(必选)可扩展文件系统支持,弹性存储,负载均衡,高可用性可根据情况选择。后30分钟左右安装完成

5)     由于RedHat为商业版本其系统自带软件更新未付费不可用,而oracle安装时必须安装依赖库。需要将yum软件更新源切换到国内163源http://mirrors.163.com/centos/1)选择和自己系统版本最相近的版本进入http://mirrors.163.com/centos/6/os/x86_64/Packages/中ctrl+F查找4个软件包

忽略版本号名称对应就可以

yum-3.2.2.27-14.el6.centos.noarch.rpm yum-metadata-parser-1.1.2-14.1.el6.x86_64.rpm 

yum-plugin-fastestmirror-1.1.26-11.el6.noarch.rpm

python-iniparse-0.3.1-2.1.el6.noarch.rpm 

  2)卸载原系统yumrpm –aq|grep yum|xargs rpm –e –nodeps

  3)安装yum rpm -ivhpython-iniparse-0.3.1-2.1.el6.noarch.rpm 
rpm -ivhyum-metadata-parser-1.1.2-14.1.el6.x86_64.rpm 

rpm-ivhyum-3.2.27-14.el6.centos.noarch.rpm yum-plugin-fastestmirror-1.1.26-11.el6.noarch.rpm  
注意最后两个包必需同时安装,否则会相互依赖 

  4)下载http://mirrors.163.com/.help/CentOS5-Base-163.repo 记事本打开将所有$releasever

替换成自己版本号,例如我的是redHat6系统就替换成6 baseurl=http://mirrors.163.com/centos/6/os/$basearsh/后复制改好的信息vim /etc/yum.repos.d/rhel-debuginfo.repo 覆盖原信息后:wq保存退出

  5)终端中执行命令yum clean all(清除所有缓存信息)  yum makecache(刷新yum源缓存)  yum installvim(测试是否ok)

 

二.oracle 11g R2安装配置

1)资源准备,oracle官网下载oracle安装程序http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html,2个文件of1和of2都要下载,下载oracle图形化管理工具SQLDeveloper,下载JDKjdk-7u67-linux-x64.rpm,下载window平台PLSQLDeveloper。要使用SQL Developer必须安装jdk7(jdk6以上8以下),SQL Developer测试本地oracle连接图形化管理数据库,PLSQL Developer测试远程数据库连接也管理数据库。

2)检查电脑硬件是否满足安装需求,内存大于1g grep Memtotal /proc/meminfo 交换空间大于2g  grep SwapTotal /proc/meminfo 硬盘大于16gdf-ah  基本不太老电脑都可以满足

3)依赖包安装yum installbinutils-2.* compat-libstdc++-33* elfutils-libelf-0.* 

elfutils-libelf-devel-* gcc-4.* gcc-c++-4.*glibc-2.* glibc-common-2.* glibc-devel-2.* glibc-headers-2.* libaio-0.* libaio-devel-0.* libgcc-4.* libstdc++-4.*libstdc++-devel-4.*  make-3.* sysstat-7.*unixODBC-2.* unixODBC-devel-2.*

4)为避免安装冲突后再安装libXp,然后再安装pdksh163源中查找pdksh-5.2.14-37.el5_8.1.x86_64.rpm,rpm –ivh pdksh-5.2……rpm 如提示与ksh冲突已安装ksh可以使用命令rpm –eksh-*卸载

5) 创建Oracle用户与组,设置oracle用户密码

 #groupadd oinstall # groupadd dba

 #useradd -m -g oinstall -G dba oracle # passwd oracle

6)配置系统内核参数

 #vim /etc/sysctl.conf

 kernel.shmmax = 536870912

 kernel.shmmni= 4096

 kernel.sem = 250 32000 100 128 

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048576

fs.aio-max-nr = 1048576

fs.file-max = 6815744

使修改生效sysctl –p

7)修改系统资源限制  编辑系统资源限制配置文件 vim/etc/security/limits.conf,在该文件下添加如下行: # vim /etc/security/limits.conf

oracle soft nproc 2047

oracle hard nproc 16384

oracle soft nofile 1024

oracle hard nofile 65536

oracle soft stack 10240

8)关闭SELinux  vim /etc/selinux/config 修改SELINUX=disabled;可使系统重启后不启动SELinux,关闭当前已开启SELinux可使用setenforce0;命令

9)vim /etc/hosets 检查是否有localhost指向127.0.0.1若没有oracle监听会出现问题无法启动监听。可添加localhost并确定主机名指向真实的ip地址否则oracle只能监听只能建立在127.0.0.1上。

10)创建oracle安装文件夹以及数据文件夹,把oracle安装在/u01/app/oracle目录下需创建目录如下

 #mkdir -p /u01/app/oracle

 #chown -R oracle:oinstall /u01/app/oracle

 #chmod 755 /u01/app/oracle 

11)安装时数据放在/u01/app/oracle/oradata目录下,所以需创建该目录:

#mkdir -p /u01/app/oracle/oradata

#chown -R oracle:oinstall /u01/app/oracle/oradata

#chmod -R 755 /u01/app/oracle/oradata  

12)安装时还需要设置Inventory 目录,所以需创建该目录:

#mkdir -p /u01/app/oraInventory

 #chown –R oracle:oinstall/u01/app/oraInventory

#chmod -R 755 /u01/app/oraInventory

13)设置ORACLE_HOME目录

 #mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1

 #chown -R oracle:oinstall/u01/app/oracle/product/11.2.0/dbhome_1

#chmod -R 755/u01/app/oracle/product/11.2.0/dbhome_1

说明:想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。

14)将oracle2个安装文件都解压到/u01/app/oracle/database目录中

15)重启系统已oracle用户登录,设置环境变量

vim /home/oracle/.bash_profile

ORACLE_BASE=/u01/app/oracle 

ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1

 ORACLE_SID=orcl (需和后面创建的需监听数据仓库一致,不一致可更改

 LD_LIBRARY_PATH=$ORACLE_HOME/lib 

PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin 

export ORACLE_BASE ORACLE_HOME ORACLE_SIDLD_LIBRARY_PATH PATH

退出后使修改生效 source /home/oracle/.bash_profile

16)开始安装oracle

#chmod -R 755 /u01/app/oracle/ 使程序有执行权限

 #suoracle  获取权限

 $cd/u01/app/oracle/database   打开安装程序位置

 $export LANG=C  解决乱码oracle安装界面乱码问题

$./runInstaller   执行安装程序

注意:下图为我截取window平台安装图片和Linux下一样,可能出问题在第4部数据库路径选择报错没权限点击浏览重新选择相同路径即可解决,一定记住安装时的密码和用户名数据库名重要信息,数据仓库使用UTF8存储避免中文乱码,数据库使用内存自动增长

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第2张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第3张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第4张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第5张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第6张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第7张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第8张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第9张图片

18)数据仓库创建,创建共享服务器否则只能本地使用oracle。可通过dbca创建仓库和修改仓库为共享模式

启动dbca命令su oracle –> cd –>export LANG=C ->dbca中文界面如下可根据需要配置修改

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第10张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第11张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第12张图片

19)配置数据仓库监听,可修改/oracle/…/dbhome_1/network/admin目录下listener.ora来配置但麻烦且容易出错,另中通过图形化界面netca命令或netmgr命令但netca只能配置监听不能配置传输功能。因此使用netmgr命令图形界面配置

  1)以oracle用户登录后终端输入netmgr界面如下,+号添加监听,配置好后lsnrctl start启动监听

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第13张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第14张图片

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第15张图片

20)oracle 手动启动关闭步骤命令

su oracle(获取权限)->lsnrctl start(启动监听)->sqlplus /nolog(进入sqlplus)->conn /as sysdba(连接数据库已管理员用户登录本地无需密码)或普通用户登录 conn world/oracle123 前面用户名后面密码登录->startup(启动数据库实例)->shutdown immediate(关闭数据库实例)->lsnrctl stop(关闭监听)

21)开机oracle用户登录自动启动oracle数据实例配置

  1)vim /etc/oratab 修改orcl=/u01/app/oracle/product/dbhome_1:Y 将N改为Y将允许自动启动

  2)修改oracle自带启动与关闭脚本

   分别是dbstart和dbshut,执行脚本为启动或关闭数据库。在oracle账户下修改$ORACLE_HOME/bin/dbstart

cd$ORACLE_HOME/bin/dbstart –>vim dbstart 将ORACLE_HOME_LISTNER=$1改为ORACLE_HOME_LISTENER=$ORACLE_HOME

之所以做这一步,是因为在这个脚本自动生成的时候,也就是ORACLE被安装进RHEL的时候,这个脚本并不知道你的ORACLE_HOME_LISTNER是什么,现在要将这个参数显示的写明,这样就不会在执行这个脚本的时候报ORACLE_HOME_LISTNER没有被指定的错误了。注意:dbstart和dbshut脚本在10g之后就已经将监听器的启动与关闭合并进数据库实例的启动与关闭脚本里面了。而不再是单独分开的了。
同样的方式,我们也要修改dbshut的这个参数。这里就不再详细写出了,他们在同一个目录下。

  3)在/etc/init.d目录下新建一个文件名为oracle,完整内容如下(如果和自己实际路径不符合需自己修改路径)

# !/bin/sh

#chkconfig:345 6161

# description:Oracle 11g AutoRun Services

#/etc/init.d/oracle

#

# Run-levelStartup script. for the Oracle Instance, Listener, and

# Web Interface

 

export ORACLE_BASE=/u01/app/oracle

exportORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1

exportORACLE_SID=orcl

exportPATH=$PATH:$ORACLE_HOME/bin

 

ORA_OWNR="oracle"

 

# if theexecutables do not exist -- display error

 

if [ ! -f$ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]

then

     echo "Oracle startup: cannotstart"

     exit 1

fi

 

# depending onparameter -- startup, shutdown, restart

# of the instanceand listener or usage display

 

case"$1" in

start)

     # Oracle listener and instance startup

     su $ORA_OWNR -lc $ORACLE_HOME/bin/dbstart

 

     touch /var/lock/subsys/oracle11

     su $ORA_OWNR -lc"$ORACLE_HOME/bin/emctl start dbconsole"

     echo "Oracle StartSuccesful!OK."

     ;;

stop)

     # Oracle listener and instance shutdown

     su $ORA_OWNR -lc"$ORACLE_HOME/bin/emctl stop dbconsole"

     su $ORA_OWNR -lc $ORACLE_HOME/bin/dbshut

 

     rm -f /var/lock/subsys/oracle11

     echo "Oracle Stop Succesful!OK."

     ;;

reload|restart)

     $0 stop

     $0 start

     ;;

*)

     echo $"Usage: `basename $0`{start|stop|reload|reload}"

exit 1

esac

exit0

 这段脚本的关键解释:
第一:#chkconfig:345 99 10虽是一行注释,但是确实关键的必不可少的一行,除非你不用chkconfig命令来自动生成符号连接文件,而是完全采用手工创建。否则没有这一行,执行chkconfig系统将会报出oracle11没有chkconfig服务权限的错误。
第二:su oracle -c $ORACLE_HOME/bin/dbstart和touch /var/lock/subsys/oracle11这两行的作用是首先执行dbstart脚本启动oracle,然后在服务活动列表目录中创建一个与oracle11这个服务同名的一个文件,表示这个服务是活动的,也就是被启动的。而su oracle -c $ORACLE_HOME/bin/dbshut和rm -f/var/lock/subsys/oracle11这两行的作用是首先执行dbshut脚本关闭oracle,然后从服务活动列表目录中删除那个与oracle11同名的那个文件,表示这个服务不是活动的,也就是已经被关闭。

那么为什么要做touch /var/lock/subsys/oracle11和rm -f/var/lock/subsys/oracle11这两步呢?原因是跟LINUX系统的机制有关的:LINUX的判别一个服务是否被启动的依据是在/var/lock/subsys/目录下是否与服同名的文件,若有则表示这个服务已经被启动了,在系统关闭的时候,LINUX会把这里面列出的服务全部关闭,并删掉与服务同名的文件。若一个服务被启动了,但却在这个目录里没有那个服务的同名文件,则不会关闭那个服务。网上的文章均将这个地方设置错了,所以会发现,ORACLE可以随系统启动了,但却没有随系统关闭。我也是分析了/etc/rc.d/rc.local后才发现这个原理的。经过试验,果然如此。再分析mysql的启动与关闭脚本也是这样做的,最终恍然大悟
原来如此。这个地方请大家注意了。

4)将这个脚本注册成为一个系统服务
方法有二:
其一:先给脚本分配可以被执行的权限。执行下面命令:
#su-root
chown oracle /etc/init.d/oracle11
chmod 775 /etc/init.d/oracle11

-------[root@oracle init.d]# chmod 750/etc/init.d/oracle

-------链接:
 
-------[root@oracle init.d]# ln -s /etc/init.d/oracle /etc/rc1.d/K61oracle

-------[root@oracle init.d]# ln -s/etc/init.d/oracle /etc/rc3.d/S61oracle

-------执行以下命令:
 
-----[root@oracle init.d]# chkconfig --level 345 oracle on   (参数--level 为两个"-",下同)

-----[root@oracle init.d]# chkconfig --addoracle          // 添加到服务里


再创建符号链接文件。
chkconfig --add /etc/init.d/oracle11,执行这个命令就需要你在脚本中写上#chkconfig:3459910了。这样当这个命令被执行的时候,回去oracle11文件中寻找这行注释,并解析这行注释,根据解析结果分别在/etc/rc.d/rc3.d;/etc/rc.d/rc4.d;/etc/rc.d/rc5.d中创建符号连接文件S99oracle11文件,这个文件是系统启动时要执行的,其实这个文件是指向/etc/init.d/oracle11的,启动的时候系统向这个文件发送一个start参数,也就执行了oracle11文件中的start分支了。还会在/etc/rc.d/rc0.d;/etc/rc.d /rc1.d;/etc/rc.d/rc6.d中创建K10oracle11文件,这个文件时系统关闭时要执行的,其实这个文件也是指向/etc /init.d/oracle11的,关闭的时候系统向这个文件发送一个stop参数,也就执行了oracle11文件中的stop分支了。
我想你应该明白#chkconfig:3459910中这些数字的含义了吧:指出3,4,5级别启动这个服务,99是在相应的/etc /rc.d/rcN.d(N为前面指定的级别,这里是2345)目录下生成的链接文件的序号(启动优先级别)S99oracle11,10为在除前面指出的级别对应的/etc/rc.d/rcN.d(N为除2345之外的级别)目录生成的链接文件的序号(服务停止的优先级别)K10oracle11。至于为什么在这些目录中创建文件和文件的命名规则,这就要您对LINUX的系统启动流程有一个熟悉的了解了,在这就不详谈了。
其二:若您想尝试一下手动创建符号连接文件的乐趣,请执行如下命令:
#su -root
ln -s /etc/init.d/oracle11 /etc/rc.d/rc3.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc4.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc5.d/S99oracle11
作用效果和执行chkconfig --add oracle11是一样的。
重启之后看看/var/lock/subsys/目录下的oracle11log文件,里面是不是有脚本的启动分支输出信息呢?

 

touch/var/lock/subsys/local

su oracle –lc “/u01/app/oracle/product/11.2.0/dbhome_1/bin/lsnrctlstart”

su oracle –lc/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart

 

22)创建用户,表,字段并授权用户读写权限

 1.在终端中su oracle->sqlplus /nolog -> conn /assysdba 进入SQL命令

 2.创建临时表空间create temporary tablespace user_temptmmpfile ‘/u01/app/oracle/oradata/orcl/user_temp.dbf’  size 50m autoextend on next 50m maxsize20480m extent management local;

 3.创建数据表空间 crate tablespace user_data loggingdatafile ‘/u01/app/oracle/oradata/orcl/user_data.dbf’ size 50m autoextend onnext 50m maxsize 220480m extent management local;

4.创建用户并指定表空间

create user username identified by passworddefault tablespace user_data temporary tablespace user_temp;

5.给用户授权

grant connect,resource,dba tousername;  用户权限3个connect resource dba其中connect resource 增删改查就够了

6.其它备用知识

删除数据库用户drop user TEST cascade,删除无外键约束表drop table User.tablename;

23)本地Oracle SQL Developer图形化管理软件安装

  1.安装jdk7并配置环境变量(简单可自行百度方法完成)一定要安装jdk否则程序安装后点击无法启动

 2.oracle官网http://www.oracle.com/index.html-->Downloads-->Developer Tools-->SQL Developer下载后安装

  3.在系统应用程序,编程中有启动程序图标如jdk配置完成就可以启动程序后点击+号添加连接,oracle有系统用户sys ,system 信息输入正确点击测试正常后即可连接 ,连接如下:

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第16张图片

4.连接成功后可以在新建的普通用户下图形化创建数据表,并写入原始数据不用再授权,如下图

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第17张图片

24)远程连接数据库配置window7平台PLSQL Developer

 1.资源准备自行下载PLSQL Developer,Instant Client(地址http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html)Instant Client一定下载32位的即使你系统为64位版本(64位连接不上)

2.配置方法博客http://w-tingsheng.blog.163.com/blog/static/25056034201211382932264/,后做记录。将InstantClient解压到C:\Program Files\instantclient_12_1目录,在文件夹目录中新建network目录,将oracle服务器中/u01/app/oracle/product/11.2.0/dbhome_1/network/admin文件夹copy到C:\ProgramFiles\instantclient_12_1\network下,起作用为tnsnames.ora文件中有服务器ip 端口数据库sid信息可记事本查看如不正确可改动后保存即可

3.window7设置系统变量名TNS_ADMIN 值为C:\Program Files\instantclient_12_1

4.在PLSQL Developer根目录中创建start.bat文件,内容如下

@echo off 
set path=D:\oracle\product\instantclient_10_2
set ORACLE_HOME=D:\oracle\product\instantclient_10_2
set TNS_ADMIN=D:\oracle\product\instantclient_10_2
set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
start plsqldev.exe

 5.启动PLSQLDeveloper不登录直接进入,工具->首选项->连接->选择自己oci路径C:\Program Files (x86)\instantclient_12_1\oci.dll 如下

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第18张图片

6.重启后登录即可远程连接数据库,如果你下载了instantclient64位会提示无法加载oci.dll还需要下载32位版本。登录后可查看并操作数据库

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第19张图片

三.Pro*C连接oracle数据库开发

1.      简介:为了用户开发oracle应用程序oracle提供了一套oracle调用规范即Oracle call Interface(OCI)但比较难以掌握使用,对于熟悉C/C++用户要花很多时间去研究OCI因此oracle推出一个在C/C++中直接嵌入SQL的方法,通过oracle提供的预编译程序编译成SQLLib,这就是Pro*C/C++。

2.      编译环境,如果你已经安装oracle在/u01/oracle/product/11.2.0/dbhome_1/bin下有proc编译工具,编译过程中需要用到/dbhome_1/precomp/public,lib下资源

3.      网络中查找oracle官方Demo,有人说在oracle安装后在oracle/product/11.2.0/dbhome_1/demo下就有但我安装的11g R2未找到可百度找到下载。其demo第一个就是连接数据库代码,编译命令proc parse=none DYNAMIC=ANSI iname=demo.pc  oname=demo.c à gcc –odemo demo.c –I /u01/app/oracle/product/11.2.0/dbhome_1/precomp/public –L/u01/app/oracle/product/11.2.0/dbhome_1/lib –lclntsh  第一条命令将SQL和C .pc后缀代码混合文件通过编译成.c文件  第二条命令将.c文件编译成可执行文件。其中路径为依赖库文件路径

4.      错误解决,如果.pc编译成.c时不报错但编译出.c长度不够无法编译成.o,需要查看/u01/app/oracle/product/11.2.0/dbhome_1/precomp/admin/pcscfg.cfg 文件是否有$ORACLE_HOME/lib依赖库路径需添加进去保存退出即可。

5.      运行./demo 只能以普通用户登录,输入用户名和密码即可连接上。

RedHat6.0,Oracle11g-R2,Pro*C配置开发图文详解_第20张图片

总结

通过上述步骤你可以搭建一个oracle服务器并连接管理该服务器,要做商业项目还有许多知识要学习。不怕倒腾敢于尝试,懂得学习。肯定会有所收获

 

 

 

 

 

你可能感兴趣的:(ubuntu,oracle11g,redhat,数据库服务器,oracle)