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.

macOS: SSH-Config dauerhaft speichern

Photo by Kaitlyn Baker on Unsplash

Ich arbeite ja berufsbedingt oft auf Linux-Servern und nutze dafür den in macOS vorhandenen SSH-Client (in Verbindung mit iTerm 2, was aber hierfür nichts zur Sache tut).

Um bequemer zu arbeiten, habe ich mir mit der Zeit eine eigene SSH-Konfiguration zusammengewürfelt, um z.B. automatisch den Login-User, den SSH-Port oder einen Alias für bestimmte Hosts zu setzen.

Daraus folgt, dass ich mich zum Beispiel einfach ohne Angabe des Users, des SSH-Ports oder des vollen Hostname mit einem simplen

ssh management

an meinem Management-Server anmelden kann.

Leider hat macOS seit einigen Versionen eine unschöne Angewohnheit: bei Updates verschiebt es individuell angepasste Konfigurationen in einen Ordner „Neu zugewiesene Objekte“ auf dem Desktop (mehr dazu hier).

Die Lösung für dieses Problem ist allerdings denkbar einfach: die Änderungen an der SSH-Konfiguration einfach nicht in /etc/ssh/ssh_config eintragen, sondern in die Datei /Users/$USERNAME/.ssh/config – diese wird bei Updates nicht angefasst und die dort hinterlegten Änderungen sind dauerhaft.

Hetzner Storagebox mit Borgmatic

Bildquellen: Hetzner, Borg

Ich habe über Karfreitag alle meiner Maschinen endlich mal vom nicht mehr weiterentwickelten Tartarus auf Borg umgestellt. Ich habe, zur leichteren Verwaltung und Konfiguration der Backups, hierbei auf den kleinen Wrapper Borgmatic gesetzt und möchte heute zeigen, wie die Konfiguration in Verbindung mit einer Storage Box von Hetzner aussehen muss.

Ich nutze für alle Server eine große Storagebox, regele die Berechtigungen allerdings mit Sub-Accounts. Jeder Server bekommt also einen eigenen Sub-Account auf der Storagebox – wichtig ist hier, mindestens den SSH-Support zu aktivieren. Vorher habe ich allerdings die entsprechenden Ordner auf der Storagebox angelegt (benannt nach den Hostnames der Server) und den Sub-Account entsprechend per Basis Verzeichnis darauf beschränkt

Der Server des Accounts „-sub1“ steht außerhalb des Hetzner-Netzwerks, daher „externe Erreichbarkeit“ – bei Maschinen innerhalb des Hetzner-Netzwerks ist nur SSH nötig!

In die jeweiligen Ordner müssen dann auch noch die SSH-Public-Keys der jeweiligen Maschine verbracht werden (.ssh/authorized_keys). In jedem Ordner braucht man diese Datei mit dem Key des zugeordneten Servers.

Repository initialisieren

Wir sind also nun soweit, das Repository zu initialisieren. Die Findung des korrekten Strings hat mich ein wenig zeit gekostet, er muss aber so aussehen (oder eben so Ähnlich mit anderen Optionen):

borg init --encryption=repokey ssh://uXXXXXX-subX@nulluXXXXXX.your-storagebox.de:23/./backup

Konfiguration Borgmatic

Die Konfiguration von Borgmatic war auch etwas tricky, letztlich habe ich aber diese funktionierende Konfiguration gefunden:

location:
    source_directories:
        - /etc
        - /var/www

    one_file_system: true
    repositories:
        - uXXXXXX-subX@nulluXXXXXX.your-storagebox.de:backup

    exclude_patterns:

    exclude_caches: true
    exclude_if_present: .nobackup

storage:
    ssh_command: ssh -p 23
    compression: auto,zstd
    encryption_passphrase: CHANGEME
    archive_name_format: '{hostname}-{now}'
    relocated_repo_access_is_ok: true

retention:
    keep_daily: 7
    keep_weekly: 4
    keep_monthly: 12
    keep_yearly: 2
    prefix: '{hostname}-'

