DBeaver – Eclipse Plugin für DB2

DBeaver ist ein freier SQL Client für zahlreiche Datenbanken, ich verwende ihn als Eclipse-Plugin für DB2. DBeaver verfügt über ein paar tolle Funktionen.

DBeaver generate SQL

Ein wirklich nützliches Feature von DBeaver ist die Möglichkeit SQL-Statements zu generieren. Am folgenden Beispiel wird gezeigt, wie aus einer Ergebnismenge eines SELECT’s – INSERT Statements generiert werden können. Diese INSERT Statements können dann z.B. als Vorlage für Anpassungen und Generierung von „synthetischen“ Testdaten dienen. Voraussetzung: DBeaver Ansicht ist ausgewählt.

Um einen simplen SELECT * auf eine Tabelle auszuführen, muss die Tabelle mit der Maus markiert werden und über das Kontextmenü der Eintrag „Read data in SQL console“ ausgewählt werden.

Anschließend wird in der Konsole das Ergebnis eines SELECT * angezeigt – hier am Beispiel der S_BIZ_ANTRAG Tabelle.

In der Konsole müssen aus der Ergebnismenge die relevanten Datensätze mit der Maus markiert werden. Dies kann

  • die gesamte Ergebnismenge sein (i.d. R. die ersten 1000 Records) – Markierung der ges. Tabelle,
  • ein Bereich (Markierung über Shift und/oder Maustaste)
  • einzelne Datensätze (Markierung mit Strg und Maustaste) oder
  • ein einziger Datensatz (Markierung eines einzelnen Datensatzes über die Zeilen-Nummer) sein.

Nach getroffener Auswahl über das Kontextmenü den Eintrag  „Generate SQL –> z.B. INSERT“ auswählen.

Es erscheint ein neues Fenster in dem die selektierten Datensätze als INSERT-Statements generiert werden.

Diese generierten Statements können nun über copy/paste bspw. nach Notepad++ kopiert und angepasst werden. Man muss sich bei den generierten Statements um keine Datentypen kümmern, da diese beim Generieren von DBeaver gleich korrekt erzeugt werden.

DBeaver compare

DBeaver kann auch Objekte, die im Datenbank Navigator angezeigt werden, strukturell vergleichen. Dies funktioniert mit jedem Objekt (Tabellen, Schemata, ganze Datenbanken etc.) – natürlich müssen die zu vergleichenden Objekte vom gleichen Typ sein.

Im Datenbanknavigator die zu vergleichenden Objekte – hier Tabellen – mit der Maustaste markieren und anschließend im Kontextmenü den Eintrag <Compare> auswählen:

Im anschließend erscheinenden Dialog weitere Optionen auswählen und das Ausgabeformat Datei/Browser auswählen.

 

Datenbank-Monitoring mit DB2TOP

In meinem aktuellen Data Warehouse Projekt verwende ich das db2-Monitoring Tool DB2TOP. Mit diesem textbasierten Tool können db2-Umgebungen überwacht werden.

Starten und Beenden von DB2TOP

Um DB2TOP aufzurufen, muss man sich über putty mit dem DB-Server verbinden und anschließend auf der Kommandozeile db2top eingeben (in manchen Fällen gefolgt vom Parameter -d für den DB-Namen und den Namen der Datenbank):

Aufruf von db2top
[y0e6844@blbbddbentw01] $ db2top -d dbbded01

Anschließend wird DB2TOP gestartet und das Hauptmenü angezeigt.

DB2TOP Startseite

Im oberen Bereich von DB2TOP werden verschiedene Werte angezeigt.

