为什么我在一段时间后不断出现MySQL客户端内存不足错误.
Why do I keep getting MySQL Client Out of Memory error after a certain period of time...?
我正在开发一个服务器应用程序,该应用程序每天预成型各种(可能数百到数千)MySQL查询(SELECTS、INSERTS和UPDATES)。
查询非常有效,直到。。。。
出于某种原因,在服务器运行大约1到2天后,每当我试图从服务器预生成任何MySQL查询时,它都会生成MySQL错误。。。服务器是用C++开发的。
错误表明MySQL客户端内存不足。
我正在使用MySQL社区服务器5.6.24
是否有某种我不知道的存储在内存中的隐藏数据缓存,每当执行MySQL查询时就会被占用。。。。?这是我唯一能想到的。
这可能与您正在使用的查询有关。索引不仅有助于限制这些查询返回的结果。我猜您正在使用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++代码中的某些东西没有分配内存,并且在分配完内存之后,会正确地释放内存。
另一件可能泄漏的事情是连接。数据库连接非常昂贵,而且很难实现。我在谷歌上搜索了"mysql连接池"。如果您使用连接器/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.
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 从服务器传输到客户端的消息不会出现
- OpenSSL TLS服务器-使用客户端证书白名单
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何绑定 C++ gRPC 客户端的网络接口
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 MySQL 中运行 HTTP 服务器以从客户端接收数据
- 为什么我在一段时间后不断出现MySQL客户端内存不足错误.
- 使用 valgrind 查找 mysql c++ 客户端中的内存泄漏
- mysql 远程连接 - mysql CL 客户端工作,C++应用程序不工作
- 插入不工作,如果没有在phpmyadmin / linux mysql客户端
- MySQL客户端库与服务器的版本兼容性