Mysql e comandi bash – come dividere un file sql per permettere un import del data base
Spezzettare un file .sql enorme in più parti può essere una manna dal cielo per la gestione e l’importazione.
Soprattutto se il problema è il file dump mysql enorme che non è possibile importare tramite interfaccia grafica del DBMS phpmyadmin.
Ti propongo un comando bash piuttosto semplice (e flessibile) che divide il file in N parti di dimensione simile:
Tabella dei contenuti
🧩 Opzione 1: Split in N parti (es. 10 o 20)
bash
split -n l/10 -d --additional-suffix=.sql file_origine.sql parte_
Spiegazione:
- -n l/10 → divide il file in 10 parti uguali per numero di righe.
- -d → aggiunge i numeri (00, 01, 02…) invece di lettere (aa, ab, ac…).
- –additional-suffix=.sql → aggiunge .sql ai file risultanti.
- parte_ → prefisso dei file di output (parte_00.sql, parte_01.sql, ecc).
📌 Cambia 10 con 20 o quello che preferisci.
🛠️ Opzione 2: Split per numero di righe (es. ogni 1000 righe)
Se preferisci tagliarlo in base a un numero fisso di righe:
bash
split -l 1000 -d --additional-suffix=.sql file_origine.sql parte_
⚠️ Attenzione se il file SQL ha transazioni o comandi multilinea
Il metodo sopra è “cieco”: taglia a prescindere da contenuto o sintassi. Se i tuoi file SQL hanno transazioni (BEGIN…COMMIT) o query multi-riga, potresti rischiare di troncare comandi a metà.
🧩 Opzione 3: Script in Bash con una divisione più intelligente delle query
Qui di seguito propongo anche la versione “intelligente” in Bash, che taglia il file SQL in blocchi completi, cercando di non spaccare a metà i comandi tipo INSERT, CREATE, ALTER, DROP, ecc.
L’idea è: leggiamo riga per riga e scriviamo su un file finché raggiungiamo un certo numero di istruzioni SQL complete, mantenendo la coerenza sintattica.
Ecco uno script Bash che lo fa:
🧠 Script Bash “smart splitter” per file SQL
bash
#!/bin/bash input_file="file_origine.sql" output_prefix="parte_" max_statements_per_file=100 # puoi cambiarlo come vuoi statement_count=0 file_index=0 output_file="${output_prefix}$(printf "%02d" $file_index).sql" buffer="" mkdir -p sql_parts # salva tutto in una cartella dedicata while IFS= read -r line || [[ -n "$line" ]]; do buffer+="$line"$'\n' # Se troviamo un punto e virgola a fine riga, consideriamo la statement "completa" if [[ "$line" =~ ;[[:space:]]*$ ]]; then ((statement_count++)) fi # Quando raggiungiamo il massimo, scriviamo su file if (( statement_count >= max_statements_per_file )); then echo -n "$buffer" > "sql_parts/${output_file}" ((file_index++)) output_file="${output_prefix}$(printf "%02d" $file_index).sql" buffer="" statement_count=0 fi done < "$input_file" # Scriviamo l’eventuale contenuto rimanente if [[ -n "$buffer" ]]; then echo -n "$buffer" > "sql_parts/${output_file}" fi echo "✅ Fatto! File spezzettati nella cartella 'sql_parts/'"
✅ Vantaggi: Non tronca comandi a metà.
Facile da configurare: puoi cambiare max_statements_per_file per spezzarlo in più o meno parti.
Pulito: ti crea una cartella sql_parts/ con i file parte_00.sql, parte_01.sql, ecc.
🧪 Per eseguirlo:
Salvalo come split_sql.sh, rendilo eseguibile e lancialo:
bash
chmod +x split_sql.sh ./split_sql.sh
Buon divertimento con questo nuovo suggerimento settimanale.
Lascia un Commento
Vuoi partecipare alla discussione?Sentitevi liberi di contribuire!