gpt4 book ai didi

oracle - Oracles 'alter system set local_listener' 究竟做了什么

转载 作者:行者123 更新时间:2023-12-01 11:17:11 25 4
gpt4 key购买 nike

为什么我很好奇:

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

TNS-12505: TNS:listener does not currently know of SID given in connect descriptor



我已经使用各种方法设法解决了这个问题,但是我了解到现在最适合我的方法是使用 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文档出来我也没开悟吧。任何人都可以启发我吗?

最佳答案

Why does re-configuring the Listener work?



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

From the docs:

LOCAL_LISTENER specifies a network name that resolves to an address or address list of Oracle Net local listeners (that is, listeners that run on the same system as this instance).



默认值是:

(ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521)) where hostname is the network name of the local host.



另见 the alter system REGISTER 条款:

Specify REGISTER to instruct the PMON background process to register the instance with the listeners immediately. If you do not specify this clause, then registration of the instance does not occur until the next time PMON executes the discovery routine. As a result, clients may not be able to access the services for as long as 60 seconds after the listener is started.



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

因为默认是主机名,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 services现在也将显示服务名称。但这是一个运行时,通过注册动态的事情 - 而不是对监听器的永久配置的更改。

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

您也可以在 tnsnames.ora 中有一个条目对于监听器本身,而不仅仅是对于 DB。然后您可以使用该 TNS 别名作为 local_listener目标,而不是拼写输入地址和端口,如果需要,可能更容易在以后更改。

关于oracle - Oracles 'alter system set local_listener' 究竟做了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com