source

QUERY 패킷을 보내는 중 오류 발생

factcode 2022. 11. 5. 08:57
반응형

QUERY 패킷을 보내는 중 오류 발생

데이터베이스에 데이터를 삽입하려고 했는데 "QUERY 패킷 전송오류"라는 오류가 발생했습니다.

$insertDeta = $conPat->prepare("insert into table1(data) VALUES(:data)");
$insertDeta->bindParam(':data',$data);
$conPat->beginTransaction();    
    $insertDeta->execute();
$conPat->commit();

하지만 데이터 사이즈가 16MB가 넘는 것이 문제라고 생각합니다.
컬럼의 데이터 타입은 롱 텍스트로 설정되어 있기 때문에 4GB의 데이터를 유지할 수 있다고 생각합니다.

PDO가 쿼리를 실행하거나 16MB의 데이터를 데이터베이스로 전송하는 데 문제가 있는지 알 수 없습니다.
mysql이 데이터를 패킷으로 보낼 수 있고 패킷은 16MB의 데이터를 저장할 수 없기 때문에 추측할 수 있는 것은 이것뿐입니다.

MySQL에는 데이터 크기에 제한이 있습니다. 소규모 레코드 그룹에서 쿼리를 중단해야 합니다.또는 max_allowed_packet을 변경하여SET GLOBAL max_allowed_packet=524288000;

이 문제는, 다음의 몇개의 순서로 해결할 수 있습니다.

1) 터미널 창을 엽니다.

2) 단말기에 다음 명령어를 적어주세요.

ssh root@yourIP port

3) 루트 패스워드 입력

4) 다음 명령을 사용하여 서버의 my.cnf 파일을 편집합니다.

nano /etc/my.cnf  

명령어가 인식되지 않으면 먼저 이를 실행하거나 vi를 실행한 후 yum install nano를 반복합니다.

아니면

  vi /etc/my.cnf 

5) [MYSQLD] 섹션에 행을 추가합니다.:

max_allowed_packet=524288000 (obviously adjust size for whatever you need) 
wait_timeout = 100

6) Control + O(저장) 후 ENTER(확인) 후 Control + X(종료 파일)

7) 다음 명령어를 사용하여 mysql 서버를 재시작합니다.

/etc/init.d/mysql stop
/etc/init.d/mysql start

8) PHPMyAdmin으로 들어가거나 SQL 명령 창을 열고 다음을 실행하여 확인할 수 있습니다.

SHOW VARIABLES LIKE 'max_allowed_packet'

난 이거면 돼.당신에게 효과가 있기를 바랍니다.

이 에러는, 변수가 다음과 같은 경우에 발생할 수도 있습니다.wait_timeout너무 낮아요.

이 경우 다음과 같이 높게 설정할 수 있습니다.

SET GLOBAL wait_timeout=10;

이것은 나의 경우 같은 오류에 대한 해결책이었다.

/etc/my.cnf추가:

  max_allowed_packet=32M

그것은 나에게 효과가 있었다.PHPMyAdmin으로 이동하여 SQL 명령 창을 열고 다음을 실행하여 확인할 수 있습니다.

SHOW VARIABLES LIKE  'max_allowed_packet'

sygwin에서 희귀한 엣지 케이스가 발생했습니다.그 경우, 이 에러가 발생합니다.exec('rsync');조회 전 어딘가에서요일반적인 PHP 문제일 수도 있지만, 이것을 rsync를 사용한 sygwin에서만 재현할 수 있습니다.

$pdo = new PDO('mysql:host=127.0.0.1;dbname=mysql', 'root');
var_dump($pdo->query('SELECT * FROM db'));
exec('rsync');
var_dump($pdo->query('SELECT * FROM db'));

생산하다

object(PDOStatement)#2 (1) {
   ["queryString"]=>
   string(16) "SELECT * FROM db"
}
PHP Warning:  Error while sending QUERY packet. PID=15036 in test.php on line 5
bool(false)

https://cygwin.com/ml/cygwin/2017-05/msg00272.html에서 버그가 보고되었습니다.

당신은 가질 수 없습니다.WHERE의 조항INSERT진술.

insert into table1(data) VALUES(:data) where sno ='45830'

그래야 한다

insert into table1(data) VALUES(:data)


업데이트: 코드를 코드에서 삭제했습니다(잘못 복사한 것 같습니다).허용되는 패킷 크기를 늘리는 경우:

SET GLOBAL max_allowed_packet=32M

변경합니다.32M(32 메가바이트) 업/다운.다음은 주제에 대한 MySQL 문서 링크입니다.

' 많은 데이터가 ' 많은 데이터를 삽입할 수 없는 max_allowed_packet데이터베이스 서버의 설정에 따라 다음 경고가 발생합니다.

SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 
'max_allowed_packet' bytes

이 경고가 예외로 포착되면(설정된 오류 핸들러로 인해) 데이터베이스 연결은 손실되지만 응용 프로그램은 이를 인식하지 못합니다(삽입 실패에는 여러 가지 원인이 있을 수 있습니다).다음 조회는 다음과 같이 단순합니다.

SELECT 1 FROM DUAL

그러면 이 SO-question이 시작된 오류와 함께 실패합니다.

Error while sending QUERY packet. PID=18486

간단한 테스트 스크립트를 사용하여 설명을 재현하고 오류 핸들러를 사용하거나 사용하지 않고 테스트하여 영향의 차이를 확인합니다.

set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try
{
    // $oDb is instance of PDO
    var_dump($oDb->query('SELECT 1 FROM DUAL'));

    $oStatement = $oDb->prepare('INSERT INTO `test` (`id`, `message`) VALUES (NULL, :message);');
    $oStatement->bindParam(':message', $largetext, PDO::PARAM_STR);
    var_dump($oStatement->execute());
}
catch(Exception $e)
{
    $e->getMessage();
}
var_dump($oDb->query('SELECT 2 FROM DUAL'));

명령줄에 대해 php에서 포킹을 실행할 때 이와 같은 문제가 발생하였습니다.제 경우 php가 자 프로세스를 종료하는 경우가 종종 있었습니다.이 문제를 해결하려면 pcntl_wait($status) 명령을 사용하여 프로세스가 완료될 때까지 기다립니다.

다음은 시각적인 예시를 위한 코드입니다.

    #!/bin/php -n
    <?php
    error_reporting(E_ALL & ~E_NOTICE);
    ini_set("log_errors", 1);
    ini_set('error_log', '/media/logs/php/fork.log');
    $ski = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);
    error_log(getmypid().' '.$ski.' start my php');

    $pid = pcntl_fork();
    if($pid) {
    error_log(getmypid().' '.$ski.' start 2');
    // Wait for children to return. Otherwise they 
    // would turn into "Zombie" processes
    // !!!!!! add this !!!!!!
    pcntl_wait($status);
    // !!!!!! add this !!!!!!
    } else {
    error_log(getmypid().' '.$ski.' start 3');
    //[03-Apr-2020 12:13:47 UTC] PHP Warning:  Error while sending QUERY packet. PID=18048 in /speed/sport/fortest.php on line 22457
    mysqli_query($con,$query,MYSQLI_ASYNC);
error_log(getmypid().' '.$ski.' sleep child');
  sleep(15);
    exit;
    } 

   error_log(getmypid().' '.$ski.'end my php');
    exit(0);
    ?>

언급URL : https://stackoverflow.com/questions/30753674/error-while-sending-query-packet

반응형