簡體   English   中英

Perl和MySQL插入XML字符串會導致錯誤2006“服務器消失”

[英]Perl and MySQL Inserting an XML string causes error 2006 “server gone away”

我試圖將XML字符串插入此表中:

創建表producto_xmlId int(11)unsigned NOT NULL FechaDescarga ', FechaDescarga datetime NOT NULL, XML FechaDescarga
主鍵( Id ),約束producto_xml_ibfk_1刪除級聯上的外鍵( Id )參考productoId )ENGINE = InnoDB DEFAULT CHARSET = utf8 ROW_FORMAT = COMPRESSED

這是我的腳本:

#!/usr/bin/perl

use strict;
use DBI;
use XML::LibXML;

my $xmlfilename = 'E:/localhost/erp/XMLs/TPT/BigFile.xml';

my $MyDB = 'XXXXX';
my $MyHOST = 'localhost';
my $MyUSR = 'XXXXX';
my $MyPASS = 'XXXXX';

my $dbh = DBI->connect("DBI:mysql:$MyDB:$MyHOST",$MyUSR,$MyPASS, { AutoCommit => 1, RaiseError => 0, PrintError => 0 } ) or &ErrHandle('MySQL: connecting to DB.');
$dbh->do('SET NAMES utf8');

my $max_allowed_packet = ((1024*1024)*15);#15 mb
$dbh ->do('SET @max_allowed_packet='.$max_allowed_packet); 

my $parser = XML::LibXML->new();
my $doc;
eval { $doc = $parser->parse_file($xmlfilename);};
if ($@){ &ErrHandle('XML Parser: Incorrect XML File');}

print 'File length: ' . length($doc->toString(0)) . "\n";

my $St = 'INSERT INTO producto_xml (XML, FechaDescarga, Id) VALUES (?,NOW(), ?) ON DUPLICATE KEY UPDATE XML=VALUES(XML), FechaDescarga=NOW()';

my $Sth =$dbh->prepare($St);
$Sth->execute(
    $doc->toString(0)
    ,1780
);

if ($dbh->{'mysql_errno'} > 0) { &ErrHandle('MySQL: ' . $dbh->{'mysql_errno'} . ': ' . $dbh->{'mysql_error'}); }

print $dbh->{'mysql_insertid'} ."\n";
print $Sth->rows; 
exit;

sub ErrHandle {
    my $Err = shift;
    print 'ERROR: ' . $Err;
    exit;
}

文件“ BigFile.xml”約為1.2 Mb,無論我嘗試什么,我都會遇到此錯誤:

File length: 1207951
ERROR: MySQL: 2006: MySQL server has gone away

我嘗試過:

  • 將列類型更改為mediumtext,longblob,mediumblob
  • 將max_allowed_pa​​cket設置為15,2,1,500 mb。

我使用相同的腳本從大約300 Kb中插入文件。 沒有問題。

我將不勝感激。

恩里克

正如AKHolland所暗示的,應在服務器端設置max_allowed_packet 此外,如果我沒有記錯的話,更改此參數需要重新啟動mysqld

有關如何更改max_allowed_packet

更改my.ini/my.cnf文件。 在文件的[mysqld]下包含單行

max_allowed_packet=500M

現在,一旦完成,請重新啟動MySQL服務。 您可以在mysql中看到它的當前值,如下所示:

SHOW VARIABLES LIKE 'max_allowed_packet'

您可以在這里閱讀有關它的信息http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM