Ответ 1
Другая возможность - записать данные в CSV файл и использовать MySQL LOAD DATA INFILE
для загрузки его в вашу базу данных (здесь ссылка на MySQL документы).
Я пробовал это с CSV файлами размером до 250 МБ, и он работал очень хорошо.
Я получаю следующую ошибку в php error_log
PHP Предупреждение: ошибка при отправке пакета QUERY. PID = 29770 в /home/test/test.php в строке 87
И на линии 87 в моем php script код id
$DBH->beginTransaction();
И после этого, когда я совершаю, я получаю следующую ошибку
exception "PDOException" с сообщением "Нет активной транзакции" в /home/test/test.php:98
Я уже установил max_allowed_packet=512M
, а моя таблица InnoDB
Что здесь не так?
РЕДАКТИРОВАТЬ: Мой код работает в цикле, чтобы вставить всего 100 000 + записей в таблицу. Я делаю 5000 множественных вставок в каждой транзакции. Это моя структура кода
beginTransaction
Multiple insert query for 5000 records
commit
Запуск в цикле для вставки 100 000 + записей. Иногда script выполняется успешно, иногда он терпит неудачу.
Я получаю эту ошибку в середине 6-7 циклов (после вставки записей 30k в 40k)
Другая возможность - записать данные в CSV файл и использовать MySQL LOAD DATA INFILE
для загрузки его в вашу базу данных (здесь ссылка на MySQL документы).
Я пробовал это с CSV файлами размером до 250 МБ, и он работал очень хорошо.
Существует вероятность того, что соединение с базой данных не является постоянным. Это может привести к тому, что транзакции будут уничтожены до совершения и, следовательно, ошибки.
Я бы скорее прокомментировал, поскольку это не "ответ" как таковой, но, к сожалению, у меня нет необходимой репутации.
Я сделал несколько поисков в Интернете для фразы "Ошибка при отправке пакета QUERY". Он смог включить эту ссылку: http://www.willhallonline.co.uk/blog/max-packet-size-php-error
У автора этой публикации была аналогичная проблема, а также попытался увеличить размер max_allowed_packet
и увеличить время ожидания, но это не сработало. Но то, что, похоже, сработало, разбило работу на более мелкие куски.
Наши новые файлы csv меньшего размера, успешно обновленные в MySQL, хотя мы по-прежнему не знаем, что из-за исходной ошибки.
Мне непонятно, обрабатывали ли они много кусков в течение всего одного процесса PHP или если они запускали код несколько раз, но идея кажется звуковой; возможно, вы можете попробовать.