Fryboyter

E-Mail-Adressen mit Python aus Datenbanksicherung auslesen

Ab und zu werde ich bei schwierigen Fällen um Hilfe gebeten. Wie zum Beispiel vor ein paar Tagen. Aufgabenstellung war, die E-Mail-Adressen in einer MySQL-Datenbank zu finden und die Treffer in eine Textdatei zu schreiben. Das Problem ist aber, dass die Datenbank nur als Datensicherung in Form einer SQL-Datei vorliegt und diese nicht eingespielt werden soll oder kann. Wäre auch zu einfach gewesen.

Da ich gerade als Fachliteratur das eBook von “Automate the Boring Stuff with Python” lese habe ich mich für Python als Lösung entschieden. Herausgekommen ist folgendes “Kunstwerk”.

#!/usr/bin/env python
""" Emails in einer Datei finden und Treffer in eine neue Datei schreiben """

import os
import re

QUELLDATEI = input("Quelldatei angeben: ")
ZIELDATEI = input("Zieldatei angeben: ")

if os.path.exists(QUELLDATEI):
    DATEN = open(QUELLDATEI, 'r')
    EMAILDATEI = DATEN.read()
else:
    print("Datei nicht gefunden")
    raise SystemExit


# Regex und Suche ohne doppelte Treffer
EMAILREGEX = re.compile(
    r'[a-z0-9!#$%&*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&*+=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?', re.IGNORECASE)
TREFFERDOPPELT = EMAILREGEX.findall(EMAILDATEI)
TREFFEREINFACH = set(TREFFERDOPPELT)

# Treffer ausgeben und in Datei schreiben
with open(ZIELDATEI, 'w') as f:
    for row in TREFFEREINFACH:
        print(row)
        f.write("%s\n" % str(row))

Habe ich schon erwähnt, dass ich so gut wie gar nicht programmieren kann? Nein? Gut ich kann es so gut wie nicht. Aber erstaunlicherweise funktioniert es. Auf eine Prüfung ob die jeweilige E-Mail-Adresse gültig ist, habe ich bewusst verzichtet. Das wird mit RegEx sonst ein Fass ohne Boden. Vor allem weil ich RegEx noch weniger beherrsche als z. B. Python. Von daher wie immer… Benutzung auf eigene Gefahr.

Nachtrag: Nach einem Testlauf ist mir aufgefallen, dass einige Adressen mehrfach vorhanden sind. Ich habe das Script daher noch einmal angepasst, so dass nun keine doppelten Adressen ausgegeben werden.

Nachtrag 2 Ich habe das Script noch einmal angepasst. Zum einen wird nun die Quelldatei sowie die Zieldatei abgefragt und ist nicht mehr fest hinterlegt und zum anderen habe ich mich an den PEP8-Richtlinien (außer der Zeilenlänge) orientert.

Linux | OSBN

Größe einer MySQL-Datenbank herausfinden

Heute hat es mich mal interessiert, wie groß die MySQL-Datenbank sind, welche auf meinem Uberspace laufen. Daher habe ich mir mal etwas mit SQL-Abfragen gebaut.

SELECT sum(round(((data_length + index_length) / 1024 / 1024), 2)) as "Größe in MB" 
FROM information_schema.TABLES 
WHERE table_schema = "Datenbankname"

Hier wird der Wert aus data_length und index_length der Datenbank welche man anstelle von Datenbankname angibt zusammengezählt und das Ergebnis auf zwei Stellen gerundet.

Hat man mehrere Datenbanken kann man deren Größe auch auf einen Schlag anzeigen lassen. Hierzu kann man folgende Abfrage nutzen.

SELECT table_schema, sum(round(((data_length + index_length ) / 1024 / 1024),2)) "Größe in MB"
FROM information_schema.TABLES
GROUP BY table_schema ;

Linux | OSBN

Datenbank sichern und verschlüsselt in die Dropbox hochladen

Ungesicherte Daten sind unwichtige Daten. Daher sollte man sich gut überlegen wie und vor allem wohin man seine wichtigen Daten sichert. Bei vielen Betreibern ist zum Beispiel die Datenbank absolut wichtig, da dort die Artikel und Kommentare eines Blogs gespeichert sind. Da eine Datensicherung prinzipiell auf einem anderen Speichermedium zu erfolgen hat als die Originaldaten liegen, habe ich mir überlegt, ob man hierfür nicht eine Dropbox nutzen könnte. Man kann.

