神谕'alter system set local_listener'到底做了什么



为什么我很好奇:

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

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;

问题:

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

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

为什么重新配置侦听器有效?

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

从文档中:

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

默认值为:

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

另见alter system REGISTER条款:

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

这意味着当数据库启动时,然后定期尝试向侦听器注册其服务名称;并从local_listener参数获取有关侦听器的信息。(还有一个数据卫士remote_listener,在这里无关紧要。

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

所以......数据库查找其init参数,结果尝试向侦听器注册,例如192.168.1.2。但是侦听器已在本地主机上启动,因此它正在侦听 127.0.0.1。数据库无法注册其服务名称,因为它无法访问侦听器;尽管这仅在您查看警报日志时才很明显。如果您运行lsnrctl services它不会显示任何内容。

当您更改 init 参数时,您是在告诉数据库尝试在 localhost 上注册侦听器 - 由于这是它实际侦听的位置,注册现在可以工作,侦听器在后续连接尝试中识别服务名称。(您的问题涉及有关 SID 的错误消息,该错误消息是不同的,并且无法通过您的更改解决。运行lsnrctl services现在也会显示服务名称。但这是通过注册的运行时动态事物 - 而不是对侦听器永久配置的更改。


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

您还可以在tnsnames.ora中为侦听器本身提供一个条目,而不仅仅是数据库。然后,可以使用该 TNS 别名作为local_listener目标,而不是拼写地址和端口,这样以后可能需要,可以更轻松地进行更改。

最新更新