我有一个由PHP生成的MySQL查询,它存储在一个字符串中。
要插入的数据量相当大。当我运行查询将数据插入数据库时,什么也没有发生。当我将字符串复制到vim实例中并将文件保存为*.php
时,字符串中只有前~2995个字符会突出显示。
即使我从前2995个字符中删除行,字符串中的下一行也会高亮显示,以便始终高亮显示第一个~2995个字符。
我起初以为有一个最大的字符串长度,但发现它是2GB在这个线程,我的字符串绝对不是。
我不知道它是否有帮助,但是字符串遵循格式
INSERT INTO Table_Name(Field1, Field2) VALUES('value1', 'value2'),......
注意:插入值中的所有引号都已被转义或删除,因此不会引起问题。
这听起来像是my.cnf
中max_allowed_packet
大小的问题。
下面的细节提到了使用命令行中的mysqld
来调整这一点。但如果可能的话,最好直接进入my.cnf
文件并在那里调整max_allowed_packet
。例如,在我管理的一些使用InnoDB的服务器上,我将该值设置为max_allowed_packet=64M
。
服务器的默认max_allowed_packet值是1MB。你可以增加如果服务器需要处理大型查询(例如,如果您正在处理大BLOB列)。例如,设置变量到16MB,像这样启动服务器:
shell> mysqld --max_allowed_packet=16M
您也可以使用选项文件设置
max_allowed_packet
。为例如,要将服务器的大小设置为16MB,则添加以下内容选项文件中的行:[mysqld] max_allowed_packet=16M
增加这个变量的值是安全的,因为额外的只在需要时分配内存。例如,mysqld分配只有在发出长查询或mysqld必须时才会增加内存返回一个大的结果行。该变量的小默认值为在客户端和服务器之间捕获错误数据包的预防措施并且还确保您不会通过使用large来耗尽内存包不小心。
EDIT:我还发现了另一个可能有用的设置,net_buffer_length
:
每个客户端线程与一个连接缓冲区和结果相关联缓冲区。两者都以
每执行一条SQL语句后,result buffer缩小到net_buffer_length
给出的大小开始,但都是根据需要动态放大到max_allowed_packet
字节。的net_buffer_length
。这个变量通常不应该被改变,但是如果你有非常内存少,可以将其设置为语句的预期长度客户端发送。如果语句超过此长度,则断开连接缓冲区自动扩大。的最大值
net_buffer_length
可以设置为1MB
net_buffer_length
的默认值是16384字节,即0.015625MB,然后是16KB。试着调整这个值&再试一次。比如524288字节,也就是512 KB或者131072字节,也就是128 KB。您需要知道的是net_buffer_length
直接连接到mysqldump
线长度。这就是它