在MySQL数据库中导入大文件

8

我希望在MySQL数据库中插入大约50,000个“insert”查询,有两种选择:

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,但仍出现了内存大小错误。

那么我想,如果我能够每次加载有限的行数(如1000行)并执行mysql查询,那么它可能会将所有记录从文件导入数据库。但是在这里,我不知道如何处理文件的起始位置和结束位置,以及如何更新起始和结束位置,以便它不会从.sql文件中获取先前获取的行。


你是否在更改 memory_limit 后重启了服务并再次尝试? - Treby
你是否“参考文档以解决此限制问题”? - Boldewyn
4个回答

4

这里是你需要的代码,现在已经美化! =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

与使用 file 函数加载整个文件到内存中不同,一种可能的解决方案是逐行读取文件,使用 fopenfgetsfclose 的组合——即只读取需要的内容,处理已有的行,然后再读取下一对。


此外,您可能还想查看这个答案:Best practice: Import mySQL file in PHP; split queries

尚未有被接受的答案,但给出的一些答案可能已经对您有所帮助...


啊哇...我刚想发布那个。 :P - Alix Axel
@Alix:嗨,^^我们两个回答之间不到1分钟的时间--这是你写一个例子的时间;-) - Pascal MARTIN

1
使用命令行客户端,它更加高效,并且可以轻松处理5万个插入操作:
 mysql -uUser -p <db_name> < dump.sql

0
最近我读到一篇关于如何快速向数据库插入大量查询的文章。该文章建议使用 sleep() 函数(或 usleep 函数)在查询之间延迟几秒钟,以避免过度加载 MySQL 服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接