consistency:
    checks:
        - archives

    check_last: 3
    prefix: '{hostname}-'

Die wichtigsten Optionen sind

  • repositories
  • ssh_command
  • relocated_repo_access_is_ok

Nur mit einer Kombination dieser drei Optionen hat die Verbindung zwischen Storagebox und Borgmatic funktioniert. Natürlich muss die Konfiguration an die eigenen Bedürfnisse angepasst werden, ich wollte nur die grundlegende Konfiguration hier aufzeigen. Auch die weiterführende Konfiguration (Cronjobs, Überwachung, …) muss selbst durchgeführt werden. Wie immer übernehme ich keine Haftung für Schäden an euren Systemen.

Fragen, Anmerkungen oder Tipps gerne in die Kommentare! Ich wünsche allein meinen Lesern frohe Ostern!

EasyLetter: Einfach Briefe schreiben

Oft kommt es vor, dass ich einen kurzen Brief aufsetzen muss, um beispielsweise eine Kündigung auszusprechen.

Bisher nutze ich hierfür eine einfache Briefvorlage in Google Docs, allerdings ist diese natürlich nicht der DIN 5008 entsprechend formatiert – das ist zwar oft kein Problem, da ich die Dokumente meistens eh nur per Fax an den entsprechenden Empfänger versende, professioneller ist es aber doch.

Diesem „Problem“ nimmt sich die kleine, aber feine Mac-App „EasyLetter“ des deutschen Entwicklers Felix Brix an.

Mit EasyLetter kann man im Handumdrehen perfekt formatierte Briefe erstellen, als PDF speichern und direkt im Anschluss versenden oder ausdrucken. Als Formate stehen DIN 5008 Typ A, DIN 5008 Typ B und US Letter. Mit nur einem Mausklick lassen sich die verschiedenen Vorlagen wechseln und im Vorschaufeld sieht man direkt das Ergebnis.

Natürlich lässt sich das selbe Ergebnis auch mit Word, Google Docs, Pages, … erzielen, allerdings bei weitem nicht so einfach und simpel, wie es hier gehandhabt wird. Wer wirklich nur einfache Briefe ohne großes Brimborium verfassen möchte, ist mit EasyLetter sehr gut bedient.

Für mich passt die App perfekt in meinen Workflow: Brief schreiben, als PDF speichern und per Online-Fax im Handumdrehen verschickt.

Ein wenig Kritik muss ich allerdings dennoch verteilen: mir wäre es wichtig, eine Bilddatei direkt als Unterschrift in den Brief einbetten zu können – viele Firmen verlangen bei Kündigungen die Unterschrift und ich spare mir gerne das Drucken des Briefs, um ihn dann mit Unterschrift wieder einzuscannen. Laut dem Entwickler ist das Feature aber in Arbeit.

Die App kostet aktuell im Mac App Store 2,99 Euro, was ich als sehr gut investiertes Geld ansehe – selbstverständlich aber nur, wenn der Workflow überhaupt zur App passt.

‎EasyLetter - Briefe erstellen
‎EasyLetter - Briefe erstellen
Entwickler: Felix Brix
Preis: 2,29 €
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot

Eigene Skripte jetzt öffentlich

Immer mal wieder schreibe ich kleinere oder größere (Bash-)Skripte, die ich schon seit einiger Zeit veröffentlichen möchte. Vielleicht sind sie ja auch für andere nützlich und man muss ja auch nicht immer das Rad neu erfinden…

Ich veröffentliche meine Skripte jetzt bei Github. Hier meine Repositories.

Die Skripte sind sicher nicht immer 100% sauber geschrieben und für den ein oder anderen sind sie sicher auch völlig nutzlos – falls aber doch jemand sich darüber freut, habe ich mein Ziel ja erreicht.

In diesem Sinne: frohe Weihnachten an euch und eure Familien – habt ein besinnliches, ruhiges Weihnachtsfest und lasst es euch gut gehen.