2010-01-06 12 views
8

chcę wstawić zapytanie o 50.000 mysql dla „wkładką” w MySQL DB, za to mam 2 opcje,importu dużych plików na MySQL DB

1- Bezpośrednio zaimportować plik (.sql): obserwuję Wystąpił błąd "Prawdopodobnie próbowałeś przesłać zbyt duży plik. Zapoznaj się z dokumentacją, aby dowiedzieć się, jak obejść ten limit."

- Użyj kodu php, aby wstawić zapytania w postaci różnych fragmentów z (.sql) plik. tutaj jest mój kod:

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

?> 

Ale Błąd rozmiaru pamięci występują jednak muszę przedłużyć limit pamięci od 128M do 256M lub nawet 512MB.

Następnie myślę, że jeśli mógłbym ładować ograniczone wiersze z pliku (.sql) jak 1000 na raz i wykonać zapytanie mysql to może to być import wszystkich rekordów z pliku do bazy danych. Ale tutaj nie mam pojęcia, jak postępować z lokalizacją startową pliku do końca i jak mogę zaktualizować lokalizację początkową i końcową, tak aby nie pobierać wcześniej pobranych wierszy z pliku .sql.

+0

pan ponownie uruchomić usługi i spróbuj go ponownie po zmianie memory_limit – Treby

+0

Czy „odnosi [ł] do dokumentacji sposobów obejścia tego ograniczenia "? – Boldewyn

Odpowiedz

4

Oto kod, którego potrzebujesz, teraz prettified! = 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'; 

?> 

Zasadniczo jest to mniej zachłanny wersja kodu, zamiast otwierać całego pliku w pamięci to odczytuje i wykonuje małe kawałki (jeden worki) z SQL.

2

Zamiast ładowania całego pliku do pamięci, która jest, co zrobić w przypadku korzystania z funkcji file, możliwym rozwiązaniem byłoby, aby ją przeczytać wiersz po wierszu, używając combinaison o fopen, fgets i fclose - istota pomysł czytać tylko to, czego potrzebujesz, radzić sobie z liniami, które masz, a dopiero potem przeczytać kilka następnych.


Additionnaly, warto przyjrzeć się tej odpowiedzi: Best practice: Import mySQL file in PHP; split queries

nie ma jeszcze zaakceptowane odpowiedź, ale niektóre z podanych odpowiedzi może już pomóc ...

+0

Awww ... Właśnie o tym pisałem. : P –

+0

@Alix: hu ^^ pomiędzy naszymi dwiema odpowiedziami jest mniej niż 1 minuta - czas na napisanie przykładu ;-) –

0

Ostatnio czytałem o tym, jak szybko wstawić wiele zapytań do bazy danych. W artykule zasugerowano użycie funkcji sleep() (lub usleep) w celu opóźnienia kilku sekund między zapytaniami, aby nie przeciążać serwera MySQL.

1

Użyj klienta wiersza poleceń, to jest o wiele bardziej efektywne, i powinien łatwo obsługiwać 50K wkładki:

mysql -uUser -p <db_name> < dump.sql 
Powiązane problemy