更改了max_allowed_pa​​cket并仍然收到“ Packet Too Large”错误


8

我使用mysqldump创建用于备份目的的平面文件。我已使用此文件在备用服务器上重新创建数据库。我在命令行上通过ssh运行了导入过程,但收到多个Packet too Large错误。

我用更大的max_allowed_pa​​cket(即1000M)重新启动了mysql,但仍然收到错误。我什至尝试在导入文件中设置max_allowed_pa​​cket,仍然收到错误。

有没有一种方法可以确保设置了max_allowed_pa​​cket和/或使用mysqldump来创建不会引起此问题的文件?

以供参考:

未压缩的mysqldump文件约为2GB

数据库类型为INNODB

Answers:


5

我首先想到的是max_allowed_pa​​cket实际控制的内容。这是我发现的:

根据“了解MySQL内部知识”(ISBN 0-596-00957-7)第99页,这里是第1-3段对此进行了解释:

MySQL网络通信代码是在假设查询总是相当短的前提下编写的,因此可以以一个块的形式发送到服务器并由服务器进行处理,这在MySQL术语中称为数据包。服务器为临时缓冲区分配内存以存储数据包,并且它请求足够完全容纳它。这种体系结构需要采取预防措施,以免服务器耗尽内存-限制数据包大小,此选项可以实现此目的。

与该选项有关的感兴趣的代码位于 sql / net_serv.cc中。看一下my_net_read(),然后跟随对my_real_read()的调用,并特别注意 net_realloc()

此变量还限制了许多字符串函数的结果的长度。有关详细信息,请参见sql / field.ccsql / intem_strfunc.cc

给定max_allowed_pa​​cket的定义,然后我从ServerFault中发现了其他内容:如果您有很多大对象,则innodb_log_file_size和innodb_log_buffer_size的总和必须大于最大对象的十倍。

牢记这两件事,我将/etc/my.cnf中的innodb_log_file_size增加到允许的最大大小2047M。当然这需要以下

service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start

这将容纳您数据中可能存在的任何大斑点。


奇怪的是10x来自何处-是只是一个经验法则,还是MySQL中有代码说分配10个固定缓冲区,因此您需要10个以确保其中1个足够大吗?
Gaius

这本书权威吗?
Pacerier

2

MySQL max_allowed_packet仍然必须处于启动它的外壳程序的范围内-是否ulimit -a表明它data seg size是无限的?


2

出于某种原因,max_allowed_packet被忽略mysqldump-通过设计?实际补码为net_buffer_length。因此,请尝试

mysqldump --net_buffer_length=100k -u root -p databasename > dump.sql

很有启发性!由于错误报告讨论了与此问题相关的扩展插入,因此也许执行--skip-extended-insert可能会补偿某些问题,但肯定会生成更大的mysqldump。+1为您找到了这颗钻石,甲骨文将死掉!
RolandoMySQLDBA 2011年

--skip-extended-insert当然可以,但是在我的数据库上,还原速度降低了100倍,使其无法使用。
Leopd 2011年

对不起,我表示慰问。也许让mysqldump创建CSV文件,然后尝试使用LOAD DATA INFILE将它们重新加载,然后将bulk_insert_buffer_size增加到1G或2G。嘿,你永远不知道!
RolandoMySQLDBA 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.