一、前言
先说明下,这里系统是CentOS7_86_64,Oracle版本是Oracle10g R2,假设系统和数据库都已安装完毕。前面有一篇文章详细说明了CentOS7下安装Oracle10g的流程,需要的同学可以去看一下。传送门:CentOS7_86_64安装Oracle10g R2血泪史。
二、检查/设置系统防火墙
说明:这里主要是为了设置oracle允许远程连接,如果没有这个需求,可以先不用管。
1、客户端检测网络通过性
此步骤不执行也可以,如果没条件检测的话。这里只是说明下网络是否正常,与后面的防火墙配置没有绝对的关系。
一般如果客户端
ping serverip
没问题则表示可访问到linux服务器
tnsping serverip
没问题说明tns下可以访问。
我是win7客户端连接linux下的Oracle服务器,就是在这里tnsping不可以通过,网上查到原因是linux防火墙问题。但是我安装的centos7默认没有安装防火墙模块,却意外的屏蔽了外部机器对linux主机的访问。
解决思路:安装防火墙模块,并对防火墙进行设置。
2、检测linux下防火墙配置信息
root下执行命令
#systemctl status iptables.service
或者
#systemctl start iptables.service
提示类似下面信息
Unit iptables.service failed to load: No such file or directory
或者
Failed to issue method call: Unit iptables.service failed to load: No such file or directory.
iptables-failThis simple means you do not have iptables-services package installed.
这里说明我的centos7下缺少防火墙模块。需要先安装防火墙模块。如果在安装CentOS7时选择了安全模块,这里应该就不会出现这种问题。
3、yum安装防火墙模块
#yum install iptables-services
安装成功后,再执行命令status查看防火墙状态,如果开启,可以restart一下
#systemctl restart iptables.service
如果关闭,执行开启命令
#systemctl start iptables.service
之后再查看下状态,如果开启,应该会显示active。
另外CentOS7 的默认防火墙是firewalld,这里还需要做一些设置。
执行
#systemctl disable firewalld.service
禁止firewall开机启动,然后执行
#systemctl enable iptables.serivce
#systemctl start iptables.serivce
以上安装并开启了centos7的防火墙,但我们这里还需要设置,将1521端口允许远程机器访问。
4、设置防火墙开放端口1521
有两种解决方案,一种是直接关闭防火墙,一种是配置防火墙服务,开启1521端口。
(1)关闭防火墙,
#systemctl stop iptables.service
但是重启后会失效,
当然也可以去执行
#systemctl disable iptables.service
永久关闭防火墙,但是也不推荐,不安全不合理。合理的解决方式应该是给1521端口开放,而保持防火墙服务正常开启。
(2)配置防火墙,开启1521端口。
首先用iptables查看当前规则:iptables -L -n , 如下图
可以看到,真的只有寥寥几个端口被允许连接.所以让iptables开放1521端口允许此端口被连接:
首先:
#vi /etc/sysconfig/iptables
加入:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1521 -j ACCEPT
保存后退出vi编辑器,然后:
# service iptables save
# service iptables restart
之后重启,再执行一下
#iptables -L -n ,
如果现实1251端口开放,则设置成功。
至此,防火墙配置结束。
三、创建Oracle数据库实例并配置监听和网络服务
安装oracle时一般会创建一个实例orcl,这里假设还没有创建数据库,或者我们需要另一个数据库实例,重新创建一个。
1.创建Oracle实例
使用oracle登录,
首先设置下当前语言环境为英文,防止乱码
$export LANG=enUS
执行命令,打开创建实例窗口——Database Configuration Assistant。
$dbca
点击next,选择
Create a Database
除了设置实例名称、账户密码、选择Character Sets,基本都是一路点击next,最后点击OK,开始创建数据库实例。假设这里建了实例test,实例sid为testsid
2、配置监听
oracle账户下,输入命令打开配置窗口——Oracle Net Configuration Assistant
$netca
选择第一项,然后点击next
Listener Configuration
如果之前配置过其他实例的监听,一般这里选择Reconfigure项,然后一路next直到finish即可。
3、配置本地网络服务名
在刚才的Net Configuration Assitant窗口中,选择第三个——Local Net Service Name Configuration,点击next
选择Add,点击Next,输入实例名test,点击next,选择TCP,点击next,然后输入Host name,这里一般输入本机IP地址,输入localhost或者127.0.0.1应该也可以,端口保持默认1521不变,然后next,选择“Yes,perform a test”进行连接测试,点击next,会告诉你登录失败,一般都是这样,这时点击Change Login,使用system和之前创建实例时设置的password登录,点击OK,显示Test successful,接着点击next,输入test,再点击next,选择No,然后next,next,回到第一个界面,此时网络配置成功。
可以输入如下命令,查看刚才的配置。(因为这篇文章是接着上一篇写的,我的ORACLE_HOME是/opt/oracle/102/。)
$cat /opt/oracle/102/network/admin/listener.ora
$cat /opt/oracle/102/netword/admin/tnsnames.ora
查看之前的监听和网路配置。
四、启动本地数据库实例
还是使用oracle用户登录。上面创建了test实例,下面我们就来启动这个实例,要不然没有意义啊。
在启动之前,我们一般先要启动监听,执行命令
$lsnrctl start
$lsnrctl status
启动实例可以有两种方式,一种是使用sqlplus,一种是直接调用启动脚本dbstart。但是默认dbstart是有问题的,我们先使用第一种。
1、使用sqlplus启动实例
如果有多个实例,且指向那个实例,可以用
$echo $ORACLE_SID
查看,如果需要改变,可以使用如下命令制定要启动的Oracle实例的SID。
$export ORACLE_SID=testsid
$echo $ORACLE_SID
然后执行命令
$sqlplus /nolog
$conn /as sysdba
以dba身份进入,接着输入指令
SQL>startup
则启动了数据库实例test。
如果需要关闭,则之前流程都一样,最后一步执行shutdown immediate即可。
2、使用dbstart启动数据库
还有个很好用的命令dbstart和dbshut,但是dbstart需要配置一下,如果直接执行,会报错:
ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener
或者类似
Failed to auto-start Oracle Net Listene using /ade/vikrkuma_new/oracle/bin/tnslsnr
看来是listener服务没有起来,但是执行lsnrctl start却能启动listener服务。
搜索dbstart文件中的tnslsnr字符串
$grep tnslsnr dbstart
返回结果:
if [ -f $ORACLE_HOME_LISTNER/bin/tnslsnr ] ; then
echo "Failed to auto-start Oracle Net Listene using $ORACLE_HOME_LISTNER/bin/tnslsnr"
看来可能是ORACLE_HOME_LISTNER环境变量引起的,查找ORACLE_HOME_LISTNER
grep ORACLE_HOME_LISTNER dbstart
返回结果
# 3) Set ORACLE_HOME_LISTNER
ORACLE_HOME_LISTNER=/ade/vikrkuma_new/oracle
if [ ! $ORACLE_HOME_LISTNER ] ; then
echo "ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener"
LOG=$ORACLE_HOME_LISTNER/listener.log
if [ -f $ORACLE_HOME_LISTNER/bin/tnslsnr ] ; then
$ORACLE_HOME_LISTNER/bin/lsnrctl start >> $LOG 2>&1 &
export VER10LIST=`$ORACLE_HOME_LISTNER/bin/lsnrctl version | grep "LSNRCTL for " | cut -d' ' -f5 | cut -d'.' -f1`
echo "Failed to auto-start Oracle Net Listene using $ORACLE_HOME_LISTNER/bin/tnslsnr"
$LOGMSG "Restart Oracle Net Listener using an alternate ORACLE_HOME_LISTNER: lsnrctl start"
其中有一段给ORACLE_HOME_LISTNER环境变量赋值,但是这个路径是不对的,编辑dbstart文件
vi /opt/oracle/102/bin/dbstar
将该行改为
export ORACLE_HOME_LISTNER=$ORACLE_HOME
保存退出,然后执行dbstart就没问题了。
一般情况下,dbshut不会有错,如果有的话,同理解决。
五、远程连接Linux服务器上的Oracle实例
前面我们基础工作已经完成,接下来就可以测试远程连接了。这里的测试场景为plsql客户端连接远程linux服务器。客户端所在环境为windows7,服务器环境为centos7,连接数据库实例test,实例的sid是testsid。
1、oracle客户端配置
因为plsql客户端通过tns连接数据库服务器,在客户端需要安装oracle客户端。具体安装过程不说了,不会的去网上找,比较简单。安装完成之后,需要配置。
在客户端安装路径的network/admin下,即
D:oracleproduct10.2.0client_1NETWORKADMIN
有几个比较重要的文件,分别是sqlnet.ora,tnsnames.ora,listener.ora。
这是plsq客户端比较关键的配置文件。这里有几个建议,
(1)将linux服务器上的tnsnames.ora直接拷贝到此处。比手动编写要靠谱些,避免一些错误。当然也可以用客户端的net Configuration Assistant来配置。
(2)将linux服务器上的sqlnet.ora直接拷贝到此处。
(3)使用Net Congratulation Assistant配置监听,配置完之后,会生成新的listener.ora文件。这个不用动。
2、plsql客户端配置
打开plsql客户端,登录窗口点击cancel,直接进入。点击Tools-Preferences,打开配置选项卡,在第一项Connection中,将Oracle客户端路径
D:oracleproduct10.2.0client_1instantclient
拷贝到Oracle Home处,之后在下方的OCI library应该会显示成
D:oracleproduct10.2.0client_1binoci.dll
点击Apply应用配置,到此配置就结束了。
然后再打开plsql,选择身份和数据库实例,输入用户名和密码,就可以访问了。
到这里,我们已经创建了一个数据库实例,并且启动服务,而且设置了远程可连接,也就是说,我们的数据库服务器已经可用了。但还有个问题就是,Oracle不会随着开机自动启动,每次开机我们都得手动dbstart,这不是我们想要的。网络上有很多关于设置oracle服务开机自启的方法,这里选择比较简单的一个,折腾了很久,终于搞定。其实很简单,主要还是对linux尤其是centos7不熟。
六、设置Linux开机自启动
1、配置oratab
先以root身份登录到linux系统,键入命令
vi /etc/oratab
进入vi编辑器后,找到
testsid:/opt/oracle/102:N
,改为
testsid:/opt/oracle/102:Y
修改完成后,保存退出vi。
说明:testsid为实例sid;/opt/oracle/102安装目录;会因安装的情况不同而有所不同。
2、配置rc.local
键入命令
vi /etc/rc.d/rc.local
添加如下行
su oracle -lc "/opt/oracle/102/bin/lsnrctl start"
su oracle -lc /opt/oracle/102/bin/dbstart
其中第一行因为lsnrctl之后有空格,需要引号,第二行加不加引号都可以。修改完保存退出即可。
但是还有一个很重要的问题,如果是在以前的centos版本中,这样就可以了。但是centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In constrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
翻译:
#这个文件是为了兼容性的问题而添加的。
#强烈建议创建自己的systemd服务或udev规则来在开机时运行脚本而不是使用这个文件。
#与以前的版本引导时的并行执行相比较,这个脚本将不会在其他所有的服务后执行。
#请记住,你必须执行“chmod +x /etc/rc.d/rc.local”来确保确保这个脚本在引导时执行。
于是我又确认了下/etc/rc.local的权限
[root@localhost ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 8月 12 06:09 /etc/rc.local -> rc.d/rc.local
[root@localhost ~]# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 477 6月 10 13:35 /etc/rc.d/rc.local
发现原来/etc/rc.d/rc.local没有执行权限,于是按说明的内容执行
chmod +x /etc/rc.d/rc.local
重启后发现/etc/rc.local能够执行了。
然后使用如下命令查看数据库实例的启动情况。
$lnsrctl status
$ps -ef |grep ora_
分别查看监听和实例的运行情况。
到此,终于结束,基本上可以实现oracle的开机自启动。另外说明下,由于整理这篇文章时,已经距离我实际实验有一段时间了,可能有的地方漏了,不过一般网上都能找到资料。还有说明下本文章的内容,是结合网络上别人的资料和自己的实践整理的,很多地方都是别人的文章的内容,我只是把遇到的问题放在一起梳理了一下,仅供学习之用。感谢每一个乐于 共享知识的人。如有错误,请指正。