2010-01-06 35 views
8

Tôi muốn chèn truy vấn khoảng 50.000 mysql cho 'chèn' trong db mysql, cho điều này tôi có 2 lựa chọn,nhập tập tin lớn vào MySQL DB

1- Trực tiếp nhập khẩu (sql) file: Tiếp theo lỗi xảy ra "Bạn có thể cố gắng tải lên tệp quá lớn. Vui lòng tham khảo tài liệu về cách giải quyết giới hạn này."

2- Sử dụng mã php để chèn các truy vấn này dưới dạng các khối khác nhau từ (.sql) tập tin. đây là mã của tôi:

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

?> 

Nhưng kích thước bộ nhớ lỗi là xảy ra tuy nhiên tôi có mở rộng giới hạn bộ nhớ từ 128M đến 256M hoặc thậm chí 512M. Sau đó, tôi nghĩ rằng nếu tôi có thể tải một hàng hạn chế từ (.sql) tập tin như 1000 tại một thời điểm và thực hiện truy vấn mysql sau đó nó có thể được nhập khẩu tất cả các hồ sơ từ tập tin để db. Nhưng ở đây tôi không có bất kỳ ý tưởng nào về cách xử lý vị trí bắt đầu của tệp và cách tôi có thể cập nhật vị trí bắt đầu và kết thúc, để nó không tìm nạp các hàng đã tìm nạp trước đó từ tệp .sql.

+0

bạn đã khởi động lại dịch vụ và thử lại lần nữa khi thay đổi memory_limit – Treby

+0

Bạn đã "tham khảo [ed] để tài liệu hướng dẫn cách giải quyết giới hạn này "? – Boldewyn

Trả lời

4

Đây là mã bạn cần, hiện đã được làm sẵn! = 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'; 

?> 

Về cơ bản nó là phiên bản ít tham lam hơn, thay vì mở toàn bộ tệp trong bộ nhớ đọc và thực thi các khối nhỏ (một lớp) của câu lệnh SQL.

2

Thay vì tải toàn bộ tập tin vào bộ nhớ, đó là những gì được thực hiện khi sử dụng file chức năng, một giải pháp khả thi sẽ được đọc nó từng dòng, sử dụng một combinaison của fopen, fgets, và fclose - ý tưởng hạnh phúc để chỉ đọc những gì bạn cần, đối phó với những dòng bạn có, và chỉ sau đó, hãy đọc vài dòng tiếp theo.


Additionnaly, bạn có thể muốn xem xét câu trả lời này: Best practice: Import mySQL file in PHP; split queries

Không có câu trả lời được chấp nhận, nhưng một số các câu trả lời cho có thể đã giúp bạn ...

+0

Awww ... Tôi đã đăng chính xác điều đó. : P –

+0

@Alix: hu ^^ có ít hơn 1 phút giữa hai câu trả lời của chúng tôi - thời gian để bạn viết một ví dụ ;-) –

0

Tôi đã đọc gần đây về việc chèn nhiều truy vấn vào cơ sở dữ liệu một cách nhanh chóng. Bài viết đề xuất sử dụng chức năng sleep() (hoặc usleep) để trì hoãn vài giây giữa các truy vấn để không làm quá tải máy chủ MySQL.

1

Sử dụng client dòng lệnh, nó còn lâu mới hiệu quả hơn, và nên dễ dàng xử lý 50K chèn:

mysql -uUser -p <db_name> < dump.sql 
Các vấn đề liên quan