有網友反映,他在一套Oracle的測試環境中配置有兩個監聽,分別監聽不同端口。
目前想把環境上的一套數據庫同時注冊到這兩個監聽,他將數據庫參數local_listener和tnsname.ora文件配置如下:
然后拋出問題:tnsname.ora中的service_name可以隨便填嗎?
如果答案是不可以,那為什么他測試隨意更改這個service_name都不影響注冊?
如果答案是可以?那為什么平日工作中這個service_name填錯就連不上呢?
首先,可以驗證他說的這個場景是可以復現的。但其實他的困惑是因為將兩個原本獨立的問題混為一團所致。可以將他的困惑分解為2個獨立的問題:
1.tnsname.ora中的service_name可以隨便填嗎?
當tnsnames.ora作為客戶端配置時,此時要求service_name必須和要連接的庫中的service_names中的某個值保持對應,否則也無法連接。這個針對初級dba都是必備常識,不必多說了。2.為什么他測試隨意更改這個service_name都不影響注冊?
因為他這里的tnsnames.ora配置條目是單純給local_listener使用的,而對於local_listener的配置,官方有明確說明: > 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.也就是說local_listener配置可以是網絡別名,而且從它的默認值:
可以看出,如果這個tnsnames.ora中的條目如果只是單純給local_listener使用,那實際應該並不要求配置service_name的值,或者說CONNECT_DATA這一塊都不需要配置。
根據這個猜想,我在測試環境也實際驗證了下,如果將tnsnames.ora 配置文件中新增一個條目,只包含如下信息:
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實際連接到具體的數據庫,自然就不能填寫錯誤。