Architektur, SQL/PLSQL, Ablaufintegrität, Tuning Ing. Hermann Zauner Oracle 8i – Weiterführende Literatur Zauner Hermann 1998 – 2001 Ing. Hermann Zauner [email protected] 1. Auflage Umschlaggestaltung: Hermann Zauner Text, Abbildungen und Programme wurden mit größter Sorgfalt erarbeitet. Autoren können jedoch für eventuell verbliebene fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Dieses Dokument ist für Lernzwecke gedacht und darf in diesem Rahmen reproduziert werden. Weiterführende Literatur: Oracle 7 – Die verteilte semantische Datenbank Günther Stürner - dbms publishing – ISBN 3-930124-00-9 Oracle 8 für den DBA – Verwalten, optimieren, vernetzen Uwe Herrmann, Dierk Lenz, Günter Unbescheid Addison-Wesley – ISBN 3-8273-1310-4 Oracle 8 effizient einsetzen Andreas Christiansen, Michael Höding, Claus Rautenstrauch, Gunter Saake Addison-Wesley – ISBN 3-8273-1347-3 Oracle Magazin Danbankmodelle, Datenbanksprachen und Datenbank-Management-Systeme Gottfried Vossen – Addison-Wesley – ISBN 3-89319-566-1 Taschenbuch der INFORMATIK Werner u.a. – Fachbuchverlag Leipzig – ISBN 3-343-00892-3 Internet: www.oracle.at, www.oracle.com, www.oracle.de -2- Oracle 8i – Oracle Architektur 1. Zauner Hermann ORACLE ARCHITEKTUR ....................................................................................................................... 4 1.1 DIE PHYSISCHE STRUKTUR ........................................................................................................................ 4 1.1.1 Datenbank Files .............................................................................................................................. 5 1.1.2 REDO-Log Files.............................................................................................................................. 5 1.1.3 Kontrol Files ................................................................................................................................... 5 1.2 DIE LOGISCHE STRUKTUR .......................................................................................................................... 6 1.3 DIE TABLESPACE STRUKTUR ..................................................................................................................... 7 1.4 DIE SEGMENTE .......................................................................................................................................... 8 1.5 DIE BLOCKSTRUKTUR ............................................................................................................................... 9 1.5.1 DB-Block Kopf .............................................................................................................................. 10 1.5.2 DB-Block Datenbereich ................................................................................................................ 10 1.5.2.1 1.5.2.2 DB-Freibereich (PCTFREE)..................................................................................................................... 10 DB-Einfügebereich (PCTUSED).............................................................................................................. 10 1.5.3 FREE-DB-Block-Liste (FREELISTS)............................................................................................ 10 1.6 DIE DATENSATZSTRUKTUR ..................................................................................................................... 11 1.6.1 Datensatzkopf................................................................................................................................ 12 1.6.2 Datensatzrumpf ............................................................................................................................. 12 1.7 DIE PROZEß STRUKTUR ........................................................................................................................... 13 1.7.1 Database-Write Prozeß (DBWR) .................................................................................................. 13 1.7.2 REDO Log-Writer Prozeß (LGWR)............................................................................................... 14 1.7.3 Prozeß Monitor (PMON) .............................................................................................................. 15 1.7.4 SYSTEM Monitor (SMON) ............................................................................................................ 15 1.7.5 Archivier Prozeß (ARCH) ............................................................................................................. 15 1.8 DER DATENBANK-CACHE ....................................................................................................................... 16 1.8.1 DB-Block Puffer ............................................................................................................................ 16 1.8.2 Shared Pool................................................................................................................................... 16 1.8.3 Instance-Informationen ................................................................................................................. 16 2 SQL / PLSQL............................................................................................................................................. 17 2.1 SQL......................................................................................................................................................... 17 2.1.1 Historie.......................................................................................................................................... 17 2.1.2 Ausführung .................................................................................................................................... 17 2.1.2.1 2.1.2.2 2.1.2.3 2.1.2.4 2.1.2.5 2.1.2.6 Der Cursor ................................................................................................................................................ 17 Die Open-Phase ........................................................................................................................................ 18 Die Parse-Phase ........................................................................................................................................ 18 Die Execute-Phase.................................................................................................................................... 18 Die Fetch-Phase........................................................................................................................................ 18 Die Close-Phase........................................................................................................................................ 18 2.2 PLSQL .................................................................................................................................................... 19 2.2.1 Historie.......................................................................................................................................... 19 2.2.2 Ausführung .................................................................................................................................... 19 2.2.3 Beispiel.......................................................................................................................................... 19 2.3 SQL AUFGABE 1 ..................................................................................................................................... 20 3 ABLAUFINTEGRITÄT ........................................................................................................................... 21 3.1 SPERRMECHANISMEN .............................................................................................................................. 21 3.1.1 Sperrtypen ..................................................................................................................................... 21 3.1.2 Automatische Sperrmechanismen.................................................................................................. 21 3.1.3 Manuelle Sperrmechanismen ........................................................................................................ 22 3.2 DAS TRANSAKTIONSKONZEPT ................................................................................................................. 22 3.2.1 Transaktionsverarbeitung nach SQL92......................................................................................... 22 3.2.2 Transaktionssteuerung über mehrere abhängige Tabellen ........................................................... 23 4 LÖSUNGEN............................................................................................................................................... 26 4.1 SQL AUFGABE 1 ..................................................................................................................................... 26 -3- Oracle 8i – Oracle Architektur Zauner Hermann 1. Oracle Architektur 1.1 Die physische Struktur Eine Oracle DB besteht aus folgende Komponenten: • • • Beliebig viele Datenbank-Files, die auf beliebige Plattenlaufwerke verteilt werden können. Mindestens zwei REDO-Log-Files und Mindestens zwei Kontroll-Files Datenbank-Files File 1 File 2 File 3 File 4 Online Redo-Log Files Kontroll-Files Abbildung 1: Die physische Strukturelemente einer Oracle-Datenbank -4- Oracle 8i – Oracle Architektur Zauner Hermann 1.1.1 Datenbank Files In den Datenbank Files befinden sich alle Oracle Objekte . Sowohl das Oracle-DataDictionary als auch die vom Benutzer angelegten Datenstrukturen, Zugriffsstrukturen, prozedurale Objekte und die eigentlichen Daten werden hier verwaltet. 1.1.2 REDO-Log Files Man unterscheidet zwischen zwei Arten von REDO-Log Files: a) Online REDO Log Dienen dazu alle Datenänderungen, die innerhalb einer Transaktion durchgeführt werden, zu protokollieren und abzuspeichern. Der Schreibvorgang auf das REDO Log erfolgt erst, wenn die Transaktion (COMMIT) abgeschlossen wurde. Die Transaktion gilt erst dann als erfolgreich abgeschlossen, wenn alle Änderungen und die Information über das Transaktionende erfolgreich im REDO Log abgespeichert wurde. Um die Sicherheit zu erhöhen, können mehrere Online REDO Logs parallel betrieben werden. b) Offline REDO Log (optional) Archivierte Online Redo Logs (DB im ARCH Modus) 1.1.3 Kontrol Files In den Kontroll-Files werden die Grundstrukturen und Grundinformationen über eine OracleDB abgelegt. • • • • • Der Zeitpunkt der Datenbank-Erstellung Die Namen aller Datenbank-Files Die Namen aller REDO-Log Files und deren Sequenz-Nummern Zeitpunkt des letzten Checkpoints und zugehörige REDO-Log Files Datenbank-Strukturänderungen z.B. Vergrößern der Datenbank und vieles mehr -5- Oracle 8i – Oracle Architektur Zauner Hermann 1.2 Die logische Struktur Für das ORACLE-Datenbanksystem sind die Datenbankfiles lediglich Speicherlieferant, dem das ORACLE System seine eigene, für die Verwaltung großer Mengen von Daten optimale Struktur aufprägt. Logische Sicht Physische Sicht Tablespace A Tablespace B Tabelle 1 File 1 File 1 File 2 File 3 Abbildung 2: Zusammenhang zwischen logischer und physischer Sicht Ein DB-Objekt kann innerhalb eines Tablespaces wachsen, auch über Filegrenzen(File 1) und somit über Plattengrenzen hinweg. Ein DB-Objekt (Tabelle 1) kann sich jedoch nicht über Tablespacegrenzen hinweg ausdehnen. Vorteile dieser Strukturierung: • Fehlertoleranz gegenüber Plattenfehlern Datenbank Files sollten auf unterschiedliche Plattenlaufwerke verteilt werden und die Files eines Plattenlaufwerkes einem Tablespace zugeordnet werden, um beim Ausfall eines Plattenlaufwerkes den Schaden begrenzen zu können. • Performance kann gesteigert werden Sind Tabellendaten und dazugehörige Indexe auf unterschiedliche Tablespaces und somit auf verschiedene Plattenlaufwerken verteilt, kann in den meisten Fällen die Performance gesteigert werden. -6- Oracle 8i – Oracle Architektur Zauner Hermann 1.3 Die Tablespace Struktur I I D Tablespace Segmente Extents DB-Blöcke Datensatz Abbildung 3: Elemente eines Oracle Tablespaces Alle DB-Objekte, die innerhalb einer Oracle-DB angelegt werden, sind stets einem Tablespace zugeordnet. In welchem Tablespace das entsprechende DB-Objekt mit dem dazugehörigen Segment angelegt wird, hängt ab: • • • Auf welche Tablespaces der Benutzer, der das Objekt anlegt, Zugriff hat Mit welchen Privilegien der Benutzer, der das Objekt anlegt, ausgestattet ist Welche Optionen der create Befehl, der das Objekt erzeugt, beinhaltet. Ein neu angelegter Benutzer hat standardmäßig keine Tablespace Verbrauchsrechte. Charakteristika: • • • • Speicherplatzstruktur Verteilen der I/O Zugriffe Backup/Recovery Schema Platzverwaltung auf Benutzerebene Um einen Tablespace zu definieren siehe Segmente. -7- Oracle 8i – Oracle Architektur Zauner Hermann 1.4 Die Segmente Im wesentlichen können vier Objekt-Typen bzw. Segmentarten unterschieden werden: • • • • Tabellen (Datensegmente) Indices (Indexsegmente) Rollback-Segmente Temporäre-Segmente Wobei Temporäre-Segmente vom System angelegt werden. Tablespace B Initial TAB1 __ __ _ _____ __ __ _ _____ __ __ _ _____ Extent Block Extent Abbildung 4: Segmentstruktur Ein Segment besteht aus einem oder mehreren „extents“, das sind Speicherbereiche in bestimmbarer Größe, die einem Segment zugeordnet werden können. Dabei wird unterschieden zwischen einem Anfangs-Extent (initial extent), das bereits zum Erstellungszeitpunkt des Segments angelegt wird und beliebig viele Folge-Extents (next). Die Folge-Extents werden immer dann vom System erzeugt, wenn der bisherige allokierte Speicherplatz nicht ausreicht, um neue Datensätze aufzunehmen. Die Größe des Next-Extents eines Segmentes ist definierbar und kann zusätzlich mit einem Wachstums-Parameter (PCTINCREASE) versehen werden, der die Größe eines Next-Extents gegenüber dem Vorgänger-Extent entsprechend vergrößern kann. Jedes Extent wiederum besteht aus einer bestimmten Anzahl von ORACLE-Datenblöcken, die bei den meisten Implementierungen 2KB groß sind. -8- Oracle 8i – Oracle Architektur Zauner Hermann Gibt die Größe des ersten Extents eines Segmentes an Gibt die Größe des nächsten Extents des Segments an. Gibt die Anzahl der Extents an, die bereits bei der Erstellung eines Segments angelegt werden sollen. Gibt die maximale Anzahl von Extents an, die ein Segment besitzen kann Gibt den Wachstumsfaktor eines Extents in Prozent an. Ein Wert von 50 bedeutet, daß das jeweils nächste Extent um 50% gegenüber den Vorgängerextent vergrößert wird. (Empfehlung 0) Gibt die freelists eines Segmentes an Gibt die optimale Größe eines Rollback-Segments an. Nur für ein Roll.-Seg. definierbar. INITIAL NEXT MINEXTENTS MAXEXTENTS PCTINCREASE FREELISTS OPTIMAL • Alle Tablespaces anzeigen: Select * from user_tablespaces; • DB-Objekte und den dazugehörigen Tablespace anzeigen: Select * from user_tables; 1.5 Die Blockstruktur Man unterscheidet zwischen zwei Bereiche: • DB-Block Kopf und • Der DB-Block Datenbereich DB-Block Kopf PCTFREE Für sich vergrößernde Datensätze (Schlupf) Update Insert PCTUSED Abbildung 5: DB-Block Struktur -9- D A T E N B E R E I C H Oracle 8i – Oracle Architektur Zauner Hermann 1.5.1 DB-Block Kopf Der DB-Block enthält Verwaltungsinformationen wie zum Beispiel das Datensatz (Row)Directory, das für jeden Datensatz des betreffenden DB-Blockes 2Bytes reserviert und das Transaktions-Directory, das Informationen beinhaltet über die aktuellen Transaktionen. Ein einzelner Transaktionseintrag belegt dabei 23Bytes, wobei die Anzahl der TransaktionsEntires pro DB-Block durch die DB-Block Parameter INITRANS und MAXTRANS definiert werden. 1.5.2 DB-Block Datenbereich 1.5.2.1 DB-Freibereich (PCTFREE) Der notwendige Freibereich für „update“ Operationen kann mit dem „PCTFREE“ Parameter definiert werden. Dieser Parameter gibt an, wieviel Prozent des DB-Block-Datenbereiches als Freiplatz für sich vergrößernde Datensätze freigehalten werden soll. • Dynamische Tabellen 60% • Statische Tabellen 0-30% Kann eine „update“ Operation die gewünschte Änderung nicht innerhalb des Blockes durchführen, wird der betreffende Datensatz in einen neuen DB-Block oder in einen DBBlock mit genügend freiem Speicherplatz übertragen, um in diesem neuen DB-Block die Änderungen durchzuführen. Ein solcher Datensatz ist mit seinem ursprünglichen DB-Block verkettet. Der ursprüngliche DB-Block speichert dabei die neue Adresse (die neue ROWID) des Datensatzes unter der alten Datensatzadresse ab. Dadurch muß der Index bei einer Verkettung nicht geändert werden. 1.5.2.2 DB-Einfügebereich (PCTUSED) „Insert“ Operationen werden solange durchgeführt bis der verfügbare Platz im Block weniger als PCTFREE betragen würde. Sinkt der Datenbereich unter die PCTUSED Grenze so steht der DB-Block wieder für „Inserts“ zur Verfügung. Die Summe von PCTUSED + PCTFREE + ein Schlupf (10-30% ~ 1-2 Datensatzlängen) sollten nicht 100% übersteigen. Zu beachten ist, dass durch einen großen Schlupf und einen großen PCTFREE Freibereich die Speicherplatzausnützung verschlechtert wird. PCUSED + PCTFREE + 1ROW ≈100% 1.5.3 FREE-DB-Block-Liste (FREELISTS) In der FREE-Liste werden die partiell gefüllten DB-Blöcke verwaltet. DB-Böcke deren PCTFREE Wert noch nicht erreicht ist stehen in der FREE-DB-Block-Liste. Wird durch eine INSERT Operation der PCTFREE Wert unterschritten, wird der DB-Block aus der FREE-DB-Block-Liste entfernt und steht somit für „Inserts“ nicht mehr zur Verfügung. Fällt der aktuelle Füllgrad eines DB-Blockes durch „delete“ oder „update“ Operationen unter PCTUSED definierten Wert, wird dieser DB-Block wieder in die FREE-Liste aufgenommen. - 10 - Oracle 8i – Oracle Architektur Zauner Hermann Wird in der FREE-DB-Block-Liste kein genügend großer Speicherbereich gefunden, werden noch nicht benutzte DB-Blöcke des Segmentextents herangezogen und in die FREE-Liste eingetragen. Können nicht genügend DB-Böcke bereitgestellt werden, wird ein neues Extent aus dem aktuellen Tablespace angelegt. Da bei vielen Transaktionen sehr oft auf die FREE-Liste zugegriffen wird, ist es sinnvoll mehrere FREE-Lists im CREATE TABLE Befehl mit dem FREELISTS Parameter zu definieren. 1.6 Die Datensatzstruktur Man unterscheidet zwischen 2 Bereiche: • Datensatzkopf und • Datensatzrumpf Spaltenlänge 1 oder 3 Byte Datensatz Kopf Daten der Spalte Variabel (VARCHAR2) Fest (CHAR) Daten der einzelnen Spalten (Datensatzrumpf) Anzahl der Spalten 1Byte Kettenadresse für Sätze > Blöckgr. (Byte) Datensatz-Kopf 2Bytes Cluster Schlüssel (optional) 1Byte Abbildung 6: Datensatzformat - 11 - Oracle 8i – Oracle Architektur Zauner Hermann 1.6.1 Datensatzkopf Der Datensatzkopf enthält Verwaltungsinformationen: • Anzahl der Spalten innerhalb des Datensatzes • Verkettungsadressen, falls der Datensatz größer als ein DB-Block oder falls der Datensatz wegen zu kleinem DB-Block Freibereich in einen anderen DB-Block übertragen werden mußte. • Cluster-Schlüssel Informationen, falls der Datensatz zu einer geclusterten Tabelle gehört. Der Datensatzkopf besteht im Minimum aus drei Bytes und kann für geclusterte und verkettete Datensätze fünf Bytes als Maximum erreichen. 1.6.2 Datensatzrumpf Im Datensatzrumpf werden die eigentlichen Daten abgelegt. Die physische Spaltenreihenfolge muß nicht mit der logischen Reihenfolge, wie beim CREATE TABLE Befehl angegeben, übereinstimmen. Eine Spalte mit dem Type LONG oder LONG RAW wird stets an das physische Ende eines Datensatzes plaziert. Jedem Spaltenwert geht eine Spaltenlängeangabe oder Spaltenkopf voraus: • 1Byte: NUMBER, CHAR, DATE • 3Bye: VARCHAR2, VARCHAR, LONG, RAW und LONG RAW - 12 - Oracle 8i – Oracle Architektur Zauner Hermann 1.7 Die Prozeß Struktur Man unterscheidet zwischen mehreren Hintergrundprozessen: • • • • • Database-Write Prozeß Log Writer Prozeß Prozeß Monitor System Monitor Archivier Prozeß DATENBANK-CACHE (System Global Area) DB Puffer DBWR DB-Files REDO Puffer LGWR PMON REDO-Log Files Shared SQL Pool SMON Kontrol File ARCH Archivierte REDO-Log Files Abbildung 7: Die Prozeß Struktur 1.7.1 Database-Write Prozeß (DBWR) Der DBWR-Prozeß hat die Aufgabe, die bereits im DB-Cache geänderten Datenbank-Blöcke auf die Datenbank-Files zurückzuschreiben. Das Schreiben der durch eine Transaktion geänderten DB-Blöcke wird nicht unmittelbar bei Transaktionsende durchgeführt, sondern wird, um die DB-Böcke möglichst lange im DBCache zu halten und von beliebigen Prozessen nutzen zu können, erst durch bestimmte Ereignisse ausgelöst: - 13 - Oracle 8i – Oracle Architektur • • • • Zauner Hermann Ein Prozeß weitere DB-Böcke von den Datenbank-Files benötigt, aber der DB-Cache belegt ist. Anzahl der modifizierten DB-Blöcke innerhalb des DB-Caches zu groß wird. Wird ein bestimmter Prozentsatz überschritten, dann wird der DBWR-Prozeß aktiv. Wird der DBWR innerhalb einer bestimmten Zeit durch kein externes Ereignis aktiviert, dann wird DBWR von sich aus aktiv. (DBWR-Timeout ca. alle 3 Sekunden) Wird ein CHECKPOINT erreicht, dann werden alle modifizierten DB-Böcke auf die Datenbank-Files zurückgeschrieben. Es werden jene Blöcke zurückgeschrieben, die von Benutzerprozessen am wenigsten benutzt werden. Ein CHECKPOINT wird durch den Wechsel eines REDO-Log Files ausgelöst. Dieser wird duchgeführt, wenn ein REDO-Log File gefüllt ist oder wenn der CeckpointInitialisierungsparameter (LOG_CHECKPOINT_INTERVALL, LOG_CHECKPOINT_TIMEOUT) in der INIT.ORA erreicht ist. Im Normalfall sollte man die Initialisierungsparameter nicht ändern. Vor dem DBWR-Schreibvorgang wird stets der LGWR-Prozeß aktiviert. 1.7.2 REDO Log-Writer Prozeß (LGWR) Der LGWR-Prozeß hat die Aufgabe, den REDO-Log Puffer auf das REDO-Log File zu schreiben. Die Protokollierung der Transaktionen ist notwendig, um bei Fehlsituationen die Datenbank wieder in einen konsistenten Zustand bringen zu können, da die geänderten DB-Böcke nicht bei Transaktionsende auf die Datenbank-Files geschrieben werden. Im REDO-Log Puffer werden alle Datenbank-Änderungen, die innerhalb einer Transaktion im DB-Cache durchgeführt werden, protokolliert. Der REDO-Log Puffer enthält sowohl die neuen Datenwerte, als auch die ursprünglichen Datenwerte, die innerhalb der Rollbacksemgente aufbewahrt werden. Der LGWR-Prozeß wird durch folgende Ereignisse aktiviert: • • • Der aktuelle REDO-Log Puffer ist zu 80% gefüllt. Ein Benutzerprozeß signalisiert ein Transaktionsende. Der DBWR Prozeß signalisiert einen Schreibvorgang. Wird ein CHECKPOINT ausgeführt, hat der LGWR-Prozeß zusätzliche Aufgaben: • • • • Alle modifizierten DB-Blöcke des DB-Caches zu markieren. (DBWR) Alle File-Header der DB-Files bezüglich des Checkpoints zu aktualisieren. Den aktuellen REDO-Log Block auf das REDO-Log File zu schreiben. Dem DBWR-Prozeß den Checkpoint zu signalisieren, der daraufhin alle durch den LGWR-Prozeß markierten DB-Blöcke auf die DB-Files zurückschreibt. - 14 - Oracle 8i – Oracle Architektur Zauner Hermann Vorteile: • Performance kann gesteigert werden. DB-Blöcke können länger im DB-Cache gehalten werden • Systemsicherheit ist gewährleistet. Alle abgeschlossenen Transaktionen werden im REDO-Log File permanent gemacht 1.7.3 Prozeß Monitor (PMON) Der PMON-Prozeß hat die Aufgabe, abgebrochene Transaktionen aus dem System zu entfernen. Dazu müssen alle gesperrten Datensätze wieder freigegeben und alle von der offenen Transaktion durchgeführten Änderungen zurückgesetzte werden. Der PMON-Prozeß wird periodisch aktiviert und überprüft, ob abgebrochene Transaktionen existieren. Man spricht in diesem Zusammenhang auch von Prozess-Recovery. 1.7.4 SYSTEM Monitor (SMON) Der SYSTEM Monitor hat die Aufgabe, beim Starten der Oracle-Instanz zu überprüfen, ob es innerhalb der Datenbank noch offene Transaktionen gibt, oder ob Transaktionen vorhanden sind, die zwar abgeschlossen sind, deren Daten jedoch noch nicht in die Datenbank-Files geschrieben wurden. Folgende Gründe kommen in Frage: • • • Datenbank-Administrator schließt die Datenbank im IMMEDIATE- oder ABORT-Modus Zusammenbruch des DBMS oder des Betriebsystems Hardware-Fehler (kein Plattenfehler), Stromausfall Beim erneuten Starten der Datenbank-Instanz, nach einem der genannten Ereignisse, übernimmt der SMON-Prozeß das komplette Recovery. Mit Hilfe der Einträge im REDO-Log File werden alle Transaktionsschritte nachvollzogen, d.h. für alle abgeschlossenen Transaktionen werden die gültigen Daten in das Datenbank-File geschrieben und etwaige Daten in den Datenbakfiles von nicht abgeschlossenen Transaktionen werden zurückgesetzt. Nach Abschluß des Instance-Recovery Vorganges ist die Datenbank in einem konsistenten Zustand. 1.7.5 Archivier Prozeß (ARCH) Der ARCH-Prozeß ist ein optionaler Hintergrundprozeß, dessen Vorhandensein abhängt, ob die Oracle-Instanz im ARCHIVE-Modus gestartet wurde. Im Falle eines Datenverlustes, der durch einen Plattenfehler hervorgerufen wurde, kann die gesamte Datenbank mit Hilfe eines BACKUPs der betreffenden Datenbankfiles und der dazugehörigen Log-Files rekonstruiert werden. Dieses Sichern übernimmt der ARCH-Prozeß. Zusätzlich macht dieser noch die notwendigen Einträge in den Kontroll-Files, die im Falle eines Medium Recovery´s benötigt werden. - 15 - Oracle 8i – Oracle Architektur Zauner Hermann 1.8 Der Datenbank-Cache Der DB-Cache ist ein Hauptspeicherbereich, der von allen Benutzerprozessen, die mit dieser Oracle-Instanz arbeiten, benutzt werden kann. Alle Hintergrundprozesse, die für den Betrieb eines Oracle-Systems notwendig sind, nutzen diesen Hauptspeicherbereich sehr intensiv, einerseits um Datenblöcke oder Indexblöcke zu verändern, andererseits um Informationen untereinander auszutauschen. 1.8.1 DB-Block Puffer DB-Blöcke, die das Anwenderprogramm anfordert, werden in den DB-Cache gelesen, dort verarbeitet und dem Benutzerprozeß zur Verfügung gestellt. Ein bereits im DB-Cache befindlicher DB-Block kann nicht nur von dem Prozeß benutzt werden, der ihn ursprünglich angefordert hat, sondern steht allen Prozessen zur Verfügung. Es werden jene DB-Böcke aus dem DB-Cache entfernt, die am längsten nicht mehr benutzt wurden (Least Recently Used - Algorithmus). 1.8.2 Shared Pool Es wird unterschied zwischen einem „shared“ SQL und einem „privatem“ SQL Bereich. Innerhalb des „shared“ Bereiches des DB-Caches werden die geparsten SQL Befehle, compilierte Funktionen, Prozeduren, Data-Dictionary Informationen und Datenbank-Trigger gehalten. Im „privatem“ Bereich werden sessionorientierte (private) Informationen wie Werte der Bindevarible, Ausführungsstatus eines Befehls usw. abgelegt. Die im Shared Pool abgelegten Objekte unterliegen einem LRU-Algorithmus (s. 0). 1.8.3 Instance-Informationen Hier wird eingetragen, welche Resourcen gesperrt sind, in welcher Reihenfolge eine Warteschlange abgearbeitet wird, welche Transaktionen aktiv sind und welchen Status diese Transaktionen haben. Hierzu kann auch die Request-Queue und die Response-Queue bei einer MTS-Konfiguration gezählt werden. - 16 - Oracle 7,8 – SQL, PLSQL Zauner Hermann 2 SQL / PLSQL 2.1 SQL 2.1.1 Historie Die Geschichte der Datenbanksprache SQL steht in unmittelbarem Zusammenhang mit der Entwicklungsgeschichte des relationalen Datenbankmodells, das 1970 durch eine Forschungsabteilung der IBM entstand. Das Relationale Datenbankmodell brachte folgende Vorteile gegenüber den Hierarchischen Datenbanksystemen: • • • • Entlastung der Programmierer Datenunabhängigkeit der Programme Flexibilität der Datenstrukturen Benutzung auch durch den End-Benutzer Oracle wurde 1977 gegründet und bot mit der Version 2 die erste kommerziell verfügbare relationale SQL basierende Datenbank an. Auch IBM kündigte Anfang der 80er Jahre zwei relationale SQL-Datenbanksysteme an: SQL/DS für DOS/VSE- und VM- Maschinen und DB2 für MVS-Maschinen. 1986 wurde der erste Standart unter den Namen SQL1 bzw. SQL86 von der ISO herausgegeben. Ergänzungen erfolgten 1989, 1992 (SQL2) und 1999. SQL 1999 unterstützt Objektorientierung einschließlich Benutzer definierter Typen mit hierarchischer Vererbung, dynamischer Einsatzverteilung und vollständiger Einkapselung. Objekt/relationale Datenbanksysteme wie Oracle8i besitzen bereits diese Merkmale. Das Objektmodell von SQL 1999 ist ähnlich wie das von Java, und erleichtert damit die gemeinsame Nutzung beider Sprachen. Mit einem neuen Teil von SQL 1999, der 2000 veröffentlicht werden soll, können SQL-Befehle sogar in Java-Programme eingebettet werden. Weitere Fähigkeiten sind in Vorbereitung, um Java-Methoden in SQL-Code nutzen zu können. 2.1.2 Ausführung Die Abarbeitung eines SQL-Befehles erfolgt nicht in einem Stück, sondern in mehreren Phasen. 2.1.2.1 Der Cursor Der Cursor enthält den betreffenden SQL-Befehl als Zeichenkette, den Ausführungsplan des SQL-Befehls als Zeiger auf den Shared Pool sowie Zeitstempel- und Zustandsinformationen. Der Cursor wird stets als dynamisches SQL übergeben. Dies Bedeutet, dass die SQL-Befehle der Anwendungen dem ORACLE Server vor der Ausführung nicht bekannt sein müssen. - 17 - Oracle 7,8 – SQL, PLSQL Zauner Hermann 2.1.2.2 Die Open-Phase Hier wird lediglich die Datenstruktur des Cursors bereitgestellt und initalisiert. In einigen Programmierumgebungen wird die nachfolgende Parse-Phase automatisch beim Open ausgeführt 2.1.2.3 Die Parse-Phase Die Parse-Phase dient zur Vorbereitung der Ausführung eines SQL-Befehls. Wird der SQL-Befehl im Shared Pool gefunden und kann er verwendet werden, wird die Parse-Phase sofort erfolgreich beendet. Ansonsten erfolgt eine Syntaxüberprüfung, die Auswertung der betroffenen Datenbankobjekte (Tabellen, Views etc.) inklusive einer Zugriffsprüfung sowie die Bestimmung eines Ausführungsplans durch den Optimizer. Der Ausführungsplan und der SQL-Befehl werden im Shared Pool (1.8.2) abgelegt. Vor dem Ausführen des SQL-Befehls werden noch die Bindvariablen gebunden. 2.1.2.4 Die Execute-Phase Es wird ein Lesekonistenzzeitpunkt (SCN) im Cursor vermerkt. Es wird damit gewährleistet, dass ein SQL-Befehl immer lesekonsistent arbeitet, d.h. aus Sicht des Befehls haben sich die Daten seit Befehlsstart nicht verändert. Beim SELECT werden bei Sortierungen und Gruppierungen die Daten entsprechend aufbereitet und in einem Temporärbereich abgelegt. 2.1.2.5 Die Fetch-Phase Diese Phase wird ausschließlich für SELECT Befehle durchgeführt. In der Fetch-Phase werden die Daten an die Anwendung übertragen. Dabei wird entweder aus den Daten- und Indexblöcken oder aus dem in der Execute-Phase vorbereiteten Temporärbereich gelesen. ORACLE bietet auch die Möglichkeit die Ergebnisse in einem Array Fetch zu übertragen. Damit kann die Performance gesteigert und die Netzbelastung minimiert werden. 2.1.2.6 Die Close-Phase Wenn der Cursor nicht mehr gebraucht wird, kann er durch einen Close beendet und entfernt werden. - 18 - Oracle 7,8 – SQL, PLSQL Zauner Hermann 2.2 PLSQL 2.2.1 Historie Die Sprache PL/SQL wurde in starker Anlehnung an die Programmiersprache ADA definiert. Mit der Version 6 des ORACLE-Datenbanksystems wurde die Sprache PL/SQL als prozedurale Erweiterung von SQL eingeführt. Wesentliche Gründe waren: • • Komplexe datenbankorientierte Operationen sollten vollständig innerhalb des DatenbankServers durchgeführt werden können, ohne daß nach jeder SQL-Operation die Kontrolle an das Anwendungsprogramm zurückgegeben werden muß. (Performancegewinn) PL/SQL als Standard in allen ORACLE-Programmen, sowohl innerhalb des Servers als auch innerhalb der ORACLE Softwareentwicklungsumgebung. Erweiterungen in Oracle 8i • Manipulation mehrerer Datenelemente mit nur einer SQL-Anweisung (Bulk Binds) • Parameterübergabe per Referenz in PL/SQL • Eingebettetes dynamisches SQL in PL/SQL • Beschreibung des PL/SQL-Codes für Werkzeugeentwickler • Unbeschränkte PL/SQL-Paketgröße 2.2.2 Ausführung PL/SQL wird generell in einem P-Code übersetzt. Der P-Code ist darauf optimiert, möglichst schnell interpretiert werden zu können. Der P-Code wird zu allen gespeicherten PL/SQLProgrammeinheiten (Proceduren, Funktionen, Pakete, Trigger) im Data Dictionary abgelegt und muß zur Ausführung lediglich in den Shared Pool geladen werden. Befindet sich die Funktion etc. bereits im Shared Pool wird sie von dort geladen. 2.2.3 Beispiel DECLARE -- declaration section num_err NUMBER; num_varcol MV_TERMIN.terminid%TYPE; CURSOR my_cursor IS SELECT terminid FROM MV_TERMIN; BEGIN -- execution section dbms_output.put_line( 'HALLO WORLD'); OPEN my_cursor; LOOP FETCH my_cursor INTO num_varcol; EXIT WHEN my_cursor%NOTFOUND; END LOOP; IF my_cursor%ISOPEN THEN CLOSE my_cursor; END IF; EXCEPTION -- error section WHEN OTHERS THEN num_err := SQLCODE; END; - 19 - Oracle 7,8 – SQL, PLSQL Zauner Hermann 2.3 SQL Aufgabe 1 Richtigstellung (Ergebnis): Motivation: In der Tabelle t_master wurde irrtümlich für jede Buchung ein Master Datensatz (t_master) angelegt. Nun sollen die Daten laut Tabelle richtiggestellt werden. SQL> select * from t_master; ID PARTNERID ---------- ---------1 1 2 3 3 2 7 4 Aufgabenstellung: Löschen der doppelten Partnerdaten. Dabei sollen jene Datensätze mit dem kleinsten Schlüssel (id) erhalten bleiben. SQL> select * from t_buchung; Anweisung: Lösung mit möglichst wenigen SQL Befehlen und nach folgen Punkten. 1. SQL 86 2. SQL 92 3. PLSQL etc. ID BUCHUNGID ---------- ---------1 101 2 101 3 103 1 104 3 105 2 106 7 107 Lösungen an: [email protected] SQL> select * from t_master; Script: ID PARTNERID ---------- ---------1 1 2 3 3 2 4 1 5 2 6 3 7 4 drop table t_buchung; drop table t_master; create table t_master (id number(2) constraint masterid_pk primary key, partnerid number(12) not null); insert insert insert insert insert insert insert SQL> select * from t_buchung; ID BUCHUNGID ---------- ---------1 101 2 101 3 103 4 104 5 105 6 106 7 107 into into into into into into into t_master t_master t_master t_master t_master t_master t_master values values values values values values values (1,1); (2,3); (3,2); (4,1); (5,2); (6,3); (7,4); create table t_buchung (id number(2) constraint id_fk references t_master(id), buchungid number(12) not null, constraint buchung_pk primary key (id, buchungid) ); insert insert insert insert insert insert insert commit; into into into into into into into - 20 - t_buchung t_buchung t_buchung t_buchung t_buchung t_buchung t_buchung values values values values values values values (1,101); (2,101); (3,103); (4,104); (5,105); (6,106); (7,107); Oracle 7,8 – Ablaufintegrität Zauner Hermann 3 Ablaufintegrität 3.1 Sperrmechanismen 3.1.1 Sperrtypen EXCLUSIVE MODE (X) Die Tabelle ist exklusiv gesperrt. Andere Prozesse können jedoch lesend zugreifen SHARE MODE(S) Andere Prozesse können die Tabelle ebenfalls im SHARE Mode sperren und die Tabelle lesen, jedoch kann kein Prozeß Änderungsoperationen auf die Tabelle durchführen. ROW EXCLUSIVE(RX) Standard Sperrverhalten innerhalb Oracle, das beliebigen Prozessen RX-Locks gestattet. Beliebig viele Prozesse können gleichzeitig Änderungsoperationen auf die Tabelle durchführen. ROW SHARE(RS) Gestattet weiteren Prozessen RS- und RX Locks zu setzen. Andere Prozesse können die Tabelle lesen, jedoch nicht exclusiv (X) sperren. Zum UPDATE Zeitpunkt werden die RS-Sperren in eine RX-Sperre umgewandelt. SHARE ROW EXCLUSIVE(SRX) Andere Prozesse können die Tabelle lesen und im RS-Mode sperren. Exclusive Sperren (X) oder Share Sperren (S) sind nicht erlaubt. 3.1.2 Automatische Sperrmechanismen Bei ORACLE werden bei allen DML-Operationen (insert, update, delete) stets nur die von der Operation betroffenen Datensätze exklusiv (x) gesperrt. Während einer solchen Operation befindet sich die entsprechenden Tabellen im Datensatz (ROW) Exlusiv-Modus(RX). Da die RX-Sperre von beliebigen Prozessen geleichzeitig gehalten werden kann, können mehrere Prozesse gleichzeitig dieselben Tablle mit INSERT, UPDATE oder DELETE bearbeiten. Nur bei einer exclusiv(X) Sperre, muss der andere Prozess so lange warten bis die Sperre wieder aufgehoben wird. Operation Sperrmodus Sperrmodus Bemerkung Datensatz Tabelle SELECT Ein lesender Zugriff braucht keine Sperren INSERT, UPDATE, X RX Alle DML-Operationen sperren auf DELETE Satzebene DDL/DCL X ALLE DDL-Operationen (create, Befehle drop) sperren auf Tabellenebene Abbildung 8: Automatische Sperrmechanismen - 21 - Oracle 7,8 – Ablaufintegrität Zauner Hermann Die Implementierug des ORACLE-Sperrverfahrens basiert prinzipiell auf drei Komponenten: • Transaktionsverzeichnis innerhalb eines jeden DB-Blockes • System Change/Commit Number (SCN) • Transaktions-Tabelle Jede Transaktion, die gestartet wird, erhält eine eindeutige Transaktionsnummer (SCN), die innerhalb der Transaktionstabelle verwaltet wird. Alle Datensätze, die durch eine Transaktion geändert werden, erhalten die SCN dieser Transaktion. Ein Datensatz gilt als gesperrt, wenn die SCN für den betreffenden Datensatz mit einer aktiven, in der Transaktions-Tabelle befindlichen SCN übereinstimmt. Der Satz wird durch einen Commit oder Rollback wieder freigegeben, indem die SCN aus der Transaktionstabelle gelöscht wird. 3.1.3 Manuelle Sperrmechanismen Darüberhinaus besteht die Möglichkeit Datensätze oder Tabellen manuell zu Sperren Datensätze sperren: Select * from dual for update (nowait) Tabellen sperren: Lock table dual in exclusive [share, etc.] mode (nowait) Die Aktualität des Datensatzes am Client kann durch die Einführung eines Update-Counts oder durch einen Timestamp überprüft werden. Wurde der Datensatz von einem anderen Benutzer verändert, so muss der Datensatz unter Umständen erneut eingelesen werden (Aktualisierung). 3.2 Das Transaktionskonzept Eine Transaktion kann jeweils nur vollständig durchgeführt werden, d.h. nach Beendigung einer Transaktion wird in allen Fällen ein konsistenter Datenbankzustand erreicht. Ist der Übergang zu einem neuen konsistenten Zustand nicht möglich, so muss die Transaktion vollständig zurückgesetzt (ROLLBACK) werden, um den alten konsistenten Zustand wiederherzustellen. 3.2.1 Transaktionsverarbeitung nach SQL92 Dirty Read Eine Abfrage greift auf nicht bestätigte Transaktionen zu und liefert daher falsche Ergebnisse Non-Repeatable Read Eine erneute Ausführung einer Abfrage führt zu unterschiedlichen Ergebnissen, da durch zwischenzeitlichen Änderungen (update) oder Löschen (delete) die Datensätze verändert wurden. Dabei sind die einzelnen Abfrageergebnisse konsistent, beziehen sich aber auf unterschiedliche Zeitpunkte, z.B. den jeweiligen Beginn der Abfrage Phantom Read Eine erneute Ausführung einer Abfrage führt zu einer unterschiedlichen Ergebnissmenge, da durch zwischenzeitlichen Datensätze eingefügt (insert) wurden. - 22 - Oracle 7,8 – Ablaufintegrität Zauner Hermann Oracle unterstützt dabei 2 Isolation Levels: Isolation Level Dirty Read Phantom Read Ja - Non-Repeatable Read Ja Ja Read Uncommited Read Commited (Oracle) Repeatable Read Serializable (Oracle) - - Ja - Ja Ja Abbildung 9: Isolation Level nach SQL92 Zusätzlich unterstützt Oracle noch den Modus read only. Wie Serializable Mode aber es kann ausschließlich nur lesend zugegriffen werden. Mit dem Befehl SET TRANSACTION kann die Transaktion in die verschiedene TransaktionsModi gebracht werden. 3.2.2 Transaktionssteuerung über mehrere abhängige Tabellen Eine Transaktion beeinflußt eine andere Transaktion bei einem fast zeitgleichen Transaktionsstart. Dazu wird eine Tabelle hz_main mit 1000 Datensätzen und eine abhängige Tabelle hz_detail mit 100 000 Datensätzen geladen. Anschließend liest die Transaktion update.sql die Anzahl der Detail-Sätze (hz_detail) für jeden MasterRecord. In der Zwischenzeit wird die Anzahl der Detail-Sätze durch die Transaktion insert2.sql erhöht. DECLARE -- declaration section err_num NUMBER; err_txt VARCHAR2(200); key1 NUMBER; key2 NUMBER; MAXD CONSTANT NUMBER := 100; BEGIN -- execution section FOR key1 in 1..1000 LOOP insert into hz_main values (key1, MAXD, null); FOR key2 in 1..MAXD LOOP insert into hz_detail values (key1, key2); END LOOP; END LOOP; COMMIT; EXCEPTION -- error section WHEN OTHERS THEN err_num := SQLCODE; err_txt := SQLERRM; ROLLBACK; dbms_output.put_line( err_txt ); insert into tmp_error values (err_num, err_txt); COMMIT; END; INSERT.SQL – Datenbefüllen der TEST-Tabellen - 23 - Oracle 7,8 – Ablaufintegrität Zauner Hermann DECLARE -- declaration section err_num NUMBER; err_txt VARCHAR2(200); num_err NUMBER; num_varcol hz_main.id1%TYPE; CURSOR my_cursor IS SELECT id1 FROM hz_main; BEGIN -- execution section OPEN my_cursor; LOOP FETCH my_cursor INTO num_varcol; EXIT WHEN my_cursor%NOTFOUND; UPDATE HZ_MAIN SET COUNT_NEW = (SELECT COUNT(*) FROM hz_detail WHERE id1 = num_varcol) WHERE id1 = num_varcol; END LOOP; IF my_cursor%ISOPEN THEN CLOSE my_cursor; END IF; COMMIT; EXCEPTION -- error section WHEN OTHERS THEN err_num := SQLCODE; err_txt := SQLERRM; ROLLBACK; dbms_output.put_line( err_txt ); insert into tmp_error values (err_num, err_txt); COMMIT; END; UPDATE.SQL INSERT INTO hz_detail values (500, 101); Commit; INSERT2.SQL INSERT2.SQL wird nach UPDATE.SQL ausgeführt. Die Transaktion INSERT2.SQL ist vor UPDATE.SQL mit einem COMMIT abgeschlossen d.h. die Änderungen der Tabelle hz_detail werden für die Transaktion UPDATE.SQL wirksam (aber niemals für den SELECT hz_main = READ COMMITED). Transaktion INSERT2.SQL UPDATE.SQL t Abbildung 10: Transaktionssteuerung anhand eines Bsp. - 24 - Oracle 7,8 – Ablaufintegrität SQL> Zauner Hermann select * from hz_main where count_new <> 100; ID1 COUNT_OLD COUNT_NEW --------- --------- --------500 100 101 Wie man sehen kann, wurde innerhalb der Transaktion UPDATE.SQL das Ergebnis verändert. Wenn man will, dass keine anderer Transaktion die eigene Transaktion beeinflussen kann, kann man die Tabelle mit dem Befehl LOCK TABLE hz_detail IN EXCLUSIVE MODE NOWAIT sperren, oder die Transaktion im Isolation Level Serializable mit dem Befehl SET TRANSACTION ISOLATION LEVEL SERIALIZABLE starten. - 25 - Oracle 7,8 – Ablaufintegrität Zauner Hermann 4 Lösungen 4.1 SQL Aufgabe 1 -- Lösung SQL Aufgabe 1 mit Oracle PLSQL -- (c) by Hermann Zauner 2/2001 Declare v_id number; buchung_record t_buchung%ROWTYPE; -- alle Buchungen die zu ändern sind cursor c1 is select id, buchungid from t_buchung where id not in (select min(id) from t_master group by partnerid); begin for buchung_record in c1 loop -- hole kleinsten Schlüssel pro Partner select min(id) into v_id from t_master where partnerid = (select partnerid from t_master where id = buchung_record.id); -- ändern der id in den buchungen update t_buchung set id = v_id where id = buchung_record.id and buchungid = buchung_record.buchungid; end loop; -- löschen der überflüssigen master sätze -- der geänderten buchungen delete t_master where id not in (select min(id) from t_master group by partnerid); end; - 26 - Oracle 7,8 – Ablaufintegrität Zauner Hermann Abbildungsverzeichnis: Abbildung 1: Die physische Strukturelemente einer Oracle-Datenbank Abbildung 2: Zusammenhang zwischen logischer und physischer Sicht Abbildung 3: Elemente eines Oracle Tablespaces Abbildung 4: Segmentstruktur Abbildung 5: DB-Block Struktur Abbildung 6: Datensatzformat Abbildung 7: Die Prozeß Struktur Abbildung 8: Automatische Sperrmechanismen Abbildung 9: Isolation Level nach SQL92 Abbildung 10: Transaktionssteuerung anhand eines Bsp. - 27 - 4 6 7 8 9 11 13 21 23 24