關於PLSQL連接ORACLE配置字符串
首先要講一下下面的一些知識
1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER) Oracle實例是由SGA和一組后台進程組成的,實例的創建和啟動需要一個參數文件,而參數文件的名稱就是由ORACLE_SID決定的。
對於init文件,缺省的文件名稱是init<ORACLE_SID>.ora,對於 spfile文件,缺省的文件名稱是spfile<ORACLE_SID>.ora 設置不同的ORACLE_SID值,就可以默認使用不同的參數文件啟動不同的數據庫實例。
例如: sql>startup spfile='/u01/oracle/product/11.2.0/dbs/spfileprd.ora' 在實例啟動后,實例名稱INSTANCE_NAME也是從ORACLE_SID得到的。
SQL> select value from v$parameter where name='spfile';
VALUE
--------------------------------------------------------------------------------
/u01/oracle/product/11.2.0/dbs/spfileprd.ora //spfile+prd.ora組成
2.INSTANCE_NAME: INSTANCE_NAME是Oracle實例的名字,用來區分不同的實例。在Oracle9i之前,該名字存儲在兩個地方:參數文件和數據庫的內部試圖(V$INSTANCE). 而在Oracle10g之后的版本中,這個名字不再出現在參數文件中,而是動態從系統中獲得,默認是取自ORACLE_SID。 INSTANCE_NAME的作用除了區別不同實例之外,在監聽器動態注冊時,還會用於向監聽器注冊。
比如instance_name=abc,監聽中將動態注冊Instance "prd",status READY信息。
//查看實例名
SQL> select INSTANCE_NAME FROM v$instance;
INSTANCE_NAME
------------------------------------------------
prd
//查看監聽器
[oracle@prod:/home/oracle$lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 16-MAR-2022 17:13:11
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date 16-MAR-2022 16:59:10
Uptime 0 days 0 hr. 14 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File /u01/oracle/diag/tnslsnr/rac-12c-2/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac-12c-2)(PORT=1521)))
Services Summary...
Service "prd" has 2 instance(s).
Instance "prd", status UNKNOWN, has 1 handler(s) for this service...
Instance "prd", status READY, has 1 handler(s) for this service...
3.DB_NAME: DB_NAME概念相比於INSTANCE_NAME要重要的多,它決定實例將掛在的數據文件。它出現在數據文件,控制文件,日志文件中。在參數文件中也出現,且必須出現。
這個參數涉及到系統的物理文件。 4.SERVICE_NAME和GLOBAL_DBNAME: 這兩個參數之所以放在一起講,是因為他們往往是成對出現的。SERVICE_NAME出現在Tnsnames.ora文件中,是客戶端要請求的服務名。 GLOBAL_DBNAME 出現在Listener.ora文件中,是服務器提供的服務名,可以通過show parameter service_names查看,
SQL> show parameter service_names;
NAME TYPE VALUE
service_names string prd
並可以通過alter system set service_name='servicename' scope=both來修改。 二者對應,實現了Listerner.ora/Tnsnames.ora的重要功能----監聽、請求與驗證。
首先就要涉及三個配置文件中,其中最重要的首先要看sqlnet.ora,通過這個文件來決定怎么樣找一個連接中出現的連接字符串。
oracle網絡配置三個配置文件 listener.ora、sqlnet.ora、tnsnames.ora文件查看(遠程和本地連接重點是看這三個文件)
三個文件中首先又要關注sqlnet.ora
1、sqlnet.ora
[grid@shdb02 ~]$ locate sqlnet.ora
/u01/app/11.2.0/grid/network/admin/sqlnet.ora
[grid@shdb02 ~]$ cat /u01/app/11.2.0/grid/network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
ADR_BASE = /u01/app/grid
2、listener.ora
[grid@shdb02 ~]$ locate listener.ora /u01/app/11.2.0/grid/network/admin/listener.ora [grid@shdb02 ~]$ cat /u01/app/11.2.0/grid/network/admin/listener.ora LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = htcmsdb) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) (SID_NAME =htcmsdb2) ) ) ADR_BASE_LISTENER = /u01/app/grid ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
3、tnsnames.ora
[grid@shdb02 ~]$ locate tnsnames.ora
/u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
[grid@shdb02 ~]$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
STANDBY1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.129.51.40)(PORT = 1521))
)
(CONNECT_DATA =
(SID = shdb1)
(SERVICE_NAME = shdb1) //這個是lsnrctl中注冊的實例名,lsnrctl status查看
)
)
ORA1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.128.51.20)(PORT = 1521))
)
(CONNECT_DATA =
(service_name = ora1)
)
)
htst =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.128.51.20)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = htst) //這個是lsnrctl中注冊的實例名,lsnrctl status查看
)
)
對應數據庫(各個數據庫以什么方式可以連接)
SQL> Select username,server,program from v$session where username is not null; USERNAME SERVER ------------------------------ --------- PROGRAM ------------------------------------------------ SYS DEDICATED oraagent.bin@shfpdb02 (TNS V1-V3) SHFP DEDICATED plsqldev.exe SYS DEDICATED sqlplus@shfpdb02 (TNS V1-V3) USERNAME SERVER ------------------------------ --------- PROGRAM ------------------------------------------------ SHFP DEDICATED JDBC Thin Client SHFP DEDICATED JDBC Thin Client
oracle網絡配置
三個配置文件中最重要的首先要看sqlnet.ora,通過這個文件來決定怎么樣找一個連接中出現的連接字符串。
三個配置文件 listener.ora、sqlnet.ora、tnsnames.ora ,我們這里是放在了/u01/app/11.2.0/grid/network/admin目錄下。
1. sqlnet.ora
文件作用:
sqlnet.ora文件控制着客戶端Oracle NetServices的行為,例如跟蹤級別和會話特性。
當客戶發出請求時,通過使用tnsnames.ora文件首先解析Oracle Net Services的名稱。
tnsnames.ora文件中的參數將該請求指引到適當的數據庫節點。
監聽器進程監聽客戶請求,
並且將其與一個服務器進程相連接。該請求將被處理,其結果被返回到客戶端機器。
參數解釋:
#SQLNET.AUTHENTICATION_SERVICES= (NTS)
none:作用是不允許通過os系統用戶登錄數據庫,需要提供數據庫用戶名及密碼
all: 作用是允許所有的登錄方式
nts: 作用是windows的本地操作系統用戶認證,unix環境需注釋掉。
NONE,NTS 兩種方式可以並用。
#NAMES.DIRECTORY_PATH可以有多種設置,
例如:
1、設置NAMES.DIRECTORY_PATH=(TNSNAMES),
客戶端就只會從設置的tnsnames.ora查找你要連接的字符串(如orcl)記錄,
如果tnsname.ora文件中沒有此記錄,則連接不上數據庫。
2、設置NAMES.DIRECTORY_PATH=(TNSNAMES,ONAMES)
客戶端首先會從tnsnames.ora查找你要連接的字符串(如orcl)記錄,
如果tnsname.ora文件中沒有此記錄,
則Oracle使用自己的名稱服務器(Oracle Name Server)來解析 (ONAMES) 。
一般比較少使用Name Server。
3、設置 NAMES.DIRECTORY_PATH= (TNSNAMES,ONAMES,HOSTNAME,EZCONNECT)
先找tnsnames.ora,沒有的話,再找Oracle Name Server,再找不到,那么嘗試把客戶端(設置的)要連接的字符串(如orcl)
當作一個主機名,通過網絡的途徑去解析它的ip地址然后去連接這個ip上GLOBAL_DBNAME=連接字符串(如orcl)
這個實例,當然這里連接字符串(如orcl)並不是一個主機名,最后會嘗試以ezconnect的方式連接數據庫。
所謂 EZCONNECT是oracle10g引入的簡單連接,sqlplus連接格式:
不是 sqlplus user/password@10.121.10:1521:orcl
而是 sqlplus user/password@10.121.10:1521/orcl 是/不是:
我們的配置文件是:NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
先找tnsnames.ora,沒有的話,再找Oracle Name Server,再找不到,那么嘗試把客戶端(設置的)要連接的字符串(如orcl)
當作一個主機名,通過網絡的途徑去解析它的ip地址然后去連接這個ip上GLOBAL_DBNAME=連接字符串(如orcl)
2. tnsnames.ora------這個文件類似於unix 的hosts文件,提供的tnsname到主機名或者ip的對應。
遠程連接中 tnsnames.ora和listener.ora 他兩是息息相關的(集群模式除外,集群的時候, 監聽器開啟與否無關)
只有當sqlnet.ora中類似 NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,
也就是客戶端解析連接字符串的順序中有TNSNAMES是,才會嘗試使用這個文件。
[oracle@shdb02 ~]$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
STANDBY1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.41)(PORT = 1521))
)
(CONNECT_DATA =
(SID = shdb1)
(SERVICE_NAME = standby)
)
)
#這條信息記錄我們將使用TCP協議,去連接IP地址為10.128.51.20,端口號為1521的數據庫主機上服務名為htst的數據庫
htst =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.20)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.21)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = htst)
)
)
MYORA:客戶端連接服務器端使用的服務別名。注意一定要頂行書寫,否則會無法識別服務別名。
PROTOCOL:客戶端與服務器端通訊的協議,一般為TCP,該內容一般不用改。
HOST:ORACLE服務器端IP地址或者hostname。確保服務器端的監聽啟動正常。
PORT:數據庫偵聽正在偵聽的端口,可以察看服務器端的listener.ora文件或在數據庫偵聽所在的機器
命令提示符下通過lnsrctl status [listener name]命令察看。
此處Port的值一定要與數據庫偵聽正在偵聽的端口一樣。
SERVICE_NAME:在服務器端,用system用戶登陸后,sqlplus> show parameter service_name命令查看。
3. listener.ora------listener監聽器進程的配置文件
關於listener進程就不多說了,接受遠程對數據庫的接入申請並轉交給oracle的服務器進程。
所以如果不是使用的遠程的連接,listener進程就不是必需的,同樣的如果關閉listener進程並不會影響已經存在的數據庫連接。
例子:
oracle@prod:/home/oracle$vi /u01/oracle/product/11.2.0/network/admin/listener.ora
//配置監聽多個服務名和多個全局數據庫
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = prd)
(SID_NAME = prd)
(ORACLE_HOME=/u01/oracle/product/11.2.0)
)
(SID_DESC=
(GLOBAL_DBNAME=fp)
(ORACLE_HOME=/u01/oracle/product/11.2.0)
(SID_NAME=fp)
)
(SID_DESC=
(SID_NAME=mysql_uts01)
(ORACLE_HOME=/u01/oracle/product/11.2.0)
(PROGRAM=dg4odbc)
)
)
//配置監聽器名稱,如何你配置了多個監聽器名稱,我們可以通過 lsnrctl status MYLISTENER 來查看某個監聽器的狀態
//所以這是一個名為 MYLISTENER的監聽器
MYLISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.70)(PORT = 1522))
LISTENER :監聽名稱,可以配置多個監聽,多個監聽的端口號要區分開來。 GLOBAL_DBNAME :全局數據庫名。通過select * from global_name; 查詢得出 ORACLE_HOME :oracle軟件的跟目錄 SID_NAME :數據庫實例的SID PROTOCOL:監聽協議,一般都使用TCP HOST:本機IP地址,雙機時候使用浮動VIP PORT:監聽的端口號,使用netstat –an 檢查該端口不被占用。
1、客戶端連接形式為: 用戶名: serp01 密碼: passwd01 數據庫為連接字符串: 10.128.51.22:1521/fp,注意/fp,而不是:fp 因為是服務名連接方式
2、服務器監聽log
[grid@shdb02 app]$ locate listener.log /u01/app/grid/diag/tnslsnr/shdb02/listener/trace/listener.log [grid@shfpdb02 app]$ tail -f /u01/app/grid/diag/tnslsnr/shdb02/listener/trace/listener.log
......
監聽的log日志,在登陸時候就會出現相應的反映。