
🗄️ ORA-00147 错误详解:客户端无响应
1. 官方正式说明
错误代码: ORA-00147
错误消息: no response from client
中文释义: 客户端无响应
官方解释:
ORA-00147 是Oracle数据库网络通信层的一个协议错误,表明数据库服务器端的TNS协议适配器在预期时间内未能收到客户端的响应。这种错误通常发生在已建立的数据库连接上,当服务器向客户端发送数据或请求后,在指定的超时时间内没有收到客户端的任何响应。这属于一种通信超时错误,可能由网络中断、客户端应用程序崩溃、客户端资源耗尽或网络配置问题引起。该错误保护服务器资源不被无响应的客户端无限期占用。
2. ORA错误代码结构说明
| 组成部分 | 说明 | 示例 (以ORA-00147为例) |
|---|---|---|
| ORA- | 错误前缀,代表这是一个Oracle (ORA) 数据库运行时错误 | ORA- |
| 00147 | 5位数字错误代码。001 通常表示与实例配置、参数和内存分配相关的错误类别。47 是该类别中的特定错误代码。 | 00147 |
| 错误消息 | 描述错误性质的文本 | no response from client |
此错误属于 ORA-00100 到 ORA-00199 范围,该范围主要涵盖与数据库实例配置、参数验证相关的错误。
3. 错误原因分析
ORA-00147 的根本原因是数据库服务器在预期时间内未能收到客户端的响应。具体原因包括:
- 网络中断:客户端与服务器之间的网络连接意外中断。
- 客户端故障:客户端应用程序崩溃、被强制终止或发生内部错误。
- 客户端资源耗尽:客户端机器内存不足、CPU过载或发生交换抖动。
- 防火墙干预:中间防火墙或安全设备主动中断了空闲连接。
- 协议不匹配:客户端和服务器使用的Oracle网络协议版本不兼容。
- 操作系统问题:客户端操作系统发生蓝屏、死机或其他严重故障。
- 超时设置过短:SQLNET.INBOUND_CONNECT_TIMEOUT或SQLNET.RECV_TIMEOUT参数设置过短。
4. 发生场景
此错误通常发生在以下情况下:
- 长时间查询执行:客户端执行耗时查询时网络中断或客户端无响应。
- 大数据量传输:服务器向客户端返回大量数据时客户端处理能力不足。
- 连接空闲期间:连接建立后长时间空闲被中间设备中断。
- 网络不稳定环境:无线网络或远程连接质量差的环境。
- 客户端资源竞争:客户端机器同时运行多个资源密集型应用。
- 批量数据处理:ETL过程或数据迁移过程中客户端无法及时处理数据。
5. 相关原理
- TNS协议超时机制:Oracle TNS协议包含心跳机制和超时检测,用于及时发现无响应的连接。
- 操作系统TCP超时:底层TCP协议也有自己的超时重传机制,与TNS超时协同工作。
- 连接状态管理:数据库服务器维护所有活动连接的状态信息,定期检查连接健康状态。
- 资源清理机制:当检测到客户端无响应时,服务器会释放为该连接分配的资源(内存、游标等)。
6. 相关联的其他ORA-错误
- ORA-00148:服务器无响应(no response from server)- 客户端视角的类似错误
- ORA-00149:TNS协议适配器无法分配内存(TNS protocol adapter could not allocate memory)
- ORA-03113:通信通道的文件结束(end-of-file on communication channel)
- ORA-03114:未连接到ORACLE(not connected to ORACLE)
- ORA-12170:TNS连接超时(TNS:Connect timeout occurred)
- ORA-12535:TNS操作超时(TNS:operation timed out)
7. 定位原因与分析过程
- 检查服务器端日志:查看数据库警报日志和跟踪文件:
tail -100f $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log
grep -i "ORA-00147" $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/*.trc
- 检查网络连接状态:查看当前数据库连接状态:
SELECT sid, serial#, username, status, machine, program, last_call_et
FROM v$session
WHERE status = 'ACTIVE';
- 检查超时参数设置:查看相关网络超时参数:
SELECT name, value
FROM v$parameter
WHERE name LIKE '%timeout%' OR name LIKE '%dead%';
- 监控网络状态:使用操作系统工具监控网络连接:
netstat -an | grep 1521
ss -tuln | grep oracle
- 检查客户端状态:联系客户端用户确认应用程序状态和客户端资源状况。
8. 解决方案
根据具体原因,采取相应的解决方案:
方案A:调整超时参数(预防性)
-- 增加入站连接超时时间(默认60秒)
ALTER SYSTEM SET SQLNET.INBOUND_CONNECT_TIMEOUT=120 SCOPE=SPFILE;
-- 增加接收超时时间
ALTER SYSTEM SET SQLNET.RECV_TIMEOUT=60 SCOPE=SPFILE;
-- 重启监听器使更改生效
lsnrctl reload
方案B:优化网络环境
# 1. 检查网络稳定性
ping -c 10 <client_ip>
# 2. 检查网络延迟
traceroute <client_ip>
# 3. 检查防火墙设置
iptables -L -n | grep 1521
方案C:客户端应用程序优化
-- 1. 优化长时间运行的查询
EXPLAIN PLAN FOR <problem_query>;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 2. 分批处理大数据量操作
-- 使用ROWNUM或OFFSET/FETCH分批处理
方案D:清理无响应会话
-- 1. 查找可能无响应的会话
SELECT sid, serial#, username, status, last_call_et, machine
FROM v$session
WHERE last_call_et > 3600; -- 超过1小时无活动
-- 2. 谨慎终止无响应会话(确保不会影响业务)
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
9. 相关SQL语句和命令
-- 1. 查看当前所有活动会话
SELECT s.sid, s.serial#, s.username, s.status,
s.machine, s.program, s.last_call_et,
p.spid "OS_PID", s.sql_id
FROM v$session s, v$process p
WHERE s.paddr = p.addar
AND s.status = 'ACTIVE'
ORDER BY s.last_call_ET DESC;
-- 2. 检查网络相关参数
SELECT name, value, description
FROM v$parameter
WHERE name IN ('sqlnet_inbound_connect_timeout',
'sqlnet_recv_timeout',
'dispatchers')
ORDER BY name;
-- 3. 监控网络错误统计
SELECT name, value
FROM v$sysstat
WHERE name LIKE '%error%' OR name LIKE '%timeout%';
-- 4. 查看最近发生的网络错误
SELECT * FROM v$session_wait
WHERE wait_class = 'Network'
AND state = 'WAITING';
# 5. 客户端网络测试
tnsping <service_name>
sqlplus -L username/password@service_name
# 6. 检查操作系统网络设置
sysctl -a | grep net.ipv4.tcp_keepalive
sysctl -a | grep net.ipv4.tcp_retries
# 7. 监控实时网络流量
tcpdump -i any port 1521 -w oracle_network.pcap
10. 通俗易懂的解释
可以把Oracle的客户端-服务器通信想象成两个人打电话:
- 数据库服务器:就像是接电话的人,随时准备回答问题。
- 客户端应用程序:就像是打电话的人,提出问题并等待回答。
- ORA-00147错误:就好像接电话的人问:“你还在吗?”,但打电话的人没有任何回应。
系统会报错:“客户端无响应”。
为什么会出现这种情况?
- 信号中断:打电话的人手机没信号了(网络中断)。
- 手机没电:打电话的人手机突然关机了(客户端崩溃)。
- ** distracted**:打电话的人被其他事情吸引,忘记还在通话(客户端资源耗尽)。
- 语言不通:双方说的语言不一致(协议不匹配)。
怎么办?
- 重拨电话:重新建立连接(重新启动客户端应用)。
- 改善信号:找个信号好的地方(优化网络环境)。
- 约定暗号:约定如果没声音了就挂断(调整超时参数)。
- 换个手机:使用更可靠的设备(升级客户端硬件)。
这个错误通常不是服务器的问题,而是客户端或网络的问题,就像打电话时对方突然不说话了一样。解决方法主要是改善通信条件和提高客户端的可靠性。
欢迎关注我的公众号《IT小Chen》

被折叠的 条评论
为什么被折叠?



