为什么重新配置监听器会起作用?
You are not重新配置监听器。这就是为什么您看不到侦听器配置文件更改的原因。您正在更改数据库配置。The spfile https://docs.oracle.com/cloud/latest/db112/ADMIN/create.htm#ADMIN11115已更新,因为您使用的命令有scope=both
,这意味着更改会立即应用(在内存中)并写入该文件,因此它在数据库重新启动后仍然存在。
来自文档: https://docs.oracle.com/cd/E18283_01/server.112/e17110/initparams116.htm
LOCAL_LISTENER
指定解析为 Oracle Net 本地侦听器(即与此实例在同一系统上运行的侦听器)的地址或地址列表的网络名称。
默认值是:
(ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521))
where hostname是本地主机的网络名称。
也可以看看the alter system REGISTER https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_2014.htm clause:
Specify REGISTER
指示 PMON 后台进程立即向侦听器注册实例。如果您不指定此子句,则直到下一次 PMON 执行发现例程时才会注册实例。因此,监听器启动后,客户端可能长达60秒内无法访问服务。
所以这意味着当数据库启动时,它会定期尝试向侦听器注册其服务名称;它从以下位置获取有关侦听器的信息local_listener
范围。 (还有一个remote_listener
对于数据保护,此处不相关。)
因为默认是hostnamePC 名称直接在该参数中使用,并且通常会解析为 PC 的 LAN IP 地址(如果 IP 是由 DHCP 分配的,则每次重新启动都会更改,从而增加混乱),可以将其存储起来。如果您幸运的话,主机名将解析为与 localhost 相同,但您的情况并非如此。
所以...数据库查找其 init 参数,然后尝试在 192.168.1.2 处注册侦听器。但侦听器已在 localhost 上启动,因此它正在侦听 127.0.0.1。数据库无法注册其服务名称,因为它无法到达侦听器;尽管只有在查看警报日志时才会明显看到这一点。如果你跑lsnrctl services
它不会显示任何内容。
当您更改 init 参数时,您是在告诉数据库尝试在本地主机上注册侦听器 - 由于这是它实际侦听的位置,因此注册现在可以正常工作,并且侦听器可以在后续连接尝试中识别服务名称。 (你的问题是指关于SID的错误消息,这是不同的,并且没有通过你的更改解决。)lsnrctl services
现在也会显示服务名称。但这是通过注册实现的运行时动态事物,而不是对侦听器永久配置的更改。
可以让监听者监听多个地址。最主要的是listener.ora
, tnsnames.ora
(如果您使用 TNS 别名)和 init 参数使用一致的主机名或 IP 地址,因此它们都解析并引用相同的事物,无论是 localhost(只能从该 PC 访问),还是 LAN 地址(可通过nwtwork)或两者兼而有之。
您还可以在tnsnames.ora
对于侦听器本身,而不仅仅是数据库。然后您可以使用该 TNS 别名作为local_listener
目标,而不是拼写地址和端口,可能使以后需要时更容易更改。