MySQL没有插入所有成功的插入查询...为什么?

时间:2012-04-15 02:55:59

标签: php mysql insert bulkinsert fgetcsv

在我继续之前,这纯粹是一种直觉问题。也就是说,我不是在寻找答案来解决我的PHP / MySQL代码中的特定错误。相反,我想了解在解决我的问题时需要考虑的一系列可能问题。为此,我不会发布代码或附加脚本 - 我将简单地解释我做了什么以及发生了什么。

我编写了

的PHP脚本
  1. 读取要插入MySQL数据库表的X记录的CSV文本文件和/或更新适用的重复条目;
  2. 将所述记录插入到我称之为该数据集的“根”表中;
  3. 从“root”表中选择特定字段的子集记录,然后将这些记录插入“master”表中;和
  4. 从主表创建输出导出文本文件以进行分发。
  5. 我每隔30分钟通过单独的预定cron任务处理几个CSV文件。所有人都说,从各种来源,估计有420,000个从文件到根表的插入事务,以及通过计划任务从根表到主表的另外420,000个插入事务。

    其中一项任务涉及一个大约400,000条记录的CSV文件。处理中没有错误,但问题在于:MySQL指示的400,000条记录已经成功插入到根表中,这些记录中只有大约92,000条实际存储在根表中 - 我从那个计划中丢失了大约308,000条记录任务。

    其他计划任务分别处理大约16,000和1,000个事务,这些事务处理完美。事实上,如果我将交易数量从400,000减少到10,000,那么这些过程也很好。显然,这不是目标。

    为解决这个问题,我尝试了几种补救措施......

    1. 提升我服务器的内存(并增加php.ini文件中的最大限制)
    2. 获取具有扩展内存的专用数据库(而不是共享VPS数据库)
    3. 重写我的代码以基本上消除存储的数组,这些数据会在运行时吸收内存并处理fgetcsv()进程
    4. 使用INSERT DELAYED MySQL语句(与普通的INSERT语句相反)
    5. ......并且这些补救措施都没有按照预期发挥作用。

      鉴于到目前为止所采取的行动缺乏成功,此时应考虑采取哪些补救措施?感谢...

2 个答案:

答案 0 :(得分:0)

csv中的源数据可能有重复的记录。即使csv中有400,000条记录,您的“插入或更新”逻辑也会将它们修剪为简化集。较少的内存可能导致异常等,但这种数据丢失。

答案 1 :(得分:0)

我怀疑CSV文件存在问题。

我的建议:

  • 打印一些内容,以便在读取的每一行上调试信息 CSV。这将显示处理的行数。
  • 在每次插入/更新时,打印任何错误(如果有)

这是这样的:

<?php
$csv = fopen('sample.csv', 'r'); $line = 1;
while (($item = fgetcsv($csv)) !== false) {
    echo 'Line ' . $line++ . '... ';

    $sql = ''; // your SQL query
    mysql_query($sql);
    $error = mysql_error();

    if ($error == '') {
        echo 'OK' . PHP_EOL;
    } else {
        echo 'FAILED' . PHP_EOL . $error . PHP_EOL;
    }
}

因此,如果有任何错误,您可以看到它并找到问题(CSV的哪些行有问题)。