在 MySQL 错误日志中,我看到了很多这样的警告:
120611 16:12:30 [Warning] Aborted connection 2619503 to db: 'db_name' user: 'user_name' host: 'webapp_hostname' (Got an error reading communication packets)
没有注意到任何数据丢失本身,所以我想知道这个警告是什么意思,或者是什么原因导致的,以及是否可以解决导致这些问题的问题。这是在 RHEL 6.1 和 MySQL Enterprise 5.5 上。
MySQL 连接的无声杀手之一是 MySQL 数据包。
首先,让我们弄清楚什么是 MySQL 数据包。
根据“Understanding MySQL Internals” (ISBN 0-596-00957-7) 第 99 页,这里是解释 MySQL 数据包的第 1-3 段:
MySQL 网络通信代码是在查询总是相当短的假设下编写的,因此可以以一个块的形式发送到服务器并由服务器处理,这在 MySQL 术语中称为数据包。服务器为临时缓冲区分配内存来存储数据包,并且它请求足够的内存来完全容纳它。此体系结构需要采取预防措施以避免服务器内存不足——数据包大小的上限,此选项可实现。 与此选项相关的代码可在 sql/net_serv.cc中找到。查看my_net_read(),然后调用my_real_read()并特别注意 net_realloc()。 该变量还限制了许多字符串函数的结果长度。有关详细信息,请参阅sql/field.cc和 sql/intem_strfunc.cc。
MySQL 网络通信代码是在查询总是相当短的假设下编写的,因此可以以一个块的形式发送到服务器并由服务器处理,这在 MySQL 术语中称为数据包。服务器为临时缓冲区分配内存来存储数据包,并且它请求足够的内存来完全容纳它。此体系结构需要采取预防措施以避免服务器内存不足——数据包大小的上限,此选项可实现。
与此选项相关的代码可在 sql/net_serv.cc中找到。查看my_net_read(),然后调用my_real_read()并特别注意 net_realloc()。
该变量还限制了许多字符串函数的结果长度。有关详细信息,请参阅sql/field.cc和 sql/intem_strfunc.cc。
了解 MySQL 数据包的这一点后,开发人员/DBA 可以调整它们的大小以在一个数据包中容纳多个 BLOB,即使它们大得令人讨厌。当然,太小的数据包会导致打开连接在这方面出现问题。
根据MySQL 文档
推荐
尝试将max_allowed_packet提高到更大的数字,因为默认值为 1M。我建议使用当前数据集中最大 TEXT 或 BLOB 字段的大约 10 倍。
要将 max_allowed_packet 设置为 256M,您可以将其添加到 /etc/my.cnf 或 my.ini
[mysqld] max_allowed_packet=256M
以涵盖将来重新启动 mysqld。要立即在服务器上安装值,请运行以下命令:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;
试试看 !!!