2010-01-06 19 views
8

quiero insertar consulta sobre 50.000 MySQL para 'insertar' en la base de datos mysql, para este tengo 2 opciones,importación de base de datos MySQL

1- importar directamente el archivo (.sql): Siguiendo se produce un error "Probablemente haya intentado cargar un archivo demasiado grande. Consulte la documentación para encontrar formas de solucionar este límite."

2- Utilice el código php para insertar estas consultas en forma de diferentes fragmentos del (.sql) archivo. aquí es mi código:

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

?> 

Pero el error tamaño de la memoria es producir sin embargo he extender límite de memoria de 128M a 256M o incluso 512M.

entonces creo que si pudiera ser capaz de cargar un filas limitados de (.sql) presentar como 1.000 a la vez y ejecutar la consulta mysql, entonces puede ser la importación todos los registros de archivo de base de datos. Pero aquí no tengo idea de cómo manejar la ubicación de inicio del archivo para finalizar y cómo puedo actualizar la ubicación de inicio y finalización, de modo que no recupere las filas obtenidas previamente del archivo .sql.

+0

¿Ha reiniciado los servicios e intentarlo de nuevo al cambiar el memory_limit – Treby

+0

¿Ha "se refieren [ó] a la documentación para formas de solución este límite "? – Boldewyn

Respuesta

4

Aquí es el código que necesita, ahora embellecido! = 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'; 

?> 

Básicamente se trata de una versión menos codiciosos de su código, en lugar de abrir el archivo completo en la memoria lee y ejecuta trozos pequeños (uno liners) de las sentencias SQL.

2

En lugar de cargar todo el archivo en la memoria, que es lo que se hace cuando se utiliza la función file, una posible solución sería leer línea por línea, utilizando una Combinación de fopen, fgets y fclose - la idea de bienestar para leer solo lo que necesita, trate las líneas que tiene, y solo entonces, lea las siguientes.


Additionnaly, es posible que desee echar un vistazo a esta respuesta: Best practice: Import mySQL file in PHP; split queries

No hay una respuesta aceptado todavía, pero algunas de las respuestas dadas ya que puede ayudar a ...

+0

Awww ... Publicaba exactamente eso. : P –

+0

@Alix: hu ^^ hay menos de 1 minuto entre nuestras dos respuestas: el momento para que usted escriba un ejemplo ;-) –

0

He leído recientemente acerca de cómo insertar muchas consultas en una base de datos de forma rápida. El artículo sugería usar la función sleep() (o usleep) para retrasar unos segundos entre consultas para no sobrecargar el servidor MySQL.

1

utilizar el cliente de línea de comandos, es mucho más eficiente, y se debe manejar con facilidad 50K inserciones:

mysql -uUser -p <db_name> < dump.sql 
Cuestiones relacionadas