先說明下,這裡系統是CentOS7_86_64,Oracle版本是Oracle10g R2,假設系統和數據庫都已安裝完畢。前面有一篇文章詳細說明了CentOS7下安裝Oracle10g的流程,需要的同學可以去看一下。傳送門:CentOS7_86_64安裝Oracle10g R2血淚史。
說明:這裡主要是為了設置oracle允許遠程連接,如果沒有這個需求,可以先不用管。
此步驟不執行也可以,如果沒條件檢測的話。這裡只是說明下網絡是否正常,與後面的防火牆配置沒有絕對的關系。
一般如果客戶端
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:\oracle\product\10.2.0\client_1\NETWORK\ADMIN
有幾個比較重要的文件,分別是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:\oracle\product\10.2.0\client_1\instantclient
拷貝到Oracle Home處,之後在下方的OCI library應該會顯示成
D:\oracle\product\10.2.0\client_1\bin\oci.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的開機自啟動。另外說明下,由於整理這篇文章時,已經距離我實際實驗有一段時間了,可能有的地方漏了,不過一般網上都能找到資料。還有說明下本文章的內容,是結合網絡上別人的資料和自己的實踐整理的,很多地方都是別人的文章的內容,我只是把遇到的問題放在一起梳理了一下,僅供學習之用。感謝每一個樂於 共享知識的人。如有錯誤,請指正。