2009-01-18 56 views
3

試圖讓使用Perl & MySQL的大插入片段時,我跑入我可以更改DBD :: mysql使用的數據包大小嗎?

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

錯誤。我知道在my.cnf中增加max_allowed_packet設置可以解決這個問題,但是可以告訴DBI(或DBD :: mysql,因爲我的應用程序真的只需要與MySQL一起工作)來使用較小的數據包?是否有可能將一個大插入分成更小的數據包?

我沒有完全控制數據庫服務器,因爲這需要在共享主機環境中運行,所以如果我可以在不請求對服務器進行全局更改的情況下處理此問題,那將是理想的。

謝謝!

回答

3

嘗試在DBI-> connect的第一個參數中添加諸如";max_allowed_packet=1MB"之類的內容。

如果這不起作用,您可以使用指向具有正確配置的my.cnf文件的";mysql_read_default_file=/somewhere/my.cnf"選項。

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

我沒有測試這個代碼,但你應該明白了。

相關問題