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
'source' 카테고리의 다른 글
Mockito는 여러 번 호출된 메서드의 인수를 캡처할 수 있습니까? (0) | 2022.11.05 |
---|---|
예외를 발생시킨 예외 설명 및 스택 추적을 모두 문자열로 가져옵니다. (0) | 2022.11.05 |
레지스트리 키 '...'의 값은 '1.7'이지만 '1.6'은 필수입니다.Java 1.7이 설치되어 레지스트리가 이를 가리키고 있다. (0) | 2022.11.05 |
일주일보다 새로운 행을 선택하려면 어떻게 해야 합니까? (0) | 2022.11.05 |
Linux와 Windows 모두에서 Python에서 "/"(디렉토리 구분자)를 사용하는 방법은 무엇입니까? (0) | 2022.11.05 |