Kopfzeile 1:

  • linker Bereich in der Kopfzeile
  • [/]: Wenn dieses Symbol rotiert, bedeutet es, dass DB2TOP zwischen zwei Snapshots wartet – anderenfalls wartet DB2TOP auf eine Antwort von DB2h
  • 08:25:29: aktuelle Uhrzeit
  • refresh=2secs: Zeit Intervall für die Aktualisierung zwischen zwei Snapshots
  • refresh=!secs: Ein angezeigtes Ausrufezeichen bedeutet, dass die Verarbeitungszeit eines Snapshots länger dauert als die refresh-Zeit. Wenn dies der Fall ist, erhöht DB2TOP den Zeitintervall um 50%.
  • (0.001): Dauer die benötigt wurde, um den Snapshot zu erzeugen
  • rechter Bereich in der Kopfzeile
  • Linux: Plattform, auf der die DB2-Instanz läuft
  • member=[1/1]: Zeigt im Falle von Partitionen die aktive von gesamt vorhandenen Partitionen an
  • BADISE01: DB-Instanz-Name
  • DBBDBD01: Datenbank-Name

Kopfzeile 2:

  • linker Bereich in der Kopfzeile
  • d=Y/N: Delta oder Kumulativer Snapshot Indikator (-k oder k Option)
  • a=Y/N: Nur aktive oder alle Objekte (-a oder i Option)
  • e=Y/N: erweiterte Anzeige
  • p=ALL: Alle Datenbank-Partitionen (p=CUR aktuelle DB-Partition, p=2: Partition 2, sofern partitioniert) (-P Option ohne Angabe einer Partition)
  • rechter Bereich in der Kopfzeile
  • qp=on/off: Query patroller an/aus

Zusätzlich werden auf der Startseite von DB2TOP die möglichen Tastenkommandos zur Navigation angezeigt (Achtung: Groß-/Kleinschreibung beachten).

Beenden von DB2TOP

DB2TOP kann durch die Eingabe von q (quit) beendet werden. Möchte man DB2TOP nicht beenden, dennoch auf der Linux-Shell Befehle ausführen, so kann durch die Eingabe eines Ausrufezeichens temporär auf die Linux-Shell gewechselt werden – durch Eingabe von exit wird die Shell wieder verlassen und man befindet sich wieder in der DB2TOP Ansicht.

d (Database)

Auf der Datenbank-Seite werden eine Reihe von Performance Monitoring Elemente für die gesamte Datenbank angezeigt

Database

Auslastungs-Anzeige (durch Eingabe von g aktivier-/deaktivierbar)

  • MaxActSessions: Aktive Sessions
  • AssAgents: ??
  • SortMemory: Auslastung Sortier-Speicher
  • LogUsed: Auslastung des DB2-Transaktions-Logs (WICHTIG!!) von „uncommitted transactions“
  • FCM BufLow: FCM (Fast Communication Manager) buffer shared memory

Neben der Auslastungs-Anzeige werden Informationen (Datum/Uhrzeit/Log) zum letzten Backup angezeigt (Hinweis: Diese Angabe wird nur dann angezeigt, wenn das putty-Fenster entsprechend groß gewählt wird).

Felder:

  • Start Date Start Time: Startdatum und Uhrzeit wann die Datenbank hochgefahren wurde
  • Status:  Status der Datenbank
  • Shthres: Sort heap threshold Konfigurations-Parameter
  • Buffers: konfigurierter Buffer-Speicher in Mega-/Gigabyte
  • FCMBuf: konfigurierter FCM-Speicher in Mega-/Gigabyte
  • OtherMem: sonstiger konfigurierter Speicher im Mega-/Gigabyte
  • Sessions: Anzahl Sessions
  • ActSess: Anzahl aktiver Sessions
  • LockUsed:  Prozentuale Auslastung des LOCK-Bereichs – zusammen mit LockEscals: Lock Escalation interessant bei Locking-Problemen
  • DeadLocks:
  • LogReads:
  • LogWrites:
  • L_Reads: Logical Reads
  • P_Reads: Physical Reads
  • HitRatio:
  • A_Reads: Asynchronous Reads
  • Writes:
  • A_Writes: Asynchronous Writes
  • Lock Wait:
  • Sortheap:
  • SortOvf: Sort Overflow (dieser Wert geht hoch, wenn Sortheap nicht groß genug ist)
  • PctSortOvf: Percentage Sort Overflow
  • AvgPRdTime: Average Physical Read Time
  • AvgDRdTime: Average Direct Read Time
  • AvgPWrTime: Average Physical Write Time
  • AvgDWrTime: Average Direct Write Time

B (Bottleneck)

Bottleneck

Durch die Eingabe eines großen B’s bekommt man die Hauptkonsumenten kritischer Serverressourcen zu sehen. Hierüber können Engpässe analysiert werden. In der Darstellung werden (typischerweise) alle 2 Sekunden die Analyseergebnisse aktualisiert. Möchte man eine Eingabe „einfrieren“ so kann über die Taste f die Anzeige eingefroren werden – durch die Eingabe von <ENTER> erfolgt wieder die dynamische Anzeige.

Im oberen Bereich des Monitors erfolgt eine Pegel-Anzeige mit prozentualer Angabe der „Ausschläge“. Durch die Eingabe von z oder Z kann die Sortierreihenfolge (nach anschließender Eingabe der Spalten-Nummer) ausgewählt werden. Soll nach mehreren Spalten sortiert werden, so sind die Spalten-Nummern getrennt durch Komma anzugeben. Soll diese Sortierreihenfolge dauerhaft beibehalten bleiben, so besteht die Möglichkeit durch die Eingabe von w die „Konfiguration“ zu speichern. Die Konfigurationsdatei heißt .db2toprc.

l (Sessions)

Über die Sessions werden Anweisungsanzeigen aufgerufen.

Sessions

Benötigt man zu einer Anweisung (Application Handle) detailliertere Informationen, so kann durch die Eingabe eines kleinen a’s (agent) und anschließender Eingabe des in der ersten Spalte angezeigten Application-Handles (sowas Ähnliches wie eine Prozess-ID – ist aber nicht zu verwechseln mit der Linux/Unix Prozess-ID) ein Application Handle ausgewählt werden. Ein Application-Handle manuell eingeben funktioniert nicht – am Besten die ID mit der Maus markieren und copy/paste mit anschließendem <ENTER> drücken.

Sessions

Spaltenreihenfolge der Anzeige (dauerhaft) ändern, funktioniert wie folgt:

  • Im Sessions-Screen die Taste c eingeben. Dadurch werden alle verfügbaren und aktuell sortierten Spalten aufgelistet.
  • Danach im unteren Bildschirmbereich bei „Enter new columns order for sessions“ durch Komma getrennt die Nummer der oben angeführten Spalten in der gewünschten Reihenfolge angeben und mit <ENTER> bestätigen.
  • Soll die Darstellung dauerhaft gespeichert werden, einfach w eingeben und mit <ENTER> bestätigen.

D (Dynamic SQL)

Dynamic SQL zeigt detaillierte Informationen zu gecachten SQL Statemens an. Über die Angabe des angezeigten HashValues des SQL-Statements kann ein vollständiges SQL-Statement eingeblendet werden.

Dynamic SQL

O (Settings)

Über die Settings-Funktion werden die aktuellen Einstellungen von DB2TOP angezeigt:

DB2TOP Einstellungen

h (Help)

Über die Taste h wird eine Hilfeseite mit den zur Verfügung stehenden Tastaturkürzeln und eine kurze Beschreibung angezeigt. Die Hilfeseite beendet man durch die Eingabe von <ENTER>.

DB2TOP Hilfe

Weiterführende Informationen zum DB2TOP Monitoring Tool findet man auf den developerWorks Seiten von IBM. Besonders interessant ist der Bereich unter „What can be monitored by db2top“ von Tao Wang und Shen Li.

 

MD5-Hashing für Dummies

