Come ripristinare una singola tabella da un dump di MySQL/MariaDB
Normalmente i backup dei database MySQL/MariaDB vengono fatti sottoforma di dump SQL, un unico file che contiene tutto il contenuto del database. Si tratta di un formato molto comodo perché è facilmente trasportabile e si può ripristinare con estrema facilità.
Ma come fare per recuperare i dati di una sola tabella da un backup completo?
Una soluzione può essere quella di ripristinare il backup in un database separato e poi trasferire solamente la tabella in questione. È un metodo che funziona ma richiede un po’ di tempo.
Una soluzione alternativa, e molto più rapida, per ripristinare solo una tabella a partire dal dump di un database MySQL o MariaDB e sfruttando il comando sed
ed una espressione regolare ad hoc:
sed -n -e '/DROP TABLE.*`nome_della_tabella`/,/UNLOCK TABLES/p' nome_dump.sql > nome_dump_parziale.sql
Dove nome_della_tabella
è appunto il nome della tabella da estrarre, nome_dump.sql
è il nome del file di dump del database completo, ed infine nome_dump_parziale.sql
è il nome del nuovo file che conterrà il dump della singola tabella.
Una volta eseguito il comando basterà eseguire da un qualunque client SQL lo script nome_dump_parziale.sql
per ripristinare soltanto la tabella in esame.
A puro titolo informativo ecco più in dettaglio come funziona il comando.
Per prima cosa si utilizza una espressione regolare (regex) tramite il comando sed
che estrapola la sottostringa del dump contenente la porzione relativa alla tabella che si desidera recuperare. Il comando cerca la stringa che comincia con DROP TABLE.*`nome_della_tabella`
e finisce alla prima occorrenza della stinga UNLOCK TABLES
.
Normalmente l’output di sed è a video, quindi come si fa sempre in questi casi, su usa il simboli di maggiore >
che reindirizza l’output di un comando in un file specifico.
Se avessimo più tabelle da estrarre ci basta ripetere il comando cambiando il nome del file di destinazione, oppure unendo il tutto usando due volte il simbolo di maggiore >>
che concatena l’output alla fine del file (mentre nel caso precedente il file viene completamente sovrascritto).