0

Ошибка при отправке пакета QUERY

10

Ошибка при вставке данных в базу данных: "Error while sending QUERY packet"

Я пытаюсь вставить данные в базу данных, но получаю ошибку: "Error while sending QUERY packet".

Вот код, который я использую для вставки:

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

Я предполагаю, что проблема заключается в том, что размер переменной $data превышает 16 МБ. Строка в базе данных имеет тип longtext, который, как я полагаю, может хранить данные объемом до 4 ГБ.

Не могу понять, связано ли это с тем, что PDO имеет проблемы при выполнении запроса или при передаче 16 МБ данных в базу данных. Мое единственное предположение заключается в том, что MySQL может отправлять данные в пакетах, и этот пакет не может содержать данные размером более 16 МБ.

Кто-то сталкивался с такой проблемой? Как можно её решить?

5 ответ(ов)

0

Вы правильно угадали, у MySQL действительно есть ограничения на размер данных. Вам нужно разбить ваш запрос на более мелкие группы записей. Также вы можете изменить параметр max_allowed_packet, используя команду:

SET GLOBAL max_allowed_packet=524288000;

Таким образом, вы увеличите максимальный размер пакета, который может обрабатываться сервером. Не забудьте, что для изменения глобальных настроек могут потребоваться права администратора.

0

Вы можете решить эту проблему, выполнив несколько шагов:

  1. Откройте окно терминала.

  2. Введите следующую команду в терминале:

ssh root@вашIP порт
  1. Введите пароль root.

  2. Теперь отредактируйте файл конфигурации сервера my.cnf, используя следующую команду:

nano /etc/my.cnf  

Если команда не распознана, выполните сначала следующую команду или попробуйте vi, затем повторите:

yum install nano

ИЛИ

vi /etc/my.cnf 
  1. Добавьте строку в секцию [MYSQLD]:
max_allowed_packet=524288000 (естественно, подкорректируйте размер в зависимости от ваших нужд)
wait_timeout = 100
  1. Нажмите Control + O (сохранить), затем ENTER (подтвердить), затем Control + X (выйти из файла).

  2. Затем перезапустите сервер MySQL следующими командами:

/etc/init.d/mysql stop
/etc/init.d/mysql start
  1. Вы можете проверить это, зайдя в PHPMyAdmin или открыв окно команд SQL и выполнив команду:
SHOW VARIABLES LIKE 'max_allowed_packet'

Это сработало для меня. Надеюсь, это поможет и вам.

0

Вы также можете столкнуться с этой ошибкой, если переменная wait_timeout установлена слишком низко.

В таком случае вы можете установить её на более высокий уровень с помощью следующей команды:

SET GLOBAL wait_timeout=10;

Это решение помогло устранить аналогичную ошибку в моем случае.

0

Вы можете добавить следующую строку в файл /etc/my.cnf:

max_allowed_packet=32M

Это помогло мне. Вы можете проверить, изменилось ли значение, зайдя в PHPMyAdmin, открыв окно SQL-команд и выполнив:

SHOW VARIABLES LIKE 'max_allowed_packet'
0

Это довольно редкая ситуация, с которой, похоже, сталкиваются пользователи Cygwin при использовании PHP. Проблема возникает из-за того, что вызов exec('rsync'); нарушает соединение с базой данных после первой выполненной выборки. Вы получаете предупреждение о том, что произошла ошибка при отправке запроса, и второй вызов query() возвращает bool(false).

Судя по всему, это связано с тем, как Cygwin обрабатывает процессы и взаимодействие с системными ресурсами. В результате exec('rsync'); может неожиданно завершить или прервать соединение с MySQL, что вызывает подобные ошибки.

Ниже приведен пример кода:

$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)

Несмотря на то, что это может выглядеть как проблема PHP в общем, она воспроизводится только в Cygwin с rsync, что указывает на специфичную особенность окружения. Рекомендуется избегать вызовов exec или аналогичных функций после выполнения запросов к базе данных. В качестве обходного пути вы можете попробовать вызвать exec до выполнения любых запросов к базе данных, чтобы избежать возникновения этой ошибки.

Согласно отчету об ошибке, который упоминается в ссылке на Cygwin, это поведение может быть связано с внутренними механизмами Cygwin. Если вам необходимо использовать rsync, попробуйте рассмотреть альтернативные способы выполнения этой команды, которые не прерывали бы соединение с MySQL.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь