Saya memiliki kode berikut (kurang lebih) untuk mengimpor 500.000 hingga 4.000.000 baris:
$sSql = "Insert into table (a,b,c) VALUES(?,?,?)"
$oSQLStmnt = $pdo->prepare($sSql);
$oSQLStmnt->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
if (!$oSQLStmnt) {
echo $pdo->errorInfo(); // Handle errors
}
$pdo->beginTransaction();
$iLineCounter = 1;
while (($sLine = fgets ($oCSV, 8000)) !== FALSE) {
$aLine = explode('|', $sLine); //Fgetscsv did not work properly
if ($iLineCounter % 100 == 0) {
lo("Inserting row " . $iLineCounter);
$pdo->commit();
sleep(0.15);
$pdo->beginTransaction();
}
try {
$oSQLStmnt->execute($aLine);
$iSuccesulInserts++;
}
catch (exception $e) {
print_r($e);
$iFailedInserts++;
}
$iLineCounter++;
}
$pdo->commit();
Seperti yang Anda lihat, saya melakukan komit setiap 100 baris, dan saya bahkan menambahkan beberapa sleep. Saya biasa menjalankan komit hanya sekali setiap 25.000 baris, dan saya tidak menggunakan mode tidur apa pun. Namun, pada satu titik, saya menemukan bahwa saya kehilangan catatan. Saya mulai bermain-main dengan pengaturan ini (tidur dan jumlah baris). Dengan cara ini saya mengurangi jumlah catatan yang hilang dari 50.000 menjadi sekitar 100. Namun saya masih kehilangan catatan! Kemana mereka pergi? Saya tahu SQL-nya baik-baik saja, karena saya langsung menerima kesalahan ketika ada yang salah di sana.
Saya pikir saya bisa menumpuk banyak sisipan selama transaksi? Mungkinkah menelepon BeginTransaction menjadi masalah?
PEMBARUAN:
Hadiahnya berakhir dan saya harus menghadiahkannya. Terima kasih atas jawaban Anda. Atau sebenarnya tip, karena tidak ada di antara Anda yang menjawab pertanyaan saya. Saya tidak meminta solusi, meskipun saran Anda sangat kami hargai. Jawaban yang diberikan bounty untuk menerimanya karena paling mendekati jawaban pertanyaan saya. Sayangnya itu tidak berhasil.
Untuk saat ini saya menggunakan impor massal CSV, itu berfungsi dengan baik, tetapi jika ada yang punya tips lain untuk memperbaiki masalah ini, beri tahu saya. Karena saya lebih suka menggunakan metode asli saya.
range(0, 50000)
dan menghapus semua kode yang bermasalah (sleeps,try .. catch
, dan komitmen menengah), apakah Anda masih dapat mereproduksi masalah tersebut ? Jika ya, bisakah Anda menautkan ke lengkap contoh skrip? - person phihag   schedule 04.07.2012$pdo->commit();
dan$pdo->beginTransaction();
tidak tertangkap dengan kode tersebut, jika saya membacanya dengan benar. - person vyegorov   schedule 04.07.2012$sSql
tidak memiliki kata kunciVALUES
. Apakah kata itu juga hilang dari skrip di kode kerja Anda? - person Andriy M   schedule 05.07.2012