2010-01-06 67 views
8

我想插入约50000 MySQL查询在MySQL数据库, “插入”为了这个,我有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文件的先前获取行的想法。

+0

你重新启动服务,并再次尝试在改变memory_limit的 – Treby 2010-01-06 06:18:35

+0

有你“指[编者按]到文档的方法来解决这个限制“? – Boldewyn 2010-01-07 08:46:13

回答

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功能时做的,一个可能的解决方案是通过线上,线下阅读使用fopenfgets,并fclose一个combinaison - 的想法是只读你需要的东西,处理你有的行,然后才读下一个。


Additionnaly,你可能想看看这个答案:Best practice: Import mySQL file in PHP; split queries

没有公认的答案,但一些给出的答案可能已经帮你...

+0

Awww ...我正在发布那个。 :P – 2010-01-06 06:36:09

+0

@Alix:hu ^^我们的两个答案之间不到1分钟 - 你写作一个例子的时间;-) – 2010-01-06 06:37:55

0

我最近读到插入大量的查询迅速到数据库中。文章建议使用sleep()(或usleep)函数在查询之间延迟几秒钟,以免超载MySQL服务器。

1

使用命令行客户端,这是更为有效,并且应该轻松处理50K镶:

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