Als erstes läd man sich von https://github.com/andreafabrizi/Dropbox-Uploader die Shellscripte herunter und speichert diese in einem Verzeichnis auf den Server. Hier sollte man nach Möglichkeit das Verzeichnis außerhalb des Document Root anlegen.

Nun macht man mittels

chmod +x dropbox_uploader.sh

das Shellscript ausführbar und startet es. Beim ersten Start wird hierbei der Konfigurationsvorgang ausgeführt. Diesem folgt man dann entsprechend (eine Dropbox muss bereits vorhanden sein). Da man hier eigentlich nichts falsch machen kann, gehe ich an dieser Stelle nicht näher darauf ein. Falls doch Fragen aufkommen sollten, meldet euch einfach. Nachdem der Uploader konfiguriert wurde, kann man diesen schon einmal testen indem man mit touch test.txt eine Datei erstellt und diese dann mittels

./dropbox_uploader.sh upload test.txt .

in die Dropbox hochläd.

Nun erstellt man im gleichen Verzeichnis in dem das Shellscript liegt ein weiteres. Beispielsweise backup.sh. Dies füllt man dann wie folgt:

#!/bin/bash
set -e DAY=`/bin/date +%Y%m%d`
PASSPHRASE='a=Fr#M?w\\+.Qg3T.qD)x'
mysqldump -u benutzername -p'4567' datenbankname | gzip -9 > /home/benutzername/Dropbox-Uploader/$DAY.sql.gz
gpg --batch --cipher-algo AES256 --passphrase=$PASSPHRASE -c /home/benutzername/Dropbox-Uploader/$DAY.sql.gz
cd /home/benutzername/Dropbox-Uploader/ 
./dropbox_uploader.sh upload "$DAY.sql.gz.gpg" . 
rm /home/benutzername/Dropbox-Uploader/$DAY.sql.gz 
rm /home/benutzername/Dropbox-Uploader/$DAY.sql.gz.gpg

Das ganze Script ist relativ schnell erklärt. Erst wird ein Dump der Datenbank “datenbankname” erstellt und gepackt. Hierbei wird der Dateiname wie in Zeile drei definiert erstellt (Jahr/Tag/Monat). Als nächstes wird das so erstellte Archiv mittels gpg und dem in Zeile vier hinterlegtem Passwort verschlüsselt. Danach wird die verschlüsselte Datei in die Dropbox hochgeladen. Abschließend wird sowohl die verschlüsselte als auch die unverschlüsselte Datei vom Server gelöscht.

Nun legt man sich am besten noch einen Cronjob an mit dem dann das eben erstelle Script regelmäßig ausgeführt wird und somit die Datenbank automatisch gesichert wird.

Linux | OSBN

Temporäre Tabellen unter MySQL erstellen

Am Freitag war ich mal wieder in der Situation etwas an einer Datenbank ändern zu müssen. Und das ohne Netz und doppelten Boden. Sprich die Datensicherung war schon ein paar Stunden alt und für eine Testdatenbank war keine Zeit. Da die Änderungen nicht ganz ohne waren, habe ich mir trotzdem einen Sicherheitsgurt eingebaut. Ich habe mir einfach eine temporärer Tabelle angelegt. Das ganze ist recht simpel.

CREATE TEMPORARY TABLE test (SELECT * from nutzer)

Bei diesem Beispiel wird also die temporäre Tabelle test in der Datenbank erstellt. Und zwar mit allem, was in der Tabelle nutzer vorhanden ist. Auf diese temporärer Tabelle habe ich dann mein Script losgelassen, das diverse Änderungen durchgeführt hat. Nachdem das einwandfrei geklappt hat, habe ich es dann auf die richtige Tabelle losgelassen. Einen DROP kann man sich übrigens schenken, da die temporären Tabellen nur so lange halten, wie man mit der Datenbank verbunden ist. Naja im Grunde nichts besonderes, aber vielleicht kann es ja jemand mal gebrauchen.

OSBN | Allgemein