Intereting Posts
Проблема маршрутизации, вызывающая ошибку Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException Использование php для создания кнопки, вызывающей функцию php PHP Реальный путь всегда возвращает false ReferenceError: функция ajax не определена Как определить сервер Mobile Safari с помощью PHP? Странное поведение PHP time math: Почему strtotime () возвращает отрицательные числа? Как обнаружить диагональную победу в игре «5 в ряд» (PHP) Magento: отображать продукты из дочерних категорий, если родительская категория пуста Защита форм регистрации и комментариев от CSRF WordPress wp-load.php Не удается заставить Curl MailChimp API работать Клиент в DART-сообществе с сервером на PHP: управление доступом позволяет пропустить заголовки источника Почему PHP не разрешает частные константы? лучший подход, чем сохранение пароля mysql в текстовом виде в файле конфигурации? Как отключить кнопку заднего браузера после того, как пользователь выйдет из системы и уничтожит сеанс?

Импорт большого файла в базу данных MySQL

Я хочу вставить около 50 000 запросов mysql для 'insert' в mysql db, для этого у меня есть 2 варианта,

1- Непосредственно импортируйте файл (.sql). Произошла ошибка: «Вероятно, вы пытались загрузить слишком большой файл. Пожалуйста, обратитесь к документации о способах устранения этого ограничения».

2- Используйте PHP-код для вставки этих запросов в виде разных фрагментов из файла (.sql). вот мой код:

<?php // Configure DB include "config.php"; // Get file data $file = file('country.txt'); // Set pointers & position variables $position = 0; $eof = 0; while ($eof < sizeof($file)) { for ($i = $position; $i < ($position + 2); $i++) { if ($i < sizeof($file)) { $flag = mysql_query($file[$i]); if (isset($flag)) { echo "Insert Successfully<br />"; $position++; } else { echo mysql_error() . "<br>\n"; } } else { echo "<br />End of File"; break; } } $eof++; } ?> 

Но ошибка размера памяти возникает, однако у меня есть ограничение на максимальную память от 128M до 256M или даже 512M.

Тогда я думаю, что если я смогу загрузить ограниченные строки из (.sql) файлов, например 1000, и выполнить запрос mysql, тогда он может импортировать все записи из файла в db. Но здесь я понятия не имею, как обрабатывать местоположение начала файла до конца и как я могу обновить начальное и конечное местоположение, чтобы он не извлекал ранее извлеченные строки из файла .sql.

Вот код, который вам нужен, теперь приглушен ! = D

 <?php include('config.php'); $file = @fopen('country.txt', 'r'); if ($file) { while (!feof($file)) { $line = trim(fgets($file)); $flag = mysql_query($line); if (isset($flag)) { echo 'Insert Successfully<br />'; } else { echo mysql_error() . '<br/>'; } flush(); } fclose($file); } echo '<br />End of File'; ?> в <?php include('config.php'); $file = @fopen('country.txt', 'r'); if ($file) { while (!feof($file)) { $line = trim(fgets($file)); $flag = mysql_query($line); if (isset($flag)) { echo 'Insert Successfully<br />'; } else { echo mysql_error() . '<br/>'; } flush(); } fclose($file); } echo '<br />End of File'; ?> 

В основном это менее жадная версия вашего кода, вместо того, чтобы вскрыть весь файл в памяти, он читает и выполняет небольшие куски (один лайнер) операторов SQL.

Вместо того, чтобы загружать весь файл в память, что и было сделано при использовании файловой функции, возможным решением было бы прочитать его по очереди, используя комбинацию fopen , fgets и fclose – идея состоит в том, чтобы читать только то, что вам нужно иметь дело с линиями, которые у вас есть, и только после этого прочитайте следующую пару.

В дополнение, вы можете взглянуть на этот ответ: Лучшая практика: Импортировать файл mySQL в PHP; разделенные запросы

Пока нет ответа, но некоторые из этих ответов уже могут помочь вам …

Используйте клиент командной строки, он намного эффективнее и должен легко обрабатывать вставки 50K:

  mysql -uUser -p <db_name> < dump.sql 

Недавно я прочитал о том, как быстро вставлять много запросов в базу данных. В статье предлагается использовать функцию sleep () (или usleep ) для задержки нескольких секунд между запросами, чтобы не перегружать сервер MySQL.