我可以更改DBD :: mysql使用的数据包大小吗?

时间:2009-01-18 16:34:40

标签: mysql perl

我正在进入

DBD::mysql::st execute failed: Got a packet bigger than 'max_allowed_packet' bytes
尝试使用Perl& amp;进行大插入时出现

错误MySQL的。我知道增加my.cnf中的max_allowed_packet设置可以解决这个问题,但是有可能告诉DBI(或DBD :: mysql,因为我的应用程序真的只需要使用MySQL)来使用较小的数据包吗?是否有可能将大插入分解为更小的数据包?

我无法完全控制数据库服务器,因为这需要在共享托管环境中运行,因此如果我可以在不请求对服务器进行全局更改的情况下处理此问题,那将是理想的。

谢谢!

2 个答案:

答案 0 :(得分:3)

尝试将类似";max_allowed_packet=1MB"的内容添加到DBI-> gt; connect的第一个参数。如果这不起作用,您可以使用指向my.cnf的";mysql_read_default_file=/somewhere/my.cnf"选项具有正确配置的文件。

答案 1 :(得分:1)

如果这不起作用,一方面解决问题,就是先插入字符串的最大长度(插入语句的长度为1MB)。然后,使用如下所示的1MB数据包更新:

$data = "whatever data needs inserting";
my $ins_sth=$dbh->prepare("insert into table_name (datacol) values(?)");
my $upd_sth=$dbh->prepare("update table_name set datacol=datacol||? where id=?");
my $max_size = 900_000; # Really max_packet_size - 200bytes
my $pos = 0;
$ins_sth->execute(substr($data,$pos,$max_size));
my $id = $dbh->{'mysql_insertid'};
$pos += $max_size;
while ( $pos < length($data) ) {
  $upd_sth->execute(substr($data,$pos,$max_size));
  $pos+=$max_size;
}

我没有测试这段代码,但你应该明白这个想法。