Импорт большого файла в БД MySQL - PullRequest
8 голосов
/ 06 января 2010

Я хочу вставить около 50 000 запросов MySQL для «вставки» в 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, то он может импортировать все записи из файла в дб. Но здесь я не имею ни малейшего представления о том, как обрабатывать начальное и конечное расположение файла и как я могу обновить начальное и конечное расположение, чтобы оно не получало ранее извлеченные строки из файла .sql.

Ответы [ 4 ]

4 голосов
/ 06 января 2010

Вот код, который вам нужен, теперь с предварительным подтверждением ! = 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';

?>

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

2 голосов
/ 06 января 2010

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


Кроме того, вы можете взглянуть на этот ответ: Рекомендация: импорт файла MySQL в PHP; разделенные запросы

Ответа пока нет, но некоторые из приведенных ответов уже могут вам помочь ...

1 голос
/ 06 января 2010

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

 mysql -uUser -p <db_name> < dump.sql
0 голосов
/ 06 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...