Oracle服务器连接
1 Oracle服務器的兩類連接方式
Oracle數據庫連接有多種方式,按照客戶端和服務器端是否同機運行可分成兩大類,一是本地連接,二是通過網絡連接。
本地連接。顧名思義,就是客戶端程序和服務器程序運行在同一臺機器上。安裝Oracle時,客戶端程序sqlplus自動伴隨安裝在了服務器機器上,所以這種方式總是可用。
遠程連接??蛻舳顺绦蚝头掌鞫顺绦蜻\行于不同的機器上。
另外,Oracle在連接方面還有一個獨特的特點,那就是Oracle實例尚未運行時,仍然可以通過客戶端連接。其中的原因在于,服務器端負責偵聽的并不是Oracle實例本身,而是另一個獨立的偵聽器程序tnslsnr。
2 本地連接
本地連接不需要偵聽器工作。本地連接可以連接到已經運行的實例,也可以連接到空實例(實例尚未運行)。本地連接時,sqlplus首先根據$ORACLE_HOME找到oracle可執行文件,然后啟動一個專用服務器進程,并運行這個程序。然后依據$ORACLE_HOME和$ORACLE_SID這兩個環境變量來確定要連接的實例,所以連接之前必須要設定號它們.
2.1 連接到已經運行的實例
目前一個SID為orcl12c的實例正在運行,此時sqlplus以ORACLE安裝用戶oracle運行,此用戶屬于OSDBA組,所以oracle不需要驗證用戶名密碼。而?"as sysdba" 則會強制以SYS用戶登錄。
[oracle@centos192?~]$?env?|?grep?ORACLE ORACLE_SID=orcl12c ORACLE_HOME=/opt/app/oracle/product/12.1.0/dbhome_1 [oracle@centos192?~]$?sqlplus?/?as?sysdba;SQL*Plus:?Release?11.2.0.3.0?Production?on?Fri?Dec?5?01:55:33?2014Copyright?(c)?1982,?2011,?Oracle.??All?rights?reserved.Connected?to: Oracle?Database?12c?Enterprise?Edition?Release?12.1.0.2.0?-?64bit?Production With?the?Partitioning,?OLAP,?Advanced?Analytics?and?Real?Application?Testing?optionsSQL>當以sysdba身份連接時,ORACLE根本不理會命令行上提供的用戶名和密碼,而是直接以SYS賬戶登錄。而此時又是oracle這個操作系統賬戶執行sqlplus,導致不需要驗證密碼,所以可以正常登錄。如下所示:
[oracle@centos192?~]$?sqlplus?randomusername/randompassword?as?sysdba;SQL*Plus:?Release?11.2.0.3.0?Production?on?Fri?Dec?5?02:28:03?2014Copyright?(c)?1982,?2011,?Oracle.??All?rights?reserved.Connected?to: Oracle?Database?12c?Enterprise?Edition?Release?12.1.0.2.0?-?64bit?Production With?the?Partitioning,?OLAP,?Advanced?Analytics?and?Real?Application?Testing?optionsSQL>如果使用了 as sysdba,而又不是oracle這個操作系統賬戶運行sqlplus,那么就必須提供正確的SYS賬戶密碼了,否則登錄不上。
[root@centos192?~]#?sqlplus?sys/wrongpassword??as?sysdba;SQL*Plus:?Release?11.2.0.3.0?Production?on?Fri?Dec?5?03:49:36?2014Copyright?(c)?1982,?2011,?Oracle.??All?rights?reserved.ERROR: ORA-01017:?invalid?username/password;?logon?deniedEnter?user-name:如下是不使用as sysdba的連接。使用system用戶連接。
[oracle@centos192?~]$?sqlplus?system/systempassword;SQL*Plus:?Release?11.2.0.3.0?Production?on?Fri?Dec?5?02:22:48?2014Copyright?(c)?1982,?2011,?Oracle.??All?rights?reserved.Connected?to: Oracle?Database?12c?Enterprise?Edition?Release?12.1.0.2.0?-?64bit?Production With?the?Partitioning,?OLAP,?Advanced?Analytics?and?Real?Application?Testing?optionsSQL>2.2 實例尚未啟動時的連接
這種情況其實是比較特殊的,無論是tnslsnr偵聽器還是instance都沒有啟動,也就是說目前oracle相關的軟件完全沒有運行。這樣建立服務器連接的任務就完全落在了sqlplus身上。其實實例是否運行與sqlplus本地連接關系不大,sqlplus照樣還是首先啟動一個專用服務器進程,只是這個進程無法與實例通信(實例還沒有運行)。
[oracle@centos192?~]$?sqlplus?/?as?sysdba;SQL*Plus:?Release?11.2.0.3.0?Production?on?Fri?Dec?5?03:59:24?2014Copyright?(c)?1982,?2011,?Oracle.??All?rights?reserved.Connected?to?an?idle?instance.SQL>如果此時不是以oracle用戶運行,那么就必須提供正確的用戶名和密碼了,問題是數據庫實例尚未啟動,當然無法自身驗證此用戶密碼。解決辦法就是服務器進程會根據密碼文件來驗證用戶。默認安裝后的密碼文件位于$ORACLE_HOME/dbs/目錄中,里只有SYS這一個用戶,所以只有SYS才能登陸。
[root@centos192?~]#?sqlplus?sys/syspassword?as?sysdba;SQL*Plus:?Release?11.2.0.3.0?Production?on?Fri?Dec?5?04:19:04?2014Copyright?(c)?1982,?2011,?Oracle.??All?rights?reserved.Connected?to?an?idle?instance.SQL>3 遠程連接
遠程連接與本地連接的最大區別就是,必須啟動tnslsnr這個偵聽器程序,而且此時的專用服務器進程也是有這個偵聽器負責產生了。再一個區別就是如何找到指定實例,本地連接確定實例的依據是$ORACLE_SID,而遠程連接時則是靠偵聽器公布的服務名(tnslsnr內部負責服務名與實例SID的對應)。另外,由于是遠程連接,所以不存在操作系統安裝用戶免驗證了,所有登錄必須驗證用戶名和密碼。
下面給出幾個例子。
3.1 實例已經啟動時
為了明顯起見,這次從一臺Windows機器上運行sqlplus.
C:\>sqlplus?system/systempassword@172.16.2.192/orcl12c.xy.comSQL*Plus:?Release?12.1.0.2.0?Production?on?星期五?12月?5?13:51:39?2014Copyright?(c)?1982,?2014,?Oracle.??All?rights?reserved.上次成功登錄時間:?星期五?12月?05?2014?03:37:41?+08:00連接到: Oracle?Database?12c?Enterprise?Edition?Release?12.1.0.2.0?-?64bit?Production With?the?Partitioning,?OLAP,?Advanced?Analytics?and?Real?Application?Testing?opt ionsSQL>3.2 實例尚未啟動時
實例尚未啟動時,密碼驗證還是要通過密碼文件,這個與本地連接相同。
C:\>sqlplus?sys/syspassword@172.16.2.192/orcl12c.xy.com?as?sysdba;SQL*Plus:?Release?12.1.0.2.0?Production?on?星期五?12月?5?13:57:16?2014Copyright?(c)?1982,?2014,?Oracle.??All?rights?reserved.ERROR: ORA-12514:?TNS:?監聽程序當前無法識別連接描述符中請求的服務請輸入用戶名:這次登錄失敗了,原因就是tnslsnr偵聽器并沒有公開orcl12c.xy.com這個服務。這是因為這個服務是實例啟動后自動向偵聽器動態注冊的,現在實例還沒有啟動,當然也就沒有注冊這個服務。解決辦法就是提前靜態注冊,具體做法是修改$ORACLE_HOME/network/admin/listener.ora這個文件,添加靜態服務項,如下:
#?listener.ora?Network?Configuration?File:?/opt/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora #?Generated?by?Oracle?configuration?tools.LISTENER?=(DESCRIPTION_LIST?=(DESCRIPTION?=(ADDRESS?=?(PROTOCOL?=?TCP)(HOST?=?localhost)(PORT?=?1521))(ADDRESS?=?(PROTOCOL?=?IPC)(KEY?=?EXTPROC1521))))SID_LIST_LISTENER?=(SID_LIST?=(SID_DESC?=(ORACLE_HOME?=?/opt/app/oracle/product/12.1.0/dbhome_1)(SID_NAME?=?orcl12c)))如此一來,偵聽器已啟動就會自動想外公布這個名為orcl12c的服務,并對應到orcl12c這個SID的實例上。通過lsnrctl stop; lsnrctl start;重新啟動tnslsnr之后,就會通過lsnrctl status看到這個服務了。如下圖:
[oracle@centos192?~]$?lsnrctl?statusLSNRCTL?for?Linux:?Version?12.1.0.2.0?-?Production?on?05-DEC-2014?04:47:25Copyright?(c)?1991,?2014,?Oracle.??All?rights?reserved.Connecting?to?(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) STATUS?of?the?LISTENER ------------------------ Alias?????????????????????LISTENER Version???????????????????TNSLSNR?for?Linux:?Version?12.1.0.2.0?-?Production Start?Date????????????????04-DEC-2014?14:23:19 Uptime????????????????????0?days?14?hr.?24?min.?6?sec Trace?Level???????????????off Security??????????????????ON:?Local?OS?Authentication SNMP??????????????????????OFF Listener?Parameter?File???/opt/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora Listener?Log?File?????????/opt/app/oracle/diag/tnslsnr/centos192/listener/alert/log.xml Listening?Endpoints?Summary...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Services?Summary... Service?"orcl12c"?has?1?instance(s).Instance?"orcl12c",?status?UNKNOWN,?has?1?handler(s)?for?this?service... [oracle@centos192?~]$盡管SID為orcl12c的實例并沒有啟動,但是偵聽器已經把它提供的服務對外發布了。此時就可以通過遠程連接它了,盡管還是一個空實例。
C:\>sqlplus?sys/syspassword@172.16.2.192/orcl12c?as?sysdba;SQL*Plus:?Release?12.1.0.2.0?Production?on?星期五?12月?5?14:07:53?2014Copyright?(c)?1982,?2014,?Oracle.??All?rights?reserved.已連接到空閑例程。SQL>4 總結
為清楚起見,總結本地連接和遠程連接的特點為如下表格。
| 本地連接 | sqlplus | $ORACLE_HOME和$ORACLE_SID環境變量 | 1 運行sqlplus的操作系統賬戶是否是安裝oracle軟件擁有者 2 密碼文件 3 數據庫自身 |
| 遠程連接 | tnslsnr偵聽進程 | 客戶端提供的服務名 | 1 密碼文件 2 數據庫自身 |
另一個需要注意的就是 SYS 這個特殊賬戶和 as sysdba這個特殊身份。只要是 as sysdba身份,必須是SYS這個賬戶名,反過來這不成立,因為SYS還可以以其他身份登入系統。
登錄驗證流程圖:
2014年12月6日更正:
按照Oracle文檔說明,使用具有管理權限的身份登錄時(as sysdba, as sysoper, as syskm, as sysbackup, as sysdg),根本不會去數據庫字典驗證,只能通過密碼文件、操作系統等外部驗證手段。下面是官網給出的認證流程圖。
這些特殊管理權限身份特殊,使用它們連接時,會話用戶和當前schema都是特定的。
然而通過實際實驗,我發現如果實例已經啟動,那么遠程連接的話,認證首先是數據庫字典而不是密碼文件。我做的簡單實驗就是sqlplus sysbackup/systembackuppassword@172.16.2.192/orcl12c as sysbackup; 如果實例是啟動的,那么這個連接將會失敗,因為sysbackup賬戶是被鎖定的,而如果實例尚未啟動,這個連接將會成功。所以官方的文檔也許有不正確的地方,還希望大家繼續探討。
轉載于:https://blog.51cto.com/10704296/1694528
總結
以上是生活随笔為你收集整理的Oracle服务器连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker1.8在Centos7下的安
- 下一篇: Nodejs架构之json空处理