Windows监听日志文件过大,需要清理,设置log_status off报错TNS-12508

Oracle监听器配置与管理
(1)检查监听日志状态
C:\Users\Administrator>lsnrctl status
...
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 64-bit Windows: Version 11.2.0.3.0 - Produ
ction
启动日期                  26-10月-2017 13:03:25
正常运行时间              0 天 0 小时 2 分 19 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:\app\Administrator\product\11.2.0\dbhome_1\network\a
dmin\listener.ora
监听程序日志文件          D:\app\Administrator\diag\tnslsnr\WIN-MIRBE4NEBAU\listener\alert\log.xml
...
  实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orclXDB" 包含 1 个实例。
  实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功

(2)设置log_status off
LSNRCTL> set log_status off
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=WIN-MIRBE4NEBAU)(PORT=1521)
))
TNS-12508: TNS: 监听程序无法解析给定的 COMMAND

(3)检查listener.ora:
# listener.ora Network Configuration File: D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
INBOUND_CONNECT_TIMEOUT_LISTENER = 0
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:D:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = WIN-MIRBE4NEBAU)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

ADR_BASE_LISTENER = D:\app\Administrator

Admin_Restrictions_LISTENER = ON      ---包含此行



(4)修改listener.ora中的Admin_Restrictions_LISTENER = OFF

然后执行lsnrctl reload,提示设置成功

LSNRCTL> set log_status off
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=WIN-MIRBE4NEBAU)(PORT=1521)
))
TNS-12508: TNS: 监听程序无法解析给定的 COMMAND
LSNRCTL> reload
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=WIN-MIRBE4NEBAU)(PORT=1521)
))
命令执行成功
LSNRCTL> set log_status off
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=WIN-MIRBE4NEBAU)(PORT=1521)
))
LISTENER 参数 "log_status" 设为 OFF
命令执行成功
LSNRCTL>

(5)删除listener.log成功


参考MOS文章:
TNS-12508 When Issuing Any SET Command For The Listener (文档 ID 238312.1)
<think>我们正在处理一个Oracle数据库连接错误ORA-12518的问题。根据引用[1]中的描述,这个错误的原因是“监听器无法移交客户端连接”。我们需要分析可能的原因并提供解决方案。 首先,让我们理解错误信息:ORA-12518表示监听器无法将客户端连接移交给服务器进程。这通常发生在数据库服务器资源不足或配置不当的情况下。 可能的原因包括: 1. 数据库服务器进程数达到最值(PROCESSES参数限制)。 2. 监听器配置问题。 3. 数据库资源不足(如内存不足)。 4. 网络问题。 解决方案: 1. 检查并增加PROCESSES参数:登录数据库,查看当前PROCESSES参数设置,并根据需要增加。 ```sql SHOW PARAMETER processes; ALTER SYSTEM SET processes=300 SCOPE=SPFILE; -- 根据实际情况调整 ``` 修改后需要重启数据库。 2. 检查会话数:确认当前会话数是否达到上限。 ```sql SELECT count(*) FROM v$session; SELECT value FROM v$parameter WHERE name = 'processes'; ``` 3. 检查监听器日志:查看监听日志文件(通常位于$ORACLE_HOME/network/log/listener.log)以获取更多错误信息。 4. 调整调度程序(DISPATCHERS)参数:如果使用共享服务器模式,可能需要增加DISPATCHERS的数量。 ```sql ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=5)' SCOPE=BOTH; ``` 5. 检查服务器资源:确保服务器有足够的资源(内存、CPU)来处理新的连接。 6. 重启监听器:有时重启监听器可以解决临时问题。 ```bash lsnrctl stop lsnrctl start ``` 7. 检查网络:确保客户端和服务器之间的网络连接正常。 如果以上步骤不能解决问题,需要进一步分析监听器日志和数据库警报日志。 §§相关问题§§ 1. ORA-12518错误在什么情况下会发生? 2. 如何监控Oracle数据库的进程和会话使用情况? 3. 共享服务器模式和专用服务器模式有什么区别? 4. 如何配置Oracle监听器? 5. 除了ORA-12518,还有哪些常见的Oracle连接错误?</think>### Oracle ORA-12518 错误原因及解决方案 **错误描述** ORA-12518 表示监听器无法将客户端连接移交给数据库服务器进程,错误信息为: `Listener refused the connection with the following error: ORA-12518, TNS:listener could not hand off client connection`[^1]。 --- ### 原因分析 1. **进程数超限** - 数据库的 `PROCESSES` 参数达到上限,无法创建新进程。 - 验证命令: ```sql SELECT name, value FROM v$parameter WHERE name = 'processes'; ``` 2. **会话数超限** - `SESSIONS` 参数设置过低,或活跃会话过多。 - 验证命令: ```sql SELECT COUNT(*) FROM v$session; -- 当前会话数 SELECT value FROM v$parameter WHERE name = 'sessions'; -- 上限值 ``` 3. **共享服务器模式问题** - 使用共享服务器(Shared Server)时,调度进程(DISPATCHERS)不足。 - 检查命令: ```sql SELECT * FROM v$dispatcher; -- 查看调度进程状态 ``` 4. **资源不足** - 服务器内存/CPU 资源耗尽,无法创建新进程。 - 操作系统级验证: ```bash top # Linux/Unix taskmgr # Windows ``` 5. **监听器配置错误** - `listener.ora` 中 `PROTOCOL` 或 `SID` 配置错误。 --- ### 解决方案 #### 1. 调整数据库参数 - **增加 `PROCESSES` 和 `SESSIONS`** ```sql ALTER SYSTEM SET processes=500 SCOPE=spfile; -- 建议值:当前值×1.5 ALTER SYSTEM SET sessions=555 SCOPE=spfile; -- sessions ≈ processes×1.1 ``` **重启数据库生效**: ```bash sqlplus / as sysdba SHUTDOWN IMMEDIATE; STARTUP; ``` #### 2. 优化共享服务器模式 - **增加调度进程**: ```sql ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=5)' SCOPE=both; ``` #### 3. 释放资源 - **终止空闲会话**: ```sql SELECT sid, serial# FROM v$session WHERE status='INACTIVE'; ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; ``` - **重启监听器**: ```bash lsnrctl stop lsnrctl start ``` #### 4. 检查监听器配置 - 确认 `listener.ora` 中的数据库 SID 和协议正确: ```ini SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = your_sid) (ORACLE_HOME = /path/to/oracle/home) ) ) ``` #### 5. 操作系统级优化 - 增加服务器内存/CPU 资源。 - 调整内核参数(Linux): ```bash sysctl -w kernel.sem="250 32000 100 128" # 增加信号量 ``` --- ### 预防措施 - 定期监控会话和进程使用: ```sql SELECT resource_name, current_utilization, max_utilization FROM v$resource_limit WHERE resource_name IN ('processes', 'sessions'); ``` - 设置连接池超时机制,避免空闲连接占用资源。 - 在 `sqlnet.ora` 中添加 `SQLNET.EXPIRE_TIME=10`(分钟),自动断开空闲连接。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值