Oracles的alter system set local_listener'做了什么

时间:2018-03-13 21:53:34

标签: oracle oracle11g listener

为什么我很好奇:

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

  

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

我已经设法使用各种方法解决了这个问题但是我已经了解到最近适用于我的方法是使用SQL Plus重新配置监听器。当监听器失败SQL Plus是我连接到OracleXE服务器的唯一方法,在搜索互联网之后,我并不孤单。

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

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

问题:

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

我阅读了整篇Oracle LISTENER文档,但我没有明白这一点。谁能开导我?

1 个答案:

答案 0 :(得分:5)

  

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

重新配置侦听器。这就是为什么你没有看到监听器配置文件发生变化的原因。您正在更改数据库配置。 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用于数据保护,这里不相关。)

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

所以...数据库查找其init参数,结果尝试向192.168.1.2的监听器注册。但是监听器已经在localhost上启动,因此它正在侦听127.0.0.1。数据库无法注册其服务名称,因为它无法联系到收听者;虽然只有在查看警报日志时才会显而易见。如果你运行lsnrctl services,它就不会显示任何内容。

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

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

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