玩轉Oracle伺服器串連,轉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 ORACLEORACLE_SID=orcl12cORACLE_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 ProductionWith 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 ProductionWith 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 ProductionWith 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 ProductionWith the Partitioning, OLAP, Advanced Analytics and Real Application Testing optionsSQL>
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 LISTENERVersion TNSLSNR for Linux: Version 12.1.0.2.0 - ProductionStart Date 04-DEC-2014 14:23:19Uptime 0 days 14 hr. 24 min. 6 secTrace Level offSecurity ON: Local OS AuthenticationSNMP OFFListener Parameter File /opt/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.oraListener Log File /opt/app/oracle/diag/tnslsnr/centos192/listener/alert/log.xmlListening 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還可以以其他身份登入系統。