首先打開tnsnames.ora的存放目錄,通常爲D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安裝具體位置了。html
使用editplus或者記事本或其餘工具打開tnsnames.ora,進行編輯node
配置一下文件linux
CONN_shenyi2 =sql
(DESCRIPTION =數據庫
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.17.144.191)(PORT = 1521))windows
(CONNECT_DATA =tomcat
(SERVER = DEDICATED)服務器
(SERVICE_NAME = orcl)網絡
)架構
)
上邊的SERVICE_NAME 和HOST、PORT 改成本身的便可
打開plsql,登錄
登錄完成便可使用強大的plsql developer
今天是重要的一天。將XML數據導入ORACLE遇到不少問題,學了好多,其中很長時間花在網絡配置上,剛開始學,具體緣由不知道,先把蒐集到的好文章存下來,之後慢慢研究。
監聽配置文件
爲了使得外部進程 如 CAMS後臺程序 可以訪問 Oracle 數據庫 必須配
置 Oracle 網絡服務器環境 配置 Oracle 網絡服務器環境是經過配置
listener.ora sqlnet.ora 和 tnsnames.ora 共三個文件來進行的 listener.ora
即監聽配置文件 在本小節說明 另兩個文件分別在隨後的兩個小節說明
監聽配置文件 listener.ora 的存放路徑爲 $ORACLE_HOME/network/admin
如下是一個示例
LISTENER = #監聽器名稱
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = localhost.localdomain)
(PORT = 1521))
)
)
(DESCRIPTION =
(PROTOCOL_STACK =
(divSENTATION = GIOP)
(SESSION = RAW)
)
(ADDRESS =
(PROTOCOL = TCP)
(HOST = localhost.localdomain)
(PORT = 2481))
)
)
SID_LIST_LISTENER = #命名規則 SID_LIST_+上面定義的監聽器名稱
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc1)
(ORACLE_HOME = /u01/app/oracle/product/8.1.7)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = cams)
(ORACLE_HOME = /u01/app/oracle/product/8.1.7)
(SID_NAME = cams)
)
(SID_DESC =
(GLOBAL_DBNAME = oid)
(ORACLE_HOME = /u01/app/oracle/product/8.1.7)
(SID_NAME = oid)
)
)
& 說明
1 listener.ora 文件中定義一個監聽器 其缺省的名稱爲 LISTENER
這個監聽器缺省以tcp/ip爲協議地址且端口號爲1521運行 在CAMS應用中
監聽文件定義的監聽器就使用這個缺省名字 而且使用缺省的協議 tcp/ip
和缺省的端口號 1521 待配置好監聽文件以及隨後說明的 sqlnet.ora 和
tnsnames.ora 文件以後 就能夠用如下命令將監聽文件中定義的監聽器啓動
起來
$ lsnrctl start
中止監聽器的命令爲
$ lsnrctl stop
監測監聽器當前狀態的命令爲
$ lsnrctl status
當 lsnrctl status 命令有以下輸出結果
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 8.1.7.4.0 - Production
Start Date 17-JAN-2004 19:00:08
Uptime 31 days 15 hr. 27 min. 59 sec
就說明監聽器正在運行 不然說明監聽器已經中止了 CAMS 系統的後臺程
序的正常運行不只依賴於數據庫實例的運行 還依賴於這個數據庫監聽器的
運行 假如監聽器沒有啓動 即便數據庫已經啓動 CAMS 後臺程序仍然不
能正常工做
2 如(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))所示的一個
IPC 協議地址的監聽 是爲了外部進程調用用的 在數據庫安裝時自動設定
不須要改動
3 在監聽文件後部還有一個 SID_LIST_LISTENER 段 該段用於定義監聽
器的服務 即爲哪些數據庫實例提供監聽服務 以 cams 實例爲例 其對應的
服務信息爲
(SID_DESC =
(GLOBAL_DBNAME = cams) #數據庫名
(ORACLE_HOME = /u01/app/oracle/product/8.1.7)
(SID_NAME = cams) #數據庫實例名
)
1.2.5 sqlnet.ora 文件
sqlnet.ora 文件的存放路徑爲 $ORACLE_HOME/network/admin 如下是一
個示例
NAMES.DEFAULT_DOMAIN = localdomain
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
& 說明
NAMES.DEFAULT_DOMAIN 指定網絡域名 NAMES.DIRECTORY_PATH
指定當解析客戶端鏈接標識符時命名方法 naming metthods 採用的優先順
序 從左至右遞減 在 CAMS 應用中 這兩個參數採用上述所示的系統缺
省值
1.2.6 tnsnames.ora 文件
tnsnames.ora 文件的存放路徑爲 $ORACLE_HOME/network/admin 如下
是一個示例
OID.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT =
1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oid)
)
)
CAMS.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT =
1521))
)
(CONNECT_DATA =
(SERVICE_NAME = cams)
)
)
INST1_HTTP.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT =
1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = MODOSE)
(divSENTATION = http://admin)
)
)
EXTPROC_CONNECTION_DATA.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc1)
(divSENTATION = RO)
)
)
& 說明
tnsnames.ora 文件中定義一個或多個網絡服務 net service cams 實例對
應的網絡服務爲
CAMS.LOCALDOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = localhost.localdomain)
(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = cams)
)
)
注意 這裏 ADDRESS項包含三個子參數
PROTOCOL :默認協議TCP
HOST :ip地址
PORT:端口,默認1521
CAMS.LOCALDOMAIN爲數據名
要確保在監聽文件中也有對應的一個 ADDRESS 項也包含一樣的三個子參
數 而且子參數的值對應都相等 另外 這裏 SERVICE_NAME 的值必需確
保與監聽文件中某 SID_DESC項下的 SID_NAME參數的值相等
oracle網絡配置
三個配置文件 listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目錄下。
1. sqlnet.ora—–做用相似於linux或者其餘unix的nsswitch.conf文件,經過這個文件來決定怎麼樣找一個鏈接中出現的鏈接字符串。
例如咱們客戶端輸入
sqlplus sys/oracle@orcl
假如個人sqlnet.ora是下面這個樣子
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那麼,客戶端就會首先在tnsnames.ora文件中找orcl的記錄.若是沒有相應的記錄則嘗試把orcl看成一個主機名,經過網絡的途徑去解析它的 ip地址而後去鏈接這個ip上GLOBAL_DBNAME=orcl這個實例,固然我這裏orcl並非一個主機名
若是我是這個樣子
NAMES.DIRECTORY_PATH= (TNSNAMES)
那麼客戶端就只會從tnsnames.ora查找orcl的記錄,括號中還有其餘選項,如LDAP等並不經常使用。
2. Tnsnames.ora——這個文件相似於unix 的hosts文件,提供的tnsname到主機名或者ip的對應,只有當sqlnet.ora中相似
NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,也就是客戶端解析鏈接字符串的順序中有TNSNAMES是,纔會嘗試使用這個文件。
PROTOCOL:客戶端與服務器端通信的協議,通常爲TCP,該內容通常不用改。
HOST:數據庫偵聽所在的機器的機器名或IP地址,數據庫偵聽通常與數據庫在同一個機器上,因此當我說數據庫偵聽所在的機器通常也是指數據庫所在的機器。在UNIX或WINDOWS下,能夠經過在數據庫偵聽所在的機器的命令提示符下使用hostname命令獲得機器名,或經過ipconfig(for WINDOWS) or ifconfig(for UNIX)命令獲得IP地址。須要注意的是,無論用機器名或IP地址,在客戶端必定要用ping命令ping通數據庫偵聽所在的機器的機器名,不然須要在 hosts文件中加入數據庫偵聽所在的機器的機器名的解析。
PORT:數據庫偵聽正在偵聽的端口,能夠察看服務器端的listener.ora文件或在數據庫偵聽所在的機器的命令提示符下經過lnsrctl status [listener name]命令察看。此處Port的值必定要與數據庫偵聽正在偵聽的端口同樣。
SERVICE_NAME:在服務器端,用system用戶登錄後,sqlplus> show parameter service_name命令察看。
ORCL 對應的本機,SALES對應的另一個IP地址,裏邊還定義了使用主用服務器仍是共享服務器模式進行鏈接
#你所要鏈接的時候輸入得TNSNAME
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
#下面是這個TNSNAME對應的主機,端口,協議
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
#使用專用服務器模式去鏈接須要跟服務器的模式匹配,若是沒有就根據服務器的模式自動調節
(SERVER = DEDICATED)
#對應service_name,SQLPLUS>;show parameter service_name; 進行查看
(SERVICE_NAME = orcl)
)
)
#下面這個相似
SALES =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales)
)
)
注意:若是數據庫服務器用MTS,客戶端程序須要用database link時最好明確指明客戶端用dedicated直連方式,否則會遇到不少跟分佈式環境有關的ORACLE BUG。通常狀況下數據庫服務器用直接的鏈接會好一些,除非你的實時數據庫鏈接數接近1000。
3. listener.ora——listener監聽器進程的配置文件
關於listener進程就很少說了,接受遠程對數據庫的接入申請並轉交給oracle的服務器進程。因此若是不是使用的遠程的鏈接,listener進程就不是必需的,一樣的若是關閉listener進程並不會影響已經存在的數據庫鏈接。
Listener.ora文件的例子
#listener.ora Network Configuration File: #E:/oracle/product/10.1.0/Db_2/NETWORK/ADMIN/listener.ora
# Generated by Oracle configuration tools.
#下面定義LISTENER進程爲哪一個實例提供服務 這裏是ORCL,而且它對應的ORACLE_HOME和GLOBAL_DBNAME 其中GLOBAL_DBNAME不是必需的除非
#使用HOSTNAME作數據庫鏈接
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = E:/oracle/product/10.1.0/Db_2)
(SID_NAME = ORCL)
)
)
#監聽器的名字,一臺數據庫能夠有不止一個監聽器
#再向下面是監聽器監聽的協議,ip,端口等,這裏使用的tcp1521端口,而且使#用的是主機名
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
上面的例子是一個最簡單的例子,但也是最廣泛的。一個listener進程爲一個instance(SID)提供服務。
監聽器的操做命令
$ORACLE_HOME/bin/lsnrctl start,其餘諸如stop,status等。具體敲完一個lsnrctl後看幫助。
上面說到的三個文件均可以經過圖形的配置工具來完成配置
$ORACLE_HOME/netca 嚮導形式的
$ORACLE_HOME/netmgr
本人比較習慣netmgr,
profile 配置的是sqlnet.ora也就是名稱解析的方式
service name 配置的是tnsnames.ora文件
listeners配置的是listener.ora文件,即監聽器進程
具體的配置能夠嘗試一下而後來看一下配置文件。
這樣一來整體結構就有了,是
當你輸入sqlplus sys/oracle@orcl的時候
1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
2. 則查詢tnsnames.ora文件,從裏邊找orcl的記錄,而且找到主機名,端口和service_name
3. 若是listener進程沒有問題的話,創建與listener進程的鏈接。
4. 根據不一樣的服務器模式如專用服務器模式或者共享服務器模式,listener採起接下去的動做。默認是專用服務器模式,沒有問題的話客戶端就鏈接上了數據庫的server process。
5. 這時候網絡鏈接已經創建,listener進程的歷史使命也就完成了。
#—————
幾種鏈接用到的命令形式
1.sqlplus / as sysdba 這是典型的操做系統認證,不須要listener進程
2.sqlplus sys/oracle 這種鏈接方式只能鏈接本機數據庫,一樣不須要listener進程
3.sqlplus sys/oracle@orcl 這種方式須要listener進程處於可用狀態。最廣泛的經過網絡鏈接。
以上鍊接方式使用sys用戶或者其餘經過密碼文件驗證的用戶都不須要數據庫處於可用狀態,操做系統認證也不須要數據庫可用,普通用戶由於是數據庫認證,因此數據庫必需處於open狀態。
init.ora中的Remote_Login_Passwordfile對身份驗證的影響
三個可選值:
NONE:默認值,指示Oracle系統不使用密碼文件,經過操做系統進行身份驗證的特權用戶擁有SYSORA和SYSOPER權限
EXCLUSIVE:
1.表示只有一個數據庫實例可使用密碼文件
2.容許將SYSORA和SYSOPER權限賦值給SYS之外的其它用戶
SHARED:
1.表示能夠有多個數據庫實例可使用密碼文件
2.不容許將SYSORA和SYSOPER權限賦值給SYS之外的其它用戶
因此,若是要以操做系統身份登陸,Remote_Login_Passwordfile應該設置爲NONE
當登陸用戶不是ORA_DBA組和ORA_OPER組成員時,登陸數據庫須要在Oracle中建立當前操做系統用戶相同的用戶名,若是當前用戶是域用 戶,則名稱爲:domainname/yourname,若是是本地計算機用戶,則名稱爲:computername/yourname
建立方法:
create "domainname/yourname" identified externally;
操做系統,修改HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0下面添加AUTH_PREFIX_DOMAIN,值設爲FALSE,在建立Oracle用戶時能夠忽略 掉域名
這種方式下,init.ora中有一個參數將影響數據庫如何匹配一個windows用戶和Oracle用戶os_authent_prefix = ""
缺省爲空,Oracle8i之前,無該參數,而使用OPS$做爲用戶名前綴.(Oracle用戶名最大長度限制爲30個字符)
關於域名(主機名)解析
/etc/hosts (UNIX)
或者windows/hosts(WIN98) winnt/system32/drivers/etc/hosts (WIN2000)
客戶端須要寫入數據庫服務器IP地址和主機名的對應關係。
127.0.0.1 localhost
192.168.0.35 oracledb oracledb
192.168.0.45 tomcat tomcat
202.84.10.193 bj_db bj_db
有些時候咱們配置好第一步後,tnsping 數據庫服務器別名顯示是成功的,
可是sqlplus username/password@servicename不通,jdbc thin link 也不通的時候,
必定不要忘了在客戶端作這一步,緣由多是DNS服務器裏沒有設置這個服務器IP地址和主機名的對應關係。
若是同時有私有IP和Internet上公有IP,私有IP寫在前面,公有IP寫在後面。
編輯前最好留一個備份,增長一行時也最好用複製粘貼,避免編輯hosts時空格或者tab字符錯誤。
UNIX下ORACLE多數據庫的環境,OS客戶端須要配置下面兩個環境變量
ORACLE_SID=appdb;export ORACLE_SID
TWO_TASK=appdb;export TWO_TASK
來指定默認的目標數據庫
#————-
平時排錯可能會用到的
1.lsnrctl status查看服務器端listener進程的狀態
LSNRCTL>; help
The following operations are available
An asterisk (*) denotes a modifier or extended command:
start stop status
services version reload
save_config trace change_password
quit exit set*
show*
LSNRCTL>; status
:em11:
2.tnsping 查看客戶端sqlnet.ora和tnsname.ora文件的配置正確與否,及對應的服務器的listener進程的狀態。
C:/>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 – Production on 16-8月 –
2005 09:36:08
Copyright (c) 1997, 2003, Oracle. All rights reserved.
Used parameter files:
E:/oracle/product/10.1.0/Db_2/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_
NAME = orcl)))
OK (20 msec)
3.
SQL>;show sga 查看instance是否已經啓動
SQL>; select open_mode from v$database; 查看數據庫是打開仍是mount狀態。
OPEN_MODE
———-
READ WRITE
使用hostname訪問數據庫而不是tnsname的例子
使用tnsname訪問數據庫是默認的方式,可是也帶來點問題,那就是客戶端都是須要配置tnsnames.ora文件的。若是你的數據庫服務器地址發生改變,就須要從新編輯客戶端這個文件。經過hostname訪問數據庫就沒有了這個麻煩。
須要修改
服務器端listener.ora
#監聽器的配置文件listener.ora
#使用host naming則再也不須要tnsname.ora文件作本地解析
# listener.ora Network Configuration File: d:/oracle/product/10.1.0/db_1/NETWORK/ADMIN/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
# (SID_NAME = PLSExtProc)
(SID_NAME = orcl)
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = d:/oracle/product/10.1.0/db_1)
# (PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
)
客戶端sqlnet.ora 若是確認不會使用TNSNAME訪問的話,能夠去掉TNSNAMES
# sqlnet.ora Network Configuration File: d:/oracle/product/10.1.0/db_1/NETWORK/ADMIN/sqlnet.ora
# Generated by Oracle configuration tools.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (HOSTNAME)
Tnsnames.ora文件不須要配置,刪除也無所謂。
下面就是網絡和操做系統的配置問題了,怎麼樣可以解析個人主機名的問題了
能夠經過下面的方式鏈接
sqlplus sys/oracle@boway
這樣的話,會鏈接boway這臺服務器,而且listener來肯定你所要鏈接的service_name
常見故障解決辦法:
TNS-12154 (ORA-12154):TNS:could not resolve service name
該錯誤表示用於鏈接的網絡服務名在tnsnames.ora文件中不存在,如上面的tnsnames.ora中的網絡服務名只有test,假如用戶在鏈接時用sqlplus system/manager@test1則就會給出TNS-12154錯誤。
要注意的是,有時即便在tnsnames.ora文件中有相應的網絡服務名,但是用該網絡服務名鏈接時還會出錯,出現這種狀況的典型配置以下(在客戶端的機器上):
sqlnet.ora文件:
NAMES.DIRECTORY_PATH = (TNSNAMES, ….)
NAMES.DEFAULT_DOMAIN = server.com
tnsnames.ora文件:
test =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
sql*plus運行基本機理:
在用戶輸入sqlplus system/manager@test後,sqlplus程序會自動到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN參數,假如該參數存在,則將該參數中的值取出,加到網絡服務名的後面,即此例中你的輸入由sqlplus system/manager@test自動變爲sqlplus system/manager@test.server.com ,而後再到tnsnames.ora文件中找test.server.com網絡服務名,這固然找不到了,由於該文件中只有test網絡服務名,因此報錯。解決的辦法就是將sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN參數註釋掉便可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN參數不存在,則sqlplus程序會直接到tnsnames.ora文件中找 test網絡服務名,而後取出其中的host,port,tcp,service_name,利用這些信息將鏈接請求發送到正確的數據庫服務器上。
另外原則上tnsnames.ora中的配置不區分大小寫,可是個人確遇到區分大小寫的狀況,因此最好將使用的網絡服務與tnsnames.ora中配置的徹底同樣。
ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor.
該錯誤表示能在tnsnames.ora中找到網絡服務名,可是在tnsnames.ora中指定的SERVICE_NAME與服務器端的 SERVICE_NAME不一致。解決的辦法是修改tnsnames.ora中的SERVICE_NAME。
易混淆術語介紹:
Db_name:對一個數據庫(Oracle database)的惟一標識,該數據庫爲Oracle database。這種表示對於單個數據庫是足夠的,可是隨着由多個數據庫構成的分佈式數據庫的普及,這種命令數據庫的方法給數據庫的管理形成必定的負擔,由於各個數據庫的名字可能同樣,形成管理上的混亂。爲了解決這種狀況,引入了Db_domain參數,這樣在數據庫的標識是由Db_name和 Db_domain兩個參數共同決定的,避免了由於數據庫重名而形成管理上的混亂。這相似於互連網上的機器名的管理。咱們將Db_name和 Db_domain兩個參數用’.’鏈接起來,表示一個數據庫,並將該數據庫的名稱稱爲Global_name,即它擴展了Db_name。 Db_name參數只能由字母、數字、’_’、’#’、’$’組成,並且最多8個字符。
Db_domain:定義一個數據庫所在的域,該域的命名同互聯網的’域’沒有任何關係,只是數據庫管理員爲了更好的管理分佈式數據庫而根據實際狀況決定的。固然爲了管理方便,能夠將其等於互聯網的域。
Global_name:對一個數據庫(Oracle database)的惟一標識,oracle建議用此種方法命令數據庫。該值是在建立數據庫是決定的,缺省值爲Db_name. Db_domain。在之後對參數文件中Db_name與Db_domain參數的任何修改不影響Global_name的值,若是要修改 Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO 命令進行修改,而後修改相應參數。
Service_name:該參數是oracle8i新引進的。在8i之前,咱們用SID來表示標識數據庫的一個實例,可是在Oracle的並行環境中,一個數據庫對應多個實例,這樣就須要多個網絡服務名,設置繁瑣。爲了方便並行環境中的設置,引進了Service_name參數,該參數對應一個數據庫,而不是一個實例,並且該參數有許多其它的好處。該參數的缺省值爲Db_name. Db_domain,即等於Global_name。一個數據庫能夠對應多個Service_name,以便實現更靈活的配置。該參數與SID沒有直接關係,即沒必要Service name 必須與SID同樣。
Net service name:網絡服務名,又能夠稱爲數據庫別名(database alias)。是客戶端程序訪問數據庫時所須要,屏蔽了客戶端如何鏈接到服務器端的細節,實現了數據庫的位置透明的特性。
如何利用配置的網絡服務名鏈接到數據庫:
用sqlplus程序經過test網絡服務名進行測試,如sqlplus system/manager@test。若是不能鏈接到數據庫,則在tnsname.ora文件中的test網絡服務名(net service)後面加上Oracle數據庫的DB_Domain參數值,經過用sqlplus> show parameter db_domain命令察看。此處db_domain參數值爲testserver.com,將其加到網絡服務名後面,修改後的tnsname.ora中關於該網絡服務名的內容爲:
應該改成:
如何利用配置的網絡服務名鏈接到數據庫:
用sqlplus程序經過test網絡服務名進行測試,如sqlplus system/manager@test。若是不能鏈接到數據庫,則在tnsname.ora文件中的test網絡服務名(net service)後面加上sqlnet.ora文件中NAMES.DEFAULT_DOMAIN參數的值,此處個人參數值爲 testserver.com,將其加到網絡服務名後面,修改後的tnsname.ora中關於該網絡服務名的內容爲:
什麼狀況下會引發oracle自動設置NAMES.DEFAULT_DOMAIN參數?
出現這種狀況的典型環境爲windows的客戶端的‘我得電腦à屬性à計算機名à更改à其它…à此計算機的主DNS後綴’中設置了‘primary dns suffix’,由於在這種狀況下安裝客戶端時,會在sqlnet.ora文件中自動設置NAMES.DEFAULT_DOMAIN參數,或許當把計算機加入域中安裝oracle客戶端時也會出現這種狀況,有條件的話你們能夠試一下。
我在設置oracle的客戶端時通常手工修改tnsnames.ora文件,可是還有許多人喜歡用圖形工具配置,該圖形工具最終仍是修改tnsnames.ora文件,可是它有時會引發其它的問題:
在用oracle的圖形配置軟件’net assistant’或‘Net Configuration Assistant’配置網絡服務名時,假如已經設置了‘primary dns suffix’,可是在圖形配置軟件中寫的網絡服務名的名字中沒有‘primary dns suffix’,如只是寫了test,則圖形配置軟件會自動在後面加上‘primary dns suffix’,使之變爲test.testserver.com,並存在tnsnames.ora中,而無論你的sqlnet.ora文件中是否有 NAMES.DEFAULT_DOMAIN參數。此時,用圖形工具進行測試鏈接是經過的,可是假如此時sqlnet.ora文件中沒有 NAMES.DEFAULT_DOMAIN參數,則你在使用網絡服務名時應該使用在tnsnames.ora中的 test.testserver.com,而不是你在圖形配置軟件中鍵入的test。解決的辦法爲:
能夠在sqlnet.ora文件中設置NAMES.DEFAULT_DOMAIN= testserver.com,這時你能夠用test或test.testserver.com鏈接數據庫
在sqlnet.ora文件中不設置NAMES.DEFAULT_DOMAIN參數,在tnsnames.ora文件中將 test.testserver.com中的.testserver.com去掉,這時你能夠用test鏈接數據庫
listener.ora、 tnsnames.ora和sqlnet.ora這3個文件是關係oracle網絡配置的3個主要文件,其中listener.ora是和數據庫服務器端 相關,而tnsnames.ora和sqlnet.ora這2個文件不只僅關係到服務器端,主要的仍是和客戶端關係緊密。
檢查客戶端oracle網絡的時候能夠先檢查sqlnet.ora文件:
# SQLNET.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/sqlnet.ora
# Generated by Oracle configuration tools.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)
##NAMES.DEFAULT_DOMAIN = us.oracle.com
上面的sqlnet.ora文件說明:
SQLNET.AUTHENTICATION_SERVICES= (NTS)——這個表示採用os認證,在數據庫服務器上,能夠利用sqlplus 「/ as sysdba」。通常這個配置在windows上是ok的,在unix環境下可能會有問題,通常在unix下能夠去掉這個配置。
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示將首先利用tnsnames進行解析;若是tnsnames解析不到,將使用hostname解析;若是hostname解析不 到,將採用onames進行解析。
被註釋掉的NAMES.DEFAULT_DOMAIN = us.oracle.com——表示採用默認的domain name爲us.oracle.com,在tnsnames.ora中若是配置對應的解析,若是原來的別名oralocal,那麼,當啓用這個參數後,在 tnsnames中的配置要改爲oralocal.us.oracle.com。在使用tnsping時或者sqlplus登陸時,只需寫前面的別名,系 統會自動加上後面的domain name來進行解析。
檢查完畢sqlnet.ora,通常都會發現是使用tnsname來解析別名的,那麼,tnsnames.ora中能夠有哪些配置種類呢?
# TNSNAMES.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora
# Generated by Oracle configuration tools.
###### 通常的配置 ##################################
ORALOCAL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oralocal)
)
)
###### 這樣也行,用SID=oralocal ###########################
ORALOCAL_2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = oralocal)
)
###### RAC的配置(3節點rac) ###############################
ORALOCAL =
(DESCRIPTION =
(load_balance = yes)
(failover = on)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oralocal)
(SERVER = DEDICATED)
(failover_mode=(type=select)(method=basic)(retries=20)(delay=20))
)
)
ORALOCAL_NODE1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oralocal)
(INSTANCE_NAME = oralocal_node1)
)
)
ORALOCAL_NODE2=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oralocal)
(INSTANCE_NAME = oralocal_node2)
)
)
ORALOCAL_NODE3 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oralocal)
(INSTANCE_NAME = oralocal_node3)
)
)
)
###### DATA GUARD配置(primary庫和standby庫都須要配置)##############
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER=DEDICATED)
(SERVICE_NAME = oralocal)
)
)
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER=DEDICATED)
(SERVICE_NAME = oralocal)
)
)
另外須要注意的2點狀況:
(1)若是tnsnames中的service_name配置錯誤,配置成了instance_name了,這個時候會發生tnsping能通,可是 sqlplus鏈接不上的奇怪狀況。報錯ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor。這個時候查錯的時候,須要檢查對應的service_name。
(2)若是遠程數據庫是rac,並且本地客戶端端遠程數據庫處於不一樣的網段,經過公網連接,rac對外的ip映射只有一個,即只映射到一個節點。請注意在 客戶端配置tnsnames的時候按照單機的狀況來配置。呵呵,dba不只僅要學習oracle,瞭解一些網絡的知識,特別是本身系統的網絡架構,也是需 要的。
注:文章內容由網絡及相關書籍整理而來,如此只爲共享知識,給予幫助。
listener.ora、tnsnames.ora和sqlnet.ora這3個文件是關係oracle網絡配置的3個主要文件,都是放在$ORACLE_HOME/network/admin目錄下。其中listener.ora是和數據庫服務器端相關,而tnsnames.ora和sqlnet.ora這2個文件不只僅關係到服務器端,主要的仍是和客戶端關係緊密。
1、客戶端設置
1.sqlnet.ora
經過這個文件來決定怎樣找一個鏈接中出現的鏈接字符串
示例文件:
# sqlnet.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.
# This file is actually generated by netca. But if customers choose to
# install "Software Only", this file wont exist and without the native
# authentication, they will not be able to connect to the database on NT.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME, ONAMES, EZCONNECT)
#NAMES.DEFAULT_DOMAIN = oracle.com
內容說明:
SQLNET.AUTHENTICATION_SERVICES= (NTS)——這個表示採用OS認證,在數據庫服務器上,能夠利用sqlplus / as sysdba。通常這個配置在windows上是ok的,在unix環境下可能會有問題,通常在unix下能夠去掉這個配置。
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示將首先利用tnsnames進行解析;若是tnsnames解析不到,將使用hostname解析;若是hostname解析不到,將採用onames進行解析;最後使用EZCONNECT解析。例如咱們客戶端輸入:sqlplus zidi/zidi@changbai,那麼,客戶端就會首先在tnsnames.ora文件中找orcl的記錄.若是沒有相應的記錄則嘗試把orcl看成一個主機名,經過網絡的途徑去解析它的IP地址而後去鏈接這個IP上global_name=changbai這個實例,固然我這裏orcl並非一個主機名。
被註釋掉的NAMES.DEFAULT_DOMAIN = changbai.com——表示採用默認的域名爲changbai.com,在tnsnames.ora中若是配置對應的解析,若是原來的數據庫別名是oralocal(即網絡服務名),那麼,當啓用這個參數後,在tnsnames中的配置要改爲oralocal.changbai.com。在使用tnsping時或者sqlplus登陸時,只需寫前面的別名,系統會自動加上後面的域名來進行解析。
2.tnsnames.ora
這個文件放在客戶端機器上,記錄客戶端訪問數據庫的本地配置,其實就是定義網絡服務,只有當sqlnet.ora中有「NAMES.DIRECTORY_PATH= (TNSNAMES)」這樣的字樣時,也就是客戶端解析鏈接字符串的順序中有TNSNAMES時,纔會嘗試使用這個文件。
示例文件:
# tnsnames.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/NETWORK/ADMIN/tnsnames.ora
# Generated by Oracle configuration tools.
HUINAMN =網路服務名
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 108.108.108.108)(PORT = 1521))訪問數據庫使用的協議,數據庫計算機的主機名或IP地址,數據庫的端口號
)
(CONNECT_DATA =
(SID = HN)數據庫實例名,前提是所鏈接的數據庫是Oracle8或更低版本
)
)
CHANGBAI =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 208.208.208.208)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = CB)數據庫服務名,即全局數據庫名
)
)
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)使用專用服務器模式去鏈接,這須要跟服務器的模式匹配,若是沒有就根據服務器的模式自動調節
(SERVICE_NAME = orcl)
)
)
2、服務器端設置
listener.ora
它是listener監聽器進程的配置文件。關於listener進程就很少說了,接受遠程對數據庫的接入申請並轉交給oracle的服務器進程。因此若是不是使用的遠程的鏈接,listener進程就不是必需的,一樣的若是關閉listener進程並不會影響已經存在的數據庫鏈接。
示例文件:
# listener.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =這裏定義LISTENER進程爲哪一個實例提供服務
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = F:/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)
LISTENER =監聽器的名字,一臺數據庫能夠有不止一個監聽器
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))監聽器監聽的協議,IP,端口等
(ADDRESS = (PROTOCOL = TCP)(HOST = dabeng)(PORT = 1521))
)
)
上面的例子是一個最簡單的例子,但也是最廣泛的。一個listener進程爲一個數據庫實例(SID)提供服務。
3、總結
上面說到的三個文件均可以經過圖形的配置工具來完成配置:Database Configuration Assistant,Net Configuration Assistant
具體的配置能夠嘗試一下,而後來看一下配置文件,這樣一來整體結構就有了,是當你輸入sqlplus zidi/zidi@changbai的時候
1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
2. 則查詢tnsnames.ora文件,從裏邊找orcl的記錄,而且找到主機名,端口和service_name
3. 若是listener進程沒有問題的話,創建與listener進程的鏈接。
4. 根據不一樣的服務器模式如專用服務器模式或者共享服務器模式,listener採起接下去的動做。默認是專用服務器模式,沒有問題的話客戶端就鏈接上了數據庫的server process。
5. 這時候網絡鏈接已經創建,listener進程的歷史使命也就完成了。
換個角度理解:
changbai是咱們鏈接遠端數據庫用到的服務命名,可是最終必須轉化爲host:port:servide_name這樣的鏈接字串,而這個轉化能夠理解爲是翻譯的過程,而要想翻譯成功,則必須選擇好翻譯方法,那麼sqlnet.ora就是咱們用來選擇翻譯方法的,其中的NAMES.DIRECTORY_PATH= (TNSNAMES) 就是咱們選擇的命名解析方法; tnsnames.ora是翻譯方法中的一種——本地命名解析方法的配置文件,就好像咱們選擇了查字典方法,這個文件就是咱們的字典同樣裏面存放着全部服務命名對應的鏈接字串;至於listener.ora則是負責接受咱們請求的負責任人——鏈接地址配置文件,裏面包括了鏈接負責人的鏈接地址,也放着通過他容許能夠鏈接的數據庫信息。這樣就構成了Oracle的網絡架構。
55555555555555555555555555
listener.ora、 tnsnames.ora和sqlnet.ora這3個文件是關係oracle網絡配置的3個主要文件,其中listener.ora是和數據庫服務器端 相關,而tnsnames.ora和sqlnet.ora這2個文件不只僅關係到服務器端,主要的仍是和客戶端關係緊密。
檢查客戶端oracle網絡的時候能夠先檢查sqlnet.ora文件:
# SQLNET.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/sqlnet.ora
# Generated by Oracle configuration tools.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)
##NAMES.DEFAULT_DOMAIN = us.oracle.com
上面的sqlnet.ora文件說明:
SQLNET.AUTHENTICATION_SERVICES= (NTS)——這個表示採用os認證,在數據庫服務器上,能夠利用sqlplus 「/ as sysdba」。通常這個配置在windows上是ok的,在unix環境下可能會有問題,通常在unix下能夠去掉這個配置。
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示將首先利用tnsnames進行解析;若是tnsnames解析不到,將使用hostname解析;若是hostname解析不 到,將採用onames進行解析。
被註釋掉的NAMES.DEFAULT_DOMAIN = us.oracle.com——表示採用默認的domain name爲us.oracle.com,在tnsnames.ora中若是配置對應的解析,若是原來的別名oralocal,那麼,當啓用這個參數後,在 tnsnames中的配置要改爲oralocal.us.oracle.com。在使用tnsping時或者sqlplus登陸時,只需寫前面的別名,系 統會自動加上後面的domain name來進行解析。
檢查完畢sqlnet.ora,通常都會發現是使用tnsname來解析別名的,那麼,tnsnames.ora中能夠有哪些配置種類呢?
# TNSNAMES.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora
# Generated by Oracle configuration tools.
###### 通常的配置 ##################################
ORALOCAL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oralocal)
)
)
###### 這樣也行,用SID=oralocal ###########################
ORALOCAL_2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = oralocal)
)
###### RAC的配置(3節點rac) ###############################
ORALOCAL =
(DESCRIPTION =
(load_balance = yes)
(failover = on)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oralocal)
(SERVER = DEDICATED)
(failover_mode=(type=select)(method=basic)(retries=20)(delay=20))
)
)
ORALOCAL_NODE1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oralocal)
(INSTANCE_NAME = oralocal_node1)
)
)
ORALOCAL_NODE2=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oralocal)
(INSTANCE_NAME = oralocal_node2)
)
)
ORALOCAL_NODE3 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oralocal)
(INSTANCE_NAME = oralocal_node3)
)
)
)
###### DATA GUARD配置(primary庫和standby庫都須要配置)##############
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER=DEDICATED)
(SERVICE_NAME = oralocal)
)
)
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER=DEDICATED)
(SERVICE_NAME = oralocal)
)
)
另外須要注意的2點狀況: (1)若是tnsnames中的service_name配置錯誤,配置成了instance_name了,這個時候會發生tnsping能通,可是 sqlplus鏈接不上的奇怪狀況。報錯ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor。這個時候查錯的時候,須要檢查對應的service_name。 (2)若是遠程數據庫是rac,並且本地客戶端端遠程數據庫處於不一樣的網段,經過公網連接,rac對外的ip映射只有一個,即只映射到一個節點。請注意在 客戶端配置tnsnames的時候按照單機的狀況來配置。呵呵,dba不只僅要學習oracle,瞭解一些網絡的知識,特別是本身系統的網絡架構,也是需 要的。