Oracle數據庫連接有多種方式,按照客戶端和服務器端是否同機運行可分成兩大類,一是本地連接,二是通過網絡連接。
本地連接。顧名思義,就是客戶端程序和服務器程序運行在同一台機器上。安裝Oracle時,客戶端程序sqlplus自動伴隨安裝在了服務器機器上,所以這種方式總是可用。遠程連接。客戶端程序和服務器端程序運行於不同的機器上。另外,Oracle在連接方面還有一個獨特的特點,那就是Oracle實例尚未運行時,仍然可以通過客戶端連接。其中的原因在於,服務器端負責偵聽的並不是Oracle實例本身,而是另一個獨立的偵聽器程序tnslsnr。
本地連接不需要偵聽器工作。本地連接可以連接到已經運行的實例,也可以連接到空實例(實例尚未運行)。本地連接時,sqlplus首先根據$ORACLE_HOME找到oracle可執行文件,然後啟動一個專用服務器進程,並運行這個程序。然後依據$ORACLE_HOME和$ORACLE_SID這兩個環境變量來確定要連接的實例,所以連接之前必須要設定號它們.
目前一個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 2014 Copyright (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 options SQL>
當以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 2014 Copyright (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 options SQL>
如果使用了 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 2014 Copyright (c) 1982, 2011, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied Enter 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 2014 Copyright (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 options SQL>
這種情況其實是比較特殊的,無論是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 2014 Copyright (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 2014 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to an idle instance. SQL>
遠程連接與本地連接的最大區別就是,必須啟動tnslsnr這個偵聽器程序,而且此時的專用服務器進程也是有這個偵聽器負責產生了。再一個區別就是如何找到指定實例,本地連接確定實例的依據是$ORACLE_SID,而遠程連接時則是靠偵聽器公布的服務名(tnslsnr內部負責服務名與實例SID的對應)。另外,由於是遠程連接,所以不存在操作系統安裝用戶免驗證了,所有登錄必須驗證用戶名和密碼。
下面給出幾個例子。
C:\>sqlplus system/[email protected]/orcl12c.xy.com SQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 13:51:39 2014 Copyright (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 ions SQL>
實例尚未啟動時,密碼驗證還是要通過密碼文件,這個與本地連接相同。
C:\>sqlplus sys/[email protected]/orcl12c.xy.com as sysdba; SQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 13:57:16 2014 Copyright (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 status LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 05-DEC-2014 04:47:25 Copyright (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/[email protected]/orcl12c as sysdba; SQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 14:07:53 2014 Copyright (c) 1982, 2014, Oracle. All rights reserved. 已連接到空閒例程。 SQL>
為清楚起見,總結本地連接和遠程連接的特點為如下表格。
另一個需要注意的就是 SYS 這個特殊賬戶和 as sysdba這個特殊身份。只要是 as sysdba身份,必須是SYS這個賬戶名,反過來這不成立,因為SYS還可以以其他身份登入系統。