【问题标题】:What does Oracles 'alter system set local_listener' do exactlyOracles 'alter system set local_listener' 究竟做了什么
【发布时间】:2018-08-22 07:34:53
【问题描述】:

我为什么好奇:

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

TNS-12505:TNS:listener 目前不知道连接描述符中给出的 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;

问题:

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

我阅读了整个 Oracle LISTENER 文档,但我并没有从中获得启发。谁能赐教?

【问题讨论】:

  • 我可能已经找到了我自己的问题的答案,但不能 100% 确定这一点。看来 SPFILEXE.ORA 文件已更新。对于 Oracle Express,此文件位于:C:\oraclexe\app\oracle\product\11.2.0\server\dbs

标签: oracle oracle11g listener


【解决方案1】:

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

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

From the docs:

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

默认是:

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

另见the alter system REGISTER 子句:

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

所以这意味着当数据库启动时,然后定期地,它会尝试向侦听器注册其服务名称;它从local_listener 参数中获取有关侦听器的信息。 (还有一个 remote_listener 用于数据保护,这里不相关。)

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

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

当您更改 init 参数时,您是在告诉 DB 尝试注册 localhost 上的侦听器 - 因为那是它实际侦听的位置,所以现在可以进行注册,并且侦听器会在后续连接尝试中识别服务名称. (您的问题是关于 SID 的错误消息,它是不同的,并且没有通过您的更改解决。)运行lsnrctl services 现在也将显示服务名称。但这是通过注册实现的运行时、动态的事情——而不是改变监听器的永久配置。


可以让监听器监听多个地址。主要的是listener.oratnsnames.ora(如果你使用TNS别名)和init参数使用一致的主机名或IP地址,所以它们都解析和引用同一个东西,无论是localhost(仅可从该 PC 访问)或 LAN 地址(可通过网络访问)或两者兼而有之。

您还可以在tnsnames.ora 中为侦听器本身添加一个条目,而不仅仅是针对 DB。然后,您可以将该 TNS 别名用作 local_listener 目标,而不是拼写输入地址和端口,这样以后如果需要更容易更改。

【讨论】:

  • 感谢您提供这么好的答案。虽然它很有启发性,但我仍然需要对数据库配置中的这种更改起作用的原因进行一些研究。您提到:(Your question refers to the error message about SID, which is different, and not solved by your change.) 问题是……每次我遇到它时,它都能解决我的 SID 错误。如果我有时间我想进一步研究这个。无论如何,我很感谢您的回复。
猜你喜欢
  • 2012-07-23
  • 2016-09-10
  • 2023-03-15
  • 2012-10-17
  • 2021-06-04
  • 1970-01-01
  • 2018-07-30
  • 2019-10-06
  • 2021-01-01
相关资源
最近更新 更多