Oracle12537

本文详细分析了Oracle数据库连接出现ORA-12537错误的原因,并提供了针对性的解决方法。主要原因是OS内存使用率过高导致无法分配足够的资源给ORACLE服务进程。通过增加物理内存容量可以有效解决该问题。
ORA-12537错误的解决
Author : rainnyzhong
Date: 2009-6-5
服务器配置:

DB VERSION:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi 专用服务器
OS: Linux ecv33.localdomain 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux
OS RAM:8G
症状描述:

用SQLPLUS连接DB报:
ERROR:
ORA-12537: TNS:connection closed

检查listener.log,看到很多如下错误:
05-JUN-2009 13:24:26 * (CONNECT_DATA=(SID=ORA33)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.17.16.234)(PORT=1487)) * establish * ORA33 * 12518
TNS-12518: TNS:listener could not hand off client connection
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 32: Broken pipe

检查sqlnet.log,报很多类似如下的错误:
***********************************************************************
Fatal NI connect error 12537, connecting to:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.16.33)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ora33)(CID=(PROGRAM=sqlplus)(HOST=ecv33.localdomain)(USER=oracle))))

VERSION INFORMATION:
TNS for Linux: Version 10.2.0.1.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 10.2.0.1.0 - Production
Time: 05-JUN-2009 13:24:52
Tracing not turned on.
Tns error struct:
ns main err code: 12537
TNS-12537: TNS:connection closed
ns secondary err code: 12560
nt main err code: 507
TNS-00507: Connection closed
nt secondary err code: 0
nt OS err code: 0
原因分析:

(1)检查实例参数:
n PROCESSES:300
n SESSIONS:350
(2)检查v$resource_limit

当实际的进程数达到200个左右时,就连不到ORACLE了。报ORA-12537错。当发生这种错误时,一般是由于PROCESS参数设得不够大所导致,但这个CASE有点例外,当实际进程数达到200时就不行了,这是为什么呢?
这是因为,还有一个原因会导致这个错误的发生:那就是OS的内存使用状况。当OS的内存使用率达到90%以上时,既使是还可以再建立100个进程,但此时由于OS再也分配不出更多的内存来给ORACLE的服务进程了,所以监听器就没办法给进来和客户端连接启动一个专用的ORACLE SERVER PROCESS(我们知道,在DEDICATED SERVER模式,一个客户端连接的建立,ORACLE就会启动一个专用的SERVER PROCESS来服务这个客户端连接)。我们来检查一下OS的内存状况:
[oracle@ecv33 admin]$ free
total used free shared buffers cached
Mem: 8160800 8142776 18024 0 10236 6809660
-/+ buffers/cache: 1322880 6837920
Swap: 8388600 104252 8284348

果然,OS的内存使用率已达99%了。
解决方法:

增加ORACLE服务器的物理内存
### 查看 Oracle 数据库中的白名单配置 在 Oracle 数据库中,白名单的配置通常通过 `sqlnet.ora` 文件实现。此文件位于 `$ORACLE_HOME/network/admin` 目录下,用于定义哪些 IP 地址可以访问数据库实例。以下是查看和验证白名单配置的方法: #### 1. 检查 `sqlnet.ora` 文件 进入 `$ORACLE_HOME/network/admin` 目录,检查是否存在 `sqlnet.ora` 文件。如果存在,打开该文件并查找以下参数: - `tcp.validnode_checking`: 启用或禁用 IP 检查功能。若值为 `yes`,则表示启用了 IP 检查[^1]。 - `tcp.invited_nodes`: 定义允许访问数据库的 IP 地址列表。多个地址之间用逗号分隔[^1]。 - `tcp.excluded_nodes`: 定义禁止访问数据库的 IP 地址列表。多个地址之间用逗号分隔[^1]。 例如,一个典型的 `sqlnet.ora` 文件内容可能如下: ```plaintext tcp.validnode_checking=yes tcp.invited_nodes=(192.168.220.128, 127.0.0.1) tcp.excluded_nodes=(192.168.220.1) ``` #### 2. 验证监听器状态 在完成上述检查后,可以通过以下命令验证监听器是否已加载新的配置: - 使用 `lsnrctl status` 命令检查监听器的状态。确保监听器已正确加载 `sqlnet.ora` 中的配置[^5]。 - 如果之前不存在 `sqlnet.ora` 文件,则需要重启监听器以使配置生效: ```bash lsnrctl stop lsnrctl start ``` - 如果 `sqlnet.ora` 文件已存在但进行了修改,则可以使用以下命令重新加载配置而无需停止监听器: ```bash lsnrctl reload ``` #### 3. 测试连接 为了验证白名单配置是否生效,可以从不同的 IP 地址尝试连接数据库: - 允许的 IP 地址应能够成功连接数据库。 - 被排除的 IP 地址应收到类似以下错误提示: ```plaintext ERROR: ORA-12537: TNS:connection closed ``` 这表明白名单配置已生效[^2]。 #### 注意事项 - 确保 `tcp.invited_nodes` 列表中包含本地地址(如 `127.0.0.1`),否则监听器可能无法正常启动[^1]。 - 如果 `sqlnet.ora` 文件中同时配置了 `tcp.invited_nodes` 和 `tcp.excluded_nodes`,优先级以 `tcp.invited_nodes` 为准。即,即使某个 IP 地址出现在 `tcp.excluded_nodes` 中,但如果它也存在于 `tcp.invited_nodes` 中,则仍然允许访问[^1]。 ### 示例代码 以下是一个简单的脚本,用于检查 `sqlnet.ora` 文件是否存在以及其内容: ```bash #!/bin/bash SQLNET_PATH=$ORACLE_HOME/network/admin/sqlnet.ora if [ -f "$SQLNET_PATH" ]; then echo "sqlnet.ora 文件存在,内容如下:" cat $SQLNET_PATH else echo "sqlnet.ora 文件不存在,请手动创建并配置。" fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值