listener.ora、tnsnames.ora和sqlnet.ora這3個文件是關係oracle網絡配置的3個主要文件,都是放在$ORACLE_HOME/NETWORK/ADMIN目錄下(Linux系統爲“/”,Windows系統爲“\")。其中listener.ora是和數據庫服務器端相關,而tnsnames.ora和sqlnet.ora這2個文件不僅僅關係到服務器端,主要的還是和客戶端關係緊密(#表註釋)。
1.sqlnet.ora
通過這個文件來決定如何查找一個連接中出現的連接字符串
示例文件:
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES,EZCONNECT)
#NAMES.DEFAULT_DOMAIN = oracle.com
內容說明:
#表明用戶連接數據庫用哪種驗證方式 主要兩種:
(1)NTS: 表示系統身份驗證 ---用戶名和口令可輸可不輸 conn / as sys
dba;
(2)NONE:oralce數據庫身份驗證--- 必須輸入用戶名和口令 conn system/oracle as
sysdba;
在unix環境下可能會有問題,一般在unix下可以去掉這個配置。
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES,EZCONECT)——表示將首先利用tnsnames進行解析;如果tnsnames解析不到,將使用hostname解析;如果 hostname解析不到,將採用onames進行解析;最後使用EZCONNECT解析。例如我們客戶端輸入:SQL>
conn [email=system/oracle@orcl23]system/oracle@orcl23[/email] (orcl123是網絡服務名) 那麼,客戶端就會首先在tnsnames.ora文件中找orcl的記錄.如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網絡的途徑去解析它的 IP地址然後去連接這個IP上global_name=orcl123這個實例,當然我這裏orcl並不是一個主機名。
被註釋掉的 NAMES.DEFAULT_DOMAIN = oracle.com——表示採用默認的域名爲oracle.com,在tnsnames.ora中如果配置對應的解析,如果原來的數據庫別名是 oralocal(即網絡服務名),那麼,當啓用這個參數後,在tnsnames中的配置要改成oralocal.oracle.com。在使用 tnsping時或者sqlplus登錄時,只需寫前面的別名,系統會自動加上後面的域名來進行解析。
2.tnsnames.ora
這個文件位於客戶端(服務器端也存在的,表示客戶端與服務器端位於同一臺主機),記錄客戶端訪問數據庫的本地配置,其實就是定義網絡服務,只有當sqlnet.ora中有“NAMES.DIRECTORY_PATH=
(TNSNAMES)”這樣的字樣時,也就是客戶端解析連接字符串的順序中有TNSNAMES時,纔會嘗試使用這個文件。
示例文件:
ORCL123 = #網絡服務名--------------配置文件裏存在的一個網絡服務名
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = zhaomengbin)(PORT = 1521))
) # 協議是TCP ,要連接的服務器的計算機名zhaomegnbin ,或爲該主機對應的IP,端口號爲1521
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
3 listener.ora
listener.ora文件中存放了客戶機與服務器連接所需要的監聽地址,以及服務器啓動監聽進程時的信息。一個完整的listener.ora文件樣式如下:
SID_LIST_LISTENER
=
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
)
以上是本人本機上的一個監聽文件,下面就該監聽文件的各個參數的作用作個描述:
LISTENER 指出一個監聽器定義的起始點。它實際上是正被定義的當前監聽器的名稱。默認的名稱是LISTENER。
DESCRIPTION 描述每個監聽位置
ADDRESS_LIST 含有與監聽器正在監聽的那些位置有關的地址信息
PROTOCOL 指定用於本監聽位置的協議
HOST 保存監聽器所駐留在的那臺計算機的名稱
PORT 含有監聽器正在上面監聽的地址
SID_LIST_LISTENER 定義配置監聽器所針對的ORACLE服務的列表
SID_DESC 描述每個Oracel SID
GLOBAL_DBNAME 標識全局數據庫名稱。本項應該與當前Oracle服務的init.ora文件中的SERVICE_NAMES項一致
ORACLE_HOME 給出服務器上Oracle可執行程序的位置
SID_NAME 含有用於本Oracle實例的Oracle SID的名稱
Lsnrctl命令用來管理Oracle監聽器,是一個命令行界面。想調用這個命令行工具,在命令行鍵入lsnrctl即可。可以在LSNRCTL>提示符下鍵入help來顯示這些命令的一份清單。
Services 列舉出服務的一個彙總表及爲每個協議服務處理程序所建立和拒絕的連接信息個數
Start listener 啓動指定的監聽器
Status listener 顯示指定監聽器的狀態
Stop listener 關閉指定的監聽器
Trace 打開監聽器的跟蹤特性
Version 顯示Oracle Net軟件與協議適配器的版本
Change_password 允許用戶修改關閉監聽器所需要的密碼
Reload 重新讀取listener.ora文件,但不關閉監聽器。如果該文件發生了變化,重新刷新監聽器。
Save_config 當從lsnrctl工具中對listener.ora文件進行了修改時,複製一個叫做listener.bak的listener.ora文件
Exit 退出lsnrctl實用工具
Quit 執行和exit相同的功能
以上三個網絡配置文件可以通過圖形化配置工具進行相應配置。如在Linux下,
$netmgr #在Windows下爲Net Manager
打開後可以看到一個窗口,其中,
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 #linux系統
C:\windows\system32\drivers\etc\hosts #windows系統
客戶端需要寫入數據庫服務器IP地址和主機名的對應關係。如果同時有私有IP和Internet上公有IP,私有IP寫在前面,公有IP寫在後面。
如:
11.0.17.136 oracle
有時候tnsping 數據庫服務器別名顯示是成功的,但是sqlplus username/passwd @servicename不通,jdbc thin link 也不通,原因可能是DNS服務器裏沒有設置這個服務器IP地址和主機名的對應關係,本人就遇到過類似問題。
UNIX下ORACLE多數據庫的環境,OS客戶端需要配置下面兩個環境變量來指定默認的目標數據庫
ORACLE_SID=appdb;export ORACLE_SID
TWO_TASK=appdb;export TWO_TASK
相關命令:
$lsnrctl start listenername #啓動監聽程序listenername
$lsnrctl status listenername #查看listenername的狀態
$lsnrctl stop listenername #停止listenername監聽
$tnsping tnsname #測試網絡服務名tnsname是否可用