SQL-Blog

MariaDB, PostgreSQL, MySQL, … Erfahrungsberichte, Meinungen, …

Dump-Datei splitten

| Keine Kommentare

MySQL ist vor allem deswegen so weit verbreitet, weil es gemeinsam mit PHP quasi zur Standardausrüstung jedes Webhosting-Pakets gehört. Die meisten Webhoster bieten den Zugang zur Datenbank über eine Weboberfläche wie phpMyAdmin an. Solche Weboberflächen bieten eine einfache Verwaltungs- und Bearbeitungsmöglichkeit der Datenbank an, die es auch technisch nicht so versierten Usern ermöglicht, die wichtigsten Datenbankoperationen auszuführen. Doch leider gibt es selten nur Vorteile.

Je nach Web-Server – Konfiguration können nicht beliebig große Dateien hochgeladen werden, oder die Ausführung einer Anfrage darf eine gewisse Zeit nicht überschreiten. Das kann vor allem dann zu Problemen führen, wenn man gezwungen ist große Datenmengen in die Datenbank zu importieren.

Die Lösung für dieses Problem ist es oft, die zu importierende Datei auf mehrere kleinere Dateien aufzuteilen. Für Windows gibt es eigene Tools, die man sich dafür installieren kann, eine Beschreibung dafür kann man u.a. hier finden.

Unter Linux, oder auch unter Mac OS X ist das auch mit Boardmitteln zu bewerkstelligen. Das Zauberwort dafür heißt split.

split

Split ist ein Programm zum Aufteilen großer Dateien in beliebig viele kleine. Es kann sowohl binär-Dateien, als auch Text-Dateien splitten. Letzteres machen wir uns für das Aufteilen von SQL Dump – Files zu nutzen. Über die genaue Verwendung von split gibt wie immer auch die Hilfefunktion Auskunft:

split --help

Hier musste ich feststellen, dass das Split von Linux etwas mehr Parameter und Funktionen bietet als jenes von OS X, was jedoch für unsere Zwecke völlig egal ist.

Welche Parameter sind für uns relevant?

-p pattern

Das reicht auch für den ersten Versuch schon.

Ich habe zum Testen eine kleine Datenbank mit nur 3 Tabellen exportiert, die für die Erklärung der Funktionen aber ausreichend ist. Beim Export habe ich sowohl die Struktur, als auch die Daten in eine Datei (exp.sql) schreiben lassen, so dass das zu teilende File wie folgt aussieht:


CREATE TABLE IF NOT EXISTS `tbl_a` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
...);

INSERT INTO `tbl_a` (...) VALUES (...),
(...),
(...) ...

CREATE TABLE IF NOT EXISTS `tbl_b` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
...);

INSERT INTO `tbl_b` (...) VALUES (...),
(...),
(...) ...

CREATE TABLE IF NOT EXISTS `tbl_c` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
...);

INSERT INTO `tbl_c` (...) VALUES (...),
(...),
(...) ...

Will ich jetzt zum Beispiel für jede Tabelle eine eigene Datei haben, so brauche ich nur zu schreiben:

split -p CREATE exp.sql tab_

Dieser Befehl bedeutet, dass split in der Datei exp.sql nach dem Pattern ‚CREATE‘ sucht und genau ab diesem Wort eine neue Datei anlegt, die den Inhalt bis zum nächsten ‚CREATE‘ beinhaltet. Standardmäßig benennt split die neuen Dateien unter OS X einfach aa, ab, ac, usw. Man kann allerdings dieser Nummerierung ein Präfix voranstellen, was ich mit tab_ getan habe, so dass meine Dateien nun tab_aa, tab_ab und tab_ac heißen.

Nun haben wir für jede Tabelle der Datenbank eine eigene Datei. Ist diese noch immer zu groß, so könnten wir einen weiteren Parameter von Split zum Einsatz bringen:

-l line_count

Das heißt wir können uns z.B. die Datei tab_ac in z.B. lauter Dateien zerlegen lassen, die genau 100 Zeilen haben. Das erreicht man mit:

split -l 100 tab_ac 100tab_ac_

Jetzt habe ich lauter 100 Zeilen lange Dateien, mit den Namen 100tab_ac_aa, 100tab_ac_ab, …

Was will man mehr? 😉

Fazit

Unter Unix – basierten Betriebssystemen, kann man ganz einfach SQL-Dumps manipulieren, die ja nichts anderes als reine Text-Dateien sind.

 

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.