Un'importazione grande fatta da un'interfaccia web fallisce quasi sempre: il limite di caricamento, il tempo di esecuzione o il timeout della richiesta la fermano a metà strada. Importa da riga di comando e nessuno di quei limiti conta più.

mysql -u user -p dbname < dump.sql
# or, compressed
zcat dump.sql.gz | mysql -u user -p dbname

Rendila veloce

# at the top of the session
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
-- import --
SET foreign_key_checks=1;
SET unique_checks=1;
COMMIT;

Gran parte del tempo di un'importazione grande se ne va nel verificare i vincoli e nello scrivere su disco dopo ogni riga. Disattivarlo per un dump di cui ti fidi e riattivarlo dopo trasforma abitualmente le ore in minuti.

Solo su un dump di cui ti fidi e su un database in cui non stia scrivendo nient'altro. Con i controlli delle chiavi esterne disattivati, un dump rovinato importa dati rovinati in silenzio.

Guardala mentre procede

pv dump.sql | mysql -u user -p dbname

pv mostra una barra di avanzamento e una stima. Senza, un'importazione lunga è indistinguibile da una bloccata, e la si uccide a metà — cosa peggiore che aspettare.

Se fallisce a metà strada

  • Disco esaurito — il database ha bisogno di spazio per i dati E per i file temporanei. Controlla df -h prima di cominciare.
  • MySQL server has gone away — una singola riga più grande di max_allowed_packet. Alzalo: max_allowed_packet = 256M.
  • Unknown collation — il dump viene da un MySQL più recente. O aggiorni la versione, o riscrivi la collazione dentro il file.
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' dump.sql
Importa dentro un database vuoto, non sopra uno in produzione. Se fallisce a metà, ti resta una copia importata a metà da buttare, non un sito distrutto a metà.