2011-09-15 14 views
6
function cpanel_populate_database($dbname) 
{ 
    // populate database 
    $sql = file_get_contents(dirname(__FILE__) . '/PHP-Point-Of-Sale/database/database.sql'); 
    $mysqli->multi_query($sql); 

    $mysqli->close(); 
} 

El archivo SQL es una exportación directa de phpMyAdmin y alrededor del 95% de las veces se ejecuta sin problemas y todas las tablas se crean y se insertan datos. (Estoy creando una base de datos desde cero)mysql consulta múltiple intermitente falla

Se crea el otro 5% solo la primera tabla o, a veces las primeras 4 tablas, pero ninguna de las otras tablas se crean (hay 30 tablas).

He decidido NO usar multi_query porque parece tener errores y ver si el error se produce al usar simplemente mysql_query en cada línea después de punto y coma. ¿Alguien ha encontrado un problema así?

Respuesta

2

que he visto problemas similares cuando se utiliza multi_query con las consultas que pueden crear o modificar tablas. En particular, tiendo a obtener errores InnoDB 1005 que parecen estar relacionados con claves externas; es como si MySQL no completara completamente una declaración antes de pasar a la siguiente, por lo que las claves externas carecen de un referente adecuado.

En un sistema, dividí las declaraciones problemáticas en sus propios archivos. En otro, de hecho, he ejecutado cada comando por separado, dividiendo en punto y coma:

function load_sql_file($basename, $db) { 
    // Todo: Trim comments from the end of a line 
    log_upgrade("Attempting to run the `$basename` upgrade."); 

    $filename = dirname(__FILE__)."/sql/$basename.sql"; 
    if (!file_exists($filename)) { 
     log_upgrade("Upgrade file `$filename` does not exist."); 
     return false; 
    } 

    $file_content = file($filename); 
    $query = ''; 
    foreach ($file_content as $sql_line) { 
     $tsl = trim($sql_line); 
     if ($sql_line and (substr($tsl, 0, 2) != '--') and (substr($tsl, 0, 1) != '#')) { 
      $query .= $sql_line; 
      if (substr($tsl, -1) == ';') { 
       set_time_limit(300); 
       $sql = trim($query, "\0.. ;"); 
       $result = $db->execute($sql); 
       if (!$result) { 
        log_upgrade("Failure in `$basename` upgrade:\n$sql"); 
        if ($error = $db->lastError()) { 
         log_upgrade("$error"); 
        } 

        return false; 
       } 

       $query = ''; 
      } 
     } 
    } 

    $remainder = trim($query); 
    if ($remainder) { 
     log_upgrade("Trailing text in `$basename` upgrade:\n$remainder"); 
     if (DEBUG) trigger_error('Trailing text in upgrade script: '.$remainder, E_USER_WARNING); 
     return false; 
    } 

    log_upgrade("`$basename` upgrade successful."); 
    return true; 
} 
0

Nunca he recurrido a la consulta múltiple. Cuando necesitaba algo así, me mudé a mysqli. Además, si no necesita ningún resultado de la consulta, pasar el script a mysql_query también funcionará. También obtendrá esos errores si hay exportaciones en un orden incorrecto que chocan con las tablas obligatorias para claves foráneas y otras.

0

Creo que el enfoque de dividir el archivo SQL en consultas únicas sería una buena idea. Incluso si es solo para fines de comparación (para ver si resuelve el problema).

Además, no estoy seguro de qué tan grande es su archivo, pero he tenido un par de casos donde el archivo era increíblemente grande y dividirlo en lotes hizo el trabajo.

12

rápida y efectiva

system('mysql -h #username# -u #username# -p #database# < #dump_file#');