为什么在一段时间后我会不断收到MySQL Client Out of Memory错误...?

时间:2015-04-08 20:34:21

标签: c++ mysql

我正在开发一个服务器应用程序,它每天预制各种(可能数百到数千)MySQL查询(SELECTS,INSERTS和& UPDATES)。

查询效果很好,直到....

由于某种原因,在服务器启动大约1到2天之后,每次我尝试从服务器执行任何MySQL查询时都会生成MySQL错误...服务器是使用C ++开发的。

错误显示MySQL客户端内存不足。

我正在使用 MySQL社区服务器5.6.24

是否有某种隐藏的数据存储在内存中,我不知道在MySQL查询执行时会被占用....这是我唯一能想到的。

2 个答案:

答案 0 :(得分:0)

这可能与您正在使用的查询有关。 索引可以帮助限制从这些查询返回的结果。 我猜测你正在使用SELECT命令加载一定数量的数据,并且返回的值需要存储在某个地方,即内存。

http://dev.mysql.com/doc/refman/5.7/en/out-of-memory.html

此链接提供了一些可能的解决方案。

  

要解决此问题,请先检查您的查询是否正确。应该返回这么多行是否合理?如果没有,请更正查询并再试一次。否则,您可以使用--quick选项调用mysql。这导致它使用mysql_use_result()C API函数来检索结果集,这会减少客户端的负担(但更多的是在服务器上)。


此外,如果您有足够的RAM,可以尝试增加配置文件中的内存限制。

更具体地说,这是您想要调整的内容:

InnoDB设置

  

innodb_buffer_pool_size - 默认为128M。这是您要更改的主要设置,因为它设置了InnoDB将用于加载到内存中的数据+索引的内存量。对于专用的MySQL服务器,建议的大小为已安装内存的50-80%。因此,例如,具有64G RAM的服务器应该具有大约50G的缓冲池。

     

将此值设置得过高的危险在于,操作系统和某些依赖于文件系统缓存的MySQL子系统(如二进制日志和InnoDB的事务日志)将不会留下任何内存。

取自:

http://www.tocker.ca/2013/09/17/what-to-tune-in-mysql-56-after-installation.html


另一种可能性是c ++代码中的某些东西没有分配内存,并且在它完成后正确地释放内存。

答案 1 :(得分:0)

可能泄漏的另一件事是连接。数据库连接非常昂贵,并且存在。我用Google搜索" mysql连接池"。如果您正在使用Connector / J,则可以查看http://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-j2ee-concepts-connection-pooling.html,如果您使用的是连接器/网络,则可以尝试使用http://dev.mysql.com/doc/connector-net/en/connector-net-programming-connection-pooling.html