PostgreSQL和Oracle中的一条错误消息分析

简介: PostgreSQL服务端的日志里有时会残留一些这样的消息。意思是说客户端的socket意外终止了。 LOG: could not receive data from client: Connection reset by peer. 或中文的 LOG:无法从客户端获得数据: 出现这样的消息有2个可能的原因 1)客户端进程意外结束了 2)客户端进程没有关闭连接就退出了 其中第2点有时比较隐蔽。

PostgreSQL服务端的日志里有时会残留一些这样的消息。意思是说客户端的socket意外终止了。

LOG: could not receive data from client: Connection reset by peer.
或中文的
LOG:无法从客户端获得数据:

出现这样的消息有2个可能的原因
1)客户端进程意外结束了
2)客户端进程没有关闭连接就退出了

其中第2点有时比较隐蔽。比如下面的.NET程序。

  1. String connectionString = ...;
  2. NpgsqlConnection con = new NpgsqlConnection(connectionString);
  3. con.Open();
  4. con.Close();

由于Npgsql使用了连接池,上面的con.Close()不会实际关闭物理连接而是将物理连接放入到连接池中以备下次重用。所以这个程序结束时也可能在服务端引发一条错误消息。

为什么说“可能”呢?
因为Npgsql通过重载NpgsqlNetworkStream类的Dispose()方法,实现了对未关闭连接的释放(*1)。所以一般情况下不会有问题。但测试发现以下几种情况下Dispose()方法不会被调用,因而会导致socket异常关闭,服务端报错。
1)由未捕获的异常导致的程序终了。
2)SSL方式的连接
3)未关闭连接太多或MinPoolSize设的比较大时(*2)


*1)其实这是一个相当危险并应当禁止的行为。因为它在GC的过程中调用了其它对象发送消息,如果其它对象可能正在或已经被回收了,可能会导致不可预知的结果。我们在做别的项目时曾经遇到一个非常极端的情况。在大量并发的情况下,通过.NET的Dispose()对未回收的连接中发一个终了消息,结果
偶尔这个终了消息被误发给了其它连接,导致服务端接受到了错误数据而宕机。
*2)有时调Dispose()有时不调,有一定随机性

 

引申:Oracle的行为
作为对比调查了Oracle。发现Oracle有类似现象。
同样用.NET程序做测试(没试SSL),只要同时存在的连接数大于2(或MIN POOL SIZE大于2),程序退出时,服务端就会出现错误日志。

测试程序:

  1. String connectionString = ...;
  2. OracleConnection con1 = new OracleConnection(connectionString);
  3. OracleConnection con2 = new OracleConnection(connectionString);
  4. con1.Open();
  5. con2.Open();
  6. con1.Close();
  7. con2.Close();

trace/alert_XXXX.log:
***********************************************************************

Fatal NI connect error 12547, connecting to:
(LOCAL=NO)

  VERSION INFORMATION:
              TNS for Linux: Version 11.2.0.1.0 - Production
              Oracle Bequeath NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production
              TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production
 Time: 04-SEP-2013 14:51:31
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12547
   
TNS-12547: TNS:lost contact
    ns secondary err code: 12560
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0
opiodr aborting process unknown ospid (3574) as a result of ORA-609

 

总结
对使用连接池的场景,出现这个错误消息很多时候不是问题。但好像没有特别好的方法能让这种场景下不报错。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
SQL 存储 关系型数据库
PostgreSQL窗口函数避坑指南:如何让复杂分析查询提速300%?
本文基于真实企业级案例,深入剖析PostgreSQL窗口函数的执行原理与性能陷阱,提供8大优化策略。通过定制索引、分区裁剪、内存调优及并行处理等手段,将分钟级查询压缩至秒级响应。结合CTE分阶段计算与物化视图技术,解决海量数据分析中的瓶颈问题。某金融客户实践表明,风险分析查询从47秒降至0.8秒,效率提升5800%。文章附带代码均在PostgreSQL 15中验证,助您高效优化SQL性能。
|
Oracle 关系型数据库 数据库
【赵渝强老师】在PostgreSQL中访问Oracle
本文介绍了如何在PostgreSQL中使用oracle_fdw扩展访问Oracle数据库数据。首先需从Oracle官网下载三个Instance Client安装包并解压,设置Oracle环境变量。接着从GitHub下载oracle_fdw扩展,配置pg_config环境变量后编译安装。之后启动PostgreSQL服务器,在数据库中创建oracle_fdw扩展及外部数据库服务,建立用户映射。最后通过创建外部表实现对Oracle数据的访问。文末附有具体操作步骤与示例代码。
1545 6
【赵渝强老师】在PostgreSQL中访问Oracle
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
3612 3
|
SQL Oracle 前端开发
Oracle效率分析,Github标星25K+超火的前端实战项目
Oracle效率分析,Github标星25K+超火的前端实战项目
|
人工智能 Oracle 关系型数据库
一篇文章弄懂Oracle和PostgreSQL的Database Link
一篇文章弄懂Oracle和PostgreSQL的Database Link
|
SQL Oracle 关系型数据库
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
|
Oracle 关系型数据库 MySQL
PG系、Oracle、MySQL数据库在特定场景下结果差异分析
本文主要介绍以PolarDB O引擎、ADB PG为代表的PG系数据库在某种特定事务场景下,其事务结果与Oracle、MySQL不同的现象,并分析该现象出现的原因。
846 0
PG系、Oracle、MySQL数据库在特定场景下结果差异分析
|
关系型数据库 分布式数据库 PolarDB
PolarDB 开源版通过 postgresql_hll 实现高效率 UV滑动分析、实时推荐已读列表过滤
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍PolarDB 开源版通过 postgresql_hll 实现高效率 UV...
659 0
|
存储 关系型数据库 测试技术
拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)
本文深入解析PostgreSQL分区表的核心原理与优化策略,涵盖性能痛点、实战案例及压测对比。首先阐述分区表作为继承表+路由规则的逻辑封装,分析分区裁剪失效、全局索引膨胀和VACUUM堆积三大性能杀手,并通过电商订单表崩溃事件说明旧分区维护的重要性。接着提出四维设计法优化分区策略,包括时间范围分区黄金法则与自动化维护体系。同时对比局部索引与全局索引性能,展示后者在特定场景下的优势。进一步探讨并行查询优化、冷热数据分层存储及故障复盘,解决分区锁竞争问题。
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
748 0

推荐镜像

更多