代码之家  ›  专栏  ›  技术社区  ›  Code Novice

Oracles的“alter system set local\u listener”到底做了什么

  •  4
  • Code Novice  · 技术社区  · 6 年前

    我为什么好奇:

    我在安装Oracle Express数据库时总是遇到问题。就像我从来没有让它第一次正常工作过一样。下次安装Oracle Express后启动计算机时,我始终会收到 common error :

    TNS-12505:TNS:侦听器当前不知道连接描述符中给定的SID

    我已经用各种方法解决了这个问题,但是我了解到,现在对我来说最有效的方法是使用SQL Plus重新配置侦听器。当监听器出现故障时,SQL Plus是我连接到OracleXE服务器的唯一方式,搜索完Internet后,我并不是这里唯一的一个人。

    修复此错误的DDL-从SQL Plus运行:

    alter system set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))' scope=both;
    

    问题是:

    为什么重新配置侦听器会起作用?它有什么作用?我监视我的听众。ora文件以及我的TNSNames。ora文件,它们在我运行上述代码之前和之后保持不变。那它做了什么?

    我读了整个甲骨文 LISTENER 文档,我并没有从中得到启发。有人能启发我吗?

    1 回复  |  直到 6 年前
        1
  •  7
  •   Alex Poole    6 年前

    为什么重新配置侦听器会起作用?

    你是 重新配置侦听器。这就是为什么您看不到侦听器配置文件的更改。您正在更改数据库配置。 The spfile 已更新,因为您使用的命令 scope=both ,这意味着更改会立即应用到内存中,并写入该文件,因此它会在数据库重新启动时保持不变。

    From the docs:

    LOCAL_LISTENER 指定解析为Oracle Net本地侦听器(即与此实例在同一系统上运行的侦听器)的地址或地址列表的网络名称。

    默认值为:

    (ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521)) 哪里 主机名 是本地主机的网络名称。

    另请参见 the alter system REGISTER 条款:

    具体说明 REGISTER 指示PMON后台进程立即向侦听器注册实例。如果未指定此子句,则在下次PMON执行发现例程之前不会注册实例。因此,在侦听器启动后,客户端可能无法访问服务长达60秒。

    因此,这意味着当数据库启动时,然后定期尝试向侦听器注册其服务名称;它从 local_listener 参数(还有一个 remote_listener 对于data guard,此处不相关。)

    因为默认值为 主机名 该参数中直接使用PC名称,这通常会解析为PC LAN IP地址(如果IP由DHCP分配,则每次重新启动都可能会更改以增加混淆),可以存储该地址。如果幸运的话,主机名将解析为与localhost相同的名称,但您的情况并非如此。

    所以数据库查找其init参数,因此尝试在192.168.1.2处向侦听器注册。但是侦听器已在localhost上启动,因此它正在127.0.0.1上侦听。DB无法注册其服务名称,因为它无法连接到侦听器;尽管只有在查看警报日志时,这一点才明显。如果你跑步 lsnrctl services 它不会显示任何东西。

    当您更改init参数时,您是在告诉DB尝试注册localhost上的侦听器,而这正是它实际侦听的地方,注册现在起作用了,并且侦听器在随后的连接尝试中识别服务名称。(您的问题指的是关于SID的错误消息,它是不同的,您的更改无法解决。)跑步 lsnrctl服务 现在也将显示服务名称。但这是通过注册实现的运行时动态功能,而不是更改侦听器的永久配置。


    可以让侦听器侦听多个地址。主要的是 listener.ora ,则, tnsnames.ora (如果使用TNS别名)和init参数使用一致的主机名或IP地址,因此它们都解析并引用相同的内容,无论是本地主机(仅可从该PC访问)还是LAN地址(可通过NWNetwork访问)或两者兼而有之。

    您还可以在 TNS名称。ora公司 对于监听器本身,而不仅仅是DBs。然后可以使用该TNS别名作为 本地\u侦听器 target,而不是拼写输入地址和端口,如果需要,可能会使以后更容易更改。