DB2 ist ein kommerzielles relationales Datenbank Management System (RDBMS) der Firma IBM, deren Ursprünge auf das System R und die Grundlagen von E. F. Codd vom IBM Research aus dem Jahr 1970 zurückgeht.
Inhaltsverzeichnis |
Das Datenbankmanagementsystem DB2 wird von IBM für verschiedene Betriebssystem-Plattformen vertrieben.
Es gibt die Produktlinie für IBM Mainframes, auf denen sich aus dem Betriebssystem VSE über MVS und OS/390 das z/OS entwickelt hat.
Eine andere Produktlinie wurde ursprünglich für das Betriebssystem OS/2 entwickelt. Diese Software ist in der Programmiersprache C geschrieben und wurde weiterentwickelt für die Betriebssysteme Linux, Unix und Windows (LUW).
Eine weitere Produktlinie ist eine in das Betriebssystem IBM i integrierte Version für IBM-Midrangesysteme (heutige Maschinenbezeichnung System i).
Die vierte Produktlinie betrifft die Betriebssysteme VSE und VM. Für diese Produktlinie gibt es zwar noch Support, aber keine Weiterentwicklung mehr. IBM möchte die Kunden dieser Produktlinie dazu bewegen, auf dem Rechner Linux zu installieren, damit das DB2 für Linux, Unix, Windows verwendet werden kann.
Aktuell sind die Versionen:
DB2 verwaltet Daten in Tables und speichert sie in Tablespaces. DB2 unterstützt neben den Standard-SQL-Datentypen auch binäre Datentypen (Text, Töne, Bilder, Videos, XML-Daten). Zusammen mit Oracle Database und MS SQL-Server gehört DB2 zu den Datenbanksystemen mit den größten Marktanteilen.
Seit Februar 2006 gibt es eine kostenlose Version (Express-C) für Windows und Linux mit den folgenden Einschränkungen gegenüber den kommerziellen Versionen:
Diese Version hat keine Einschränkungen hinsichtlich Größe der Datenbank und Anzahl der Benutzer, jedoch ohne zusätzlichem Wartungsvertrag gibt es keine Replikation, 24/7-Support und komfortable Updates.
Um bei der Ausführung von DB-Zugriffen optimale Performance zu erzielen, wird ein sog. Optimizer eingesetzt, ein regelbasiertes Expertensystem, welches bei der Programmvorbereitung den Zugriff auf die betreffenden Tabellen festlegt. Dies beruht unter anderem auf den sogenannten Tabellenstatistiken, die mittels o. a. Tool RUNSTATS periodisch aktualisiert werden können, berücksichtigt aber auch auf andere Kennwerte wie z. B. der Anzahl der CPUs und Hilfs-CPUs, dem Systemzustand, der verfügbaren Speichermenge und der physischen Verteilung der Daten.
Der Datenzugriff der Anwendungsschicht erfolgt mit SQL, das weitgehend dem ANSI-SQL entspricht. Zugriffe auf gespeicherte Daten können daher aus vielen Programmiersprachen heraus mit eingebettetem SQL erfolgen.
DB2 kann auch als eingebettetes Datenbanksystem eingesetzt werden.
Im April 2007 hat IBM eine Kooperation mit MySQL AB angekündigt, um das DB2 UDB for iSeries als Database-Engine für MySQL verfügbar zu machen.[1] Dadurch kann die Freeware-Datenbank MySQL auch auf dem System i5 eingesetzt werden. IBM erhofft sich davon, neue Einsatzbereiche des Systems i5 für MySQL- und PHP-Anwendungen zu eröffnen.
Das System erlaubt derzeit Tablespaces mit einer maximalen Größe von 128 Terabyte.
Die Administration auf Mainframes erfolgt in der Regel mittels Batchjobs, wobei zwischen DB2 Utilities (RUNSTATS, COPY, REORG usw.) und DBA-Jobs unterschieden wird (SQL wird mittels DSNTIAD in einem TSO-Backgroundjob durchgeführt). Kleinere Arbeiten werden oft auch am TSO-Terminal mittels SPUFI oder QMF (Query Management Facility) unter ISPF durchgeführt.
Größere Mainframeumgebungen verwenden DB2 Data Sharing, wobei die Funktionalität des Parallel Sysplex der zSeries-Rechner voll genutzt wird.
Das DB2 UDB für Linux, Unix und Windows wird oft als DB2 LUW abgekürzt.
Es wird mit CLI-Befehlen in der Kommandozeile administriert oder graphisch über die Steuerzentrale (Control Center (db2cc)).
Das so genannte DB2-EEE (sprich „triple E“, oder „trippel-Ih“) – seit der Version 8 „DPF“ (distributed partitioning feature) genannt – ist für größere Umgebungen, wobei die Datenbank-Partitionen über mehrere Rechner (Nodes) verteilt werden können.
Liste der Systemkomponenten eines DB2-Systems für z/OS und OS/390. Die Unterschiede zwischen OS/390 und z/OS sind relativ gering, daher muss – bezüglich der DB2-Komponenten und Funktionen – nicht näher unterschieden werden, auf welchem dieser beiden Betriebssysteme DB2 installiert ist. Im Folgenden soll z/OS als Synonym für „z/OS oder OS/390“ verwendet werden. Das DB2 für z/OS ist für eine optimale Nutzung der Betriebssystem- und Hardware-Komponenten ausgerichtet. Um die Zusammenhänge zu verdeutlichen, wurden in dieser Liste auch einige Begriffsdefinitionen von Hardware-Komponenten aufgeführt, die nicht Bestandteil des DB2-Systems im engeren Sinne sind.
Das DB2 UDB für Linux, Unix und Windows wird oft als DB2 LUW abgekürzt. Im Gegensatz zum DB2 z/OS bietet die IBM die wichtigsten Manuals für DB2 V9 LUW in deutscher Sprache[6] an. Auch die Fehler- und Hilfetexte werden – eine Installation mit Sprachauswahl deutsch vorausgesetzt – in deutsch ausgegeben. Dabei werden auch die Namen der DB2-Systemkomponenten in deutschen Begriffen angegeben. Das mag den ersten Einstieg erleichtern, da man sich nur die deutschen Begriffe merken muss. Wenn man jedoch die weiteren Details des Systems verstehen will, dann ist man auf die übrigen nicht ins Deutsche übersetzen Manuals und die sonstige englischsprachige Literatur z. B. die Redbooks[7] angewiesen. Zum anderen werden verständlicherweise im DB2-Katalog nur die originalsprachlichen Begriffe verwendet. Folglich führt kein Weg daran vorbei, sich auch die englischen Begriffe zu merken. In der nachfolgenden Begriffsdefinition werden zuerst die englischen Begriffe, danach die von der IBM verwendeten deutschen Übersetzung angegeben gefolgt von ihrer Erläuterung.
Das DBMS kann auf unterschiedlichen Hardware-Konfigurationen installiert werden.
Wenn ein kleines Datenvolumen verwaltet werden soll und nur wenige Transaktionen ihre Anforderungen an das DBMS stellen, dann ist eine Installation auf einer Einzelprozessormaschine eine kostengünstige Lösung.
Bei einer größeren Anzahl von zu bearbeitenden Transaktionen wäre eine Mehrprozessormaschine die nächst größere Einheit zur Leistungssteigerung. Das System kann die Evaluierung einer einzigen Abfrage auf mehreren Prozessoren parallel bearbeiten. Dadurch wird sowohl die Bewältigung des gesamten Transaktionsvolumens beschleunigt, als auch die Ausführung einzelner verarbeitungsintensiver Abfragen beschleunigt. Es sind jedoch nicht alle Abfragen für eine Parallelisierung geeignet. Das DBMS verwaltet die Verteilung der Arbeitsschritte auf die einzelnen Prozessoren (Symmetrisches Multiprozessorsystem). Diese Hardware-Konfiguration wird auch als Shared-everything Architecture bezeichnet, denn die einzelnen Prozessoren müssen sich alle anderen Hardware-Komponenten miteinander teilen.
Wenn sich die Nutzung der anderen Hardware-Komponenten (Plattenspeicher, Controller, Arbeitsspeicher) als Engpass herausstellt, dann kann die Leistung weiter gesteigert werden durch eine Verteilung des DBMS auf mehrere Einzelprozessormaschinen. Diese Hardware-Konfiguration wird auch als Shared Nothing Architecture bezeichnet, da jeder Prozessor seinen eigenen Hauptspeicher, Controller und Plattenspeicher besitzt. Wenn das DBMS auf mehreren Rechner-Knoten installiert wird, dann muss Datenbankpartitionierung eingesetzt werden. Das bedeutet, dass auf jedem Rechner-Knoten eine (oder auch mehrere) Datenbankpartition eingerichtet wird. Ein einzelnes DBMS kann auf maximal 512 Rechner-Knoten installiert werden.
Um die maximale Hardware-Leistung für ein DBMS zur Verfügung zu stellen, können für die einzelnen Rechner-Knoten Mehrprozessormaschinen gewählt werden. Eine solche Hardware-Architektur wird auch als SMP-Cluster bezeichnet.
DB2 bietet verschiedene Konzepte, um die Administration großer Datenmengen zu erleichtern und um die Zugriffsperformance durch Parallelverarbeitung zu erhöhen. Eines dieser Konzepte ist die Partitionierung.[8]
Datenbankpartitionierung gibt es nur für DB2 LUW. Es muss eingesetzt werden, wenn eine DB2-Instanz auf mehreren Rechner-Knoten installiert wird. Auf jedem Rechner Knoten muss mindestens eine Datenbankpartition eingerichtet werden. Es kann auch eingesetzt werden, wenn die DB2-Instanz auf nur einem Rechner-Knoten installiert ist. Bei einer Installation auf einem Rechner-Knoten lohnt sich die Datenbankpartitionierung vor allem dann, wenn unterschiedliche Speicherplatten installiert sind. Auf jeder Speicherplatte kann eine eigene Datenbankpartition eingerichtet werden. Auf diese Weise kann eine gleichmäßige Verteilung der Daten auf mehrere Speicherplatten bewirkt werden. Durch die Parallelisierung der Plattenzugriffe kann schneller auf die Daten zugegriffen werden.
Nachdem die Datenbankpartitionen definiert sind, müssen diese zu Partitionsgruppen zusammengefasst werden. Eine Partitionsgruppe kann aus einer oder aus mehreren Datenbankpartitionen bestehen. Eine Datenbankpartition kann mehreren Partitionsgruppen angehören. Die Partitionsgruppen dürfen sich überschneiden.
Beispiel:
Es gibt die Datenbankpartitionen p1, p2, … p9
Es werden die folgenden Partitionsgruppen eingerichtet:
g1 = ( p1 )
g2 = ( p2 )
g3 = ( p3, p4, p5 )
g4 = ( p3, p4, p5, p6, p7 )
g5 = ( p6, p7, p8, p9 )
g6 = ( p9 )
Beim Erstellen eines Tabellenbereichs (Tablespace) muss in dieser Umgebung immer mit angegeben werden, in welcher Partitionsgruppe der Tabellenbereich erstellt werden soll. Im Beispiel können Tabellenbereiche für kleinere Tabellen in den Partitionsgruppen g1 und g2 angelegt werden. Tabellenbereiche für größere Tabellen können z. B. in der Partitionsgruppe g4 erstellt werden. Alle Tabellen, die in diesem Tabellenbereich erstellt werden, werden automatisch in allen Datenbankpartitionen der benannten Gruppe erstellt. So können die Daten einer Tabelle auf mehrere Rechner-Knoten verteilt werden.
Die Verteilung erfolgt implizit durch Generierung eines Partitionsschlüssels mittels eines Hash-Algorithmus. Das System wählt selber die Spalten aus, die zur Generierung des Hash-Schlüssels herangezogen werden. In den meisten Fällen wird der Primärschlüssel oder ein Teil davon genommen. Wenn die Tabelle ohne Primärschlüssel definiert wird, dann wird die erste Tabellenspalte genommen. Mit dem Administrationswerkzeuge SQLUGTPI kann die Verteilungszuordnung überprüft und ggf. geändert werden.
Tabellenpartitionierung ist eine Funktion, die im DB2 z/OS seit der Version 8 genutzt werden kann. Beim DB2 LUW kann sie in den Versionen 8 und 9 ebenfalls genutzt werden.
In der englischen Literatur werden dafür die Begriffe ‚Tablepartitioned‘ oder auch ‚Datapartitioned‘ verwendet.
Bei der Tabellenpartitionierung wird beim Erstellen einer Tabelle festgelegt, wie viele Partitionen diese Tabelle haben soll und nach welchem Verteilungskriterium die Daten auf die einzelnen Partitionen aufgeteilt werden. Dabei kann für jede Tabellenpartition ein anderer Tabellenbereich (Tablespaces) angegeben werden. Wenn die Tabellenbereiche auf unterschiedlichen Speicherplatten angelegt wurden, dann kann damit eine Parallelisierung (und damit Beschleunigung) der Plattenzugriffe erreicht werden.
Die Zuordnung der Daten zu den einzelnen Partitionen muss bei der Tabellendefinition explizit angegeben werden.
Beispiel 1:
CREATE TABLE t1 (verkaufsdatum date, umsatz decimal(10,2)) IN ts1, ts2, ts3, ts4, ts5 partition BY range(verkaufsdatum) (starting FROM ('01.01.2007') ending at ('31.12.2007') every (3 month));
ts1 bis ts5 sind die bereits vorhandenen Tabellenbereiche.
Beispiel 2:
CREATE TABLE t1 (verkaufsdatum date, umsatz decimal(10,2)) IN ts1, ts2, ts3, ts4, t5 partition BY range(verkaufsdatum) ( starting FROM ('01.01.2007') ending at ('31.01.2007') IN ts1, ending at ('31.05.2007') IN ts2, ending at ('01.06.2007') IN ts3, ending at ('10.07.2007') IN ts4, ending at ('31.12.2007') IN ts5);
Bei der zweiten Variante kann eine Ungleichverteilung der Daten explizit berücksichtigt werden.
Die Partitionierungsgrenzen können nachträglich geändert werden. Es können weitere Partitionen hinzugefügt werden und einzelne Partitionen gelöscht werden.
Bei DB2 z/OS können seit der Version 8 alle Indizes, die zu dieser Tabelle definiert werden, ebenfalls partitioniert werden. Wenn ein Index auch partitioniert wird, dann wird er nach den selben Kriterien partitioniert, wie die Tabelle. Es kann der Primärschlüssel, die Partitionierung und die Sortierreihenfolge der Sätze im Tabellenbereich (CLUSTER-Order) unabhängig voneinander gewählt werden. Wenn alle Indizes einer partitionierten Tabelle ebenfalls partitioniert sind, dann wird dadurch eine völlige Unabhängigkeit der einzelnen Tabellenpartitionen hergestellt. Es kann eine Partition administriert werden (z. B. LOAD REPLACE, RECOVER, REORG, COPY) während auf den anderen Partitionen gleichzeitig Programme aktiv sind. Voraussetzung ist allerdings, dass die Programme so parametrisiert werden können, dass die nur auf die Daten bestimmter Partitionen zugreifen. Im Beispiel oben kann die Partition in ts1 mit LOAD REPLACE geladen werden, während ein Programm die Daten vom Dezember in ts5 verarbeitet.
Bei DB2 LUW Version 9 kann ein Index nicht partitioniert werden. Er kann lediglich in einem eigenen Tabellenbereich angelegt werden. Eine völlige Isolierung der einzelnen Tabellenpartitionen (aus Sicht der Administration) wie bei DB2 z/OS ist daher in der DB2 LUW Version 9 nicht möglich.
Dieses Konzept war bei DB2 z/OS bis zur Version 7 die einzige Möglichkeit der Partitionierung von Daten. Dieses Konzept ist aus Kompatibilitätsgründen noch in der aktuellen Version enthalten, doch wird vom Hersteller empfohlen, auf die Tabellenpartitionierung zu wechseln.
In der englischen Literatur werden dafür die Begriffe ‚Indexpartitioned‘ oder – um es noch deutlicher auszudrücken – ‚index-controlled partitioned‘ verwendet.
Bei der Indexpartitionierung wird bei der Definition eines Tabellenbereiches die Anzahl der Partitionen festgelegt. In diesem Tabellenbereich kann nur eine einzige Tabelle angelegt werden, die einen Primärschlüssel haben muss. Es muss ein eindeutiger (unique) Index angelegt werden, der zum Primärschlüssel passt. Bei der Indexdefinition wird der Verteilschlüssel festelegt, nach dem die Daten auf die einzelnen Partitionen aufgeteilt werden. Dieser Index bestimmt gleichzeitig die Sortierreihenfolge (Cluster-Order) der Daten und wird selber in den einzelnen Partitionen gespeichert.
Beispiel:
CREATE tablespace ts1 numpart 5 IN db01; CREATE TABLE t1 ( verkaufsdatum date, umsatz decimal(10,2), PRIMARY KEY(verkaufsdatum)) IN db01.ts1; CREATE UNIQUE INDEX i1 ON t1 (verkaufsdatum) cluster ( part 1 VALUES ('31.01.2007'), part 2 VALUES ('31.05.2007'), part 3 VALUES ('01.06.2007'), part 4 VALUES ('10.07.2007'), part 5 VALUES ('31.12.2007'));
In dem Beispiel ist db01 der Name der Datenbank, ts1 der Name des Tabellenbereichs, t1 der Name der Tabelle und i1 der Name des Index. Der Tabellenbereich wird für 5 Partitionen definiert. Die Partitionsobergrenzen werden bei der Indexdefinition festgelegt.
Der Nachteil bei der Indexpartitionierung ist, dass alle weiteren Indizes nicht partitioniert werden können. Dadurch ist eine separate Administration einzelner Partitionen stark eingeschränkt. Außerdem sind der Partitionierungs-Schlüssel, der Primärschlüssel und die Cluster-Reihenfolge untrennbar miteinander verbunden. Bei der Tabellenpartitionierung können diese drei Elemente unabhängig voneinander bestimmt werden.
Durch die Einführung der Tabellenpartitionierung der DB2 z/OS V8 sind vielfältige Gestaltungsmöglichkeiten für das Index-Design entstanden. In der DB2 LUW V9 können Indices noch nicht partitioniert werden. Die in der Literatur verwendeten englischen Begriffe sollen den deutschen Begriffen – falls vorhanden – zugeordnet werden und kurz beschrieben werden.
Eigenschaften von Indices, die zu partitionierten Tabellen erstellt werden
partitioned
(partitioniert) |
nonpartitioned
(nicht partitioniert) |
|
---|---|---|
partitioning
(partitionierend) |
*1 | *2 |
nonpartitioning
(nicht partitionierend) |
DPSI | *3 |
Bei der in früheren DB2 Versionen verwendeten Index-partitionierung einer Tabelle konnte nur der Primärschlüssel partitioniert werden. Das ist der Typ *1. Indices vom Typ *1 können natürlich in der aktuellen Version auch erstellt werden.
Weitere secondary Indices konnten in früheren Versionen nur als *2 oder *3 erstellt werden. Sie konnten aber nicht partitioniert sein. Die Verwendung eines DPSI ist erst in der DB2 z/OS V8 möglich.
Weitere Eigenschaften von Indices (betrifft Indices zu partitionierten Tabellen und auch Indices zu nicht partitionierten Tabellen)
Die Stored Procedure Engine in DB2 implementiert eine Teilmenge von ISO-standardisiertem SQLPM (SQL Persistent Modules). Sie ist ähnlich zu Oracle PL/SQL und unterstützt ROWTYPES, einfach strukturierte Tabellen und globale Variablen nicht.
Ebenfalls wie schon bei Oracle zu finden ist eine sehr weite DBMS-seitige C++- und Java-Unterstützung. Es ist möglich, Java-Funktionalität in DB2 abzulegen (die Klasse muss vom IBM-Treiber eine bestimmte Klasse ableiten, je nach dem ob eine Funktion oder eine Prozedur erstellt werden soll) und von einer Stored Procedure aufzurufen.
RUNSTATS ist ein Utility zur Erzeugung von statistischen Daten über die Inhalte von DB2-Tabellen und deren Indizes. Zum Beispiel werden die minimalen und maximalen Werte einer Spalte und die Kardinalität der Spalten und der Tabelle ermittelt.
Abgelegt werden diese Daten im DB2-Systemkatalog, einer Sammlung von Tabellen, in denen DB2 Informationen über alle Objekte, wie Tabellen, Indizes, Spalten usw., ablegt (self descriptive, also „selbstbeschreibend“).
Das Datenbankverwaltungssystem nutzt diese statistischen Daten, um für die vom Anwender realisierten Zugriffe auf die DB2-Tabellen einen möglichst optimalen Zugriffspfad zu verwenden. Z. B. sind Index-Zugriffe in der Regel sinnlos, wenn die gesamte Tabelle nur wenige Zeilen enthält; ein einfaches Lesen aller Daten ist dann schneller. Neben den Daten für den Zugriffspfad (Optimizer) werden aber auch Daten für die Administration ermittelt, z. B. der Quotient der genutzten Speicherseiten oder der Komprimierungsgrad.
RUNSTATS sollte immer dann ausgeführt werden, wenn sich die Inhalte von Tabellen wesentlich geändert haben, oder wenn neue Indizes angelegt wurden. Danach müssen bei statischem SQL auch die verweisenden DB2-Packages neu gebunden werden, da darin die Zugriffswege abgelegt sind.
Das Werkzeug kann für Tabellenbereiche (Tablespace) oder Indizes ausgeführt werden und kann auch im Rahmen anderer administrativer Utilities eingebettet laufen (REORG, LOAD).
//RSTAT EXEC DSNUPROC,UID='JCA.RUNSTA',TIME=1440, // UTPROC=, // SYSTEM='V71A',DB2LEV=DB2A //UTPRINT DD SYSOUT=* //SYSIN DD * RUNSTATS TABLESPACE DSNXXX.DSNABCDE TABLE(ALL) SAMPLE 25 INDEX(ALL) SHRLEVEL CHANGE
Hier werden im Tablespace DSNXXX.DSNABCDE in allen Tabellen und Indizes 25 % der Zeilen untersucht (SAMPLE 25). Ein paralleler Update durch andere Prozesse ist erlaubt (SHRLEVEL CHANGE).
Unter Unix könnte ein Kommando so aussehen:
RUNSTATS ON TABLE beispielschema.beispieltabelle WITH DISTRIBUTION AND DETAILED INDEX
Mit dem Utility REORGCHK kann ermittelt werden, ob eine Reorganisation von Tabellen oder Indizes möglich ist. Zudem können in vereinfachter Form auch die Statistikdaten einer Tabelle in Analogie zum Utility RUNSTATS aktualisiert werden.
REORG ist ein Utility zur Reorganisation von DB2-Tabellen bzw. Indizes (Unix- und Windows-Version) oder Tablespaces (Mainframe). Dabei werden die Daten in einer optimalen Art und Weise auf dem permanenten Speicher abgelegt. Die optimale Weise wird über den Cluster-Index bestimmt. Die Speicherseiten werden optimal aufgefüllt und Zeilen, die nicht auf ihrer ursprünglichen Seite stehen (Far-Of-Page, Near-Of-Page), werden wieder an die bestmögliche Position verschoben.
Das Utility kann offline oder online arbeiten. Bei der Offline-Variante werden die Daten dem Clustering-Index entsprechend sortiert und in temporäre Dateien gespeichert. Der Tablespace wird dann neu angelegt und die Daten werden – nun sortiert – wieder in den Tabellenbereich eingetragen. Anschließend werden alle Indizes neu aufgebaut.
Bei der Online-Variante wird ein neuer Tablespace („Schattenkopie“) angelegt und die Daten werden sukzessive in den neuen Bereich sortiert übertragen. Zwischenzeitliche Änderungen werden anschließend aus dem Recovery-Log eingearbeitet, wobei eine Arbeitstabelle (Mappingtable) der Zuordnung von alten zu neuen internen Satzschlüsseln (Record Identifiers) dient. Sind alle Änderungen berücksichtigt, findet ein „Switch“ statt, nach dem die DB2 fortan auf den neuen Tabellenbereich zugreift. Der alte Bereich wird verworfen.
Zusätzlich zum Reorganisieren können Sicherungskopien