Oracles 'alter system set local_listener' 到底做了什么

2023-12-19

为什么我很好奇:

我在安装 Oracle Express 数据库时总是遇到问题。因为我从来没有第一次就成功过。安装 Oracle Express 后下次启动计算机时,我始终收到常见错误 https://stackoverflow.com/questions/5661610/tns-12505-tnslistener-does-not-currently-know-of-sid-given-in-connect-descript:

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文件,它们在运行上述代码之前和之后保持不变。那么它做了什么?

我读了整个 OracleLISTENER https://docs.oracle.com/database/121/NETAG/listenercfg.htm#NETAG292文档和我并没有从中得到启发。谁能启发我吗?


为什么重新配置监听器会起作用?

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目标,而不是拼写地址和端口,可能使以后需要时更容易更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracles 'alter system set local_listener' 到底做了什么 的相关文章

  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4
  • 错误 38824:CREATE 或 REPLACE 命令可能无法更改现有对象的 EDITIONABLE 属性

    我们正在实现数据库生产对象 如包 过程 触发器等 的单元测试系统 为此 我们有一个容器来创建数据库https github com oracle docker images tree master OracleDatabase https
  • 我怎样才能知道oracle 9i中哪些值是数字

    我有这个包含 varchar 的数据库 我想知道哪些记录保存数值 我试过REGEXP COUNT和其他 但我在 9i 上运行 我认为这是针对 10g gt 我怎样才能实现这个目标 I tried select to number my co
  • 创建包 sqlplus

    我正在尝试通过以下过程创建一个包 CREATE OR REPLACE PROCEDURE insert rows pl deptno dept deptno TYPE pl dname dept dname TYPE pl loc dept
  • 循环预定义值

    有没有办法在 oracle 中执行 for every 如下所示 begin for VAR in 1 2 5 loop dbms output put line The value VAR end loop end 我知道你可以这样做 b
  • PL/SQL 中无法选择 count(*)

    DECLARE rec count integer default 0 str varchar 100 BEGIN str select count into rec count from emp table EXECUTE IMMEDIA
  • Oracle 中仅在一列上不同

    我想在下表中使用不同的值 但仅在 PlayerID 列上使用 这就是我现在所拥有的 MATCHID PLAYERID TEAMID MATCHDATE STARTDATE 20 5 2 14 JAN 12 01 JUN 11 20 5 4
  • Oracle SQL 分析查询 - 类似递归电子表格的运行总计

    我有以下数据 由A值 排序依据MM 月 The B列计算为GREATEST current value of A previous value of B 0 以类似电子表格的方式 我怎样才能计算B使用 SQL 查询 我尝试使用分析函数 但未
  • 如何使用 tnsname 从 Ant 连接到 Oracle 数据库?

    我正在寻找类似于 Ant sql 任务的东西 但它将接受以下格式的 JDBC url jdbc oracle thin TNS NAME 一种可能的方法似乎是编写我自己的 Ant 任务 该任务使用 OracleDataSource 来创建连
  • 关闭连接时 JDBC 事务回滚失败

    如果在提交期间与数据库资源的连接丢失 这可能会导致提交失败 然后回滚失败 是否有可能事务已部分提交 这似乎发生在我的案例中 但希望社区能更清楚地说明这一点 HibernateTransactionManager 和 Oracle 与 JDB
  • SQL在单个命令中在表中添加列和注释

    我的 Web 应用程序使用 Oracle 11g 我想向现有表添加列和注释 我可以使用以下命令轻松做到这一点 ALTER TABLE product ADD product description VARCHAR2 20 and COMME
  • ojdbc6.jar 文件是什么?

    对于学校项目 我必须使用数据库编写 Java 程序 为此我必须导入该项目文件 ojdbc6 jar 我知道没有它我就无法使用数据库 但我真的不知道这个文件是什么 有人可以解释一下吗 这样的文件是如何被调用的 它的用途到底是什么 简单地说 J
  • 我应该使用监听器还是观察者?

    我的 GUI 中有一个下拉框 它显示另一个类中 ArrayList 的内容 新对象可以添加到 GUI 中其他位置的 ArrayList 中 因此我需要知道它何时更新 以便刷新下拉菜单 据我所知 我的两个选择是扩展 ArrayList 类以允
  • 如果运行战争,oracle 和 sybase 数据库连接会出现 ClassNotFoundError,但在 eclipse 中工作正常

    我在应用程序中构建了一个功能来测试数据库连接 在本地 我能够测试所有三个数据库 sqlserver sybase 和 oracle 但如果创建 war 文件并在 Windows Linux 服务器中运行 war 则 Oracle 和 syb
  • 使用 Python 使用正确的编码从 Oracle 导入

    我很抱歉提出一个字符编码问题 因为我知道你们每天都会遇到很多问题 但我无法弄清楚我的问题 所以我还是问了 这是我们正在做的事情 使用 Python 从 Oracle DB 获取数据并cx Oracle 使用 Python 将数据写入文件 使
  • Oracle BLOB 提取非常慢

    从我管理的 oracle 10gR2 10 2 05 数据库中提取 BLOBS 时 我遇到性能问题 我有大约 400 个存储为 BLOBS 的文件 我需要将它们写入文件系统 下面是我的代码 当我执行这个过程时 前 8 个左右的文件会在几秒钟
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • SQL查询获取列的精度值

    我需要一个 SQL 查询来获取某些列的精度值 我主要关心十进制类型列 并且我需要相同的精度值 我意识到在某些版本和数据库服务器供应商中可以这样做 如果您能列出其中的一些 那就太好了 对于 SQL 服务器 select precision f
  • 使用绑定变量动态传递表名和列名

    有没有办法使用绑定变量将列名和表名动态传递给查询 这可以通过使用简单的串联运算符来完成 但我想要一种不同的方法来实现这一目标 EDIT OPEN abc cur FOR Select column name from table name
  • 从 blob 反序列化 java 对象

    首先 我很抱歉 我要问一些愚蠢的问题 我根本不懂java 也不知道我们是否可以问这样的问题 如果没有 删除我的主题 oracle中有一个存储blob的表 它是二进制的 我能够解码它 输出看起来像这样 sr com epam insure c

随机推荐