在oracle安裝目錄$HOME/network/admin下,經常看到sqlnet.ora tnsnames.ora listener.ora這三個文件,除了tnsnames.ora,其他兩個文件詳細的用途很多人都不太瞭解。
tnsnames.ora
如果連接數據庫出了什麼問題,在保證網絡出正常,沒有防火牆干擾的情況下,查找問題的步驟是:
- 在客戶端順序檢查:sqlnet.ora,tnsnames.ora是否有問題。
- 在服務器端檢查listener.ora配置,並且保證監聽程序啓動,數據庫服務加載。
域名domain定義,在你用sqlplus訪問數據庫的時候,會在tns別名後面加上".domain"
sqlnet.ora中:
NAMES.DEFAULT_DOMAIN=com
tnsnames.ora中的tns定義如下:
local_dev =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
在客戶端執行命令:sqlplus username/password@local_dev的時候,會出現如下錯誤信息:
"ORA-12154: TNS: 無法處理服務名"或者"ORA-12154: TNS:could not resolve service name"這樣的錯誤信息。
因爲sqlplus username/password@local_dev的時候,將tns別名“local_dev”轉換成了“local_dev.com”,所以local_dev.com在tnsnames.ora中找不到,就報錯了。
local_dev.com =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
再執行sqlplus username/password@local_dev,連接成功。
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
首先採用tnsnames.ora的別名配置連接數據庫;如果連接上;
再採用ONAMES進行解析,最後採用主機名進行解析;
- NONE表示Oracle數據庫身份驗證,
- NTS表示操作系統身份驗證,
- 兩種方式可以並用。
SQLNET.AUTHENTICATION_SERVICES=(NONE,NTS)
SQLNET.AUTHENTICATION_SERVICES=(NONE)
sqlplus "/ as sysdba"時,執行失敗。
提示錯誤信息ORA-01031: insufficient privileges
這個參數默認沒有設置。
認識tnsnames.ora
提供了客戶端連接某個數據庫的詳細信息,主機地址,端口,數據庫實例名等。
local_dev =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linuxdb)
)
)
HOST 一般是ip地址,也可以是主機名,這個主機名字只要能用ping hostname通就行,一般在客戶端系統的host文件上配好主機名和ip地址的映射關係。
PORT 標準是1521,根據服務器端的監聽端口而定。S
ERVICE_NAME 就是數據庫的服務名,用system用戶登陸後,sqlplus> show parameter service_name命令查看。
tnslsnr進程是監聽、並接受遠程連接數據庫請求的監聽進程,
該文件位於服務端,如果只安裝oracle客戶端,一般不存在這個文件。
如果你只需要在本地連接數據庫,不接受遠程連接,那麼也不需要啓動tnslsnr進程,也不需要去維護listener.ora文件。
啓動監聽進程的命令,在命令模式下,執行lsnrctl start命令就啓動了監聽進程tnslsnr。
監聽可以有多個,也就是說,可以同時監聽多個oracle實例,可以在listener.ora中定義多個監聽器進行監聽。
listener.ora中的內容:
LISTENER_CSB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.70.9.14)(PORT = 1621))
)
)
)
SID_LIST_LISTENER_CSB =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u02/oracle/app/oracle/product/10.2.0/db)
(SID_NAME = zjdevcsb)
)
)
#############################################
LISTENER_CSA =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.70.9.14)(PORT = 1521))
)
)
)
SID_LIST_LISTENER_CSA =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /u02/oracle/app/oracle/product/10.2.0/db)
(SID_NAME = zjdevcsa)
)
)
- LISTENER_CSB,LISTENER_CSA定義了監聽器的兩個監聽名字,和這兩個監聽器監聽的參數:ip,port等。
- SID_LIST_LISTENER_CSB,SID_LIST_LISTENER_CSA定義了兩個監聽服務,服務名字格式SID_LIST_<lsnrname>,lsnrname就是上面兩個監聽器的名字,指定了這個服務將會接受的服務將提交給那個監聽器;監聽的實例名zjdevcsb,zjdevcsa是在tnsnames.ora中需要指定的SERVICE_NAME參數對應。
啓動數據庫
數據庫 是指在物理磁盤上的文件數據,就是表空間文件的集合,只能有一個,並唯一;就像類的定義。
實例 是加載數據庫文件的一個服務,或者進程。對同一個數據庫,可以有多個實例,比如rac模式,多個實例都是加載同一份物理數據。
1) 啓動數據庫實例
首先執行命令sqlplus "/ as sysdba"用數據庫系統管理員角色登錄,然後執行startup啓動數據庫實例,關閉數據庫實例執行用shutdown命令。如果不需要從遠程連接數據庫,那麼你就可以在本機登錄數據庫了。執行sqlplus username/password就可以正確登錄數據庫。
2) 監聽
啓動監聽,執行命令lsnrctl start,可以用lsnrctl status查看監聽狀態,如果監聽成功啓動,那麼就可以在遠程連接數據庫了,執行命令sqlplus username/password@tnsname;
關閉監聽,執行命令lsnrctl stop。
遠程連接數據庫
當你執行命令sqlplus username/password@tnsname的時,一般處理過程如下:
1) 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME,或者hostname。
2) 則查詢tnsnames.ora文件,從裏邊找tnsname的記錄,並且找到主機名,端口和service_name。
3) 如果listener進程沒有問題的話,建立與listener進程的連接。
4) 根據不同的服務器模式如專用服務器模式或者共享服務器模式,listener採取接下去的動作。默認是專用服務器模式,沒有問題的話客戶端就連接上了數據庫的server process。
5) 這時候網絡連接已經建立,listener進程的歷史使命也就完成了。
如果在連接數據庫的時候,出現什麼錯誤,可以按照上面的順序查找相應的配置,解決問題。
sqlplus "/ as sysdba" 這是典型的操作系統認證,不需要listener進程,數據庫即使不可用也可以登錄。
sqlplus username/password 不需要listener進程,登錄本機數據庫,數據庫實例啓動即可。
sqlplus username/password@tnsname需要listener進程,最常見的遠程登錄模式,需要啓動數據庫實例和listener進程。
本文涉及的相關術語
Db_domain:定義一個數據庫所在的域,該域的命名同互聯網的’域’沒有任何關係,只是數據庫管理員爲了更好的管理分佈式數據庫而根據實際情況決定的。當然爲了管理方便,可以將其等於互聯網的域。
總結
學會了使用上面三個文件,就可以啓動數據庫,並在遠程連接,根據自己的需要進行系統開發了