2012-04-15 42 views
0

在我繼續之前,這純粹是一個直覺問題。也就是說,我沒有找到解決PHP/MySQL代碼中特定錯誤的答案。相反,我想了解在解決我的問題時需要考慮的一系列可能的問題。爲此,我不會發布代碼或附加腳本 - 我只會解釋我做了什麼以及發生了什麼。MySQL沒有插入所有成功的插入查詢...爲什麼?

我已經寫PHP腳本,

  1. 讀取的X記錄的CSV文本文件插入到一個MySQL數據庫表和/或更新重複條目適用;
  2. 插入上述記錄成什麼樣,我會要求該數據集的「根」表;
  3. 選擇特定字段的子集的記錄從「根」表,然後插入這些記錄到一個「主」表;和
  4. 創建從主表用於分配的輸出導出的文本文件。

有幾個CSV文件,我正在通過每30分鐘單獨的計劃cron任務處理。所有人都說,從各種渠道來看,估計有420,000個從文件到根表的插入事務,另外還有420,000個通過計劃任務從根表到主表的插入事務。

一個任務本身涉及的約40萬條記錄的CSV文件。處理中不包含錯誤,但這裏有個問題:MySQL指出的400,000條記錄中已經成功插入到根表中,其中只有大約92,000條記錄實際存儲在根表中 - 我正在丟失約308,000條記錄任務。

分別約爲16,000 1000交易

的其他計劃任務的過程,而這些交易完全處理。事實上,如果我將交易數量從400,000減少到10,000,那麼這些處理也很好。顯然,這不是目標。

爲了解決這個問題,我已經嘗試了幾種補救措施......

  1. 正在增加我的服務器的內存(並在php.ini文件中增加了最大限制)
  2. 獲得一個專用數據庫擴展存儲器(而不是共享的VPS數據庫)
  3. 重寫我的代碼,以基本上消除存儲陣列的是倒吸存儲器和處理fgetcsv()處理在運行
  4. 使用延遲插入的MySQL語句(相對於純的INSERT語句)

...,沒有這些補救措施的根據需要工作過。

應該在這一點上應注意什麼範圍的補救措施的,鑑於迄今所採取的行動沒有成功的?謝謝...

+0

第一步:郵編 – 2012-05-20 16:07:55

回答

0

csv中的源數據可能有重複的記錄。即使csv中有400,000條記錄,您的「插入或更新」邏輯將它們修剪爲縮減集。較少的內存可能會導致異常等,但這種數據丟失。

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; 
    } 
} 

所以,如果有任何錯誤,你可以看到它,並找到問題(什麼行有問題)。