Могу ли я изменить размер пакета, который использует DBD :: mysql? - PullRequest
3 голосов
/ 18 января 2009

Я бегу в

DBD::mysql::st execute failed: Got a packet bigger than 'max_allowed_packet' bytes

ошибка при попытке сделать большую вставку с использованием Perl и MySQL. Я знаю, что увеличение параметра max_allowed_packet в my.cnf может исправить это, но возможно ли указать DBI (или DBD :: mysql, поскольку моему приложению действительно нужно работать только с MySQL), чтобы использовать меньшие пакеты? Можно ли даже разбить большую вставку на более мелкие пакеты?

У меня нет полного контроля над сервером базы данных, поскольку он должен работать в среде общего хостинга, поэтому, если бы я мог справиться с этим, не запрашивая глобальные изменения на сервере, это было бы идеально.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 января 2009

Попробуйте добавить что-то вроде ";max_allowed_packet=1MB" в первый аргумент DBI-> connect.

Если это не сработает, вы можете использовать опцию ";mysql_read_default_file=/somewhere/my.cnf", указывающую на файл my.cnf, который имеет правильную конфигурацию.

1 голос
/ 18 января 2009

Если это не сработает, один из способов обойти проблему - это сначала вставить наибольшую длину строки, которую вы можете (1 МБ длины оператора вставки). Затем вы обновляете пакеты размером 1 МБ, например:

$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;
}

Я не тестировал этот код, но вы должны понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...