有網友反映,他在一套Oracle的測試環境中配置有兩個監聽,分別監聽不一樣端口。
目前想把環境上的一套數據庫同時註冊到這兩個監聽,他將數據庫參數local_listener和tnsname.ora文件配置以下:
而後拋出問題:tnsname.ora中的service_name能夠隨便填嗎?
若是答案是不能夠,那爲何他測試隨意更改這個service_name都不影響註冊?
若是答案是能夠?那爲何平日工做中這個service_name填錯就連不上呢?數據庫
首先,能夠驗證他說的這個場景是能夠復現的。但其實他的困惑是由於將兩個本來獨立的問題混爲一團所致。能夠將他的困惑分解爲2個獨立的問題:網絡
當tnsnames.ora做爲客戶端配置時,此時要求service_name必須和要鏈接的庫中的service_names中的某個值保持對應,不然也沒法鏈接。這個針對初級dba都是必備常識,沒必要多說了。測試
由於他這裏的tnsnames.ora配置條目是單純給local_listener使用的,而對於local_listener的配置,官方有明確說明:this
LOCAL_LISTENER specifies a network name that resolves to an address or address list of Oracle Net local listeners (that is, listeners that are running on the same machine as this instance). The address or address list is specified in the TNSNAMES.ORA file or other address repository as configured for your system.code
也就是說local_listener配置能夠是網絡別名,並且從它的默認值:
能夠看出,若是這個tnsnames.ora中的條目若是隻是單純給local_listener使用,那實際應該並不要求配置service_name的值,或者說CONNECT_DATA這一塊都不須要配置。blog
根據這個猜測,我在測試環境也實際驗證了下,若是將tnsnames.ora 配置文件中新增一個條目,只包含以下信息:ci
TEST001 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1526)) ) )
而後配置數據庫local_listener的參數爲TEST001,此時驗證就能夠實現兩個監聽的正常註冊。
那麼如今再回過頭去看網友提出的這個問題,就很是好解釋了,由於他所謂的這個隨便填寫的service_name,實際對於local_listener來講原本就不須要,因此任意修改它的值都不會影響到數據庫註冊到監聽。而針對客戶端的鏈接,須要根據tnsnames.ora配置文件中的service_name實際鏈接到具體的數據庫,天然就不能填寫錯誤。it