Data Vault 2.0 ist ein aktueller Trend im Data Warehouse Umfeld. Eine elementare Neuerung im Vergleich zur ersten Version ist der Einsatz von Hash-Funktionen. Diese Hash-Funktionen werden dazu verwendet, um eindeutige technische Schlüssel (Hashkeys) zu erzeugen und Deltas (Hashdiffs) – also Änderungen an Datensätzen – zu identifizieren. Empfohlen wird dabei der Einsatz des MD5 – Algorithmus (siehe: https://de.wikipedia.org/wiki/Message-Digest_Algorithm_5), da er für die meisten Anwendungsfälle als ausreichend angesehen wird und Kollisionen sehr unwahrscheinlich (aber nicht unmöglich) sind. Wichtig ist in diesem Zusammenhang zu erwähnen, dass die MD5-Verschlüsselung hier nicht aus Sicherheitsgesichtspunkten verwendet wird. In diesem kurzen Beitrag befasse ich mich ausschließlich mit MD5, es soll nur als erster Einstieg in die Materie dienen.

Der MD5-Algorithmus erzeugt aus einer beliebigen Nachricht immer einen 32 Zeichen langen Hashwert (hexadezimale Notierung) . Um ein erstes Gefühl zu bekommen, was hashing eigentlich bedeutet, kann man das unter Linux (ich nutze dazu beispielsweise einen RaspberryPi Modell 2)  sehr einfach ausprobieren. Das verwendete Programm ist bei den meisten Standard-Distributionen mit installiert (Bestandteil der coreutils) und heißt md5sum.

Die erste sehr einfache Möglichkeit ist, sich über das echo-Kommando und die Umleitung über eine Pipe, sowie den Aufruf des Programmes md5sum einen Hashwert anzeigen zu lassen. Um sich beispielsweise den Hashwert für die Nachricht abc anzeigen zu lassen,  gibt man folgendes in der Kommandozeile ein:

echo -n 'abc' | md5sum

Als Ergebnis erhält man diese Ausgabe:

900150983cd24fb0d6963f7d28e17f72

Auf dem Mac kann man in einem Terminal ähnlich vorgehen – der einzige Unterschied besteht darin, dass das MD5-Programm auf dem Mac schlicht md5 heißt. Der Aufruf im Terminal auf dem Mac lautet also:

echo -n 'abc' | md5

Die Ausgabe ist auf dem Mac ist die Gleiche.

Möchte man nicht eine interaktive Eingabe der Nachricht, sondern eine Datei (ja, das kann auch eine Nachricht sein) als Eingabe für den MD5-Algorithmus verwenden, so kann unter Linux über openssl ein Hashwert berechnet werden.  Dazu ruft man auf der Kommandozeile unter Linux folgenden Befehl auf:

openssl dgst -md5 Dateiname

Mit diesem Befehl wird der Inhalt der Datei Dateiname mit dem MD5-Algorithmus verschlüsselt. Wenn also in der Datei test.txt der Text abc (ohne Zeilenumbruch und sonstigen Sonderzeichen)  enthalten ist, erhalte ich die gleiche Ausgabe wie im o.a. Beispiel.

Auf dem Mac erreicht man das gleiche Ergebnis mit diesem Kommando:

openssl md5 Dateiname

Weitere Details findet man wie immer in den man-pages unter Linux oder auf dem Mac.

Unter Windows gibt es leider keine im Betriebssystem verankerte MD5 Funktion, jedoch gibt es zahlreiche Zusatzprogramme über die man MD5-Checksummen berechnen kann. Die MD5-Funktion gibt es in sehr vielen Implementierungen, bspw. als Java-Code, Excel-VBA-Code, in der Bibliothek hashlib von Python sowie in vielen built-in Funktionen von Datenbanken (z.B. MS SQL Server 2016, DB2 ab Version 11.1 etc.).

Zu beachten ist jedoch, dass die MD5-Funktion auf binärer Ebene fungiert. abc ist dabei nicht gleich ABC, Groß- und Kleinschreibung ist zu beachten, ebenso wie der Zeichensatz (UTF8, ASCII etc.) sowie weitere Details die bis in den Kern eines Computers reichen (z.B. Byte-Reihenfolge – die so genannte Endianess). Das bedeutet, dass eine Nachricht auf dem einen Computer nicht zwingend die gleiche Nachricht auf einem anderen Computer erzeugt. Aus diesem Grund muss die Hashwert-Berechnung gerade im Kontext von Data Vault 2.0 abgestimmten und unternehmensweit kommunizierten Konventionen unterliegen. Mehr dazu vielleicht in einem Folge-Beitrag.