Db2
| |
---|---|
Basisdaten
| |
Entwickler | IBM |
Erscheinungsjahr | 1983[1] |
Aktuelle Version | 12 (Format invalid) |
Betriebssystem | IBM Mainframe (z/OS), Linux, Unix, Windows |
Programmiersprache | C, C++, Assemblersprache |
Kategorie | Datenbankmanagementsystem |
Lizenz | proprietär |
deutschsprachig | ja |
Db2-Seite bei ibm.com |
Db2 ist ein kommerzielles relationales Datenbankmanagementsystem (RDBMS) des Unternehmens IBM, dessen Ursprünge auf das System R und die Grundlagen von Edgar F. Codd vom IBM Research aus dem Jahr 1970 zurückgehen.
Das Datenbankmanagementsystem DataBase 2 (Db2) wird von IBM für verschiedene Plattformen vertrieben:
Es gibt die Produktlinie für IBM-Mainframes, auf denen sich aus dem Betriebssystem VSE über MVS und OS/390 das System für z/OS entwickelt hat.
Eine andere Linie entstand ursprünglich für das Betriebssystem OS/2. Diese Software ist in der Programmiersprache C geschrieben und bildete die Basis für die Varianten in den Betriebssystemen Linux, Unix und Windows (LUW).
Eine Variation ist eine in das Betriebssystem IBM i integrierte Lösung für IBM-Midrangesysteme (heutige Maschinenbezeichnung System i).
Die vierte Produktlinie betrifft die Betriebssysteme VSE und VM. Für diese gibt es zwar noch Support, aber keine neuen Versionen mehr. IBM rät den Kunden zu einem Wechsel auf andere Plattformen.
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).
Seit Februar 2006 gibt es eine kostenlose Community Edition[3] für Windows und Linux mit den folgenden Einschränkungen gegenüber den kommerziellen Versionen:
Diese Version hat keine Einschränkungen hinsichtlich der Größe der Datenbank und der Anzahl der Benutzer, ohne zusätzlichen Wartungsvertrag gibt es jedoch 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 kostenbasierter Anfrageoptimierer,[4] welches bei der Programmvorbereitung den Zugriff auf die betreffenden Tabellen festlegt. Dies beruht unter anderem auf den sogenannten Tabellenstatistiken, die mit dem Tool RUNSTATS periodisch aktualisiert werden können, berücksichtigt aber auch andere Kennwerte wie z. B. die Anzahl der CPUs und Hilfs-CPUs, den Systemzustand, die verfügbare Speichermenge und die physische 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.[5] Dadurch kann die Open-Source-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)).
Die graphische Oberfläche wurde ab der Version 10.1 abgelöst. Stattdessen kann der IBM Data Server Manager benutzt werden.
Das sogenannte Db2-EEE (sprich „triple E“, oder „trippel-Ih“) – ab der Version 8 „DPF“ (distributed partitioning feature) genannt – ist für größere Umgebungen, wobei die Datenbankpartitionen ü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 IBM die wichtigsten Manuals für Db2 V9 LUW in deutscher Sprache[8] 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[9] 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.
Tools, die unter der ISPF-Benutzeroberfläche laufen:
Tools, die auf einem Client z. B. unter Windows laufen und über Db2-Connect auf den Db2-Datenbankserver zugreifen:
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ächstgröß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 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 Rechnerknoten installiert wird, dann muss eine Datenbankpartitionierung eingesetzt werden. Das bedeutet, dass auf jedem Rechnerknoten eine (oder auch mehrere) Datenbankpartition eingerichtet wird. Ein einzelnes DBMS kann auf maximal 512 Rechnerknoten installiert werden.
Um die maximale Hardware-Leistung für ein DBMS zur Verfügung zu stellen, können für die einzelnen Rechnerknoten 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 die Zugriffsperformance durch Parallelverarbeitung zu erhöhen. Eines dieser Konzepte ist die Partitionierung.[10]
Datenbankpartitionierung gibt es nur für Db2 LUW. Es muss eingesetzt werden, wenn eine Db2-Instanz auf mehreren Rechnerknoten installiert wird. Auf jedem Rechnerknoten muss mindestens eine Datenbankpartition eingerichtet werden. Es kann auch eingesetzt werden, wenn die Db2-Instanz auf nur einem Rechnerknoten installiert ist. Bei einer Installation auf einem Rechnerknoten lohnt sich die Datenbankpartitionierung vor allem dann, wenn auf diesem mehrere Festplatten installiert sind. Auf jeder Festplatte kann eine eigene Datenbankpartition eingerichtet werden. Auf diese Weise kann eine gleichmäßige Verteilung der Daten auf mehrere Festplatten erreicht 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 bis p9.
Es werden die Partitionsgruppen g1 bis g6 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 Rechnerknoten verteilt werden.
Die Verteilung erfolgt implizit durch Generierung eines Partitionsschlüssels mittels eines Hash-Algorithmus. Das System wählt selbst 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 ab der Version 8 genutzt werden kann. Beim Db2 LUW steht sie ebenfalls ab der Version 8 zur Verfügung.
In der englischen Literatur werden dafür die Begriffe ‚table-controlled partitioned', ‚table partitioned‘ oder auch ‚data partitioned‘ 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))
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 ab der Version 8 alle Indices, die zu dieser Tabelle definiert werden, ebenfalls partitioniert werden. Wenn ein Index auch partitioniert wird, dann wird er nach denselben 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 Indices einer partitionierten Tabelle ebenfalls partitioniert sind, dann wird dadurch eine völlige Unabhängigkeit der einzelnen Tabellenpartitionen hergestellt. Eindeutige (UNIQUE) Indices können allerdings nur dann partitioniert werden, wenn sie alle partitionierenden Spalten enthalten; dies muss bei der Wahl des primary key berücksichtigt werden. Es kann dann 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 ‚index partitioned‘ 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. Bei der Indexdefinition wird der Verteilschlüssel festgelegt, nach dem die Daten auf die einzelnen Partitionen aufgeteilt werden. Dieser Index bestimmt gleichzeitig die Sortierreihenfolge (Cluster-Order) der Daten und er wird selbst nach dem gleichen Verteilschlüssel partitioniert gespeichert.
Beispiel:
create tablespace ts1
numparts 5
in db01;
create table t1
( ID integer not null,
verkaufsdatum date not null,
umsatz decimal(11,2),
primary key(ID) )
in db01.ts1;
create 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 Partitionierungsschlüssel und die Cluster-Reihenfolge untrennbar miteinander verbunden. Bei der Tabellenpartitionierung können diese Elemente unabhängig voneinander bestimmt werden.
Indices können in Db2 z/OS sowie in Db2 LUW ab Version 9.7 partitioniert werden. In Db2 LUW bis und mit V9.5 ist die Partitionierung von Indices nicht möglich. Die nachfolgenden Ausführungen über Indexpartitionierung beziehen sich also auf Db2 z/OS und Db2 LUW ab 9.7.
Durch die Einführung der Tabellenpartitionierung der Db2 z/OS V8 sind vielfältige Gestaltungsmöglichkeiten für das Index-Design entstanden. 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 Indexpartitionierung einer Tabelle konnte nur der Cluster-Index partitioniert werden. Das ist der Typ *1. Indices vom Typ *1 können natürlich in der aktuellen Version auch erstellt werden.
Wenn zu einer partitionierten Tabelle weitere Secondary Indices erstellt werden sollten, dann konnten diese bis zur Version 7 nur ohne Partitionierung, also als *2 oder *3 erstellt werden. Ab der Version 8 können alle Indices zu einer partitionierten Tabelle ebenfalls partitioniert werden. Zu einer partitionierten Tabelle können nach wie vor auch unpartitionierte Indices angelegt werden. Die Partitionsunabhängigkeit ist dann allerdings eingeschränkt.
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 PostgreSQL PL/pgSQL, allerdings werden beispielsweise ROWTYPES, einfach strukturierte Tabellen nicht unterstützt.
Wie Oracle und PostgreSQL bietet auch Db2 die Möglichkeit, weitere Sprachen datenbankseitig in gespeicherten Prozeduren (stored procedures) zu nutzen. Db2 bietet hier C++ und Java an.
RUNSTATS ist ein Utility zur Erzeugung von statistischen Daten über die Inhalte von Db2-Tabellen und deren Indices. 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, Indices, 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 Indexzugriffe 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 Indices 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 Indices 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’ //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 Indices 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. Indices (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 Indices 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 Db2 fortan auf den neuen Tabellenbereich zugreift. Der alte Bereich wird verworfen.
Zusätzlich zum Reorganisieren können Sicherungskopien (COPY) und statistische Daten (RUNSTATS) ermittelt werden.
//REORG EXEC DSNUPROC,UID=’JCA.REORG’,TIME=1440, // UTPROC=’’, // SYSTEM=’V71A’ //UTPRINT DD SYSOUT=* //SYSIN DD * REORG TABLESPACE DSNXXX.DSNABCDE
Hier wird der Tablespace DSNXXX.DSNABCDE reorganisiert.
Zur Feststellung der Notwendigkeit kann ein weiteres Utility herangezogen werden: REORGCHK.
Das Db2-Utility überprüft ob der Datenbankindex auf dem zu prüfenden Tablespace konsistent zu den Daten ist, auf die der Index angewendet wird. Das Utility protokolliert allerdings nur inkonsistente Zustände, beseitigt sie aber nicht und setzt auch keinen pending-status.
//STEP1 EXEC DSNUPROC,UID=’IUIQU1UQ.CHK1’, // UTPROC=’’, // SYSTEM=’DSN’ //SYSUT1 DD DSN=IUIQU1UQ.CHK3.STEP1.SYSUT1,DISP=(MOD,DELETE,CATLG), // UNIT=SYSDA,SPACE=(8000,(200,20),,,ROUND) //SYSIN DD * CHECK INDEX (ALL) TABLESPACE DSN8D81A.DSN8S81E //*
REBUILD INDEX muss nach einem Point-in-time Recovery für alle Tablespaces ausgeführt werden, sofern der Index nicht ebenfalls mit Imagecopy gesichert wird. In diesem Fall könnte stattdessen auch ein RECOVER INDEX auf den gleichen Zeitpunkt stattfinden.
//STEP1 EXEC DSNUPROC,UID=’IUIQU1UQ.RBLD’, // UTPROC=’’, // SYSTEM=’DSN’ //SYSUT1 DD DSN=&SYSUT1,DISP=(,DELETE), // UNIT=SYSDA,SPACE=(8000,(200,20),,,ROUND) //SYSIN DD * REBUILD INDEX (ALL) TABLESPACE DSN8D81A.DSN8S81E //*
Hier werden vom Tablespace DSN8S81E der Database DSN8D81A alle Indices neu aufgebaut.
Das Utility CHECK DATA überprüft die Verletzung von referentiellen Integritäten und Constraints. Wird eine solche Verletzung ermittelt, wird der entsprechende Tablespace in den „CHECK-pending“ Status versetzt. Optional können fehlerhafte Daten aus den Tablespaces gelöscht und in Fehlertabellen (exception tables) übertragen werden. Bevor ein CHECK DATA ausgeführt wird, sollte vorher ein CHECK INDEX auf diesen Tablespace laufen, damit sichergestellt ist, dass der Index korrekt ist, auf den sich das Utility bezieht. Verschlüsselte Tabellen können mit diesem Utility nicht geprüft werden, weil die Daten vor dem CHECK nicht entschlüsselt werden. CHECK DATA sollte nach einem conditional Restart oder einem Point-in-time Recovery für alle Tablespaces ausgeführt werden, bei denen sich voneinander abhängige Tabellen eventuell nicht synchronisiert haben.
//STEP11 EXEC DSNUPROC,UID=’IUIQU1UQ.CHK2’, // UTPROC=’’, // SYSTEM=’SSTR’ //SYSUT1 DD DSN=IUIQU1UQ.CHK2.STEP5.SYSUT1,DISP=(MOD,DELETE,CATLG), // UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND) //SORTOUT DD DSN=IUIQU1UQ.CHK2.STEP5.SORTOUT,DISP=(MOD,DELETE,CATLG), // UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND) //SYSERR DD DSN=IUIQU1UQ.CHK2.SYSERR,DISP=(MOD,DELETE,CATLG), // UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND) //SYSIN DD * CHECK DATA TABLESPACE DBIQUQ01.TPIQUQ01 SCOPE ALL AUXERROR INVALIDATE /*
Um den derzeitigen Status eines gestarteten Db2-Utilitys zu überwachen, gibt es das Kommando „Db2 DISPLAY UTILITY(*|$UTILID$)“. Ein Ergebnis ist dann folgendermaßen aufgebaut: JCL-Beispiel für Db2 (z/OS):
DSNU100I – DSNUGDIS – USERID = SAMPID MEMBER = DB1G UTILID = RUNTS PROCESSING UTILITY STATEMENT 1 UTILITY = RUNSTATS PHASE = RUNSTATS COUNT = 0 NUMBER OF OBJECTS IN LIST = n LAST OBJECT STARTED = m STATUS = STOPPED DSN9022I – DSNUGCC ’-DISPLAY UTILITY’ NORMAL COMPLETION
Erklärung des Feldes STATUS:
Die Funktionalität von Db2 kann mit sog. Extendern erweitert werden, die erweiterte Funktionalität für spezialisierte Datentypen anbieten.
Für effiziente Volltextsuche auf Spalten mit Textinhalten.
Für geografische Probleme (Flutzonenanalyse etc.)
Erweiterung zum Arbeiten mit Objekten auf RDBMS-Basis
Mit der Db2 LUW V9 wurde die Verarbeitung von XML-strukturierten Daten grundlegend geändert. Auch die Db2 z/OS V8 wurde um etliche Funktionen für die Verarbeitung von XML-Daten erweitert.
Der XML-Support in der SQL-Sprache wird inzwischen auch von der ISO beschrieben.[11]
Funktionen zur Abfrage von XML-Dokumenten und zur Extraktion der Information für die Speicherung in relationalen Tabellen:
Funktionen zur Generierung von XML-Dokumenten aus Datensätzen, die in relationalen Tabellen gespeichert sind: (Beispiele)
Für das Update von einzelnen Elementen eines XML-Dokuments liegt Ende 2008 weiterhin keine Standarddefinition vor, weshalb auch Db2 nur das Update von ganzen XML-Dokumenten erlaubt.[12]
Unterstützung der SQL-Erweiterungen für OLAP-Anwendungen. Beispiele:
[13] Im Zuge der Entwicklung der relationalen Benutzerschnittstelle „Structured Query Language“ (SQL) wurde IBM-intern der erste Prototyp, das sogenannte System R entwickelt (1975–1979), das 1977 erstmals bei einem IBM-Kunden installiert wurde. Aus diesen Erfahrungen wurde SQL/DS für DOS/VSE (heute z/VSE) und VM (heute z/VM) entwickelt.
Parallel hierzu wurde die eigenständige Produktlinie des Mainframe MVS (heute z/OS) vorangetrieben. Db2 wurde 1983 als Datenbanksystem für MVS herausgebracht und war damit (nach Oracle-Markteinführung bereits im Jahr 1979) das zweite verfügbare relationale DBMS am Markt.
1987 kündigte IBM ein Datenbankmanagementsystem für das Betriebssystem OS/2 an. 1991 wurde das DBMS ‚OS/2 Database‘ für OS/2 in die Produktpalette aufgenommen. Dieses DBMS ist der Vorläufer für die heutige Db2 UDB. 1993 wurde das DBMS unter dem Namen Db2 V1 für die Betriebssysteme OS/2 und AIX angeboten. Seit 1995 kann das DBMS auch unter Windows installiert werden.
Zwischenzeitlich existieren Db2-Produkte auf unterschiedlichen Systemplattformen wie Db2 Universal Database (UDB) for z/OS, Db2/VM/VSE, Db2 Universal Database (UDB) für LUW (AIX, HP-UX, Linux, Sun Solaris, Windows (XP/2000/2003)) und Db2 Universal Database (UDB) for iSeries (System i, ehemals AS/400).
Im Großrechnerbereich hat Db2 zu einem großen Teil das hierarchische Datenbanksystem IMS/DB von IBM abgelöst.
Im April 2009 schlossen EnterpriseDB und IBM einen Vertrag, um Oracle-Kompatibilität für die Db2 auf Basis einer EnterpriseDB-Technologie verfügbar zu machen.[14]
1983 wurde Db2 als Datenbanksystem für das Mainframe-Betriebssystem MVS herausgebracht.[15]
Version 3 (verfügbar seit Dezember 1993, Support bis März 2001)
Version 4 (verfügbar seit November 1995, Support bis Dezember 2001)
Version 5 (verfügbar seit Juni 1997, Support bis Dezember 2002)
Version 6 (verfügbar seit Juni 1999, Support bis Juni 2005)
Version 7 (verfügbar seit März 2001, Support bis Juni 2008)
Version 8 (verfügbar seit März 2004)
Version 9 (verfügbar seit März 2007)
Version 10 (verfügbar seit Oktober 2010)
Version 11 (verfügbar seit Juni 2016)
Neben Db2 bietet IBM mit Informix eine weitere kommerzielle Datenbank an. Nach dem Erwerb von Informix im Jahr 2001 gab es kurzzeitig den Plan, Informix mit Db2 zusammenzuführen, was eine gewisse Verunsicherung der Informix-Kunden auslöste. Dieser Plan wurde jedoch bald verworfen. Seitdem werden Informix und Db2 parallel weiterentwickelt und für unterschiedliche Einsatzbereiche positioniert. Allerdings wurden neue Technologien häufig in das jeweils andere System übernommen.