有网友反映,他在一套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