Datenbank aus Gesamt-Dump extrahieren

Auf manchen meiner Maschinen erstelle ich Datenbank-Sicherungen gerne zum Beispiel mit einem

mysqldump --all-databases > all.sql

Das hat den Vorteil, dass auch später angelegte Datenbanken automatisch gesichert werden und keine Anpassung von Skripten notwendig ist. Natürlich ist das nur für kleinere Datenbanken gangbar und hat den Nachteil, dass man beim Restore entweder den kompletten Datenbank-Server (also alle Datenbanken) einspielen muss oder aber per Hand (oder sed, awk, …) eine Datenbank oder Tabelle aus dem Gesamt-Dump rausfummeln muss.

Einfacher geht es mit dem, mir gerade vor der Füße gefallenen, mysqldumpsplitter.

MySQL Dump splitter to split / extract databases, tables, list from mysqldump with plenty of more funtionality.

mysqldumpsplitter-Repository

Mehr macht das Skript wirklich nicht: es extrahiert einzelne Datenbanken oder Tabellen aus einer Gesamtsicherung und speichert die am gewünschten Ort. mysqldumpsplitter kann auch mit gepackten Dumps umgehen und extrahierte Daten auch direkt wieder packen. Ein Beispielaufruf sieht also z.B. so aus:

./mysqldumpsplitter.sh --source /mnt/backup/all.sql --extract DB --match_str $DBNAME --decompression none --output_dir /mnt/backup/$DBNAME.sql.gz

Zack, hat man nur die gewünschte Datenbank extrahiert und kann auch nur diese wieder einspielen.

Achtung!

MySQL hat auch die Optionen -D oder –one-database. Das klingt ja erstmal nach einem Verhalten, dass ich mir oben gewünscht habe – ist es aber nicht!

Ein Dump mit der Option –all-databases enthält für jede Datenbank die Statements

DROP DATABASE IF EXISTS dbname; 
CREATE DATABASE dbname; 
USE dbname;

Sofern ihr also z.B. die alphabetisch dritte Datenbank (nennen wir sie C) mit der Option –one-database wieder einspielt, werden die Datenbanken A und B geleert und nicht wieder befüllt. Das muss nicht, kann aber stark nach hinten losgehen – deshalb: wir bleiben beim mysqldumpsplitter.