Cod*_*ice 3 oracle listener oracle11g
安装Oracle Express数据库时,我总是遇到问题。就像我从未在第一轮就正确地工作一样。在安装Oracle Express之后下一次引导计算机时,我始终会收到以下常见错误:
TNS-12505:TNS:listener当前不知道连接描述符中给出的SID
我设法使用各种方法解决了此问题,但是我了解到,如今对我有用的最佳方法是使用SQL Plus重新配置侦听器。当侦听器失败时,SQL Plus是我连接到OracleXE Server的唯一方法,并且在搜索Internet之后,我并不孤单。
解决此错误的DDL-从SQL Plus运行:
alter system set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))' scope=both;
Run Code Online (Sandbox Code Playgroud)
为什么重新配置监听器有效?它有什么作用?我监视了我的listener.ora文件以及TNSNames.ora文件,在运行上述代码之前和之后,它们保持不变。那是做什么的呢?
为什么重新配置监听器有效?
您没有在重新配置侦听器。这就是为什么您看不到侦听器配置文件更改的原因。您正在更改数据库配置。之所以更新,spfile是因为您使用的命令具有scope=both,这意味着更改将立即应用-在内存中-并写入该文件,因此该更改在数据库重新启动时仍然有效。
LOCAL_LISTENER指定一个网络名称,该名称解析为Oracle Net本地侦听器(即与该实例在同一系统上运行的侦听器)的地址或地址列表。
默认值为:
(ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521))其中,主机名是本地主机的网络名称。
指定
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.ora,tnsnames.ora(如果使用TNS别名)和init参数使用一致的主机名或IP地址,因此它们都解析并引用了同一事物,无论该主机是localhost(只能从该PC访问),或LAN地址(可通过nwtwork访问)或两者兼而有之。
您还可以tnsnames.ora在侦听器本身中有一个条目,而不仅仅是DB。然后,您可以使用该TNS别名作为local_listener目标,而不用拼写放置地址和端口,从而可能在以后需要时更容易进行更改。