2009-03-25 14 views
13

Importo un database MySQL da 400 MB (non compresso). Sto utilizzando BIGDUMP, e sto ottenendo questo errore:Errore di importazione database MySQL a causa di inserimenti estesi

Stopped at the line 387. 

At this place the current query includes more than 300 dump lines. That can happen if your dump file was created by some tool which doesn't place a semicolon followed by a linebreak at the end of each query, or if your dump contains extended inserts. Please read the BigDump FAQs for more infos. 

Credo che il file contiene estesa Inserti, però non ho modo di rigenerare il database come è stato eliminato dal vecchio server. Come posso importare questo database o convertirlo per essere importato?

Grazie per qualsiasi aiuto.

Miglior Nick

EDIT: Sembra l'unica risposta praticabile è quello di separare gli inserti estesi, ma ho ancora bisogno di aiuto per capire come dividere il file come la risposta qui sotto suggerisce. Per favore aiuto. Grazie.

risposta

4

Sono riuscito a importare il database con successo dopo aver aumentato il buffer di memoria e effettuato un'importazione mysql ordinaria tramite SSH.

ho usato il seguente comando con il percorso assoluto:

mysql -u <username> -p < /home/dir/dumpfile.sql 

Miglior Nick

+0

Come è stato aumentato il buffer di memoria? Mi rendo conto che è una domanda vecchia, ma sto riscontrando un problema simile. – chmac

+1

@chmac Era molto tempo fa ma credo che l'impostazione fosse innodb_buffer_pool_size in my.cnf o my.ini. –

8

basta modificare il file di dettagli in modo che dopo 300 inserti di iniziare una nuova dichiarazione:

INSERT INTO `myTable` (`id`, `field1`, `field2`) VALUES 
    (1, 'a', 'b'), 
    (2, 'c', 'd'), 
    (3, 'e', 'f'), 
    -- snip -- 
    (300, 'w', 'x'); 
INSERT INTO `myTable` (`id`, `field1`, `field2`) VALUES 
    (301, 'y', 'z'), 
    (302, ... etc 

Si può fare questo semplicemente aprendo il file <backup>.sql in qualsiasi editor di testo, è solo testo. A volte un backup può essere un file .gz o .bz, ma sono solo zip: se si decomprimono questi file compressi con gzip o bzippati, si finisce con un singolo file .sql che è possibile modificare facilmente.

Probabilmente non sarebbe troppo difficile scrivere uno script per dividere ogni istruzione dopo un numero arbitrario di righe. La logica di programma di base sarebbe simile a questa, forse:

  1. trovare una riga che inizia con "INSERT".
  2. copia la riga fino alla fine della parola "VALUES"
  3. attraversa tutte le righe seguenti, contando mentre procedi.
  4. se il contatore raggiunge 300, quindi aggiungi un punto e virgola alla fine dell'ultima riga e incolla l'istruzione "INSERT ... VALUES" di prima. Cambia la tua contatore a 1 e andare al punto 3.
  5. se si raggiunge una linea che inizia con "Inserisci", azzerare il contatore a 1 e andare al punto 2.

Anche se, si può solo fare questo uno manualmente e quindi assicurarsi che tutti i backup futuri non utilizzino gli inserti estesi. Inoltre, phpMyAdmin ti consente di impostare una dimensione massima dell'istruzione quando si crea un'esportazione, quindi in pratica lo farà per te.

Tuttavia, quello che hai fatto con il limite di memoria è probabilmente una soluzione molto più semplice. Per chiunque altro in una situazione simile che non può modificare tali limiti, provare quanto sopra.

+0

Come posso modificare il file? Non ho idea di come automatizzare questo processo. –

+0

Ho modificato ora per rispondere. – nickf

29

Non è necessario apportare modifiche al file di sql: basta aprire bigdump.php in qualsiasi editor di testo, trovare la linea

define ('MAX_QUERY_LINES',300); 

e sostituire 300 con tutto quello che vuoi.

+4

Questo ha fatto per me, grazie. Ad eccezione della versione 0.35b di bigdump.php, la riga è: $ max_query_lines = 300; – nwilson5

3

Per me ha funzionato come segue:

Cerca

$max_query_lines = 300; 

poi semplicemente sostituito al

$max_query_lines = 3000; 
0

vecchia questione, ma ho trovato via ricerca su Internet, e non ha ancora la risposta che stavo cercando, come sembra che phpMyAdmin abbia cambiato il nome dell'impostazione.

Per disabilitare 'inserti' estese in un'esportazione phpMyAdmin, è necessario impostare la 'sintassi da utilizzare durante l'inserimento dei dati' impostazione per la prima opzione:

include column names in every INSERT statement 
Example: INSERT INTO tbl_name (col_A,col_B,col_C) VALUES (1,2,3) 
Problemi correlati