Oracle DBA-Wiki – verstehen, anwenden, nachschlagen

Dieses Wiki begleitet dich von den Grundlagen relationaler Datenbanken bis zu typischen Aufgaben der Oracle-Datenbankadministration. Du lernst den Aufbau von Oracle Database 19c kennen und erfährst, wie du mit SQL arbeitest, Datenbanken betreibst, Zugriffe absicherst und Sicherungen sowie Wiederherstellungen einordnest. Weitere Schwerpunkte sind Performance-Analyse und systematische Fehlersuche. Die Beispiele berücksichtigen Oracle Linux und Solaris.

In 53 Kapiteln findest du verständliche Erklärungen, Praxisbeispiele, SQL-Abfragen mit fiktiven Beispielausgaben sowie Übungen mit erläuterten Lösungen. Rezeptbuch, Diagnosekarten und Lexika unterstützen dich beim Nachschlagen. Über die Kapitelübersicht, die linke Navigation und die Suche gelangst du direkt zum gesuchten Thema.

Ergänzend stelle ich meine selbst entwickelte Maintenance Suite vor. Ich setze sie produktiv für unsere Oracle-Datenbanken ein und prüfe ihre Reports täglich auf Auffälligkeiten. Sie unterstützt mich dabei, den Zustand der Datenbanken zu beurteilen und Hinweise auf mögliche Probleme gezielt weiterzuverfolgen. Die Suite dient als zusätzliche Überwachung und ergänzt unser bestehendes Monitoring mit Checkmk (check_mk); sie ersetzt es nicht. Im Wiki zeigen statische Reports mit fiktiven Daten, wie die Suite aufgebaut ist und wie ihre Ergebnisse gelesen werden.

Erstellt von Marcus Garand
Version 11.16
Oracle 19c Standard Edition 2
Erstellt: 02.11.2026 15:27:20
Read-only Diagnosebeispiele
Aufrufe in diesem Browser: –
Meine Favoriten (0)

Mit dem Stern an einem Kapitel oder ausgewählten Unterabschnitt merkst du dir die Stelle. Hier kannst du sie direkt wieder öffnen.

Favoriten werden nur in diesem Browser gespeichert. Browserdaten löschen entfernt sie. Bei einer lokal geöffneten Datei oder einer neuen Adresse kann der Browser einen eigenen Speicher verwenden.

    So lernst du entspannter: Du musst nicht jede View, jeden Parameter und jeden Prozess auswendig lernen. Lies zuerst das Grundbild eines Kapitels, arbeite danach die Beispiele durch und nutze die Detailtabellen erst beim zweiten Durchgang oder zum Nachschlagen. Wenn ein Begriff noch unklar ist, spring ins Glossar und kehre anschließend zurück. Das Ziel ist nicht, möglichst viel Text zu schaffen, sondern Zusammenhänge zu verstehen.
    DBA-Tipp des Tages
    1. Oracle & RDBMS
    Tabellen, Schlüssel, Beziehungen und die Aufgaben einer relationalen Datenbank.
    2. Oracle Architektur
    Instanz, Datenbank, Speicher und Prozesse im Zusammenspiel.
    3. SQL-Verarbeitung & Optimizer
    Vom Absenden einer SQL-Anweisung bis zur Verarbeitung und Ergebnisausgabe.
    4. Oracle Net / Listener
    Verbindungen, Services und Listener verstehen und Verbindungsprobleme eingrenzen.
    5. Start- und Stopp-Phasen
    NOMOUNT, MOUNT, OPEN und die verschiedenen Arten des Herunterfahrens.
    6. Oracle Prozesse
    Server- und Hintergrundprozesse und ihre Aufgaben in der Instanz.
    7. Tabellen, Indizes & Constraints
    Daten mit Tabellen, Indizes und Integritätsregeln strukturieren.
    8. Oracle Storage intern
    Blöcke, Extents, Segmente, Tablespaces und Datendateien einordnen.
    9. Optimizer-Statistiken
    Wie Statistiken dem Optimizer helfen und wie du ihren Zustand beurteilst.
    10. Optimizer & Ausführungspläne
    Zugriffswege, Joins und Ausführungspläne lesen und einordnen.
    11. Transaktionen & Read Consistency
    COMMIT, ROLLBACK und konsistente Lesesichten verständlich erklärt.
    12. Benutzer, Rollen & Rechte
    Benutzerkonten, Rollen und Berechtigungen gezielt unterscheiden.
    13. Multitenant – CDB & PDB
    CDB, PDB, Container-Kontext und ihre Bedeutung für die Administration.
    14. Zugriffe & Auditing
    Anmeldung, wirksame Rechte, Audit-Regeln und Aufbewahrung nachvollziehbar prüfen.
    15. Verschlüsselung
    NNE, TLS und TDE unterscheiden; Schutzwirkung und Grenzen verstehen.
    16. Oracle Wallet – Einrichtung & Betrieb
    SEPS Schritt für Schritt einrichten: Befehle, Ausgaben, Bash, cron und Fehlersuche.
    17. Hardening
    Angriffsfläche verringern: Befund, gezielte Maßnahme und überprüfter Betrieb.
    18. Redo Logs
    Redo-Erzeugung, Log Switches, Archivierung und ihre Rolle bei Recovery.
    19. Sessions & Prozesse
    Sessions und zugehörige Prozesse finden und ihre Aktivität untersuchen.
    20. Locks & Blockierungen
    Blockierungen, Sperrketten und Deadlocks erkennen und unterscheiden.
    21. Hintergrundprozesse
    Die Aufgaben wichtiger Oracle-Hintergrundprozesse im Detail nachschlagen.
    22. SGA & PGA
    SGA und PGA, Speicherbereiche und typische Diagnosemöglichkeiten.
    23. UNDO & Flashback
    UNDO, konsistente Datenansichten und die Möglichkeiten von Flashback.
    24. Data Pump Export & Import
    Logische Exporte und Importe mit Data Pump verstehen und vorbereiten.
    25. Backup & Recovery
    Backup-Strategien, RMAN und Wiederherstellung anhand erklärter Abläufe lernen.
    26. Patchmanagement
    Oracle-Patches, Vorbereitung, Durchführung und Nachkontrolle einordnen.
    27. Oracle Scheduler
    Jobs, Zeitpläne und die Überwachung geplanter Datenbankaufgaben.
    28. NLS & Zeichensätze
    Spracheinstellungen, Datumsformate und Zeichensätze richtig einordnen.
    29. DBA Betriebscheck
    Eine strukturierte Routine für Zustandskontrolle und erste Diagnose.
    30. Wait Events
    Warteereignisse lesen und im Zusammenhang mit der Arbeitslast bewerten.
    31. Performance Tuning – Schwerpunkt
    Engpässe systematisch untersuchen, SQL-Aufwand messen und Verbesserungen prüfen.
    32. Execution-Plan-Trainer
    Ausführungspläne in sechs Lernstufen mit erläuterten Musteranalysen üben.
    33. DBA Troubleshooting & Notfallhandbuch
    Störungen strukturiert eingrenzen und nächste Diagnoseschritte ableiten.
    34. Praxis & Diagnosekarten
    Vom beobachteten Symptom zu passenden Prüfungen und weiterführenden Kapiteln.
    35. Betriebssystem, DBA-Werkzeuge & Loganalyse
    Oracle Linux und Solaris: Diagnosebefehle, Logs, Bash, vi und SQL*Plus.
    36. SQL-Grundlagen
    SELECT, Filter, JOINs, Gruppierungen und weitere SQL-Grundlagen mit Beispielen.
    37. JSON in Oracle
    Was JSON ist, wofür es gebraucht wird und wie Oracle mit Dokumenten arbeitet.
    38. APIs, REST & ORDS
    Schnittstellen, HTTP, REST und die Rolle von Oracle REST Data Services.
    39. Connection Pools
    Wie Anwendungen Datenbankverbindungen wiederverwenden und was DBAs prüfen können.
    40. Database Links
    Verbindungen zwischen Datenbanken, Namensauflösung und typische Fehlerquellen.
    41. PL/SQL-Grundlagen
    Prozeduren, Funktionen, Packages und grundlegende PL/SQL-Abläufe verstehen.
    42. SQL-Abfragen Test
    150 Aufgaben mit Lösungen: 90 Fragen mit steigender Schwierigkeit und 60 weitere Aufgaben.
    43. SQL-Rezeptbuch
    SELECT-Rezepte für typische DBA-Fragen mit erklärten Beispielausgaben.
    44. Welche View brauche ich?
    Passende Dictionary- und Performance-Views für eine konkrete Frage finden.
    45. DBA Praxislabor
    Praxisfälle anhand konkreter Beobachtungen, Diagnoseschritte und Lösungen bearbeiten.
    46. Prüfung & Quiz
    Mit 330 Fragen lernen und den Wissensstand in einer Prüfungssimulation prüfen.
    47. Wait Event Lexikon
    Wait Events mit Bedeutung, möglichen Ursachen und passenden Diagnoseansätzen.
    48. ORA-Fehler-Lexikon
    Oracle- und RMAN-Fehler mit Ursachen, Prüfschritten und Lösungsansätzen.
    49. Data Dictionary Explorer
    USER_-, ALL_-, DBA_- und CDB_-Sichten verstehen und gezielt nachschlagen.
    50. Dynamic Performance Views
    V$-Sichten zur Instanz und Laufzeit mit Erklärungen und SELECT-Beispielen.
    51. Weiterführende Links
    Offizielle Dokumentation und ergänzende Quellen für die weitere Recherche.
    52. Weitere Oracle-Technologien
    GoldenGate, Enterprise Manager, RAC und weitere Technologien im Überblick.
    53. Glossar & Abkürzungen
    Wichtige Begriffe und Abkürzungen kurz und verständlich nachschlagen.

    1. Datenbank-Grundlagen – von Tabellen bis Oracle Database

    Wie Tabellen aufgebaut sind, wie Daten zusammenhängen und wie Oracle Database in dieses Grundmodell passt.

    Lernkompass
    Einfach gesagt Du lernst zuerst, wie Tabellen, Zeilen, Spalten, Datentypen, Schlüssel und Beziehungen zusammenhängen.
    Warum ist das wichtig? Ohne dieses Grundbild bleiben spätere Begriffe wie SQL, Index, Constraint, Session oder Recovery schwer einzuordnen.
    Nach diesem Kapitel Du kannst eine einfache Tabelle lesen, wichtige Datentypen unterscheiden und Primary Key, Foreign Key sowie Tabellenbeziehungen erklären.

    Einführung: Eine Datenbank hält zusammengehörige Informationen so vor, dass Anwendungen sie gezielt speichern, wiederfinden und ändern können. Oracle Database ist die Software, die diese Arbeit organisiert. Im relationalen Modell werden Daten über Tabellen und Beziehungen beschrieben. Dieses Grundmodell ist für die Administration wichtig: Ohne es bleiben Meldungen über Tabellen, Schlüssel, Datentypen oder ungültige Werte schwer einzuordnen.

    Das Kapitel entwickelt den Wortschatz vom einzelnen Wert über Zeilen und Spalten bis zu verknüpften Tabellen. Du lernst, welche Regeln die Bedeutung der Daten sichern und warum ein fehlender Wert anders zu behandeln ist als eine Null. Die anschließenden Fachkapitel bauen darauf auf; Kenntnisse über Oracle-Prozesse oder Speicherverwaltung brauchst du hier noch nicht.

    Oracle 19c: fachliche Grundlage

    Deutschsprachiger Einstieg bei Oracle:

    Diese allgemeinen Einführungen sind keine Oracle-19c-Befehlsreferenz. Aussagen zu Syntax, View-Spalten, Editionen und Voraussetzungen werden anhand der versionsbezogenen technischen Handbücher geprüft.

    Ziel dieses Kapitels: Du sollst nach dem Lesen Datenbank, DBMS und RDBMS unterscheiden können. Außerdem sollst du verstehen, wie eine Tabelle aufgebaut ist, was wichtige Oracle-Datentypen bedeuten, was NULL ist und wie Primary Key, Foreign Key und Tabellenbeziehungen zusammenarbeiten. Die technische Vertiefung zu Tabellen, Constraints und Indizes folgt später in Kapitel 7.

    1. Was ist eine Datenbank?

    Zusammengehörige Daten werden als gemeinsamer Bestand verwaltet. Welche Angaben dazugehören und wie sie zusammenhängen, ergibt sich aus der fachlichen Aufgabe. Bei einer Bestellung sind beispielsweise ihr Kopf und ihre Positionen verschiedene, miteinander verbundene Informationen.

    Wenn im Alltag von „der Datenbank“ gesprochen wird, ist häufig das gesamte Datenbanksystem gemeint. Für das technische Verständnis unterscheiden wir die Daten und die verwaltende Software.

    2. Was ist ein DBMS?

    Ein DBMS verwaltet Datenbanken. Es stellt die Funktionen bereit, mit denen Daten angelegt, gelesen, geändert, geschützt und wiederhergestellt werden können.

    Das DBMS bildet damit die Schicht zwischen Anwendungen und den gespeicherten Daten. Anwendungen greifen nicht direkt auf beliebige Datenbankdateien zu, sondern kommunizieren über definierte Datenbankmechanismen.

    Zwei Grundbegriffe: Konsistenz bedeutet hier, dass festgelegte Datenregeln eingehalten werden, etwa eindeutige Kundennummern. Eine Transaktion fasst zusammengehörige Änderungen zu einer Arbeitseinheit zusammen, beispielsweise das Speichern einer Bestellung mit ihren Positionen. Details folgen im Transaktionskapitel.

    3. Was bedeutet RDBMS?

    Ein RDBMS ist ein relationales Datenbankmanagementsystem. Das relationale Modell organisiert Daten in Relationen, die in der Praxis typischerweise als Tabellen dargestellt werden.

    Eine Tabelle besteht aus Zeilen und Spalten. Tabellen können über gemeinsame Schlüsselwerte miteinander in Beziehung stehen. Dadurch lassen sich komplexe fachliche Zusammenhänge sauber modellieren.

    4. Wie ist eine Tabelle aufgebaut?

    Eine Tabelle speichert zusammengehörige Informationen. Sie besteht aus Spalten und Zeilen. Die Spalten beschreiben, welche Informationen gespeichert werden. Eine Zeile enthält die Werte für einen einzelnen Datensatz.

    Im folgenden neutralen Beispiel heißt die Tabelle KUNDE. Sie besitzt die Spalten KUNDEN_ID, NAME und ORT.

    KUNDEN_IDNAMEORT
    101Beispiel GmbHBerlin
    102Muster AGHamburg
    103Demo KGKöln
    Was sehe ich hier?

    Tabelle: KUNDE ist die gesamte dargestellte Datenmenge. Spalte: NAME beschreibt eine Eigenschaft. Zeile: Die Zeile mit der KUNDEN_ID 102 ist ein einzelner Datensatz. Wert: Hamburg ist der konkrete Inhalt der Spalte ORT in dieser Zeile.

    5. Datentypen – welche Werte darf eine Spalte enthalten?

    Jede Spalte besitzt einen Datentyp. Der Datentyp sagt Oracle, welche Art von Information in einer Spalte gespeichert wird. Text, Zahlen, Datum/Uhrzeit und Binärdaten werden unterschiedlich behandelt. Das ist wichtig, weil Oracle zum Beispiel mit Zahlen rechnen und Datumswerte zeitlich vergleichen kann.

    Für den Einstieg reichen die folgenden häufigen Oracle-Datentypen. Kapitel 1 soll nicht jeden Spezialdatentyp behandeln, sondern ein sicheres Grundverständnis schaffen.

    DatentypEinfach erklärtBeispiel
    VARCHAR2Text mit variabler LängeName, Ort, Bezeichnung
    CHARText mit fester Längekurzer Code mit fester Länge
    NUMBERGanze Zahlen oder DezimalzahlenMenge, Preis, laufende Nummer
    DATEDatum und Uhrzeit bis auf SekundenBestelldatum
    TIMESTAMPDatum und Uhrzeit mit Sekundenbruchteilengenauer Zeitstempel
    CLOBSehr großer Textlange Beschreibung
    BLOBGroße BinärdatenBild oder Binärdokument
    RAWBinäre Rohdatentechnischer Binärwert
    Wichtig bei Oracle DATE: Ein Oracle-DATE speichert nicht nur Jahr, Monat und Tag. Es speichert auch Stunde, Minute und Sekunde. Sekundenbruchteile gehören dagegen nicht zum Datentyp DATE.
    Was bedeutet VARCHAR2(100)?

    VARCHAR2 steht für Text mit variabler Länge. Die Zahl 100 legt die maximal erlaubte Länge fest. Ob diese Grenze in Bytes oder Zeichen interpretiert wird, hängt von der Längensemantik ab. Wichtig für den Einstieg: 100 bedeutet nicht, dass jeder gespeicherte Text automatisch 100 Zeichen lang ist.

    Nicht alles, was aus Ziffern besteht, ist fachlich eine Zahl: Eine Postleitzahl oder eine Artikelnummer kann nur Ziffern enthalten und trotzdem besser als Text modelliert werden. Entscheidend ist, was der Wert bedeutet und ob mit ihm gerechnet werden soll.
    CHAR und VARCHAR2 vergleichen:

    Wird der Wert AB in CHAR(5 CHAR) gespeichert, ergänzt Oracle drei Leerzeichen. In VARCHAR2(5 CHAR) bleibt er ohne diese Auffüllung zwei Zeichen lang. BYTE oder CHAR legen die Längensemantik ausdrücklich fest; ohne Angabe ist die bei der Definition wirksame Längensemantik zu beachten.

    6. NULL – wenn kein Wert vorhanden ist

    Oracle-Besonderheit: Eine leere Zeichenfolge wird in Oracle 19c bei Zeichenwerten wie NULL behandelt. Ein Leerzeichen ist dagegen ein Zeichen. Ob ein fehlender Wert erlaubt ist, bestimmt unter anderem NOT NULL; ein geeigneter Datentyp allein verlangt noch keinen Wert.

    NULL bedeutet vereinfacht: Es ist kein Wert vorhanden. NULL ist nicht die Zahl 0 und nicht das Wort „NULL“. Diese Unterscheidung ist wichtig, weil SQL mit einem fehlenden Wert anders umgeht als mit einem vorhandenen Wert.

    Ist zum Beispiel eine optionale Telefonnummer nicht gespeichert, kann die entsprechende Spalte NULL sein.

    Wie suche ich nach NULL?

    In SQL wird auf einen fehlenden Wert mit IS NULL beziehungsweise IS NOT NULL geprüft. Ein Vergleich wie = NULL ist nicht der richtige Weg. Die SQL-Logik dahinter wird in den späteren SQL-Kapiteln vertieft.

    Eine leer dargestellte Ergebniszelle beweist nicht, dass eine leere Zeichenfolge gespeichert ist. SQL-Clients können NULL ohne sichtbaren Text ausgeben. Für die fachliche Prüfung verwende IS NULL; die Darstellung allein reicht nicht.

    7. Primary Key – eine Zeile eindeutig erkennen

    Ein Primary Key, auf Deutsch Primärschlüssel, kennzeichnet jede Zeile einer Tabelle eindeutig. Im Beispiel kann KUNDEN_ID der Primary Key der Tabelle KUNDE sein. Die Nummer 101 darf dann nicht ein zweites Mal als Primary-Key-Wert vorkommen.

    Ein Primary Key kann aus einer einzigen Spalte oder aus mehreren Spalten bestehen. Die beteiligten Werte dürfen nicht NULL sein. Für den Einstieg reicht der Merksatz: Der Primary Key beantwortet die Frage: Welcher Datensatz ist das eindeutig?

    8. Foreign Key – Tabellen miteinander verbinden

    Ein Foreign Key, auf Deutsch Fremdschlüssel, stellt eine Beziehung zwischen Datensätzen her. Angenommen, es gibt neben KUNDE eine Tabelle BESTELLUNG. In BESTELLUNG kann die Spalte KUNDEN_ID als Foreign Key auf den Kunden verweisen, zu dem die Bestellung gehört.

    Ein Foreign Key verweist auf einen Primary Key oder einen passenden eindeutigen Schlüssel. Dadurch kann die Datenbank Regeln für die Beziehung zwischen den Tabellen durchsetzen. Vereinfacht: Der Primary Key identifiziert einen Datensatz; der Foreign Key stellt die Verbindung zu ihm her.

    Beim einfachen Fremdschlüssel BESTELLUNG.KUNDEN_ID muss jeder vorhandene Wert auf einen zulässigen Kunden verweisen. Ohne NOT NULL darf die Zuordnung fehlen. Soll jede Bestellung einem Kunden zugeordnet sein, ist zusätzlich NOT NULL erforderlich.

    9. Beziehungen zwischen Tabellen – 1:1, 1:n und n:m

    Eine Beziehung muss abgesichert werden: Ein Foreign Key allein erzeugt noch keine 1:1-Beziehung. Dafür ist auf der verweisenden Seite zusätzlich Eindeutigkeit nötig. NOT NULL entscheidet, ob die Zuordnung verpflichtend ist. Bei mehreren Bestellpositionen zum selben Artikel braucht das Modell eine eigene Positionsnummer oder einen anderen passenden Schlüssel.

    Tabellen werden getrennt, damit Informationen sinnvoll strukturiert und nicht unnötig wiederholt werden. Die Verbindung zwischen Tabellen beschreibt man häufig als Beziehung. Drei Grundformen sind besonders wichtig.

    BeziehungEinfach erklärtBeispiel
    1:1Auf beiden Seiten gehört ein Datensatz zu höchstens einem Datensatz der jeweils anderen Seite.Ein Benutzerkonto und eine dazu ausgelagerte Profileinstellung.
    1:nEin Datensatz auf der einen Seite kann mit mehreren Datensätzen auf der anderen Seite verbunden sein.Ein Kunde kann mehrere Bestellungen besitzen.
    n:mAuf beiden Seiten können mehrere Datensätze miteinander verbunden sein.Eine Bestellung kann mehrere Artikel enthalten; ein Artikel kann in vielen Bestellungen vorkommen.

    10. Schaubild – so hängen Tabellen zusammen

    KUNDE
    PK KUNDEN_ID
    NAME
    ORT
    1→n
    BESTELLUNG
    PK BESTELLUNG_ID
    FK KUNDEN_ID
    DATUM
    1→n
    BESTELLPOSITION
    PK, FK BESTELLUNG_ID
    PK POSITIONSNUMMER
    FK ARTIKEL_ID
    MENGE
    n←1
    ARTIKEL
    PK ARTIKEL_ID
    BEZEICHNUNG
    PREIS
    Was sehe ich hier?

    Ein Kunde kann mehrere Bestellungen besitzen. Eine Bestellung kann mehrere Bestellpositionen enthalten. Jede Bestellposition verweist auf einen Artikel. Die Tabelle BESTELLPOSITION verbindet damit Bestellungen und Artikel. Auf diese Weise lässt sich eine n:m-Beziehung sauber über eine Zwischentabelle abbilden.

    Gewähltes Beispielmodell: Der zusammengesetzte Primärschlüssel von BESTELLPOSITION besteht aus (BESTELLUNG_ID, POSITIONSNUMMER). Position 1 darf in unterschiedlichen Bestellungen vorkommen, innerhalb derselben Bestellung jedoch nur einmal. Derselbe Artikel kann dadurch in mehreren Positionen einer Bestellung stehen. Im Beispiel sind die Kunden-, Bestellungs- und Artikelzuordnungen verpflichtend; die Fremdschlüsselspalten benötigen dafür NOT NULL.

    11. Warum braucht eine n:m-Beziehung eine Zwischentabelle?

    Eine Bestellung kann mehrere Artikel enthalten. Gleichzeitig kann derselbe Artikel in vielen verschiedenen Bestellungen vorkommen. Beide Seiten haben also mehrere mögliche Partner. Das ist eine n:m-Beziehung.

    Warum werden die Informationen getrennt gespeichert? Im vorhandenen Kunden-/Bestellmodell gehört eine aktuelle Kundenangabe zum Kunden, eine Bestellangabe zur Bestellung und die Menge zur jeweiligen Position. Würde dieselbe Kundenangabe in jeder Bestellung wiederholt, könnte eine Änderung nur einen Teil der Kopien erreichen. Diese widersprüchlichen Kopien sind ein Grund für Normalisierung: Fakten werden nach ihrer fachlichen Abhängigkeit auf Tabellen verteilt und über Schlüssel verbunden. Ein Foreign Key sichert die Beziehung, beseitigt aber nicht automatisch ein ungünstiges Datenmodell. Bewusst gespeicherte historische Bestelldaten sind davon zu unterscheiden: Der damalige vereinbarte Preis ist ein anderer Sachverhalt als ein heutiger Stammdatenpreis. Oracle 19c.

    In einem relationalen Modell wird diese Beziehung typischerweise über eine dritte Tabelle aufgelöst. Im Beispiel ist das BESTELLPOSITION. Dort stehen die Verweise auf BESTELLUNG und ARTIKEL. Zusätzlich kann dort eine Information gespeichert werden, die genau zu dieser Verbindung gehört, zum Beispiel die MENGE.

    12. Constraints – Regeln für Daten

    Ein Constraint ist eine Regel, die Oracle für Daten überwachen kann. Dadurch wird nicht jede fachlich falsche Eingabe verhindert, aber wichtige strukturelle Regeln können direkt in der Datenbank abgesichert werden.

    ConstraintEinfach erklärt
    PRIMARY KEYIdentifiziert jede Zeile eindeutig und erlaubt für die Schlüsselspalten kein NULL.
    FOREIGN KEYSichert eine Beziehung zu einem passenden Schlüsselwert ab.
    UNIQUEVerhindert doppelte Kombinationen der betroffenen Werte; die genaue Behandlung von NULL wird in Kapitel 7 vertieft.
    NOT NULLVerlangt, dass in dieser Spalte ein Wert vorhanden ist.
    CHECKPrüft eine definierte Bedingung für die Daten.
    Abgrenzung zu Kapitel 7: Hier geht es nur um das Grundprinzip. Wie Oracle Constraints technisch speichert, welche Dictionary-Views dafür wichtig sind und wie Primary Keys, Foreign Keys und Indizes im Detail zusammenhängen, wird in Kapitel 7 erklärt.
    CHECK ersetzt NOT NULL nicht: CHECK (MENGE > 0) verhindert 0 und negative Mengen. Bei NULL ergibt die Bedingung UNKNOWN; das verletzt den CHECK-Constraint nicht. Soll jede Position eine positive Menge enthalten, werden CHECK und NOT NULL benötigt.

    13. JOIN – Informationen aus mehreren Tabellen gemeinsam lesen

    Voraussetzung: KUNDE und BESTELLUNG sind gedachte Lerntabellen, keine mitgelieferten Oracle-Tabellen. Das Beispiel benötigt vorhandene Tabellen und Leserechte. INNER JOIN liefert nur passende Paare: Ein Kunde ohne Bestellung erscheint nicht; ein Kunde mit zwei Bestellungen erscheint zweimal. TO_CHAR macht die Datumsanzeige unabhängig vom NLS_DATE_FORMAT, lässt hier aber bewusst die Uhrzeit weg.

    Weil zusammengehörige Informationen auf mehrere Tabellen verteilt sein können, muss eine Abfrage diese Tabellen bei Bedarf wieder verbinden. Dafür verwendet SQL einen JOIN.

    Das folgende Beispiel ist bewusst nur zum Lesen gedacht. Es verbindet Kunden und Bestellungen über die gemeinsame KUNDEN_ID.

    Was sehe ich hier?

    Dies sind die vollständigen Eingangsdaten des JOIN-Beispiels. Vergleiche für jede Bestellung die KUNDEN_ID mit der Kundentabelle. Sage zuerst voraus, welche Namen wie oft im Ergebnis erscheinen.

    KUNDE – fiktive Übungsdaten

    KUNDEN_IDNAMEORT
    101Beispiel GmbHBerlin
    102Muster AGHamburg
    103Demo KGKöln

    BESTELLUNG – fiktive Übungsdaten

    BESTELLUNG_IDKUNDEN_IDDATUM
    50011012026-10-01
    50021012026-10-02
    50031022026-10-03
    READ ONLY – einfacher JOIN
    SELECT k.name,
           b.bestellung_id,
           TO_CHAR(b.datum, 'YYYY-MM-DD') AS bestelldatum
    FROM kunde k
    JOIN bestellung b
      ON b.kunden_id = k.kunden_id
    ORDER BY b.bestellung_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. BESTELLDATUM wird durch TO_CHAR als Zeichenfolge im Format YYYY-MM-DD ausgegeben.

    NAMEBESTELLUNG_IDBESTELLDATUM
    Beispiel GmbH50012026-10-01
    Beispiel GmbH50022026-10-02
    Muster AG50032026-10-03

    So liest du das Ergebnis: In den gezeigten Eingangsdaten besitzt Kunde 101 die Bestellungen 5001 und 5002, Kunde 102 die Bestellung 5003. Deshalb erscheint Beispiel GmbH zweimal. Demo KG aus der Eingangstabelle besitzt in diesem Beispiel keine Bestellung und erscheint im INNER JOIN nicht.

    Was sehe ich hier?

    k und b sind kurze Aliasnamen für die beiden Tabellen. Die Bedingung nach ON beschreibt, welche Zeilen zusammengehören. Dadurch kann das Ergebnis den Namen aus KUNDE zusammen mit Bestellinformationen aus BESTELLUNG anzeigen. Die Daten müssen nicht in einer einzigen großen Tabelle gespeichert werden.

    Selbst üben – ohne Tabellen anzulegen:

    Die folgende vollständige SELECT-Anweisung erzeugt die Übungsdaten nur innerhalb dieser Abfrage. Die WITH-Teile benennen Zwischenergebnisse, keine dauerhaft gespeicherten Tabellen. Benötigt wird eine bestehende Oracle-Verbindung; eigene Lerntabellen sind nicht erforderlich.

    READ ONLY – JOIN mit eingebauten Übungsdaten
    WITH kunde (kunden_id, name, ort) AS (
        SELECT 101, 'Beispiel GmbH', 'Berlin' FROM dual
        UNION ALL SELECT 102, 'Muster AG', 'Hamburg' FROM dual
        UNION ALL SELECT 103, 'Demo KG', 'Köln' FROM dual
    ), bestellung (bestellung_id, kunden_id, datum) AS (
        SELECT 5001, 101, DATE '2026-10-01' FROM dual
        UNION ALL SELECT 5002, 101, DATE '2026-10-02' FROM dual
        UNION ALL SELECT 5003, 102, DATE '2026-10-03' FROM dual
    )
    SELECT k.name,
           b.bestellung_id,
           TO_CHAR(b.datum, 'YYYY-MM-DD') AS bestelldatum
    FROM kunde k
    JOIN bestellung b ON b.kunden_id = k.kunden_id
    ORDER BY b.bestellung_id;

    Fiktive Beispielausgabe:

    NAMEBESTELLUNG_IDBESTELLDATUM
    Beispiel GmbH50012026-10-01
    Beispiel GmbH50022026-10-02
    Muster AG50032026-10-03

    So liest du das Ergebnis: Zwei Bestellungen passen zu Kunde 101, eine zu Kunde 102. Kunde 103 fehlt, weil es für ihn keine passende Bestellung gibt. Vergleiche die drei Zeilen mit deiner Vorhersage.

    Einordnung der folgenden Abschnitte: Produktgeschichte und Systemvergleich ergänzen das technische Grundverständnis. Sie sind Orientierung und keine Freigabe von Funktionen anderer Oracle-Versionen.

    14. Das relationale Modell und Edgar F. Codd

    Das relationale Modell geht auf Edgar F. Codd zurück, der Anfang der 1970er-Jahre ein mathematisch geprägtes Modell für relationale Datenbanken formulierte.

    Ein zentraler Gedanke war die Trennung zwischen der logischen Sicht auf Daten und ihrer physischen Speicherung. Anwender sollten Daten über Beziehungen und Abfragen verwenden, ohne die physische Ablage im Detail kennen zu müssen.

    15. Was ist Oracle Database?

    Oracle Database ist ein kommerzielles relationales Datenbankmanagementsystem von Oracle. Es wird seit Jahrzehnten in geschäftskritischen Unternehmensumgebungen eingesetzt.

    Typische Einsatzbereiche sind große Fachanwendungen, ERP-Systeme, Finanzsysteme, Verwaltung, Produktionssysteme und andere Unternehmensanwendungen, in denen Verfügbarkeit, Konsistenz und kontrollierte Wiederherstellung wichtig sind.

    16. Die Entstehung von Oracle

    Oracle entstand in den 1970er-Jahren. Larry Ellison, Bob Miner und Ed Oates gründeten zunächst Software Development Laboratories. Das Unternehmen wurde später in Relational Software Inc. und danach in Oracle Systems Corporation beziehungsweise Oracle Corporation umbenannt.

    Oracle gehörte zu den frühen kommerziellen Anbietern, die das relationale Modell praktisch in ein marktfähiges Datenbanksystem überführten.

    17. Warum heißt das Produkt Oracle?

    Der Name Oracle geht auf ein frühes Projektumfeld der Gründer zurück. Der Begriff wurde schließlich zum Produkt- und später zum Unternehmensnamen.

    Heute bezeichnet Oracle sowohl das Unternehmen als auch zahlreiche Produkte und Dienste. Deshalb ist es hilfreich, konkret von Oracle Database zu sprechen, wenn das Datenbanksystem gemeint ist.

    18. Wichtige Stationen der Oracle-Geschichte

    Diese Auswahl erklärt historische Produktnamen und ist kein vollständiger Katalog aktuell angebotener Versionen. Die technische Referenz des Wikis bleibt Oracle 19c.
    1970er
    Gründung des Unternehmens und Entwicklung eines frühen kommerziellen relationalen Datenbanksystems.
    Oracle V2
    Frühe kommerzielle Oracle-Version. Die Bezeichnung V2 wurde verwendet, obwohl es keine regulär vermarktete V1 gab.
    Oracle 7
    Wichtige Enterprise-Generation mit stark wachsender Verbreitung.
    8i / 9i
    Die Generationen mit dem „i“ standen stark im Zeichen des Internet-Zeitalters.
    10g / 11g
    „g“ wurde mit Grid Computing verbunden.
    12c
    „c“ stand für Cloud; gleichzeitig gewann die Multitenant-Architektur an Bedeutung.
    18c / 19c
    Jahresbasierte Versionsbezeichnungen; Oracle 19c ist die langfristig unterstützte Version der 12.2-Produktfamilie.
    21c / 23ai
    Weitere moderne Generationen mit neuen Datenbank- und Entwicklungsfunktionen.

    19. Was bedeuten i, g, c und ai?

    Kürzel Historische Bedeutung Beispiel
    i Internet Oracle 8i, 9i
    g Grid Computing Oracle 10g, 11g
    c Cloud Oracle 12c
    ai Artificial Intelligence Oracle Database 23ai

    20. Oracle 19c einordnen

    Oracle Database 19c ist die langfristig unterstützte Version der 12.2-Produktfamilie. In diesem Wiki ist die offizielle Oracle-19c-Dokumentation die technische Referenz.

    Versionsübergreifende Grundbegriffe helfen bei der Orientierung. Daraus folgt jedoch nicht, dass Befehle, Funktionen und Einschränkungen in anderen Versionen unverändert gelten.

    21. Oracle-Editionen

    Oracle Database existiert in unterschiedlichen Editionen. Diese unterscheiden sich bei Funktionsumfang, Lizenzierung und Einsatzgrenzen.

    Für die grundsätzliche Einordnung sind vor allem Enterprise Edition und Standard Edition 2 bekannt. Welche Funktionen in welcher Edition verwendet werden dürfen, ist ein eigenes Lizenz- und Produktthema und sollte immer anhand der jeweils gültigen Oracle-Dokumentation geprüft werden.

    22. Oracle im Vergleich zu anderen relationalen Datenbanksystemen

    System Hersteller / Projekt Typische Einordnung
    Oracle Database Oracle Enterprise- und geschäftskritische Systeme, großes Funktions- und Administrationsspektrum.
    Microsoft SQL Server Microsoft Starkes Enterprise-System mit enger Integration in Microsoft-Umgebungen.
    PostgreSQL Open Source Leistungsfähiges, sehr verbreitetes Open-Source-RDBMS.
    MySQL Oracle Sehr verbreitet in Web-, Hosting- und Anwendungsumgebungen.
    MariaDB Community / MariaDB-Organisationen MySQL-verwandtes Open-Source-Datenbanksystem.
    IBM Db2 IBM Enterprise-Datenbanksystem, unter anderem stark in klassischen IBM-Umgebungen.
    Wichtig: Die Frage „Welches RDBMS ist das beste?“ ist zu pauschal. Auswahlkriterien sind unter anderem bestehende Anwendungen, Plattform, Know-how, Verfügbarkeit, Support, Lizenzierung, Kosten, Skalierungsbedarf und Unternehmensstrategie.

    23. Was haben moderne RDBMS gemeinsam?

    Strukturierte Daten Relationale Systeme organisieren Daten in Tabellen und Beziehungen.
    SQL SQL ist die zentrale Sprache für Abfragen und viele Datenbankoperationen.
    Transaktionen Änderungen werden kontrolliert und konsistent verarbeitet.
    Mehrbenutzerbetrieb Viele Benutzer und Anwendungen können gleichzeitig auf dieselben Daten zugreifen.
    Rechte und Sicherheit Zugriffe können kontrolliert und eingeschränkt werden.
    Recovery Moderne RDBMS besitzen Mechanismen zur Wiederherstellung nach Fehlern.

    24. Was unterscheidet Oracle?

    Oracle Database stellt Funktionen für Datenverwaltung, Transaktionen, Sicherheit und Wiederherstellung bereit. Die Verfügbarkeit und zulässige Nutzung einzelner Funktionen hängen von Edition und Lizenzierung ab.

    Oracle-Administration erfordert Wissen über Betrieb, Performance, Recovery und Sicherheit. Die folgenden Kapitel erklären diese Aufgaben anhand von Oracle 19c.

    25. SQL ist nicht Oracle

    SQL ist eine Sprache beziehungsweise ein Standard für relationale Datenbanksysteme. Oracle Database ist ein konkretes RDBMS, das SQL unterstützt und eigene Erweiterungen besitzt.

    Deshalb ist eine SQL-Anweisung nicht automatisch auf jedem RDBMS identisch. Syntax, Funktionen, Datentypen, Optimizer-Verhalten und administrative Erweiterungen können sich unterscheiden.

    SQL ist die Sprache. Oracle Database ist das Datenbanksystem. PL/SQL ist wiederum Oracles prozedurale Erweiterung rund um SQL.

    26. Datenbank, Datenbankserver und Anwendung unterscheiden

    Eine Fachanwendung und eine Datenbank sind nicht dasselbe. Die Anwendung stellt Benutzeroberfläche und Fachlogik bereit. Das Datenbanksystem verwaltet die dauerhaft gespeicherten Daten.

    Anwendung Fachliche Oberfläche und Geschäftslogik.
    Datenbanksystem Verwaltet Daten, Zugriffe, Transaktionen und Konsistenz.
    Server / Plattform Betriebssystem und Infrastruktur, auf denen Datenbanksoftware ausgeführt wird.

    27. Was macht ein DBA?

    Ein DBA sorgt dafür, dass Datenbanken verfügbar, sicher, nachvollziehbar und wiederherstellbar betrieben werden. Die konkrete Rolle unterscheidet sich je nach Unternehmen.

    Betrieb und Verfügbarkeit Datenbankzustände, Dienste und Betriebsstabilität überwachen.
    Backup und Recovery Sicherstellen, dass Daten im Fehlerfall wiederhergestellt werden können.
    Performance Engpässe analysieren und technische Ursachen nachvollziehbar belegen.
    Kapazität Speicher-, Prozess- und Ressourcenentwicklung beobachten.
    Sicherheit Rechte, Benutzer und technische Schutzmechanismen kontrollieren.
    Dokumentation und Troubleshooting Störungen reproduzierbar untersuchen und Betriebswissen dokumentieren.

    28. Warum Unternehmen DBAs brauchen

    Daten sind in vielen Unternehmen geschäftskritisch. Ein Datenverlust, lange Ausfallzeiten oder inkonsistente Daten können erhebliche fachliche und wirtschaftliche Folgen haben.

    Der DBA verbindet deshalb Datenbanktechnik mit Betriebsverantwortung. Er bewertet Risiken, plant Recovery, überwacht Kapazitäten und sorgt dafür, dass technische Entscheidungen nachvollziehbar bleiben.

    29. Begriffe, die du nach Kapitel 1 kennen solltest

    Begriff Kurzdefinition
    DatenbankStrukturierte, dauerhaft gespeicherte Datensammlung.
    DBMSSoftware zur Verwaltung von Datenbanken.
    RDBMSRelationales Datenbankmanagementsystem.
    RelationMathematischer Grundbegriff hinter der tabellarischen Darstellung.
    SQLSprache zur Arbeit mit relationalen Datenbanksystemen.
    Oracle DatabaseRelationales Datenbanksystem des Herstellers Oracle.
    DBADatabase Administrator; verantwortlich für Betrieb und Administration von Datenbanken.

    30. Typische Missverständnisse

    Aussage Bewertung Korrekte Einordnung
    Oracle und SQL sind dasselbe. Falsch SQL ist die Sprache, Oracle Database ein konkretes RDBMS.
    Eine Datenbank ist einfach eine große Datei. Falsch Ein DBMS verwaltet Struktur, Transaktionen, Rechte, Konsistenz und Recovery.
    Ein RDBMS speichert nur Tabellen. Zu kurz gedacht Ein RDBMS verwaltet wesentlich mehr als reine Tabellenspeicherung.
    Ein DBA programmiert primär die Fachanwendung. Falsch Die Kernaufgabe liegt im sicheren und stabilen Datenbankbetrieb.
    Alle relationalen Datenbanken funktionieren intern identisch. Falsch Sie teilen Grundkonzepte, unterscheiden sich aber deutlich in Implementierung und Administration.

    31. Blick über den Tellerrand: andere Datenbankmodelle

    Neben dem relationalen Modell gibt es beispielsweise dokumentenorientierte, Schlüssel-Wert- und Graphmodelle. Sie strukturieren und verknüpfen Informationen auf unterschiedliche Weise.

    Davon zu unterscheiden sind die Speicherorganisation und der Einsatzzweck: Spaltenorientierung beschreibt eine Art der Datenablage. Ein Data Warehouse dient der analytischen Auswertung und kann auf einem relationalen Datenbanksystem beruhen. Diese Begriffe bezeichnen deshalb nicht dieselbe Kategorie.

    32. Wo geht es technisch weiter?

    Ab Kapitel 2 beginnt die technische Vertiefung. Dort wird die Oracle-Architektur schrittweise erklärt. Speicher, Prozesse, Redo, Sessions, Locks, SQL, Performance und Recovery werden jeweils in eigenen Kapiteln behandelt.

    Nach Kapitel 1 solltest du erklären können:
    Du kannst Datenbank, DBMS und RDBMS unterscheiden, Tabellen lesen, wichtige Datentypen einordnen und NULL von vorhandenen Werten unterscheiden. Du kannst das Zusammenspiel von Primär- und Fremdschlüsseln sowie Tabellenbeziehungen erklären und die JOIN-Ausgabe nachvollziehen. Produktgeschichte und DBA-Berufsbild ergänzen dieses Grundverständnis.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Tabellen speichern Daten in Zeilen und Spalten. Datentypen legen fest, welche Werte eine Spalte aufnehmen kann; NULL kennzeichnet einen fehlenden Wert.
    2. Primärschlüssel identifizieren Zeilen, Fremdschlüssel sichern Beziehungen zwischen Tabellen. Constraints setzen Regeln für gültige Daten durch.
    3. Eine n:m-Beziehung benötigt eine Zwischentabelle. Eine passende Aufteilung der Daten vermeidet unnötige Wiederholungen und widersprüchliche Änderungen.
    4. SQL ist die Sprache für die Arbeit mit relationalen Datenbanken. Oracle Database ist ein konkretes Datenbankmanagementsystem, das diese Sprache bereitstellt.
    5. Ein DBA sorgt für einen verlässlichen Datenbankbetrieb. Dazu gehören Verfügbarkeit, Berechtigungen, Datensicherung, Kapazität und die nachvollziehbare Untersuchung von Störungen.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Was unterscheidet ein DBMS von einer einfachen Dateiablage?
    Ein DBMS verwaltet strukturierte Daten, gleichzeitige Zugriffe, Rechte, Transaktionen, Konsistenz und Wiederherstellung. Eine reine Dateiablage bietet diese Datenbankfunktionen nicht in vergleichbarer Form.
    Frage 2: Was bedeutet relational?
    Daten werden nach dem relationalen Modell in Relationen organisiert und können über gemeinsame Werte in Beziehung gesetzt werden.
    Frage 3: Warum ist SQL nicht dasselbe wie Oracle?
    SQL ist eine Sprache. Oracle Database ist ein konkretes relationales Datenbanksystem, das SQL unterstützt und eigene Erweiterungen besitzt.
    Frage 4: Warum gibt es nicht das eine beste RDBMS?
    Unterschiedliche Systeme haben unterschiedliche Stärken. Die Auswahl hängt unter anderem von Anwendungen, Plattform, Know-how, Betrieb, Support, Kosten und Unternehmensstrategie ab.
    Frage 5: Welche grundlegende Verantwortung hat ein DBA?
    Ein DBA sorgt dafür, dass Datenbanken stabil, verfügbar, sicher, performant und wiederherstellbar betrieben werden.
    Frage 6: Warum kann eine Postleitzahl als Text sinnvoller sein als NUMBER?
    Sie ist ein Kennzeichen, keine Rechengröße. Text bewahrt beispielsweise führende Nullen.
    Frage 7: Enthält Oracle DATE eine Uhrzeit?
    Ja, Stunde, Minute und Sekunde; Sekundenbruchteile gehören nicht zu DATE.
    Frage 8: Wie unterscheiden sich CHAR(5 CHAR) und VARCHAR2(5 CHAR) beim Wert AB?
    CHAR ergänzt drei Leerzeichen. VARCHAR2 speichert den Wert ohne diese Auffüllung.
    Frage 9: Darf der einfache Fremdschlüssel BESTELLUNG.KUNDEN_ID NULL sein?
    Ja, ohne eine zusätzliche NOT-NULL-Regel. Ein Fremdschlüssel allein erzwingt keine Pflichtzuordnung.
    Frage 10: Verhindert CHECK (MENGE > 0) einen fehlenden Wert?
    Nein. NULL führt hier zu UNKNOWN und verletzt CHECK nicht. Für einen verpflichtenden positiven Wert ist zusätzlich NOT NULL erforderlich.
    Frage 11: Warum erscheint Beispiel GmbH zweimal, Demo KG aber gar nicht?
    Zwei Bestellungen passen zu Kunde 101. Für Kunde 103 gibt es keine Bestellung; INNER JOIN liefert nur passende Zeilenpaare.
    Frage 12: Was identifiziert eine Bestellposition in unserem Modell eindeutig?
    Die Kombination aus BESTELLUNG_ID und POSITIONSNUMMER. Beide Spalten bilden gemeinsam den Primärschlüssel.

    2. Oracle Architektur – das Gesamtbild verstehen

    Instance und Database unterscheiden, die wichtigsten Ebenen einordnen und ihr Zusammenspiel verstehen.

    Lernkompass
    Einfach gesagt Oracle besteht aus einer laufenden Instance und einer dauerhaft gespeicherten Database. Weitere Komponenten verbinden Benutzer, Prozesse, Speicher und Dateien zu einem Gesamtsystem.
    Warum ist das wichtig? Wer die Ebenen der Architektur unterscheiden kann, kann spätere Fachthemen und Fehlersituationen wesentlich leichter einordnen.
    Nach diesem Kapitel Du kannst die grundlegenden Oracle-Komponenten benennen, Instance und Database unterscheiden und ihren Platz im Gesamtbild erklären.

    Einführung: Oracle-Architektur bezeichnet das Zusammenspiel der Bausteine, die Daten speichern und Anfragen verarbeiten. Die wichtigste Orientierung ist die Trennung zwischen laufender Instanz und dauerhaft gespeicherter Datenbank: Arbeitsspeicher und Hintergrundprozesse ermöglichen den Betrieb, während Datenbankdateien den persistenten Bestand bilden. Eine vorhandene Datei beweist daher ebenso wenig einen funktionierenden Dienst wie ein gestarteter Prozess eine vollständig geöffnete Datenbank.

    Hier entsteht die Übersicht, in die du spätere Detailthemen einordnest. Wir verfolgen den Weg vom Client über die Verbindung zur Verarbeitung und zur Speicherung. Danach kannst du bei einer Beobachtung zunächst die betroffene Ebene benennen. Die genauen Aufgaben einzelner Speicherbereiche, Prozesse und Dateien werden in den zugehörigen Kapiteln vertieft.

    Oracle 19c: fachliche Grundlage

    1. Was bedeutet Oracle-Architektur?

    Vereinfacht lassen sich für dieses Kapitel vier Bereiche unterscheiden: Verbindungsweg, laufende Instanz, dauerhaft gespeicherte Datenbank und logische Datenstrukturen. Dies sind Betrachtungsebenen desselben Systems, keine vier unabhängigen technischen Komponenten.

    Grundidee:

    Clientprogramm → Verbindung zur Oracle-Instanz → Verarbeitung der Anfragen und Zugriff auf die Datenbank

    Eine Anwendung oder ein Administrationswerkzeug wie SQL*Plus verbindet sich mit der Oracle-Instanz. Ein Datenbankadministrator verwendet ein solches Werkzeug, um die Datenbank zu verwalten. Dieses Bild wird in den folgenden Abschnitten schrittweise aufgebaut.

    2. Das zentrale Grundmodell: Instance und Database

    Die Oracle-Instanz (Instance) ist der laufende Teil. Sie entsteht beim Start von Oracle und umfasst die für den Betrieb benötigten Speicherstrukturen und Oracle-Prozesse. Wird die Instance beendet, verschwinden diese Laufzeitstrukturen wieder.

    Die Oracle-Datenbank (Database) ist der dauerhaft gespeicherte Teil. Zu ihr gehören die physischen Datenbankdateien, insbesondere Datafiles, Controlfiles und Online Redo Logs. Diese Dateien bleiben auch dann auf dem Storage vorhanden, wenn keine Instance läuft.

    Einfaches Denkmodell:

    Instance = Oracle läuft.
    Speicher und Prozesse stellen die Laufzeitumgebung bereit.

    Database = Oracle speichert dauerhaft.
    Datenbankdateien bleiben auf dem Storage erhalten.

    Im normalen Betrieb verwendet die Instance die Dateien der Database.

    3. Die Oracle Instance im Überblick

    Eine Instance stellt die Laufzeitumgebung bereit, mit der Oracle auf die Database zugreift. Für das Architekturverständnis reichen an dieser Stelle zwei Hauptbestandteile:

    Speicher: Oracle verwendet gemeinsam genutzte Speicherbereiche. Der zentrale Begriff dafür ist die SGA.

    Prozesse: Hintergrundprozesse übernehmen interne Aufgaben. Serverprozesse bearbeiten Anforderungen von Clients. Zusätzlich verwenden Oracle-Prozesse private Speicherbereiche, die als PGA bezeichnet werden. Die PGA ist kein Bestandteil der SGA.

    Ein Oracle-Prozess kann abhängig von Betriebssystem und Konfiguration als Betriebssystemprozess oder als Thread ausgeführt werden.

    Wie die SGA intern aufgebaut ist, welche Speicherparameter existieren und welche Aufgaben einzelne Oracle-Prozesse erfüllen, wird in den dafür vorgesehenen Fachkapiteln behandelt. Hier ist nur wichtig: Speicher und Prozesse gehören zur laufenden Ebene.

    Ziel der folgenden Abfrage:
    Die folgende Abfrage zeigt den Zustand der aktuell verbundenen Instance. Sie verändert nichts an der Datenbank.
    READ ONLY – Instance identifizieren
    SELECT instance_name,
           host_name,
           status,
           database_status
    FROM v$instance;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. STATUS beschreibt die Instanzphase; DATABASE_STATUS ist eine andere Statusangabe.

    INSTANCE_NAMEHOST_NAMESTATUSDATABASE_STATUS
    demodbdbhostOPENACTIVE

    So liest du das Ergebnis: OPEN beschreibt die Instanzphase. ACTIVE bei DATABASE_STATUS ist kein Zähler aktiver Benutzersessions. Die weitere Database-Abfrage liefert andere Eigenschaften.

    4. Die Oracle Database im Überblick

    Die Database bildet die persistente Ebene. Ihre physischen Dateien liegen auf einem Dateisystem, ASM oder einer anderen von Oracle unterstützten Storage-Struktur. Für das grundlegende Architekturmodell sind drei Dateigruppen besonders wichtig:

    Datafiles enthalten die dauerhaft gespeicherten Datenblöcke der Datenbank.

    Controlfiles enthalten zentrale Informationen über die physische Struktur und den Zustand der Database.

    Online Redo Logs gehören zur Redo-Infrastruktur und zeichnen Änderungsinformationen auf.

    Die genaue interne Funktion dieser Dateien, ihre Verwaltung und ihre Bedeutung für Backup und Recovery werden später separat behandelt. An dieser Stelle genügt die Zuordnung: Diese Dateien gehören zur persistenten Database.

    Ziel der folgenden Abfrage:
    Die Abfrage zeigt grundlegende Eigenschaften der Database, zu der die aktuelle Instance gehört. Sie setzt eine gemountete Datenbank und passende Leserechte voraus; eine gestartete Instance allein reicht nicht aus.
    READ ONLY – Database identifizieren
    SELECT name,
           db_unique_name,
           dbid,
           open_mode,
           database_role
    FROM v$database;

    Fiktive Beispielausgabe:

    NAMEDB_UNIQUE_NAMEDBIDOPEN_MODEDATABASE_ROLE
    DEMODBdemodb_primary1234567890READ WRITEPRIMARY

    So liest du das Ergebnis: Die Datenbank ist schreibbar und hat die Rolle PRIMARY. Das beweist weder einen erfolgreichen Anwendungslogin noch eine vorhandene Sicherung. DBID ist eine technische Identität, kein Benutzername.

    5. Wie Instance und Database zusammengehören

    Die Instance stellt die aktive Laufzeitumgebung bereit und verwendet die persistenten Dateien der Database. Eine beendete Instance bedeutet deshalb nicht, dass die Datenbankdateien verschwunden sind.

    Beobachtungsbeispiel: Dateien können auf dem Storage vorhanden sein, obwohl kein Datenbankbetrieb möglich ist. Erst eine laufende Instanz mit geeignetem Datenbankzustand ermöglicht die Nutzung. Umgekehrt beweist ein gestarteter Prozess noch nicht, dass die Database geöffnet ist.

    6. NOMOUNT, MOUNT und OPEN – nur zur Einordnung

    Beim Start werden Instance und Database schrittweise zusammengeführt. Diese drei Zustände sind für das Architekturverständnis hilfreich:

    NOMOUNT Die Instance wurde gestartet. Die Database ist noch nicht gemountet.
    MOUNT Die Instance hat die Controlfiles der Database geöffnet und gelesen. Die Database ist noch nicht normal geöffnet.
    OPEN Die Database ist geöffnet und kann entsprechend ihrer Konfiguration verwendet werden.
    Hier bewusst nur die Einordnung:
    Welche administrativen Befehle diese Zustände erzeugen und welche Bedeutung sie bei Restore und Recovery haben, wird in den entsprechenden Administrations- und Recovery-Kapiteln behandelt.
    Phasen in den Abfragen wiedererkennen:

    Die folgende Auswahl zeigt normale Zustände. Für NOMOUNT lautet der Wert in V$INSTANCE.STATUS STARTED. Sonderfälle wie ein Upgrade sind hier nicht enthalten.

    PhaseV$INSTANCE.STATUSV$DATABASE.OPEN_MODE
    NOMOUNTSTARTEDNoch nicht abfragbar: Database nicht gemountet
    MOUNTMOUNTEDMOUNTED
    OPEN, schreibbarOPENREAD WRITE
    OPEN, nur lesbarOPENREAD ONLY

    7. Physische und logische Strukturen unterscheiden

    Oracle betrachtet Daten nicht nur als Dateien auf dem Storage. Neben der physischen Ebene existiert eine logische Ebene.

    Zur physischen Ebene gehören beispielsweise Datafiles und andere Datenbankdateien. Auf der logischen Ebene arbeitet Oracle unter anderem mit Tablespaces, Segmenten und Datenbankobjekten wie Tabellen und Indizes.

    Für dieses Kapitel ist vor allem die Trennung wichtig: Ein logisches Objekt ist nicht automatisch eine eigene Betriebssystemdatei. Die genaue Storage-Hierarchie und die Beziehungen zwischen Tablespaces, Segmenten, Extents und Blöcken werden im Storage-Kapitel vertieft.

    Beispiel: Ein permanenter Tablespace APP_DATA kann zwei Datafiles verwenden. Eine Tabelle darin ist trotzdem keine eigene Betriebssystemdatei. Temporäre Tablespaces verwenden Tempfiles; Details folgen im Storage-Kapitel.

    8. Client, Listener, Service und Session – der Verbindungsweg im Überblick

    Benutzer und Anwendungen arbeiten normalerweise nicht direkt mit einem Datafile. Sie stellen eine Verbindung zur Oracle-Umgebung her. Dabei begegnen mehrere Begriffe, die im Gesamtbild unterschiedliche Rollen haben.

    Der Client ist beispielsweise eine Anwendung, SQL*Plus oder ein anderes Programm, das auf Oracle zugreifen möchte. Bei Netzwerkverbindungen nimmt der Listener Verbindungsanfragen entgegen und vermittelt den Zugang zu angebotenen Oracle-Services. Ein Service ist ein logischer Zugangspunkt zu einer Datenbankfunktion. Nach erfolgreicher Anmeldung arbeitet der Benutzer innerhalb einer Oracle-Session.

    Die genaue Oracle-Net-Konfiguration, Listener-Registrierung, Connect Descriptors und detaillierte Session-/Prozessbeziehungen gehören in die entsprechenden Fachkapitel. Hier geht es nur darum, die Begriffe im Verbindungsweg einzuordnen.

    Verbindungsaufbau und anschließende Verarbeitung:

    Netzwerkverbindung: Client fordert Service an → Listener vermittelt einen Service Handler.
    Im Dedicated-Server-Fall bearbeitet danach ein Serverprozess die Anforderungen; die Session ist der logische Sitzungskontext.
    Nach dem Verbindungsaufbau ist der Listener normalerweise nicht an der weiteren Kommunikation beteiligt. Eine lokale Bequeath-Verbindung kann ohne Listener zustande kommen. Service und Session sind keine Geräte, die jede SQL-Anweisung nacheinander durchläuft.

    9. SID, INSTANCE_NAME, DB_NAME und SERVICE_NAME unterscheiden

    Die getrennten Abfragen in den vorhergehenden Abschnitten zeigen diese Namen bereits. Die spätere gemeinsame Übersicht verbindet Instance und Database in einem Ergebnis. DB_UNIQUE_NAME ergänzt DB_NAME als Kennung einer Datenbank mit unternehmensweit eindeutigem Namen; der Wert ist kein Service-Name.

    Diese Begriffe tauchen in Konfigurationen, Fehlermeldungen und Diagnoseausgaben regelmäßig auf. Sie bezeichnen jedoch nicht dieselbe Sache.

    BegriffEinordnungVereinfacht gesagt
    SID / ORACLE_SIDlokale Oracle-UmgebungLokale Kennung, mit der eine Instance auf einem Host adressiert wird.
    INSTANCE_NAMEInstanceName der laufenden Oracle Instance.
    DB_NAMEDatabaseName der Oracle Database.
    DB_UNIQUE_NAMEDatabaseUnternehmensweit eindeutiger Datenbankname, auch zur Unterscheidung gleicher DB_NAME-Werte.
    DBIDDatabaseNumerische Datenbankkennung; keine Benutzer-, Service- oder Instanzkennung.
    SERVICE_NAMEVerbindungs-/ServiceebeneAngabe des angeforderten Datenbankservice im Connect Descriptor; vom Initialisierungsparameter SERVICE_NAMES zu unterscheiden.
    Was sehe ich hier?
    Die Abfragen aus Abschnitt 3 und 4 zeigen Instance- und Database-Namen getrennt. Genau diese Trennung ist das Lernziel dieses Abschnitts.

    10. Warum eine Database mehrere Services haben kann

    Ein Service ist nicht einfach nur ein anderer Name für die Instance. Services bilden eine logische Zugriffsebene. Dadurch können unterschiedliche Anwendungen oder Aufgaben getrennte Servicenamen verwenden, obwohl sie auf dieselbe Oracle-Umgebung zugreifen.

    Für das Architekturverständnis ist deshalb nur wichtig: Database, Instance und Service sind unterschiedliche Begriffe. Die technische Einrichtung und Verwaltung von Services wird an anderer Stelle vertieft.

    Unterschiedliche Servicenamen allein garantieren noch keine Ressourcen- oder Datentrennung. Solche Eigenschaften benötigen eine entsprechend eingerichtete Umgebung.

    11. Single Instance – was bedeutet das konkret?

    Bei einer klassischen Single-Instance-Konfiguration arbeitet eine Oracle Instance mit einer Oracle Database. Die Instance stellt dabei ihre Laufzeitumgebung bereit und greift auf die persistenten Dateien der Database zu.

    Dieser Begriff beschreibt damit die grundsätzliche Zuordnung zwischen laufender Instance und Database. Andere Architekturformen werden nur dort behandelt, wo sie für die jeweilige Umgebung oder ein eigenes Fachthema relevant sind.

    Single Instance und Multitenant: Single Instance beschreibt die Zuordnung einer Instanz zur Datenbank. Diese Datenbank kann als Container Database (CDB) organisiert sein. Eine CDB besitzt CDB$ROOT und die Vorlage PDB$SEED; benutzerdefinierte PDBs können hinzukommen. Eine PDB besitzt keine eigene Instanz. Details stehen im Multitenant-Kapitel.

    12. Das Architektur-Gesamtbild

    Die bisher eingeführten Begriffe lassen sich jetzt zu einem Gesamtbild verbinden. Wichtig ist dabei nicht jedes interne Detail, sondern die richtige Zuordnung der Ebenen.

    EbeneBeispieleGrundaufgabe
    Client / VerbindungClient, Listener, ServiceZugang zur Oracle-Umgebung herstellen und adressieren.
    LaufzeitInstance, SGA, PGA, Oracle-Prozesse; Session als logischer SitzungskontextOracle ausführen und Anforderungen bearbeiten.
    Dauerhaft gespeicherte DatenbankDatafiles, Controlfiles, Online Redo LogsDatenbankzustand dauerhaft auf Storage abbilden.
    Logische DatenstrukturTablespaces, Segmente, Tabellen, IndizesDaten innerhalb der Datenbank logisch organisieren.
    Das wichtigste Bild aus Kapitel 2:

    Client / Verbindung
    ↓
    Oracle Instance = laufende Ebene
    ↓
    Oracle Database = persistente Ebene

    Logische Datenstrukturen werden innerhalb dieses Systems verwaltet.

    13. Architektur als Grundlage der Fehlerdiagnose

    Die Architektur hilft später dabei, einen Fehler zunächst der richtigen Ebene zuzuordnen. Die Zuordnung ist ein Ausgangspunkt der Untersuchung und noch kein Beweis für eine Fehlerursache.

    BeobachtungErste ArchitekturebeneSpätere Vertiefung
    Netzwerkverbindung kommt nicht zustandeClient / Listener / ServiceOracle Net und Listener
    Keine laufende Oracle Instance erkennbarInstance / BetriebssystemInstance- und Prozessdiagnose
    Problem mit einer DatenbankdateiDauerhaft gespeicherte Datenbank / StorageStorage sowie Backup & Recovery
    Problem mit einem TablespaceLogische Storage-EbeneTablespaces und Storage

    14. Read-only: Welche Database und Instance sehe ich?

    Ausführungskontext: Die Architekturbeispiele betrachten die gesamte Datenbank. Verwende bei einer CDB für diese Übersicht eine entsprechend berechtigte Verbindung zu CDB$ROOT.
    Voraussetzung: Die gemeinsame Abfrage benötigt eine gemountete Datenbank. In NOMOUNT kann V$INSTANCE bereits lesbar sein, während V$DATABASE mit ORA-01507 scheitert. Das widerspricht einer laufenden Instance nicht. Die Dateiliste belegt zudem registrierte Pfade, nicht die aktuelle Lesbarkeit jeder Datei.
    Database und Instance identifizieren
    CROSS JOIN kombiniert jede Zeile der ersten Quelle mit jeder Zeile der zweiten. Die verwendeten Views liefern im vorgesehenen Kontext jeweils eine Zeile; dadurch entsteht hier eine gemeinsame Ergebniszeile.
    SELECT
        i.instance_name,
        i.host_name,
        i.status AS instance_status,
        i.startup_time,
        d.name AS database_name,
        d.dbid,
        d.open_mode,
        d.log_mode
    FROM v$instance i
    CROSS JOIN v$database d;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileINSTANCE_NAMEHOST_NAMEINSTANCE_STATUSSTARTUP_TIMEDATABASE_NAME
    1ORCLdb01OPEN08.10.2026 08:00:00ORCL
    ZeileDBIDOPEN_MODELOG_MODE
    11234567890READ WRITEARCHIVELOG

    Was sehe ich hier? Die Instanz läuft auf db01 und hat die Datenbank ORCL schreibend geöffnet. DBID ist eine Datenbankkennung; der Modus ARCHIVELOG allein weist noch keine funktionierende Backup-Strategie nach. V$INSTANCE liefert Instanzdaten, V$DATABASE die Datenbankeigenschaften. Die gemeinsame Ausgabe macht diese beiden Ebenen sichtbar.

    15. Read-only: ausgewählte physische Dateien der Database

    Datafiles, Controlfiles und Redo Member
    SELECT 'DATAFILE' AS file_type, name AS file_name
    FROM v$datafile
    UNION ALL
    SELECT 'CONTROLFILE', name
    FROM v$controlfile
    UNION ALL
    SELECT 'REDO', member
    FROM v$logfile
    ORDER BY 1, 2;

    Fiktive Beispielausgabe:

    FILE_TYPEFILE_NAME
    CONTROLFILE/u02/oradata/ORCL/control01.ctl
    DATAFILE/u02/oradata/ORCL/system01.dbf
    REDO/u03/oradata/ORCL/redo01.log

    Was sehe ich hier? Die Typkennung zeigt die Aufgabe der Datei. Dies ist ein Ausschnitt der Dateiliste, keine vollständige oder empfohlene Dateikonfiguration. Tempfiles werden von dieser Abfrage nicht erfasst; dafür gibt es V$TEMPFILE. REDO kann Online- und Standby-Redo-Member enthalten; TYPE in V$LOGFILE unterscheidet sie. Die Pfade /u02 und /u03 sind Beispiele, keine vorgeschriebenen Oracle-Verzeichnisse.

    16. Architektur-Diagnose: von außen nach innen

    Diagnosekette:

    Die Fragen helfen bei der Zuordnung einer Störung. Ihre Reihenfolge hängt vom Fehlersymptom und den verfügbaren Zugängen ab; nicht jede Störung erfordert alle Schritte. Bei fehlender Verbindung kann beispielsweise zuerst der lokale Instanzstatus untersucht werden.

    1. Erreicht der Client den Listener beziehungsweise Service?
    2. Kommt eine Verbindung zustande?
    3. Existiert eine Session in der Instance?
    4. Ist die Instance gestartet und in welchem Status?
    5. Ist die Database gemountet beziehungsweise geöffnet?
    6. Sind die benötigten physischen Dateien aus Oracle-Sicht verfügbar?
    7. Anhand der Beobachtungen im passenden Fachbereich weiterprüfen: Netzwerk, Sessions, Storage, Redo, UNDO, Memory oder Performance.
    Kapitelgrenzen: SGA/PGA werden in Kapitel 22 vertieft, Prozesse in Kapitel 6, Oracle Net in Kapitel 4, Start-/Open-Phasen in Kapitel 5 und Redo in Kapitel 18. Kapitel 2 liefert bewusst das Gesamtbild und vermeidet Doppelungen.

    17. Typische Verständnisfehler

    Instance und Database sind dasselbe.
    Nein. Die Instance ist die laufende Ebene mit Speicher und Prozessen. Die Database ist die persistente Ebene mit den Datenbankdateien.
    Wenn die Instance beendet wird, ist die Database gelöscht.
    Nein. Beim Beenden verschwinden die Laufzeitstrukturen der Instance. Die persistenten Database-Dateien bleiben auf dem Storage bestehen.
    Ein Service Name ist einfach der Name der Instance.
    Nein. Ein Service ist eine logische Zugriffsebene. Instance Name und Service Name haben unterschiedliche Aufgaben.
    Ein Tablespace ist eine einzelne Betriebssystemdatei.
    Nein. Tablespace ist ein logischer Begriff. Permanente Tablespaces verwenden Datafiles, temporäre Tablespaces verwenden Tempfiles. Die genaue Storage-Struktur wird im entsprechenden Fachkapitel erklärt.

    18. Was wird in späteren Kapiteln vertieft?

    Kapitel 2 liefert bewusst nur das Architektur-Gerüst. Die folgenden Themen werden deshalb hier nicht im Detail behandelt:

    ThemaHier in Kapitel 2Spätere Vertiefung
    SGA / PGAnur Einordnung als Speicher der LaufzeitumgebungMemory-Kapitel
    Oracle-Prozessenur Einordnung als Teil der laufenden UmgebungProzess-/Diagnosekapitel
    SQL-Verarbeitungkeine interne AblaufanalyseSQL-Ablauf und Performance
    Listener / Oracle Netnur VerbindungswegNetzwerk-/Listener-Themen
    Tablespaces / Segmente / Blöckenur logisch vs. physischStorage-Kapitel
    Redo / Archivelogsnur architektonische EinordnungRedo- und Recovery-Themen
    Backup / Restore / Recoverykeine Recovery-AbläufeBackup-&-Recovery-Kapitel
    Multitenantkeine DetailarchitekturMultitenant-Kapitel

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Oracle besitzt eine laufende Ebene und eine persistente Ebene.
    2. Die Instance stellt die Laufzeitumgebung bereit; gemeinsam genutzte SGA und private PGA erfüllen unterschiedliche Speicheraufgaben.
    3. Die Database besteht aus persistenten Datenbankdateien.
    4. Beim typischen Netzwerkaufbau vermittelt der Listener den Zugang zum angeforderten Service; Serverprozesse bearbeiten die Anforderungen.
    5. Logische Datenstrukturen und physische Dateien sind unterschiedliche Ebenen der Architektur.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Was ist der grundlegende Unterschied zwischen Oracle Instance und Oracle Database?
    Die Instance ist die laufende Ebene mit Speicherstrukturen und Prozessen. Die Database ist die persistente Ebene mit den Datenbankdateien.
    Frage 2: Welche drei Dateigruppen gehören im Grundmodell zur physischen Database?
    Datafiles, Controlfiles und Online Redo Logs.
    Frage 3: Was bedeutet MOUNT im Architekturmodell?
    Die Instance läuft und hat die Controlfiles der Database geöffnet und gelesen; die Database ist noch nicht normal geöffnet.
    Frage 4: Sind SERVICE_NAME und INSTANCE_NAME dasselbe?
    Nein. INSTANCE_NAME benennt die Instanz; SERVICE_NAME gibt beim Verbindungsaufbau den angeforderten logischen Datenbankdienst an.
    Frage 5: Beweist ein gelisteter Datafile-Pfad, dass die Datei lesbar ist?
    Nein. Die View beschreibt die registrierte Dateistruktur. Ob die Datei vorhanden und lesbar ist, muss bei einer Störung zusätzlich anhand von Status, Fehlern und Storage geprüft werden.
    Frage 6: Kann eine Instance laufen, obwohl die Database noch nicht gemountet ist?
    Ja, in NOMOUNT. V$INSTANCE.STATUS lautet dann STARTED.
    Frage 7: Ist ein Tablespace eine Datei?
    Nein. Er ist eine logische Speichereinheit. Permanente Tablespaces verwenden Datafiles, temporäre Tablespaces Tempfiles.
    Frage 8: Ist eine Session ein Betriebssystemprozess?
    Nein. Sie ist ein logischer Sitzungskontext. Serverprozesse bearbeiten die Anforderungen.
    Frage 9: Was unterscheidet SGA und PGA?
    Die SGA wird gemeinsam genutzt. Die PGA ist privater Prozessspeicher und kein Teil der SGA.
    Frage 10: Bedeutet Single Instance, dass keine PDBs vorhanden sein dürfen?
    Nein. Eine einzelne Instanz kann eine CDB mit mehreren PDBs betreiben. Eine PDB besitzt keine eigene Instanz.
    Frage 11: Warum sind STATUS = OPEN und OPEN_MODE = READ WRITE unterschiedliche Angaben?
    STATUS beschreibt die Instanzphase, OPEN_MODE den Öffnungsmodus der Datenbank. OPEN allein unterscheidet nicht zwischen READ WRITE und READ ONLY.
    Frage 12: Ordne INSTANCE_NAME, HOST_NAME und DBID den Ebenen zu.
    INSTANCE_NAME benennt die Instanz, HOST_NAME den Host und DBID die Datenbankidentität.
    Frage 13: Beweist ein erfolgreicher Anwendungslogin eine funktionierende Datensicherung?
    Nein. Er belegt den gelungenen Zugang zu diesem Zeitpunkt, nicht die Existenz oder Wiederherstellbarkeit einer Sicherung.

    3. Ablauf einer SQL-Anweisung – Parsing, Cursor und Ausführung verstehen

    Vom SQL-Text über Cursor Matching und Optimizer bis Execute, Fetch und Read Consistency.

    Lernkompass
    Einfach gesagt Du verfolgst eine SQL-Anweisung vom Parse-Aufruf bis zur Ausführung und bei Abfragen bis zum Fetch der Ergebniszeilen.
    Warum ist das wichtig? Der Ablauf hilft, Parse-, Cursor- und Ausführungskennzahlen später der richtigen Phase zuzuordnen.
    Nach diesem Kapitel Du kannst Parse, Cursor, Hard/Soft Parse, Bind, Execute und Fetch voneinander unterscheiden und in die richtige Reihenfolge bringen.

    Einführung: Eine SQL-Anweisung durchläuft Verarbeitungsschritte, bevor ein Ergebnis beim Client ankommt. Oracle muss den Text einordnen, einen nutzbaren Ausführungsweg bereitstellen, die angeforderte Arbeit ausführen und bei einer Abfrage Ergebniszeilen liefern. Diese Schritte verbrauchen unterschiedliche Ressourcen. Deshalb lässt sich eine langsame Abfrage nicht allein anhand ihres Textes oder der Zahl zurückgegebener Zeilen beurteilen.

    Das Kapitel erklärt den Weg einer Anweisung und die dafür verwendeten Cursor. Du lernst, Vorbereitung, Wiederverwendung, Ausführung und Ergebnisabruf auseinanderzuhalten. Die Diagnosebeispiele verbinden diese Phasen mit Messwerten. Die Auswahl eines Plans wird in Kapitel 10 vertieft; hier geht es darum, an welcher Stelle des Ablaufs Arbeit entsteht.

    Oracle 19c: fachliche Grundlage

    Die zusammenhängende Erklärung der Planentscheidungen findest du in Kapitel 10 – Optimizer und Ausführungspläne verstehen.

    Zum Verständnis hilft es, drei Ebenen auseinanderzuhalten. Der SQL-Text ist die Anweisung, die vom Client kommt. Der Cursor ist die Oracle-interne Struktur, über die diese Anweisung vorbereitet und ausgeführt wird. Eine Execution ist schließlich eine konkrete Ausführung eines verwendbaren Cursors. Dieselbe SQL-Struktur kann deshalb sehr oft ausgeführt werden, ohne dass jedes Mal ein neuer Ausführungsplan entstehen muss.

    Diagnosekontext: Prüfe die Beispiele in derselben Instanz und demselben Container mit passenden Leserechten. V$-Views sind keine dauerhafte Historie. Für containerübergreifende Cursorvergleiche zusätzlich CON_ID erfassen. Die folgenden Ausgaben betrachten jeweils einen festgelegten Container.

    1. Vereinfachter Lebenszyklus

    Vereinfachtes Ablaufbild: Es beschreibt den Lernweg einer gewöhnlichen SQL-Ausführung, keine für alle SQL-Arten zwingend getrennten Phasen. Ein wiederverwendeter offener Cursor kann erneut ausgeführt werden, ohne einen neuen Parse-Aufruf zu benötigen. Bind Peeking kann beim Hard Parse bereits Bind-Werte berücksichtigen. Für DDL gelten besondere Ausführungs- und Transaktionsregeln.
    SQL-Text→Syntax→Semantik / Rechte→Shared-Pool-Check→Soft / Hard Parse→Bind→Execute→Fetch

    2. Parsing – was Oracle wirklich prüft

    Parsing bereitet eine SQL-Anweisung für die weitere Verarbeitung vor. Oracle prüft zunächst die Syntax und anschließend die Semantik, also beispielsweise, ob referenzierte Objekte und Spalten gültig sind. Auch erforderliche Zugriffsrechte müssen zum Ausführungskontext passen.

    Danach ist entscheidend, ob bereits gemeinsam nutzbarer SQL-Code vorhanden ist. Oracle prüft deshalb den Shared Pool beziehungsweise Library Cache auf eine wiederverwendbare Struktur. Kann vorhandener Code wiederverwendet werden, handelt es sich um einen Soft Parse. Ist keine verwendbare ausführbare Version vorhanden, wird ein Hard Parse erforderlich.

    Syntax Check Ist die SQL-Anweisung syntaktisch korrekt?
    Semantic Check Existieren Objekte, Spalten und passen Referenzen?
    Privilege Check Darf der Benutzer die referenzierten Objekte verwenden?
    Cursor Matching Existiert bereits ein kompatibler Cursor?

    3. Warum Parsing Ressourcen kostet

    Parsing benötigt CPU und Zugriff auf interne Metadaten und Shared-Pool-Strukturen. Bei einem Hard Parse der hier betrachteten Abfragen kommen Optimizer-Arbeit, Statistikzugriffe und die Erzeugung ausführbarer Verarbeitungsschritte hinzu.

    Auch Soft Parse ist nicht kostenlos. Oracle muss weiterhin feststellen, ob der gefundene Cursor für den aktuellen Ausführungskontext verwendet werden darf. Ein Soft Parse benötigt meist weniger Arbeit als ein Hard Parse. Viele wiederholte Soft Parses können dennoch erhebliche Ressourcen verbrauchen.

    4. Soft Parse im Detail

    Bei einem Soft Parse kann Oracle einen bereits vorhandenen, passenden Child Cursor wiederverwenden. Die teure Optimizer- und Planerzeugungsarbeit muss nicht erneut in vollem Umfang erfolgen.

    Oracle prüft dennoch Cursor-Matching-Bedingungen. Dazu können SQL-Text, relevante Session-/Optimizer-Einstellungen, Bind-Metadaten und Objektabhängigkeiten gehören.

    5. Hard Parse im Detail

    Ein Hard Parse ist erforderlich, wenn Oracle keinen passenden ausführbaren Code wiederverwenden kann. Bei den hier betrachteten Abfragen gehören dazu Optimierung und die Erzeugung ausführbarer Verarbeitungsschritte. Der Optimizer bewertet mögliche Zugriffswege, Joinmethoden und Joinreihenfolgen auf Basis von Statistiken, Prädikaten und vorhandenen Strukturen.

    Ein Hard Parse ist normal, wenn eine neue SQL-Anweisung erstmals erscheint oder ein neuer Child Cursor technisch notwendig ist. Problematisch wird eine hohe Hard-Parse-Rate, wenn eine Anwendung ständig neue, eigentlich wiederverwendbare SQL-Texte erzeugt.

    DBA-Regel: Bei hoher Hard-Parse-Last nicht reflexartig den Shared Pool vergrößern. Erst Literal-SQL, Bind-Nutzung, Child-Cursor-Anzahl, Invalidations und Anwendungsmuster untersuchen.
    Geltungsbereich: Nicht jede SQL-Art durchläuft dieselben Schritte. DDL wird grundsätzlich hart geparst, aber nicht grundsätzlich optimiert. Enthält eine DDL-Anweisung einen optimierungsbedürftigen DML-Anteil, wird dieser entsprechend verarbeitet. Die folgenden Cursor- und Planbeispiele betrachten Abfragen.

    6. Was ist ein Cursor?

    Der Begriff Cursor wird in unterschiedlichen Zusammenhängen verwendet. Eine Session besitzt einen eigenen Verarbeitungskontext für ihre SQL-Anweisung. Gemeinsam nutzbare SQL-Strukturen liegen dagegen im Library Cache. Dort unterscheiden wir Parent Cursor und Child Cursor.

    Darum gilt: Cursor ist nicht gleich SQL-Text. Mehrere Sessions können gemeinsam nutzbare SQL-Strukturen verwenden und dennoch ihren eigenen Verarbeitungsstand besitzen, etwa beim Abrufen von Ergebniszeilen.

    SQL-Text Die vom Client gesendete Anweisung.
    SQL_ID Oracles Kennung für den SQL-Text.
    Child Cursor Konkrete ausführungsrelevante Variante.
    Execution Eine einzelne Ausführung eines Cursors.

    7. Parent Cursor und Child Cursor

    Der Parent Cursor enthält den SQL-Text. Ein Child Cursor enthält unter anderem den Ausführungsplan, Objektmetadaten und die Optimizer-Umgebung. Zum selben SQL-Text können mehrere Child Cursor mit unterschiedlichen CHILD_NUMBER-Werten erforderlich sein.

    Mehrere Child Cursor sind nicht automatisch schlecht. Sie können durch unterschiedliche Optimizer-Umgebungen, Bind-Datentypen oder andere Kompatibilitätsbedingungen notwendig werden. Auffällig wird es erst bei sehr hoher Child-Cursor-Anzahl mit messbarem Parse-/Shared-Pool-Aufwand.

    Was prüfe ich? Die Abfrage zeigt die Child Cursor einer tatsächlich beobachteten SQL_ID. Mehrere Children bedeuten nicht automatisch verschiedene Pläne: Auch unterschiedliche Child Cursor können denselben PLAN_HASH_VALUE besitzen.
    Eingabe in SQL*Plus: &SQL_ID ist eine Substitutionsvariable, keine Bind-Variable. SQL*Plus ersetzt sie textuell vor dem Senden an Oracle. Gib die beobachtete SQL_ID ohne zusätzliche Anführungszeichen ein. Andere Clients können eine andere Eingabemethode benötigen. Die fiktiven SQL_IDs sind keine in deiner Datenbank vorhandenen Übungsobjekte; eine leere Ausgabe beweist daher keinen Fehler.
    Child Cursor einer SQL_ID
    SELECT sql_id, child_number, plan_hash_value, executions,
           parse_calls, loads, invalidations
    FROM v$sql
    WHERE sql_id = '&SQL_ID'
    ORDER BY child_number;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören über CHILD_NUMBER zusammen und zeigen gemeinsam alle ausgewählten Spalten. CHILD_NUMBER wird zur Zuordnung wiederholt.

    SQL_IDCHILD_NUMBERPLAN_HASH_VALUEEXECUTIONSPARSE_CALLS
    7m2q6k9p4xabc0123456789010020
    7m2q6k9p4xabc123456789011010
    CHILD_NUMBERLOADSINVALIDATIONS
    010
    110

    So liest du das Ergebnis: Zwei Child Cursor gehören zu derselben SQL_ID. Bei Child 0 stehen 20 Parse-Aufrufen 100 Ausführungen gegenüber. Daraus lassen sich nicht 20 Hard Parses ableiten. Die unterschiedlichen Plan-Hashes werden bei Bedarf im Optimizer-Kapitel untersucht.

    8. Warum wurde ein Child Cursor nicht geteilt?

    Die Auswahl zeigt häufig nützliche Flags, nicht alle Gründe der View. Y ist ein Hinweis zum Nicht-Sharing dieses Child Cursors, kein Beweis für einen aktuellen Performanceengpass. SQL_ID, Child Number und Beobachtungszeit zusammen dokumentieren.

    V$SQL_SHARED_CURSOR enthält zahlreiche Flags, die Hinweise geben, warum Oracle einen vorhandenen Child Cursor nicht wiederverwenden konnte. Die View ist besonders bei einer auffällig hohen Anzahl von Child Cursorn (VERSION_COUNT) einer SQL-Anweisung nützlich.

    Gründe für Nicht-Sharing
    SELECT sql_id, child_number, unbound_cursor,
           optimizer_mismatch, stats_row_mismatch, bind_mismatch
    FROM v$sql_shared_cursor
    WHERE sql_id = '&SQL_ID'
    ORDER BY child_number;

    Fiktive Beispielausgabe:

    Zusammengehörige Teilansichten derselben Ergebniszeilen; CHILD_NUMBER wird zur Zuordnung wiederholt.

    SQL_IDCHILD_NUMBERUNBOUND_CURSOROPTIMIZER_MISMATCHSTATS_ROW_MISMATCH
    7m2q6k9p4xabc0NNN
    7m2q6k9p4xabc1NNN
    CHILD_NUMBERBIND_MISMATCH
    0N
    1Y

    So liest du das Ergebnis: BIND_MISMATCH=Y liefert für Child 1 einen Hinweis auf nicht passende Bind-Metadaten. Es bedeutet nicht, dass Bind-Werte grundsätzlich schlecht wären; Datentypen und Clientverhalten untersuchen.

    9. Shared Pool und Library Cache im Cursor-Kontext

    Der Shared Pool ist Teil der SGA. Im Library Cache werden unter anderem gemeinsam nutzbare SQL- und PL/SQL-Strukturen verwaltet. Genau dort liegt der Zusammenhang zum Cursor Sharing.

    Die Speicherarchitektur wird hier bewusst nicht erneut erklärt. Details stehen in SGA und PGA. Hier reicht: Fehlt ein verwendbarer Cursor, steigt Parse-Arbeit; zu viele Cursorvarianten erhöhen Verwaltungsaufwand.

    10. Open Cursor und Shared Cursor sind nicht dasselbe

    Ein Shared Cursor ist eine gemeinsam nutzbare Struktur im Shared Pool. Ein Open Cursor beschreibt dagegen den Cursor-Kontext einer Session. Deshalb ist OPEN_CURSORS nicht einfach die Anzahl aller SQL im Shared Pool.

    Offene und gecachte Cursor pro Session
    SELECT sid, cursor_type, COUNT(*) AS cursor_entries
    FROM v$open_cursor
    GROUP BY sid, cursor_type
    ORDER BY sid, cursor_type;

    Ausgabe richtig lesen: V$OPEN_CURSOR enthält auch gecachte Cursor. CURSOR_TYPE trennt diese Kategorien; ihre Gesamtsumme ist deshalb kein verlässlicher Messwert für die Ausschöpfung von OPEN_CURSORS. Für den Sessionzähler kann V$SESSTAT mit V$STATNAME auf den Statistiknamen opened cursors current verbunden werden. Ein hoher Wert allein beweist noch kein Cursor-Leak.

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    SIDCURSOR_TYPECURSOR_ENTRIES
    142OPEN3
    142SESSION CURSOR CACHED7

    Was sehe ich hier? Die Werte zählen Cursor-Einträge je SID und Cursor-Typ. Sie sind weder die Zahl aktiver SQL-Ausführungen noch direkt der Verbrauch des Limits OPEN_CURSORS.

    11. Bind Variables – Struktur und Wert trennen

    Bind Variables halten die SQL-Struktur konstant und übergeben konkrete Werte separat. Statt für jeden Kunden einen neuen SQL-Text zu erzeugen, kann dieselbe Struktur wiederverwendet werden.

    Literal-SQLWHERE kunden_id = 4711
    WHERE kunden_id = 4712
    Kann unterschiedliche SQL-Texte erzeugen.
    Bind-SQLWHERE kunden_id = :kunden_id
    Struktur bleibt identisch, Wert wird gebunden.
    Bind-Wert und SQL-Text:

    Das folgende vollständige SELECT setzt eine vorhandene Tabelle KUNDE und einen vom Client gebundenen numerischen Wert voraus. Es verwendet die Spaltennamen aus Kapitel 1. Der Anwendungstreiber stellt beispielsweise 101 als Wert für :kunden_id bereit; für 102 kann derselbe SQL-Text verwendet werden. Ohne bereitgestellten Bind-Wert ist dies keine eigenständig ausführbare Übung.

    SQL – Bind-Beispiel mit vorhandenem KUNDE-Modell
    SELECT kunden_id, name, ort
    FROM kunde
    WHERE kunden_id = :kunden_id;
    Unterschied: &SQL_ID in den Diagnosebeispielen bewirkt eine textuelle Ersetzung im SQL*Plus-Client. :kunden_id ist dagegen ein Bind-Platzhalter. Das Schema KUNDE ist ein Lernmodell, keine mitgelieferte Oracle-Tabelle.

    12. Bind Variables und Cursor Sharing

    Bind Variables reduzieren häufig die Zahl unterschiedlicher SQL-Texte und verbessern damit die Chance auf Cursor-Wiederverwendung. Sie sind deshalb für viele OLTP-Anwendungen wichtig.

    Sie garantieren aber nicht, dass immer derselbe Plan oder Child Cursor verwendet wird. Unterschiedliche Datenverteilungen und Ausführungsbedingungen können weiterhin mehrere Varianten notwendig machen.

    13. Optimizer und Execution Plan im SQL-Ablauf

    Bei einem Hard Parse einer hier betrachteten Abfrage erstellt Oracle einen Ausführungsplan. Der Cost Based Optimizer berücksichtigt dabei unter anderem Objekt- und Spaltenstatistiken. Bei einem Soft Parse kann Oracle einen passenden vorhandenen Cursor wiederverwenden; eine neue Optimierung ist dann nicht nötig.

    Selektivität, Cardinality, Histogramme, Access Paths, Join-Methoden und Plan-Interpretation werden hier bewusst nicht erneut erklärt.

    Zentrale Fachkapitel: Optimizer-Statistiken erklärt die Datengrundlage der Schätzung. Execution-Plan-Trainer erklärt den Plan. Indizes & Constraints erklärt die Indexmechanik.

    14. Cursor Invalidierung und Reload

    Cursor können ungültig werden, wenn sich relevante Abhängigkeiten oder Metadaten ändern. Bei der nächsten Verwendung kann dadurch erneut Parse- und Optimizer-Arbeit erforderlich werden.

    Invalidierung bedeutet, dass ein Cursor seine bisherige Gültigkeit verliert. Reload bezeichnet erneutes Laden in den Cache. LOADS zählt Laden einschließlich erneutem Laden; INVALIDATIONS zählt Invalidierungen. Zwischen beiden Zählern besteht keine feste Eins-zu-eins-Beziehung.

    SQL mit Loads und Invalidations
    SELECT *
    FROM (
      SELECT sql_id, child_number, executions, parse_calls,
             loads, invalidations, plan_hash_value
      FROM v$sql
      ORDER BY invalidations DESC, loads DESC
    )
    WHERE ROWNUM <= 30;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSQL_IDCHILD_NUMBEREXECUTIONSPARSE_CALLSLOADS
    18u3k2m9p4q7r101200503
    ZeileINVALIDATIONSPLAN_HASH_VALUE
    121827364501

    Was sehe ich hier? Dieser Child-Cursor wurde häufig ausgeführt, dreimal geladen und zweimal invalidiert. Die Zähler beschreiben den vorhandenen Cursor; sie sind keine Messrate und kein Beweis für ein aktuelles Problem.

    15. Parse Calls und Executions richtig interpretieren

    PARSE_CALLS zählt Parse-Aufrufe, nicht nur Hard Parses. Die Werte in V$SQL gehören zum jeweiligen Child Cursor und dessen Cache-Lebensdauer, nicht zwingend zum gesamten Zeitraum seit Instanzstart. Ein Vergleich ohne Zeit- und Child-Bezug kann daher täuschen.

    PARSE_CALLS zeigt, wie oft Parse-Aufrufe für einen Cursor stattfanden; EXECUTIONS zeigt dessen Ausführungen. Viele Parse Calls im Verhältnis zu Executions können auf geringe Wiederverwendung hindeuten.

    Die Kennzahl allein ist aber keine Diagnose. Hard Parses, CPU, Library Cache und Anwendungsmuster müssen mit betrachtet werden.

    SQL mit vielen Parse Calls
    SELECT *
    FROM (
      SELECT sql_id, child_number, executions, parse_calls, loads, invalidations,
             ROUND(elapsed_time/1000000,2) AS elapsed_s
      FROM v$sql
      WHERE parse_calls > 0
      ORDER BY parse_calls DESC
    )
    WHERE ROWNUM <= 30;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSQL_IDCHILD_NUMBEREXECUTIONSPARSE_CALLSLOADSINVALIDATIONS
    18u3k2m9p4q7r1012005032
    ZeileELAPSED_S
    124

    Was sehe ich hier? ELAPSED_S=24 ist die kumulierte Datenbankzeit dieses Cursor-Eintrags für Parse, Execute und Fetch, umgerechnet in Sekunden. Sie ist weder die Dauer der letzten Ausführung noch unmittelbar die Antwortzeit des Clients. Bei paralleler Ausführung werden auch Zeiten der beteiligten Worker kumuliert. 50 Parse-Aufrufe sind nicht gleich 50 Hard Parses.

    16. Der Übergang von Parse zu Execute

    Ist ein verwendbarer Cursor bestimmt, ist die Vorbereitungsphase abgeschlossen. Verwendet die SQL-Anweisung Bind-Platzhalter, stehen für die konkrete Ausführung die aktuellen Bind-Werte zur Verfügung. Danach kann Oracle in die Execute-Phase wechseln.

    Die Bedeutung von Bind Variables und Cursor Sharing wurde zuvor bereits erklärt. An dieser Stelle geht es deshalb nur um ihre Position im Lebenszyklus: Cursor bestimmen → Werte für die Ausführung bereitstellen → Execute.

    17. Execute – die geplante Arbeit beginnt

    Bei Execute beginnt die Ausführung; bereits das Parsing benötigt Datenbankressourcen. Bei schreibenden DML-Anweisungen werden Zeilen gesucht und verändert, inklusive Undo- und Redo-relevanter Transaktionsarbeit. Bei SELECT startet die Ergebniserzeugung; ein Teil der Arbeit kann erst in den nachfolgenden Fetches erfolgen.

    18. Fetch – Ergebniszeilen zum Client

    SELECT-Ergebnisse werden normalerweise nicht als ein einziger Ergebnisblock zum Client geschickt. Der Client ruft Zeilen in Fetch-Vorgängen ab. Fetch kann weitere Datenbankverarbeitung auslösen und transportiert nicht nur schon fertig berechnete Zeilen. Die Abrufgröße (Fetch Size) und die Zahl der Netzwerkrunden (Round-Trips) können die wahrgenommene Laufzeit beeinflussen.

    Die erste Ergebniszeile ist noch nicht das vollständige Ergebnis. Beendet der Client das Abholen vorzeitig, muss Oracle nicht denselben Arbeitsumfang wie bei einem vollständigen Abruf erledigen. Deshalb sind die Zeit bis zur ersten Zeile und die Zeit bis zur letzten Zeile verschiedene Messziele. Bei SELECT-Cursorn hilft END_OF_FETCH_COUNT aus V$SQL, vollständig abgearbeitete Ausführungen von bloß gezählten Ausführungen zu unterscheiden. Ein Abstand zu EXECUTIONS kann auch durch Fehler entstehen; er beweist allein keinen Clientabbruch. Oracle 19c.

    19. Parse, Bind, Execute und Fetch gegenübergestellt

    PhaseAufgabeTypischer DBA-Blick
    ParseSQL verstehen, prüfen, Cursor finden/erzeugen.Hard Parse, Child Cursor, Invalidations.
    BindWerte an Platzhalter binden.Sharing und Datentypen.
    ExecutePlan ausführen.CPU, Waits, Buffer Gets, Reads.
    FetchSELECT-Zeilen liefern.Rows, Fetch Size, Netzwerk-Round-Trips.

    20. Transaktion, Read Consistency und COMMIT im SQL-Ablauf

    Im SQL-Lebenszyklus reicht die Einordnung: gewöhnliche SELECT-Abfragen benötigen eine konsistente Lesesicht; schreibende Transaktionsarbeit umfasst Undo und Redo. COMMIT bestätigt die Änderungen der Transaktion.

    Die Mechanik wird nicht hier wiederholt: UNDO & Flashback erklärt Read Consistency und alte Datenversionen; Redo Logs erklärt Redo, LGWR und COMMIT-Persistenz.

    Read Consistency beim Fetch: Bei READ COMMITTED bezieht sich eine gewöhnliche Abfrage auf einen konsistenten Datenstand zum Beginn der Abfrage. Änderungen anderer Transaktionen, die erst währenddessen bestätigt werden, erscheinen nicht plötzlich in einem später abgeholten Teil desselben Ergebnisses. Eine neu gestartete Abfrage kann diese Änderungen sehen. Eigene vorherige Änderungen der Transaktion sind davon zu unterscheiden und für die eigene Session sichtbar.

    21. Die wichtigsten Diagnose-Views

    ViewWofür?
    V$SQLChild Cursor, Executions, Parse Calls, Loads, Invalidations, Plan Hash.
    V$SQLAREAEine Zeile je Parent Cursor; unter anderem VERSION_COUNT als Zahl der Child Cursor.
    V$SQL_SHARED_CURSORGründe für Nicht-Sharing.
    V$OPEN_CURSOROffene und gecachte Cursor je Session.
    V$SYSSTATInstanzweite Parse-/Execute-Zähler.
    V$LIBRARYCACHELibrary-Cache-Nutzung, Reloads und Invalidations.

    22. Read-only: Parse- und Execute-Aktivität auf Instance-Ebene

    SQL-Verarbeitungszähler
    SELECT
        name,
        value
    FROM v$sysstat
    WHERE name IN (
            'parse count (total)',
            'parse count (hard)',
            'execute count',
            'user calls'
          )
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUE
    execute count250000
    parse count (hard)800
    parse count (total)20000
    user calls300000

    Was sehe ich hier? Die Instanzzähler gelten seit dem Instanzstart. Für eine aktuelle Belastung zwei Zeitpunkte vergleichen; execute count und user calls zählen unterschiedliche Vorgänge. Ein hoher absoluter Zählerstand allein ist keine Fehlerdiagnose.

    Zähler unterscheiden:

    parse count (total) umfasst Hard-, Soft- und Describe-Parse-Aufrufe. parse count (hard) zählt Hard Parses. execute count zählt Ausführungen, user calls umfasst unterschiedliche Aufrufe wie Parse, Execute oder Fetch. Diese Größen sind nicht austauschbar.

    Fiktive Beispielausgabe:

    Zwei Messungen derselben Instanz und desselben Messumfangs; zwischen A und B liegen 60 Sekunden, ohne Neustart.

    ZählerABDifferenz
    parse count (total)2000020600600
    parse count (hard)80083030

    Was sehe ich hier? 600 / 60 = 10 Parse-Aufrufe pro Sekunde; darin 30 / 60 = 0,5 Hard Parses pro Sekunde. Die übrigen 570 Aufrufe sind nicht ohne Einschränkung Soft Parses, weil der Gesamtzähler auch Describe-Aufrufe enthält. Ob die Last problematisch ist, benötigt zusätzliche Beobachtungen.

    Übung zur Wiederverwendung: Cursor A wird 1000-mal ausgeführt und 1000-mal geparst; Cursor B wird 1000-mal ausgeführt und 10-mal geparst. Welcher Fall zeigt mehr Parse-Aufrufe je Ausführung?
    Lösung anzeigen

    A zeigt häufigere Parse-Aufrufe je Ausführung. Das beweist noch keine hohe Hard-Parse-Last: PARSE_CALLS unterscheidet Hard und Soft Parse nicht.

    23. Read-only: aktuelles SQL einer Session zuordnen

    Angemeldete Benutzersessions und SQL_ID
    SELECT
        sid,
        serial#,
        username,
        status,
        sql_id,
        sql_child_number,
        prev_sql_id,
        module,
        action,
        last_call_et
    FROM v$session
    WHERE type = 'USER'
      AND username IS NOT NULL
    ORDER BY status, username, sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSSQL_ID
    11423817APP_USERACTIVE8u3k2m9p4q7r1
    ZeileSQL_CHILD_NUMBERPREV_SQL_IDMODULEACTIONLAST_CALL_ET
    106c2n7v8b3m4s9BestellportalBestellung speichern30

    Was sehe ich hier? Eine angemeldete Benutzersession wird mit ihrem Anwendungskontext angezeigt. LAST_CALL_ET ist hier die Zeit in Sekunden seit dem Wechsel zu ACTIVE. Bei INACTIVE zählt der Wert die Sekunden seit dem Wechsel zu INACTIVE. Er ist kein allgemeiner Laufzeitzähler der SQL_ID. SQL_CHILD_NUMBER bezeichnet den aktuellen Child Cursor; PREV_SQL_ID ist die Kennung des vorigen SQL. Die weitere Bewertung des Statements erfolgt im SQL-Tuning-Kapitel.

    24. Diagnoseweg bei hoher Hard-Parse-Last

    Hard Parse hoch→Literal-SQL?→Viele Child Cursor?→Invalidierungen?→Anwendung / Bind?

    Erst nach dieser Ursachenanalyse wird entschieden, ob ein Memory-, SQL- oder Anwendungsproblem vorliegt. Eine automatische Parameteränderung ist kein Diagnoseweg.

    25. SQL-Lebenszyklus als Diagnosekette

    Client Call→ Parse→ Cursor→ Execute→ Fetch→ Resultat

    Bei DML kommen Transaktionsarbeit, Undo und Redo hinzu. Bei SELECT ist insbesondere die konsistente Sicht wichtig. Dieser Diagnoseweg ordnet Verzögerungen einer Phase zu: Liegt der Aufwand beim Vorbereiten, bei der Verarbeitung oder beim Abrufen? Abschnitt 24 untersucht dagegen gezielt die Ursachen erhöhter Parse-Last. Die Pfeile sind ein Lernmodell; ein wiederverwendeter offener Cursor muss nicht erneut geparst werden.

    Kapitelgrenzen: Dieses Kapitel erklärt den Ablauf einer SQL-Anweisung. SQL Tuning und die Interpretation von Execution Plans bleiben bewusst außen vor. Execution Plans werden im Execution-Plan-Trainer behandelt; Performance-Diagnose im Performance-Tuning-Kapitel.

    26. Typische Fehlannahmen

    AussageBewertungKorrekte Einordnung
    Cursor = SQL-Text.FalschCursor ist eine interne Ausführungs-/Verwaltungsstruktur.
    Soft Parse kostet nichts.FalschMatching und Prüfungen bleiben notwendig.
    Zu einer SQL_ID gehört im Cache immer genau ein Child Cursor.FalschMehrere Child Cursor können notwendig sein.
    Viele Hard Parses = Shared Pool zu klein.FalschLiteral-SQL, Invalidations oder fehlendes Sharing können Ursache sein.
    OPEN_CURSORS = Zahl der Shared Cursors.FalschOpen Cursor und Shared Cursor sind unterschiedliche Ebenen.
    Bind Variables garantieren einen einzigen Plan.FalschOptimizer-/Datenverteilung kann mehrere Child Cursor bewirken.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Beim Parsing prüft Oracle die SQL-Anweisung und sucht nach einem verwendbaren Cursor. Ein Hard Parse erfordert zusätzliche Arbeit, insbesondere die Optimierung.
    2. Ein Parent Cursor und seine Child Cursor gehören zusammen. Unterschiedliche Ausführungsbedingungen können mehrere Child Cursor für denselben SQL-Text erforderlich machen.
    3. Bind-Variablen trennen SQL-Struktur und Werte und können die gemeinsame Nutzung von Cursorn erleichtern. Sie garantieren weder einen einzigen Child Cursor noch immer den besten Plan.
    4. Execute startet die Ausführung; Fetch liefert bei einer Abfrage Ergebniszeilen an den Client. Die erste gelieferte Zeile bedeutet deshalb noch nicht, dass das ganze Ergebnis abgeholt wurde.
    5. Parse-, Ausführungs- und Fetch-Werte müssen gemeinsam und im passenden Messzeitraum gelesen werden. Ein hoher Zähler allein erklärt noch keine langsame Anwendung.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Welche Prüfungen gehören zum Parsing?
    Syntax, Semantik/Objekte, Rechte und die Suche nach einem verwendbaren Cursor.
    Frage 2: Was unterscheidet Hard Parse und Soft Parse?
    Beim Soft Parse kann ein vorhandener passender Cursor wiederverwendet werden. Beim Hard Parse wird neuer ausführbarer Code benötigt. Bei den hier betrachteten Abfragen gehören Optimierung und Planerzeugung dazu; nicht jede SQL-Art durchläuft dieselben Schritte.
    Frage 3: Warum ist ein Cursor nicht einfach die SQL?
    Der Session-Cursor hält den eigenen Verarbeitungskontext; gemeinsam nutzbare SQL-Strukturen liegen im Library Cache. Ein SQL-Text kann mehrere Child Cursor besitzen und wiederholt ausgeführt werden.
    Frage 4: Was unterscheidet Parent und Child Cursor?
    Der Parent enthält den SQL-Text. Der Child enthält unter anderem Plan, Objektmetadaten und Optimizer-Umgebung.
    Frage 5: Was ist der Unterschied zwischen Open Cursor und Shared Cursor?
    Open Cursor gehört zum Sessionkontext; Shared Cursor ist eine gemeinsam nutzbare Struktur im Shared Pool.
    Frage 6: Warum helfen Bind Variables?
    Die SQL-Struktur bleibt gleich und Werte werden getrennt bereitgestellt. Das erleichtert Wiederverwendung, garantiert aber keinen einzigen Child Cursor oder Plan.
    Frage 7: Warum ist hoher Hard Parse nicht automatisch ein Memoryproblem?
    Ursachen können Literal-SQL, Invalidierungen oder Anwendungsmuster sein. Viele Child Cursor sind eine Beobachtung; die zugrunde liegenden Inkompatibilitäten müssen untersucht werden.
    Frage 8: Was unterscheidet Execute und Fetch bei SELECT?
    Execute startet die Ausführung. Fetch ruft Ergebniszeilen ab, kann weitere Datenbankarbeit auslösen und mehrfach erfolgen.
    Frage 9: Beweisen 50 PARSE_CALLS auch 50 Hard Parses?
    Nein. PARSE_CALLS zählt Parse-Aufrufe, nicht ausschließlich Hard Parses.
    Frage 10: Warum reicht die SQL_ID in einer V$SQL-Auswertung nicht immer aus?
    Weil mehrere Child Cursor vorhanden sein können. CHILD_NUMBER und bei containerübergreifender Auswertung CON_ID helfen bei der Zuordnung.
    Frage 11: Sind &SQL_ID und :SQL_ID derselbe Mechanismus?
    Nein. &SQL_ID wird im SQL*Plus-Client textuell ersetzt; :SQL_ID ist ein Bind-Platzhalter.
    Frage 12: Was bedeutet LAST_CALL_ET = 30 bei INACTIVE?
    Die Session ist seit 30 Sekunden inaktiv. Das ist keine SQL-Laufzeit.
    Frage 13: Sieht ein späterer Fetch derselben gewöhnlichen READ-COMMITTED-Abfrage plötzlich fremde, zwischenzeitlich bestätigte Änderungen?
    Nein. Die Abfrage behält ihre konsistente Lesesicht. Eine neu gestartete Abfrage kann einen neueren Datenstand sehen.

    4. Oracle Net, TNS und Listener – Verbindungen verstehen und diagnostizieren

    Namensauflösung, Connect Descriptor, Listener, Services, dynamische Registrierung und systematische Verbindungsdiagnose.

    Lernkompass
    Einfach gesagt Du lernst die einzelnen Stationen einer Oracle-Net-Verbindung kennen und kannst erkennen, an welcher Station ein Verbindungsproblem entsteht.
    Warum ist das wichtig? Netzwerk-, Listener-, Service- und Loginfehler sehen für Anwender oft gleich aus, haben technisch aber unterschiedliche Ursachen.
    Nach diesem Kapitel Du kannst Connect Identifier, Connect Descriptor, Listener, Service und Session unterscheiden und einen Diagnoseweg ableiten.

    Einführung: Oracle Net ermöglicht die Kommunikation zwischen einem Datenbankclient und dem Oracle-Server. Bei einer typischen Netzwerkverbindung müssen die Zielangabe, der erreichbare Listener, der angeforderte Datenbankservice und die Anmeldung zusammenpassen. Der Listener vermittelt den Verbindungsaufbau; die anschließenden Datenbankaufrufe werden von Serverprozessen bearbeitet. Ein erreichbarer Rechner allein bestätigt deshalb noch keinen nutzbaren Datenbankzugang.

    Dieses Kapitel bietet eine Anleitung zur Eingrenzung: Welche Station funktioniert bereits, und an welcher scheitert der Aufbau? Dazu ordnen wir zunächst Namen und Dienste ein, lesen anschließend die Konfigurationsdateien und bewerten die Aussagekraft der Tests. So lässt sich eine Netzwerkstörung von einem fehlenden Service oder einem Anmeldeproblem unterscheiden.

    Oracle 19c: fachliche Grundlage

    Bevor einzelne Dateien und Werkzeuge betrachtet werden, müssen drei Begriffe sauber getrennt werden. Ein Connect Identifier ist die vom Client verwendete Verbindungsangabe, zum Beispiel ein Net Service Name oder ein Easy-Connect-String. Ein Connect Descriptor beschreibt die konkrete Netzwerkroute und den angeforderten Service. Der Service ist schließlich der logische Datenbankdienst, zu dem die Verbindung aufgebaut werden soll.

    Diese Trennung verhindert einen typischen Diagnosefehler: Ein Alias wie DBALIAS ist weder der Listener noch die Database. Er ist lediglich ein Name, der über die verwendete Naming-Methode zu den eigentlichen Verbindungsinformationen aufgelöst wird.

    1. Typischer Netzwerk-Verbindungsweg im Gesamtbild

    Dieses Modell beschreibt eine typische Netzwerkverbindung über einen Listener. Eine lokale Bequeath-Verbindung kann ohne Listener einen Dedicated Server verwenden. Der Listener vermittelt den Aufbau, Serverprozesse bearbeiten die Datenbankaufrufe.
    Client / Connect Identifier → Namensauflösung → Connect Descriptor → Listener → Service Handler → Datenbanksession

    2. Was meint „TNS“ in der Praxis?

    Im Betriebsalltag werden Begriffe wie „TNS-Alias“, „TNS-Verbindung“ oder „TNS-Fehler“ sehr breit verwendet. Für eine saubere Diagnose ist die genauere Oracle-Net-Terminologie hilfreicher.

    Bei der lokalen Namensauflösung steht beispielsweise in tnsnames.ora ein Net Service Name wie DBALIAS. Dieser Name verweist auf einen Connect Descriptor. Der Descriptor enthält die Netzwerkroute zum Listener und die Information, welcher Datenbank-Service angefordert wird.

    3. SID und SERVICE_NAME

    BegriffBedeutungPraxis
    SIDLokale Kennung einer Oracle-Instance.ORACLE_SID, PMON, lokale Administration.
    SERVICE_NAMEName des angeforderten logischen Dienstes für Clientverbindungen.Bevorzugte logische Adressierung von Anwendungen.
    DB_NAMEName der Oracle Database.Nicht mit Service oder Instance verwechseln.

    4. Service als logischer Zugangspunkt

    Ein Service beschreibt den logischen Zugang, den ein Client anfordert. Dadurch muss eine Anwendung nicht primär wissen, welche interne Instance die Verbindung letztlich bearbeitet. Eine Database kann mehrere Services bereitstellen, beispielsweise für unterschiedliche Anwendungen oder Aufgaben.

    Für dieses Kapitel ist vor allem die Abgrenzung wichtig: SID/INSTANCE_NAME identifizieren eine Instance; ein Service beschreibt einen angebotenen logischen Dienst für Clientverbindungen. Die weitergehende Serviceverwaltung wird hier nicht vertieft.

    5. SERVICE_NAME ist nicht SERVICE_NAMES

    Im Connect Descriptor steht SERVICE_NAME im Singular. Er bezeichnet genau den Service, den diese Verbindung anfordert. Davon zu unterscheiden ist der Initialisierungsparameter SERVICE_NAMES, der in älteren beziehungsweise bestehenden Konfigurationen mehrere Namen enthalten kann.

    Oracle weist für 19c darauf hin, dass die kundenseitige Verwendung des Parameters SERVICE_NAMES zur Serviceverwaltung deprecated ist. Das bedeutet: Der Parameter ist noch vorhanden, soll aber nicht als Grundlage neuer Serviceverwaltung verwendet werden. Sein vorhandener Wert darf für die Diagnose weiterhin angezeigt werden. Das ändert nichts daran, dass der Parameter in bestehenden Systemen sichtbar sein kann. Für die Diagnose sollte deshalb zwischen beobachten und Serviceverwaltung ändern getrennt werden.

    READ ONLY – Service- und Listenerparameter anzeigen
    SELECT
        name,
        display_value
    FROM v$parameter
    WHERE name IN (
            'instance_name',
            'service_names',
            'local_listener',
            'remote_listener'
          )
    ORDER BY name;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    NAMEDISPLAY_VALUE
    instance_namedemodb
    local_listenerLISTENER_APP_ADDR
    remote_listenerNULL
    service_namesdemodb.example.net

    Was sehe ich hier? V$PARAMETER zeigt die für die aktuelle Session wirksamen Initialisierungsparameter, keine Betriebssystem-Konfigurationsdateien. Der Listener-Alias beschreibt das Registrierungsziel und muss in der maßgeblichen Serverumgebung zu einer Listeneradresse auflösbar sein; die Werte allein bestätigen keine erfolgreiche Registrierung. NULL bei REMOTE_LISTENER kann in einer Einzelinstanz passend sein.

    6. Was ist ein Connect Descriptor?

    Ein Connect Descriptor beschreibt, wie der Client den Listener erreicht und welchen Service er anfordert. Typische Bestandteile sind eine Protokolladresse mit Host und Port sowie CONNECT_DATA mit SERVICE_NAME.

    KONFIGURATIONSBEISPIEL – tnsnames.ora, kein SQL-Befehl
    DBALIAS =
      (DESCRIPTION =
        (ADDRESS =
          (PROTOCOL = TCP)
          (HOST = dbserver.example.net)
          (PORT = 1521)
        )
        (CONNECT_DATA =
          (SERVICE_NAME = dbservice.example.net)
        )
      )

    7. Connect Identifier, Net Service Name und Connect Descriptor

    BegriffBeispielBedeutung
    Connect IdentifierDBALIAS oder Easy-Connect-AngabeDie Angabe, die der Client beim Verbindungsaufbau verwendet.
    Net Service NameDBALIASAlias, der bei Local Naming in tnsnames.ora einem Descriptor zugeordnet wird.
    Connect Descriptor(DESCRIPTION=(ADDRESS=...)(CONNECT_DATA=...))Enthält Netzwerkadresse des Listeners und Zielinformationen für den Service.
    Service Namedbservice.example.netLogischer Datenbankdienst, den der Client anfordert.
    Zwei Auflösungen unterscheiden:

    Oracle Net ordnet beispielsweise DBALIAS einem Connect Descriptor zu. Die Hostnamensauflösung ordnet anschließend dbserver.example.net einer Netzwerkadresse zu. Ein gefundener Alias beweist nicht, dass der darin genannte Host erreichbar ist.

    8. Easy Connect als Alternative

    Nicht jede Verbindung benötigt einen lokalen tnsnames.ora-Alias. Mit Easy Connect kann eine Verbindung direkt aus Host, Port und Service aufgebaut werden.

    SHELL – SQL*Plus mit Easy Connect
    sqlplus app_user@//dbserver.example.net:1521/dbservice.example.net
    APP_USER, Host und Service sind Beispielwerte und müssen zur Umgebung passen. SQL*Plus fragt das Passwort interaktiv ab; es steht nicht in der Kommandozeile. Bei einem nativen Oracle-Net-Client muss die verwendete Naming-Methode zugelassen sein.

    9. Die drei zentralen Oracle-Net-Dateien

    DateiTypische SeiteAufgabe
    tnsnames.oraClientLokale Alias->Connect-Descriptor-Zuordnung.
    sqlnet.oraClient / ServerNamensauflösung und weitere Oracle-Net-Einstellungen.
    listener.oraServerListener-Endpunkte und Listener-Parameter; statische Service-Einträge nur wenn erforderlich.
    NAMES.DIRECTORY_PATH: Dieser sqlnet.ora-Parameter bestimmt die Reihenfolge der Oracle-Net-Namensauflösungsmethoden, beispielsweise TNSNAMES und EZCONNECT. Er bezeichnet weder Dateisystemverzeichnisse noch DNS-Server. Unterschiedliche Naming-Konfigurationen können erklären, warum ein Alias oder Easy Connect in einem Client anders funktioniert.

    10. TNS_ADMIN und mehrere Oracle Homes

    Gerade auf Servern mit mehreren Oracle Homes ist wichtig, welche tnsnames.ora oder sqlnet.ora tatsächlich verwendet wird. Die Umgebungsvariable TNS_ADMIN kann auf ein zentrales Oracle-Net-Verzeichnis zeigen.

    Ein häufiger Diagnosefehler ist, eine vermeintlich zuständige Datei zu bearbeiten oder zu lesen, während der Client tatsächlich eine andere Konfigurationsquelle verwendet.

    SHELL – aktuelle Umgebung read-only prüfen
    printf 'ORACLE_HOME=%s\n' "${ORACLE_HOME:-nicht gesetzt}"
    printf 'TNS_ADMIN=%s\n' "${TNS_ADMIN:-nicht gesetzt}"
    command -v sqlplus
    command -v tnsping
    Aussagegrenze: Diese Befehle zeigen die Umgebung der aktuellen Shell. Eine laufende Anwendung kann andere Werte, Treiber und Verbindungsstrings verwenden. Ein nicht gesetztes TNS_ADMIN bedeutet nicht, dass keine Konfiguration gelesen wird.

    Typische Konfigurationsorte sind TNS_ADMIN und ORACLE_HOME/network/admin. Bei einem Read-only Oracle Home ist auch ORACLE_BASE_HOME/network/admin relevant. Die plattformspezifische UNIX-Dokumentation nennt auf Solaris zusätzlich /var/opt/oracle für bestimmte Oracle-Net-Dateien. Suchreihenfolgen hängen von Datei, Plattform und Client ab; es gibt keine für alle Fälle identische Reihenfolge.

    Vergleiche den tatsächlich verwendeten Client und seine Prozesskonfiguration. Bei TNSping helfen Naming-Adapter und kontaktierter Descriptor in der Ausgabe; bei lsnrctl status helfen Listeneradresse und angegebene Parameterdatei. Diese Angaben ersetzen nicht die Prüfung der Anwendungskonfiguration.

    11. Was macht der Listener?

    Der Listener nimmt neue Verbindungsanfragen an einem Netzwerk-Endpunkt entgegen. Anhand seiner Serviceinformationen wählt er einen geeigneten Service Handler, beispielsweise einen Dedicated Server Process oder Dispatcher, und leitet die Verbindungsanfrage weiter.

    Nach erfolgreicher Übergabe kommuniziert der Client mit dem ausgewählten Service Handler; der Listener ist an dieser Session-Kommunikation nicht mehr beteiligt. Er ist deshalb weder Database noch Session noch der Prozess, der die SQL der Session ausführt.

    12. Dynamische Service-Registrierung durch LREG

    Bei der dynamischen Service-Registrierung meldet der Hintergrundprozess LREG der laufenden Instance Informationen zu Services, Instance und verfügbaren Service Handlern an den Listener. LOCAL_LISTENER und gegebenenfalls REMOTE_LISTENER bestimmen, bei welchen Listenern registriert wird. Für dynamisch registrierte Services ist kein entsprechender statischer Service-Eintrag in listener.ora erforderlich.

    Registrierungsalias: LISTENER_APP_ADDR im Parameter LOCAL_LISTENER muss serverseitig eine Listeneradresse ergeben. Das ist weder der Anmeldealias DBALIAS noch zwingend der Listenername LISTENER_APP. Ein nicht ausdrücklich gesetzter LOCAL_LISTENER-Wert schließt die Registrierung beim Standardziel auf dem lokalen Host, TCP-Port 1521, nicht aus.

    13. Statische und dynamische Registrierung unterscheiden

    VariantePrinzipTypischer Einsatz
    DynamischInstance registriert Services bei Listener.Normaler Datenbankbetrieb.
    StatischSID-/Service-Information wird fest in listener.ora beschrieben.Beispielsweise administrative Fernverbindungen zum Starten einer noch nicht laufenden Instanz; keine Anleitung zur Änderung der Registrierung.

    14. Listener-Status richtig lesen

    READY bedeutet, dass die Instanz Verbindungen annehmen kann. UNKNOWN bedeutet bei einer statischen Registrierung, dass der Listener den Zustand nicht dynamisch kennt; es heißt nicht automatisch „Datenbank ausgefallen“. Prüfe den benannten Listener und seinen konkreten Host/Port, nicht nur einen beliebigen laufenden Listener.
    SHELL – Read-only-Diagnose des Standardlisteners
    lsnrctl status
    lsnrctl services

    Entscheidend ist nicht nur, dass der Listener läuft. Ebenso wichtig ist, ob der erwartete Service registriert ist und welchen Status beziehungsweise Handler der Listener anzeigt.

    Ohne Namen beziehungsweise zuvor ausgewählten aktuellen Listener richten sich die Befehle an LISTENER. Bei einem anderen konfigurierten Namen das Ziel ausdrücklich angeben. LISTENER_APP ist hier ein Beispielname, kein Service-Name. Vergleiche die ausgegebene Adresse mit Host und Port des Client-Descriptors.
    SHELL – benannten Listener prüfen
    lsnrctl status LISTENER_APP
    lsnrctl services LISTENER_APP

    Fiktive Beispielausgabe:

    Gekürzter Ausschnitt aus STATUS und SERVICES desselben Beispiellisteners; Host, Port und Namen sind Lernwerte.

    Alias                     LISTENER_APP
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbserver.example.net)(PORT=1521)))
    Services Summary...
    Service "dbservice.example.net" has 1 instance(s).
      Instance "demodb", status READY, has 1 handler(s) for this service...
        Handler(s):
          "DEDICATED" established:12 refused:0 state:ready
             LOCAL SERVER

    Was sehe ich hier? Der erwartete Service ist an diesem Listener bekannt; die Instanz und der Handler melden Bereitschaft. established ist ein Verbindungszähler, nicht die aktuelle Zahl aktiver Sessions. Die Ausgabe beweist noch keinen erfolgreichen Login für APP_USER.

    WertEinordnung
    READYInstanz kann Verbindungen annehmen.
    BLOCKEDInstanz kann aktuell keine Verbindungen annehmen.
    UNKNOWNStatisch registrierte Instanz; ihr Zustand ist dem Listener nicht durch dynamische Registrierung bekannt. Kein unmittelbarer Ausfallnachweis.

    15. Service-Inventar aus der Datenbank prüfen

    Zwei getrennte Nachweise: V$SERVICES beschreibt Services in der Datenbank. Eine Zeile beweist nicht, dass dieser Service beim gerade untersuchten Listener registriert ist. Die aktive Instanzsicht liefert V$ACTIVE_SERVICES; die tatsächliche Listener-Sicht liefert lsnrctl services. Auch ein registrierter Service ersetzt keinen erfolgreichen Login-Test.
    Services aus V$SERVICES
    SELECT
        name,
        network_name,
        pdb,
        con_id
    FROM v$services
    ORDER BY name, con_id;

    Fiktive Beispielausgabe:

    NAMENETWORK_NAMEPDBCON_ID
    dbservice.example.netdbservice.example.netAPP_PDB3

    Was sehe ich hier? Eine ausgewählte Servicezeile ist APP_PDB zugeordnet. Eine Zeile in V$SERVICES beweist weder Aktivität noch Registrierung beim angesprochenen Listener. NULL bei PDB kann eine Non-CDB oder einen nicht einer PDB zugeordneten Service betreffen.

    Ausführungskontext: Für die CDB-Übersicht eine entsprechend berechtigte Verbindung zu CDB$ROOT verwenden; der sichtbare Umfang hängt von Container und Berechtigungen ab. Ein Service für APP_PDB muss nicht im Parameter SERVICE_NAMES als manuell eingetragener Name stehen.
    Ist der Service auf dieser Instanz aktiv? Dies ist ein eigener Nachweis vor dem Vergleich mit der Listenerausgabe.
    SQL – aktive Services der Instanz
    SELECT name, network_name, pdb, con_id
    FROM v$active_services
    ORDER BY name, con_id;

    Fiktive Beispielausgabe:

    NAMENETWORK_NAMEPDBCON_ID
    dbservice.example.netdbservice.example.netAPP_PDB3

    Was sehe ich hier? Der Service wird in der aktiven Instanzsicht angezeigt. Ob genau der vom Client erreichte Listener ihn kennt, ist weiterhin separat mit lsnrctl services zu prüfen.

    16. Dedicated Server: was nach dem Listener passiert

    In einer typischen Dedicated-Server-Verbindung erhält die Clientverbindung einen dedizierten Serverprozess. Dieser Serverprozess verarbeitet die Datenbankaufrufe der Session. Der Listener ist nach erfolgreicher Vermittlung nicht der Prozess, der die SQL-Anweisungen der Session ausführt.

    Das erklärt auch, warum ein Listenerproblem hauptsächlich neue Verbindungen betrifft. Bereits etablierte Sessions sind konzeptionell von der ursprünglichen Listenervermittlung zu unterscheiden.

    17. TNSping: Was beweist es und was nicht?

    TNSping prüft, ob ein Oracle-Net-Namenseintrag aufgelöst und ein Listener-Endpunkt erreicht werden kann. Es testet jedoch keine vollständige Datenbankanmeldung mit Benutzer und Passwort.

    Ein erfolgreiches TNSping beweist daher weder, dass der angeforderte Datenbank-Service tatsächlich eine erfolgreiche Session bereitstellt, noch dass Benutzername, Passwort oder Datenbankberechtigungen korrekt sind.

    SHELL – Alias-Auflösung und Listener-Erreichbarkeit testen
    tnsping DBALIAS

    Fiktive Beispielausgabe:

    Gekürzter TNSping-Ausschnitt.

    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver.example.net)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=dbservice.example.net)))
    OK (10 msec)

    Was sehe ich hier? Der Alias wurde über TNSNAMES aufgelöst und der Listener antwortet. 10 ms ist ein Schätzwert für diesen Test, keine SQL-Antwortzeit. Weder ein erfolgreicher Login noch eine laufende Datenbank sind damit bewiesen. Prüfe besonders den tatsächlich kontaktierten Host, Port und Service.

    18. Verbindungstest in Diagnoseebenen aufteilen

    1. Name Wird der Oracle-Net-Alias zum Descriptor aufgelöst und danach der darin genannte Host zur richtigen Netzwerkadresse?
    2. Netzwerk Ist der Zielhost/Port erreichbar?
    3. Listener Läuft der Listener und kennt er den Service?
    4. Service / Database Ist der erwartete Service registriert und die zugehörige Datenbankumgebung verfügbar?
    5. Login Sind Benutzer, Passwort, Service und Rechte korrekt?

    19. Typische Oracle-Net-Fehler richtig einordnen

    FehlerbildErste EbeneTypische Frage
    TNS-Alias unbekanntNamensauflösungWelche tnsnames.ora/TNS_ADMIN wird verwendet?
    Listener nicht erreichbarNetzwerk / ListenerHost, Port, Prozess und Firewall korrekt?
    Service unbekanntService-RegistrierungIst der Service in lsnrctl services registriert?
    ORA-01017AuthentifizierungStimmen Benutzer/Passwort, und verbindet sich der Client wirklich mit der erwarteten Datenbank bzw. PDB?
    Verbindung bricht später abNetzwerk / Timeout / PoolIst es ein Connect- oder Laufzeitproblem?
    Fehlernummern der ersten Ebene zuordnen:
    FehlerErste Einordnung
    ORA-12154Connect Identifier konnte mit den konfigurierten Naming-Methoden nicht aufgelöst werden.
    ORA-12541Am angesprochenen Ziel wurde kein Listener erreicht.
    ORA-12514Listener kennt den angeforderten Service aktuell nicht.
    ORA-12520Kein verfügbarer Handler für den angeforderten Servertyp.

    20. PDB-Verbindungen brauchen den richtigen Service

    In einer Multitenant-Umgebung ist der Service besonders wichtig, weil der Client damit in den vorgesehenen Container gelangen soll. Eine erfolgreiche Verbindung zur CDB beziehungsweise zu einem anderen Service ist nicht automatisch eine erfolgreiche Verbindung zur gewünschten PDB.

    Bei einem Loginproblem sollte deshalb neben Benutzer und Passwort immer kontrolliert werden, zu welchem Service und Container die Anwendung tatsächlich verbindet.

    SQL – READ ONLY: eigener Sessionkontext
    SELECT
        SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS service_name,
        SYS_CONTEXT('USERENV', 'CON_NAME')     AS container_name,
        SYS_CONTEXT('USERENV', 'DB_NAME')      AS database_name,
        SYS_CONTEXT('USERENV', 'INSTANCE_NAME') AS instance_name
    FROM dual;

    Fiktive Beispielausgabe:

    SERVICE_NAMECONTAINER_NAMEDATABASE_NAMEINSTANCE_NAME
    dbservice.example.netAPP_PDBDEMODBdemodb

    So liest du das Ergebnis: Diese bereits aufgebaute Session arbeitet in APP_PDB. Die Abfrage untersucht die eigene bestehende Verbindung, keine fehlgeschlagene Anmeldung. Die Kennungen gehören verschiedenen Ebenen an und müssen deshalb nicht gleich lauten.

    21. Connection Pools

    Viele Anwendungen verwenden Connection Pools, damit nicht für jede Anfrage eine neue Datenbankverbindung aufgebaut werden muss. Das reduziert Login- und Verbindungsaufwand.

    Ein Pool muss aber zur Arbeitslast passen. Zu große Pools können unnötig viele Datenbanksessions und Serverprozesse erzeugen; zu kleine Pools können Anfragen bereits in der Anwendung warten lassen.

    Poolgröße nicht isoliert als Oracle-Parameter behandeln. Anwendung, Servermodell, Sessions, Prozesslimit und tatsächliche Parallelität gehören zusammen.

    22. Clienttechnologie bei der Diagnose mitdenken

    Eine Anwendung kann Oracle über unterschiedliche Clienttechnologien erreichen, beispielsweise JDBC oder OCI. Für den grundlegenden Oracle-Net-Verbindungsweg ändert das nichts an der notwendigen Trennung von Naming, Netzwerk, Listener, Service und Datenbanksession.

    Bei konkreten Störungen ist die Clienttechnologie trotzdem relevant, weil Treiber, Connection Strings und Pool-Konfigurationen unterschiedlich sein können. Auf Datenbankseite helfen Sessioninformationen wie PROGRAM, MODULE, MACHINE und CLIENT_IDENTIFIER bei der Zuordnung.

    SQL*Plus ist nicht automatisch die Anwendung: Vergleiche bei JDBC die tatsächliche JDBC-URL, Treiberversion und Treibereinstellungen, etwa oracle.net.tns_admin für die Aliasdatei. Ein erfolgreicher SQL*Plus- oder TNSping-Test aus der Administrationsshell beweist nicht, dass JDBC dieselbe Konfigurationsquelle oder dasselbe Ziel verwendet.
    Ziel der folgenden Abfrage:
    Wenn eine Session bereits zustande gekommen ist, kann die folgende read-only Abfrage helfen, die Verbindung einer Anwendung beziehungsweise einem Client zuzuordnen.
    SQL – READ ONLY: Clientinformationen von Benutzersessions
    SELECT sid, serial#, con_id,
           username,
           service_name,
           machine,
           program,
           module,
           client_identifier
    FROM v$session
    WHERE type = 'USER'
    ORDER BY username, machine, program;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileUSERNAMESERVICE_NAMEMACHINEPROGRAMMODULE
    1APP_USERdbservice.example.netapp01JDBC Thin ClientBestellportal
    ZeileSIDSERIAL#CON_IDCLIENT_IDENTIFIER
    114238173demo-4711

    Was sehe ich hier? SID und SERIAL# identifizieren die Session innerhalb der Instanz; CON_ID ordnet den Container zu. Service, Rechner und Modul geben Hinweise auf die Herkunft. Clientangaben können fehlen oder von der Anwendung frei gesetzt sein; sie ersetzen keine Authentifizierungsprüfung.

    23. Systematische read-only Verbindungsdiagnose

    Die Reihenfolge ist eine Orientierung. Beginne mit der Ebene, auf die der konkrete Fehler hinweist. Dokumentiere betroffenen Client, Zeitpunkt und den tatsächlich verwendeten Verbindungsstring. Für Datenbankabfragen bei gestörter Anmeldung ist ein anderer geeigneter, bereits verfügbarer Diagnosezugang erforderlich.

    24. Typische Fehlannahmen

    AussageBewertungKorrekte Einordnung
    TNSping erfolgreich = Login funktioniert.FalschTNSping testet keine Benutzeranmeldung.
    Listener läuft = Service ist verfügbar.FalschDer Service muss auch registriert/erreichbar sein.
    SID und SERVICE_NAME sind Synonyme.FalschInstance-Kennung und logischer Service sind unterschiedliche Konzepte.
    Der Listener führt die SQL aus.FalschEr vermittelt neue Verbindungen; SQL läuft im Datenbankkontext.
    Es gibt immer nur eine tnsnames.ora.FalschOracle Homes und TNS_ADMIN können unterschiedliche Quellen ergeben.
    Praxisbeispiel: Listener erreichbar, Login trotzdem fehlgeschlagen

    Beispielbefund: tnsping DBALIAS antwortet, die Anwendung meldet ORA-12514. Im Connect Descriptor steht dbservice.example.net; dieser Name fehlt in der Ausgabe des angesprochenen lsnrctl services.

    1. Host, Port und SERVICE_NAME aus genau dem vom Client verwendeten Descriptor festhalten.
    2. Die Services des Listeners an dieser Adresse prüfen.
    3. Service-Inventar, aktiven Service und PDB-Zustand über eine vorhandene administrative Verbindung vergleichen.

    Musterlösung: Die Netzwerkantwort widerlegt den Fehler nicht. Der angefragte Dienst ist beim angesprochenen Listener nicht bekannt. Falschen Servicenamen und fehlende Registrierung unterscheiden; ein Passwortwechsel erklärt ORA-12514 nicht. Nach einem Listenerstart kann die Registrierung vorübergehend noch fehlen; Zeitpunkt und Verlauf mitbewerten, statt aus einer Momentaufnahme schon die Ursache abzuleiten. Bei ORA-01017 wäre dagegen die Authentifizierung im richtigen Zielkontext zu prüfen.

    25. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Net Services Administrator's Guide
    Naming Methods, Connect Descriptors, Listener und Service Registration
    https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/

    Oracle Database 19c Net Services Reference
    tnsnames.ora, listener.ora und Oracle-Net-Parameter
    https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Ein Verbindungsaufbau umfasst Namensauflösung, Netzwerk, Listener, Service und Anmeldung. Jede dieser Ebenen kann unabhängig von den anderen scheitern.
    2. Ein Net Service Name ist ein Alias für Verbindungsinformationen. Der angeforderte Service ist ein logischer Zugang zur Datenbank und nicht dasselbe wie die SID einer Instanz.
    3. Der Listener nimmt Verbindungsanfragen entgegen und vermittelt den Zugang. Im üblichen Dedicated-Server-Betrieb verarbeitet anschließend der Serverprozess die SQL-Anfragen.
    4. TNS_ADMIN und das verwendete Oracle Home bestimmen mit, welche Konfigurationsdateien gelesen werden. Client und Datenbankserver können unterschiedliche Konfigurationen verwenden.
    5. Ein erfolgreiches TNSping beweist keine erfolgreiche Datenbankanmeldung. Erst der passende Verbindungstest zeigt, ob Benutzer, Service und gegebenenfalls PDB tatsächlich erreichbar sind.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Was ist der Unterschied zwischen SID und Service Name?
    SID kennzeichnet eine lokale Instance; ein Service Name bezeichnet einen logischen Dienst für Clientverbindungen.
    Frage 2: Was beweist ein erfolgreiches TNSping?
    TNSping zeigt, dass der verwendete Oracle-Net-Namensbezeichner aufgelöst werden kann und der in der Connect-Beschreibung adressierte Listener erreichbar beziehungsweise antwortfähig ist. Es prüft weder Benutzername/Passwort noch, ob eine echte Datenbank-Session erfolgreich aufgebaut werden kann.
    Frage 3: Warum kann der Listener laufen, obwohl der erwartete Service nicht erreichbar ist?
    Listener-Prozess und Service-Registrierung sind getrennte Ebenen. Ein Service kann fehlen oder falsch registriert sein.
    Frage 4: Warum ist TNS_ADMIN bei mehreren Oracle Homes wichtig?
    TNS_ADMIN kann das Konfigurationsverzeichnis festlegen. Maßgeblich ist die Umgebung des tatsächlich verwendeten Clients; Anwendungen können eigene Treibereinstellungen verwenden.
    Frage 5: Was ist der Vorteil eines Connection Pools?
    Verbindungen werden wiederverwendet und müssen nicht für jede Anfrage neu aufgebaut werden.
    Frage 6: Welche Diagnoseebenen helfen bei einem Verbindungsfehler?
    Oracle-Net- und Hostnamensauflösung, Netzwerk/Port, Listener, Service-Registrierung, Datenbank-/PDB-Zustand sowie Authentifizierung und Anwendung. Die Reihenfolge richtet sich nach dem Fehlerbild.
    Frage 7: Was sind Alias, Host und Service im gezeigten Descriptor?
    DBALIAS ist der lokale Alias, dbserver.example.net der Host und dbservice.example.net der angeforderte Service. Diese Namen erfüllen unterschiedliche Aufgaben.
    Frage 8: Warum kann lsnrctl services das falsche Untersuchungsziel treffen?
    Ohne ausdrückliche Auswahl wird der aktuelle beziehungsweise Standardlistener LISTENER angesprochen. Name und ausgegebene Adresse müssen zum Ziel der Anwendung passen.
    Frage 9: Beweist UNKNOWN einen Instanzausfall?
    Nein. Bei statischer Registrierung kennt der Listener den Zustand nicht über dynamische Registrierung.
    Frage 10: Beweist eine Zeile in V$SERVICES, dass der angesprochene Listener den Dienst kennt?
    Nein. Inventar, aktive Services und konkrete Listenerregistrierung sind getrennte Nachweise.
    Frage 11: Warum kann SQL*Plus funktionieren, während JDBC scheitert?
    Beide Clients können unterschiedliche Verbindungsstrings, Konfigurationsquellen, Treibereinstellungen oder Prozessumgebungen verwenden.

    5. Start- und Stopp-Phasen – Lebenszyklus einer Oracle Database

    Von der noch gestoppten Database über NOMOUNT und MOUNT bis OPEN sowie die Unterschiede der Shutdown-Verfahren.

    Lernkompass
    Einfach gesagt Du lernst die Betriebszustände einer Oracle Database und kannst erkennen, welcher Zustand für eine administrative Aufgabe erforderlich ist.
    Warum ist das wichtig? Start- und Stop-Probleme lassen sich nur sauber diagnostizieren, wenn Instance-Zustand, Database-Zustand und bei Multitenant zusätzlich der PDB-Zustand getrennt betrachtet werden.
    Nach diesem Kapitel Du kannst STARTUP-Phasen, Shutdown-Modi und CDB/PDB-Zustände unterscheiden und einen fehlgeschlagenen Start systematisch einordnen.

    Einführung: Beim Start entsteht zunächst die Oracle-Instanz; anschließend werden die Datenbankdateien schrittweise für den Betrieb erschlossen. Ein Start ist deshalb kein einzelner Zustand, sondern ein Ablauf mit prüfbaren Zwischenstufen. Beim Herunterfahren entscheidet die gewählte Variante unter anderem darüber, wie Oracle mit vorhandenen Verbindungen und offenen Transaktionen umgeht. Diese Vorgänge beeinflussen Verfügbarkeit und Wiederanlauf.

    Das Kapitel erklärt die Zustände NOMOUNT, MOUNT und OPEN anhand der jeweils benötigten Komponenten. Danach folgen die Stoppvarianten und ihre Folgen. Du lernst, eine Startmeldung einem erreichten Zustand zuzuordnen und die nächste Prüfung daraus abzuleiten. Bei einer CDB werden zusätzlich PDB-Zustände und der Anwendungszugang betrachtet.

    Oracle 19c: fachliche Grundlage

    Bei der Diagnose sollte zuerst geklärt werden, welche Ebene bereits funktioniert. Läuft noch keine Instance, beginnt die Untersuchung bei Umgebung, Parameterdatei und frühen Startmeldungen. Ist MOUNT erreicht, hat Oracle das Controlfile geöffnet und die Database der Instance zugeordnet. Ist OPEN erreicht, steht die Database für den vorgesehenen Betrieb zur Verfügung.

    Bei einer CDB wird anschließend der Zustand der PDBs betrachtet. Daraus ergibt sich ein einfaches Diagnosemodell: Instance → Database → PDBs → Services/Anwendung. Erst nach dieser Einordnung sollte über eine administrative Aktion entschieden werden.

    1. Der Lebenszyklus einer Oracle Database

    Der folgende Lebenszyklus beschreibt die Instanz und die Database einer Non-CDB beziehungsweise einer CDB aus dem Root-Kontext. STARTUP oder SHUTDOWN innerhalb einer PDB hat eine andere Reichweite: Dort geht es um das Öffnen beziehungsweise Schließen dieser PDB, nicht um eine eigene Instanz.

    Im normalen Betrieb bewegt sich Oracle vereinfacht durch eine feste Zustandsfolge. Aus einem gestoppten Zustand entsteht zunächst eine Instance. Danach wird die Database gemountet und schließlich geöffnet.

    SHUTDOWN → NOMOUNT → MOUNT → OPEN

    2. Phase NOMOUNT – die Instance existiert

    In NOMOUNT wird die Oracle-Instance aufgebaut. Oracle liest seine Initialisierungsparameter, reserviert den benötigten Instanzspeicher und startet die erforderlichen Hintergrundprozesse.

    Die Controlfiles der Database sind in dieser Phase noch nicht geöffnet. Deshalb kennt die Instance die dort gespeicherte physische Datenbankstruktur noch nicht aus dem Controlfile.

    Bereits vorhanden Oracle-Instance, Instanzspeicher, Hintergrundprozesse und eingelesene Initialisierungsparameter.
    Noch nicht geöffnet Controlfiles, Datafiles und Online Redo Logs der Database.

    3. Welche Parameterdatei wird beim Start verwendet?

    Zum Aufbau der Instance benötigt Oracle Initialisierungsparameter. Diese können aus einem SPFILE oder PFILE stammen. Sie bestimmen unter anderem grundlegende Eigenschaften der Instance und enthalten Informationen, die Oracle bereits vor dem Mounten der Database benötigt.

    Suchreihenfolge: Bei einem SQL*Plus-Start ohne explizite PFILE-Angabe sucht Oracle im plattformspezifischen Standardverzeichnis zuerst spfile<SID>.ora, danach spfile.ora und schließlich init<SID>.ora. <SID> steht für die betreffende Oracle-SID. Ein explizites STARTUP PFILE=... benennt die zu lesende Textdatei.

    Eine PFILE kann selbst mit einem SPFILE-Eintrag auf eine binäre Parameterdatei verweisen, etwa in ASM. Die PFILE-Angabe bedeutet deshalb nicht zwingend, dass sämtliche Parameter direkt in der Textdatei stehen. Bei einer durch Oracle Restart verwalteten Datenbank ist die konfigurierte SPFILE-Adresse im SRVCTL-Startverfahren zu berücksichtigen; dessen Konfiguration ersetzt eine Vermutung über lokale Standardpfade. Die nachfolgenden Beispiele erläutern den SQL*Plus-Ablauf.

    Die folgende Vertiefung erklärt, wie Startkonfiguration und laufende Werte zusammenhängen. Für den Startup-Ablauf bleibt entscheidend: Ohne passende Startparameter kann die Instanz nicht korrekt aufgebaut werden.

    Vertiefung: Parameter verstehen – Session, Instanz und gespeicherte Startwerte

    Zwei Verbindungen können für denselben Parameter unterschiedliche Werte anzeigen. Ebenso kann im SPFILE ein anderer Wert stehen als der gerade wirksame. Das muss kein Fehler sein. Es bedeutet zunächst, dass verschiedene Ebenen betrachtet werden. Für eine belastbare Diagnose müssen Quelle, Zeitpunkt und Geltungsbereich zusammenpassen. Die folgenden Abfragen helfen, diese Ebenen zu unterscheiden, ohne eine Einstellung zu ändern.

    Lernumgebung: Die zusammenhängenden Beispielausgaben stammen aus einer erfundenen Oracle-19c-Non-CDB mit einer Instanz. Sie sind keine Einstellempfehlungen. Benötigt werden passende Leserechte auf die V$-Views. Für eine CDB/PDB gilt zusätzlich die Einordnung in Abschnitt 7; insbesondere ist eine PDB keine eigene Instanz.

    1. Drei Fragen – drei Datenquellen

    FrageDatenquelleBedeutung
    Was gilt für meine Verbindung?V$PARAMETERAktuelle Werte der abfragenden Session.
    Welche Werte gelten instanzweit?V$SYSTEM_PARAMETERInstanzwerte, von denen neue Sessions ausgehen.
    Welche Einträge stehen im SPFILE?V$SPPARAMETERGespeicherte Einstellungen, nicht automatisch der laufende Zustand.

    V$PARAMETER zeigt nicht einfach die Einstellungen irgendeiner anderen Anwendungssession. Wenn deine SQL*Plus-Verbindung anders initialisiert wurde als eine Poolverbindung, können die Ergebnisse voneinander abweichen. Dokumentiere deshalb, welche Verbindung die Abfrage ausgeführt hat.

    2. SPFILE und PFILE erkennen

    Ein PFILE ist eine Textdatei mit Startparametern. Ein SPFILE ist die von Oracle verwaltete binäre Parameterdatei. Ein SPFILE wird nicht mit vi wie eine gewöhnliche Konfigurationsdatei bearbeitet. Für die Diagnose interessiert zunächst, ob die laufende Instanz eines verwendet.

    READ ONLY – Verwendetes SPFILE
    SELECT name, value
    FROM v$parameter
    WHERE name = 'spfile';

    Fiktive Beispielausgabe:

    NAMEVALUE
    spfile/u01/app/oracle/dbs/spfileDEMODB.ora

    Der Pfad benennt hier das verwendete SPFILE. Er kann in anderen Umgebungen beispielsweise auf ASM verweisen. Bei Start ohne SPFILE ist der Wert leer. Daraus lässt sich der genaue Pfad einer verwendeten PFILE-Datei nicht ableiten. Startaufruf und Alert Log helfen bei der weiteren Einordnung. Ein abweichend gewähltes Startfile kann auch dazu führen, dass beim nächsten Start andere Einstellungen gelten als erwartet.

    3. Session und Instanz mit derselben Abfrage vergleichen

    Was sehe ich hier? Die beiden SELECT-Teile liefern dieselben Parameter aus unterschiedlichen Quellen. UNION ALL stellt die Zeilen untereinander. CON_ID hält den Containerbezug sichtbar; im Non-CDB-Beispiel steht dort 0. DISPLAY_VALUE ist die lesbar formatierte Darstellung des Werts.

    READ ONLY – Laufende Parameterwerte
    SELECT 'SESSION' AS quelle, name, display_value, con_id
    FROM v$parameter
    WHERE name IN ('optimizer_mode', 'open_cursors', 'processes')
    UNION ALL
    SELECT 'INSTANZ' AS quelle, name, display_value, con_id
    FROM v$system_parameter
    WHERE name IN ('optimizer_mode', 'open_cursors', 'processes')
    ORDER BY name, quelle, con_id;

    Fiktive Beispielausgabe:

    QUELLENAMEDISPLAY_VALUECON_ID
    INSTANZopen_cursors5000
    SESSIONopen_cursors5000
    INSTANZoptimizer_modeALL_ROWS0
    SESSIONoptimizer_modeFIRST_ROWS_100
    INSTANZprocesses3000
    SESSIONprocesses3000

    Im Beispiel weicht nur OPTIMIZER_MODE für die untersuchte Session ab. Das kann zu einem anderen Optimierungsziel führen; es beweist weder einen besseren Plan noch eine fehlerhafte Datenbank. Der tatsächliche Initialisierungsablauf dieser Verbindung muss geprüft werden. Die Bedeutung der Optimierungsziele steht im Optimizer-Kapitel.

    OPEN_CURSORS begrenzt offene Cursor pro Session; 500 ist keine Messung der gerade geöffneten Cursor. PROCESSES beschreibt eine Obergrenze für Oracle-Betriebssystemprozesse, keine aktuelle Auslastung. Tatsächliche Nutzung und Höchststand werden separat untersucht, etwa mit V$RESOURCE_LIMIT im Prozesskapitel.

    4. Gespeicherte Einträge getrennt auslesen

    Was sehe ich hier? Die Abfrage zeigt ausdrücklich gesetzte SPFILE-Einträge der drei Parameter. ISSPECIFIED filtert gespeicherte Angaben. SID bezeichnet hier eine Instanzzuordnung im Parameterfile und nicht die numerische Session-ID aus V$SESSION. ORDINAL ordnet Elemente mehrwertiger Einstellungen.

    READ ONLY – Gespeicherte Startwerte
    SELECT sid, name, display_value
    FROM v$spparameter
    WHERE isspecified = 'TRUE'
      AND name IN ('optimizer_mode', 'open_cursors', 'processes')
    ORDER BY name, sid, ordinal;

    Fiktive Beispielausgabe:

    SIDNAMEDISPLAY_VALUE
    *open_cursors800
    *optimizer_modeALL_ROWS
    *processes400

    Im laufenden Zustand stehen OPEN_CURSORS auf 500 und PROCESSES auf 300; gespeichert sind hier 800 und 400. Diese Abweichungen werden zunächst dokumentiert. Ob sie beabsichtigt sind, klärt die Änderungsdokumentation. Für den nächsten Start müssen außerdem das tatsächlich verwendete SPFILE und mögliche instanzspezifische Einträge berücksichtigt werden. Ein spezifischer Eintrag für die betreffende Instanz kann einen Eintrag mit SID=* übersteuern.

    Ohne SPFILE-Start liefert ISSPECIFIED laut Oracle für alle Zeilen FALSE; unser Filter ergibt dann keine Treffer. Auch ein nicht ausdrücklich gespeicherter Parameter fehlt in dieser Auswahl. Keine Zeile bedeutet daher nicht, dass der Parameter unwirksam wäre. Die View ist außerdem keine Historie früherer Änderungen.

    5. Dynamisch, verzögert oder erst nach Neustart?

    Ob eine Einstellung zur Laufzeit veränderbar ist, ist eine dokumentierte Eigenschaft des jeweiligen Parameters. Die folgende Abfrage liest diese Eigenschaft. Sie nimmt keine Änderung vor.

    READ ONLY – Änderbarkeit und Herkunftshinweis
    SELECT name, isses_modifiable, issys_modifiable, isdefault
    FROM v$parameter
    WHERE name IN ('optimizer_mode', 'open_cursors', 'processes')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEISSES_MODIFIABLEISSYS_MODIFIABLEISDEFAULT
    open_cursorsFALSEIMMEDIATEFALSE
    optimizer_modeTRUEIMMEDIATEFALSE
    processesFALSEFALSEFALSE

    ISSES_MODIFIABLE beantwortet, ob eine Sessionanpassung möglich ist. ISSYS_MODIFIABLE unterscheidet IMMEDIATE für sofort wirksame Systemänderungen, DEFERRED für nachfolgende Sessions und FALSE für statische Einstellungen, die einen späteren Instanzstart betreffen. Die konkrete Wirkung und zulässigen Werte werden zusätzlich in der Parameterreferenz geprüft. ISDEFAULT ist ein Herkunftshinweis und keine Zustandsbewertung; ein expliziter Wert ist nicht automatisch falsch.

    Die Begriffe MEMORY, SPFILE und BOTH bezeichnen beim administrativen Setzen den gewünschten Speicherbereich: nur laufender Zustand, nur persistente Startkonfiguration oder beides. Sie ersetzen die Änderbarkeitsregeln nicht. Insbesondere kann ein statischer Parameter nicht dadurch sofort wirksam werden, dass BOTH gewählt wird. Bei einer PFILE-gestarteten Instanz sind die Möglichkeiten anders als bei einem SPFILE-Start. Hier werden bewusst nur die Zusammenhänge erläutert.

    6. Defaults, Einheiten und zwei Umgebungen vergleichen

    Ein Standardwert kann von anderen Parametern oder der Umgebung abhängen. Derselbe Parametername muss daher auf zwei unterschiedlich aufgebauten Systemen nicht denselben sinnvollen Wert haben. DEFAULT_VALUE beschreibt den jeweiligen Standard, ISADJUSTED einen von Oracle angepassten Eingabewert. Eine reine Liste ungleicher Zeichenketten reicht für eine Bewertung nicht aus.

    Ein sinnvoller Vergleich hält Datenbankversion einschließlich RU, Rolle der Umgebung, Container, Messzeitpunkt und Datenquelle fest. Werte wie 1048576 und 1M können dieselbe Größe unterschiedlich darstellen. Bei Listenparametern ist die Reihenfolge zu beachten. Aus einem Unterschied folgt zunächst eine Prüffrage, keine pauschale Angleichung. Fachliche Anforderungen und Herstellerfreigaben gehören zur Bewertung.

    7. CDB und PDB richtig abgrenzen

    In einer CDB prüfst du zusätzlich, mit welchem Container du verbunden bist. Eine PDB besitzt keine eigene Oracle-Instanz. Für bestimmte Parameter sind eigene PDB-Werte möglich; die Eigenschaft ISPDB_MODIFIABLE zeigt diese Änderbarkeit an. Andere Werte werden aus dem Root-Kontext übernommen beziehungsweise sind dort zu verwalten. Eine Abfrage innerhalb einer PDB darf deshalb nicht ungeprüft als vollständige instanzweite Konfiguration bezeichnet werden.

    Die SPFILE-Gegenüberstellung dieses Lernbeispiels beschreibt eine Non-CDB. PDB-spezifische Persistenz und Vererbung müssen mit den Multitenant-Regeln eingeordnet werden; aus einer leeren SPFILE-Auswahl in einer PDB folgt nicht, dass keine dauerhafte PDB-Einstellung vorhanden ist. Den Containeraufbau erklärt Kapitel 13.

    8. Praxisbefund statt vorschneller Parameteränderung

    Für unser Beispiel lautet der Befund: „In der untersuchten Verbindung ist OPTIMIZER_MODE abweichend vom Instanzwert gesetzt. Für OPEN_CURSORS und PROCESSES unterscheiden sich laufende und gespeicherte Werte.“ Als Nächstes werden Initialisierung der Session, beabsichtigte Startkonfiguration und dokumentierte Änderungen geprüft. Weder eine Parametereinstellung noch ein Neustart wird durch die Abfragen ausgelöst.

    Oracle 19c: V$PARAMETER; V$SYSTEM_PARAMETER; V$SPPARAMETER; Parameterdateien verwalten; Geltungsbereiche und Containerregeln; OPTIMIZER_MODE; OPEN_CURSORS; PROCESSES.

    4. Phase MOUNT – die Instance kennt die Database

    Beim Wechsel nach MOUNT öffnet Oracle die Controlfiles. Dadurch erhält die Instance zentrale Informationen über die Database, beispielsweise welche Datafiles und Online Redo Logs zur Datenbank gehören.

    Die eigentlichen Datafiles sind für den normalen Benutzerbetrieb zu diesem Zeitpunkt noch nicht geöffnet. Deshalb ist MOUNT ein wichtiger administrativer Zwischenzustand.

    5. Warum ist MOUNT für DBAs wichtig?

    MOUNT ist besonders dann relevant, wenn Oracle die Struktur der Database kennen muss, die Datenbank aber noch nicht für normalen Benutzerzugriff geöffnet sein soll.

    Das ist beispielsweise bei bestimmten Recovery- oder Wartungssituationen wichtig. Die konkreten Recovery-Abläufe werden im Kapitel Backup & Recovery behandelt.

    6. Phase OPEN – normaler Datenbankbetrieb

    Beim Öffnen werden die für den Betrieb notwendigen Datafiles und Online Redo Logs geöffnet. Oracle prüft, ob der Zustand der Dateien zusammenpasst und ob gegebenenfalls Recovery erforderlich ist.

    Erst im Zustand OPEN steht die Database normalerweise für reguläre Anwendungssessions und fachliche Zugriffe zur Verfügung.

    7. OPEN bedeutet nicht automatisch, dass jede PDB offen ist

    Bei einer CDB existiert zusätzlich die Container-Ebene. Die CDB kann OPEN sein, während einzelne PDBs einen anderen Open Mode besitzen. Für eine Anwendung, die über einen PDB-Service verbindet, ist deshalb der PDB-Zustand entscheidend.

    Abfragekontext: CDB$ROOT mit ausreichenden Leserechten. Das folgende eigenständige CDB-Beispiel ergänzt die Non-CDB-Beispiele dieses Kapitels.

    READ ONLY – PDB-Zustände
    SELECT
        con_id,
        name,
        open_mode,
        restricted
    FROM v$pdbs
    ORDER BY con_id;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    CON_IDNAMEOPEN_MODERESTRICTED
    2PDB$SEEDREAD ONLYNO
    3APPPDBREAD WRITENO
    4TESTPDBMOUNTEDNULL

    Was sehe ich hier? Die Vorlage PDB$SEED ist READ ONLY, APPPDB ist READ WRITE und TESTPDB ist noch MOUNTED. Eine offene CDB garantiert somit nicht, dass jede PDB geöffnet ist. OPEN_MODE beschreibt den Öffnungszustand; RESTRICTED beschreibt die Zugangsbeschränkung. NO bedeutet keinen eingeschränkten Zugang, YES verlangt RESTRICTED SESSION. NULL ist kein NO und wird bei der hier geschlossenen PDB nicht als Anmeldefreigabe interpretiert.

    8. Welche Komponente wird in welcher Phase benötigt?

    Komponente NOMOUNT MOUNT OPEN
    Initialisierungsparameterbenötigtbereits eingelesenbereits eingelesen
    Instance / Speicher / Prozessegestartetgestartetgestartet
    Controlfilesnoch nicht geöffnetgeöffnetgeöffnet
    Datafilesnoch nicht geöffnetnoch nicht für Normalbetrieb geöffnetfür den jeweiligen Betrieb erforderliche Dateien geöffnet
    Online Redo Logsnoch nicht geöffnetStruktur bekanntfür Betrieb geöffnet
    Normaler Benutzerbetriebneinneingrundsätzlich möglich; Öffnungsmodus, Zugangsbeschränkungen und Ziel-PDB beachten

    9. STARTUP als Kombination der Phasen verstehen

    Ausführungskontext der Lernbefehle: SQL*Plus mit einer passenden administrativen Verbindung, beispielsweise AS SYSDBA, zu einer Non-CDB beziehungsweise zum CDB-Root. STARTUP und SHUTDOWN sind SQL*Plus-Kommandos; ALTER DATABASE ist SQL. Innerhalb einer PDB betreffen STARTUP und SHUTDOWN diese PDB, nicht eine eigene Instance.

    Ein normaler STARTUP durchläuft die notwendigen Phasen bis OPEN. Die einzelnen Zustände sind trotzdem wichtig, weil ein DBA einen Start gezielt in NOMOUNT oder MOUNT anhalten kann, wenn eine administrative Aufgabe genau diesen Zustand verlangt.

    Administrative Befehle – nicht automatisch ausführen
    Die folgenden Befehle verändern den Betriebszustand und dienen hier ausschließlich dem Verständnis des Ablaufs.
    -- Alternative A: aus einer beendeten Instanz bis OPEN starten
    STARTUP;
    
    -- Alternative B: aus einer beendeten Instanz schrittweise starten
    -- A und B sind Alternativen; nicht unmittelbar nacheinander ausführen!
    STARTUP NOMOUNT;
    ALTER DATABASE MOUNT;
    ALTER DATABASE OPEN;

    10. Wie kann der aktuelle Zustand read-only geprüft werden?

    Erreichte Phase beachten: V$INSTANCE ist bei laufender Instanz die erste Statusquelle. V$DATABASE benötigt MOUNT oder OPEN; ORA-01507 in NOMOUNT ist deshalb erwartbar. V$PDBS ist eine CDB-spezifische Prüfung. Die Abfragen sind keine automatisch in jeder Phase erfolgreich ausführbare Befehlsfolge.

    Für die Diagnose sollte der DBA nicht raten, sondern den aktuellen Zustand aus den Dynamic Performance Views lesen. Besonders hilfreich sind V$INSTANCE und V$DATABASE.

    Instance- und Database-Status
    SELECT instance_name,
           status,
           database_status,
           startup_time
    FROM   v$instance;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    INSTANCE_NAMESTATUSDATABASE_STATUSSTARTUP_TIME
    demodbMOUNTEDACTIVE2026-10-08 08:00:00

    So liest du das Ergebnis: Die Instanz ist gestartet und das Controlfile eingebunden. MOUNTED ist noch kein normaler Anwendungsbetrieb. Die Startzeit ist nicht die Dauer einer einzelnen Startphase.

    Was sehe ich hier?

    V$INSTANCE beschreibt die aktuell laufende Instance, zum Beispiel Name, Status und Startzeit. Instance-Werte sind Laufzeitinformationen und nicht mit persistenten Database-Eigenschaften gleichzusetzen.

    Diese Abfragen sind read-only. Sie verändern weder Instance noch Database.
    READ ONLY – Database-Zustand
    SELECT name,
           open_mode,
           database_role
    FROM v$database;

    Fiktive Beispielausgabe:

    NAMEOPEN_MODEDATABASE_ROLE
    DEMODBMOUNTEDPRIMARY

    So liest du das Ergebnis: Diese Ausgabe passt zum vorigen Instanzbefund. PRIMARY bezeichnet die Datenbankrolle und bedeutet nicht automatisch READ WRITE. Ein noch zu klärender OPEN-Fehler gehört ins Alert Log.

    11. STARTED, MOUNTED und OPEN richtig lesen

    V$INSTANCE.STATUSBedeutung
    STARTEDInstance läuft; Database noch nicht gemountet (NOMOUNT).
    MOUNTEDDatabase ist gemountet, aber noch nicht geöffnet.
    OPENDatabase ist geöffnet; Öffnungsmodus und PDB-Zustände zusätzlich prüfen.

    DATABASE_STATUS=ACTIVE ist kein Nachweis für OPEN. Im vorherigen Beispiel stehen STATUS=MOUNTED und DATABASE_STATUS=ACTIVE gleichzeitig. STARTUP_TIME bezeichnet den Instance-Start, nicht den Beginn des aktuellen Öffnungszustands.

    Die verschiedenen Views beschreiben unterschiedliche Ebenen. Deshalb sollte man Statuswerte nicht isoliert betrachten. V$INSTANCE beschreibt den Zustand der Instance; V$DATABASE liefert Informationen zum Zustand beziehungsweise Open Mode der Database.

    Multitenant beachten:
    Nach dem Öffnen einer CDB muss der Zustand der PDBs separat betrachtet werden.

    12. Restricted Mode ist ein eigener Betriebsaspekt

    Eine Database beziehungsweise PDB kann in einem eingeschränkten Modus betrieben werden, in dem normale Benutzerverbindungen nicht uneingeschränkt zugelassen sind. Deshalb reicht bei einer Verbindungsstörung die Aussage „Database ist OPEN“ nicht in jedem Fall aus.

    Für dieses Wiki ist vor allem die read-only Feststellung wichtig. Das Aktivieren oder Deaktivieren eines Restricted Modes wäre eine Zustandsänderung und wird hier nicht automatisch ausgeführt.

    READ ONLY – Restricted Status
    SELECT
        instance_name,
        status,
        logins
    FROM v$instance;

    Fiktive Beispielausgabe:

    INSTANCE_NAMESTATUSLOGINS
    demodbOPENALLOWED

    Was sehe ich hier? Dieses eigenständige Beispiel zeigt die inzwischen geöffnete Instance ohne Restricted-Zugang auf Instance-Ebene. Bei eingeschränktem Zugang benötigen Benutzer das Privileg RESTRICTED SESSION. LOGINS=ALLOWED beweist weder eine geöffnete Ziel-PDB noch einen erreichbaren Anwendungsservice; PDB-RESTRICTED, Berechtigungen und Service sind separat zu prüfen.

    13. Warum kann ein Startup scheitern?

    Ein Fehler beim Startup sollte zuerst der Phase zugeordnet werden. Scheitert bereits der Aufbau der Instance, liegt die Ursache in einem anderen Bereich als bei einem Fehler beim Mounten oder beim Öffnen der Database.

    Fehlerphase Konzeptionell zuerst prüfen Warum?
    vor / bei NOMOUNT Parameter, Umgebung, Ressourcen, Alert Log Die Instance selbst konnte noch nicht vollständig aufgebaut werden.
    bei MOUNT Controlfile-bezogene Meldungen und Alert Log Oracle versucht in dieser Phase, die Database-Struktur zu lesen.
    bei OPEN Datafiles, Redo-/Recovery-Hinweise und Alert Log Jetzt werden die persistenten Dateien für den Betrieb zusammengeführt.

    14. Das Alert Log als wichtigste Startchronik

    Das Alert Log protokolliert zentrale Ereignisse beim Start und Shutdown. Bei einem fehlgeschlagenen Startup ist es deshalb eine der wichtigsten Quellen, um zu erkennen, welche Phase erreicht wurde und an welcher Stelle Oracle abgebrochen hat.

    Entscheidend ist die zeitliche Reihenfolge der Meldungen. Einzelne ORA-Fehler sollten immer zusammen mit den unmittelbar davor und danach protokollierten Ereignissen betrachtet werden.

    Erfasse zusätzlich den vollständigen Fehlertext des Startversuchs einschließlich begleitender Meldungen und Zeitpunkt. Bei einem sehr frühen Fehler kann ein neuer Alert-Log-Eintrag fehlen. Clientausgabe, Umgebung und Alert Log werden gemeinsam ausgewertet.

    15. Geplanter Shutdown – was ist das Ziel?

    Ein geplanter Shutdown soll Oracle kontrolliert aus dem Benutzerbetrieb nehmen und einen konsistenten Zustand für den nächsten Start hinterlassen.

    Die Shutdown-Varianten unterscheiden sich vor allem darin, wie sie mit bestehenden Sessions und offenen Transaktionen umgehen.

    16. Die vier Shutdown-Varianten

    Option Neue Verbindungen Bestehende Sessions / Transaktionen Einordnung
    NORMAL werden nicht mehr angenommen Oracle wartet, bis Benutzer ihre Sessions selbst beenden. Sauber, kann aber sehr lange warten.
    TRANSACTIONAL werden nicht mehr angenommen Oracle lässt keine neuen Transaktionen zu, wartet auf laufende Transaktionen und beendet anschließend die Sessions. Sauber, Dauer abhängig von Transaktionen.
    IMMEDIATE werden nicht mehr angenommen Sessions werden beendet; nicht abgeschlossene Transaktionen werden zurückgerollt. Typische Variante für geplante Administration.
    ABORT werden nicht mehr angenommen Instance wird abrupt beendet; kein vorheriger Transaktionsrollback. Ausnahmeverfahren; nach inkonsistentem Abbruch einer geöffneten Database erfolgt beim erneuten Öffnen Instance Recovery.

    17. Warum SHUTDOWN IMMEDIATE so häufig verwendet wird

    IMMEDIATE ist für geplante Arbeiten praktisch, weil Oracle nicht darauf warten muss, dass jeder Benutzer seine Session selbst beendet. Gleichzeitig wird die Database kontrolliert heruntergefahren.

    Nicht bestätigte Transaktionen werden zurückgerollt. Umfangreiche Rollbacks können Zeit beanspruchen: IMMEDIATE bedeutet nicht, dass der Shutdown sofort abgeschlossen ist. Nach einem erfolgreich abgeschlossenen konsistenten Shutdown ist keine crashbedingte Instance Recovery nötig.

    18. Warum SHUTDOWN ABORT eine Sonderstellung hat

    ABORT beendet die Instance abrupt. Oracle führt dabei keinen normalen geordneten Shutdown-Ablauf bis zum Ende durch. Nach dem inkonsistenten Abbruch einer geöffneten Database ist beim erneuten Öffnen Instance Recovery erforderlich.

    ABORT ist ein Ausnahmeverfahren nach betrieblicher Vorgabe, etwa wenn andere Shutdown-Verfahren scheitern, unmittelbar ein Ausfall droht oder bestimmte Startprobleme vorliegen. Die Entscheidung richtet sich nach dem konkreten Zustand und dem freigegebenen Betriebsverfahren.

    Shutdown-Befehle – niemals automatisch ausführen
    Diese Befehle verändern unmittelbar den Betriebszustand. Vor einer realen Ausführung müssen Change, Anwendungsabhängigkeiten und betriebliche Auswirkungen geklärt sein.
    -- Alternativen: genau die zum Betriebsverfahren passende Variante wählen.
    SHUTDOWN NORMAL;
    SHUTDOWN TRANSACTIONAL;
    SHUTDOWN IMMEDIATE;
    
    -- Ausnahmeverfahren nach betrieblicher Vorgabe:
    SHUTDOWN ABORT;

    19. Was bedeutet Instance Recovery nach einem Abbruch?

    Nach einem inkonsistenten Abbruch einer geöffneten Database führt Oracle beim erneuten Öffnen automatisch Instance Recovery durch. Ein bloßes STARTUP NOMOUNT öffnet die Database noch nicht. Oracle wendet benötigte Redo-Informationen an (Roll Forward) und macht nicht bestätigte Änderungen mithilfe von Undo rückgängig (Rollback). Das Rückgängigmachen von Transaktionen kann teilweise nach dem Öffnen weiterlaufen.

    Für dieses Kapitel ist nur die Einordnung wichtig: Instance Recovery nach einem Instance-Abbruch ist nicht dasselbe wie ein manueller Restore oder ein Media Recovery nach verloren gegangenen beziehungsweise beschädigten Dateien. Die Recovery-Mechanismen werden im Backup-&-Recovery-Kapitel vertieft.

    20. Shutdown, Serverabsturz und Datenbankverlust sind nicht dasselbe

    Ein sauberer Shutdown, ein ungeplanter Instanzabbruch und ein Verlust von Datenbankdateien sind drei grundverschiedene Situationen. Sie dürfen in der Diagnose nicht miteinander vermischt werden.

    Situation Was passiert? Grundsätzliche Folge
    Sauberer ShutdownOracle beendet den Betrieb kontrolliert.Normaler Neustart ohne crashbedingte Instance Recovery.
    Instanz-/ServerabbruchLaufzeitumgebung verschwindet ungeplant.Nach inkonsistentem Abbruch einer geöffneten Database: automatische Instance Recovery beim erneuten Öffnen.
    Dateiverlust / BeschädigungPersistente Bestandteile der Database fehlen oder sind unbrauchbar.Kann Restore/Media Recovery erfordern; separates Recovery-Thema.

    21. Read-only Diagnose vor einem geplanten Eingriff

    Instance, Database und PDB wurden oben bereits geprüft. Hier ergänzt die Sessionübersicht diesen Befund. Die Zahl ACTIVE ist keine vollständige Liste offener Transaktionen; auch INACTIVE-Sessions können unbestätigte Änderungen halten. Die passende Transaktionsdiagnose steht in Kapitel 11 und 19.

    Bevor ein DBA überhaupt über einen Betriebszustandswechsel nachdenkt, sollte er den Ist-Zustand dokumentieren. Dazu gehören Instance-Status, Open Mode, aktive Sessions und gegebenenfalls laufende Transaktionen.

    Read-only Zustandskontrolle vor einem Eingriff
    SELECT status,
           COUNT(*) AS sessions
    FROM   v$session
    WHERE  type = 'USER'
    GROUP BY status
    ORDER BY status;

    Fiktive Beispielausgabe:

    STATUSSESSIONS
    ACTIVE3
    INACTIVE12

    Was sehe ich hier? Es gibt hier 15 Benutzersessions. ACTIVE kann auch einen wartenden Aufruf umfassen. Fehlende Statusgruppen erscheinen nicht als zusätzliche Nullzeilen. Die Gruppierung misst weder CPU-Threads noch abgeschlossene Transaktionen; auch die Diagnoseverbindung kann mitgezählt werden.

    22. Typische Verständnisfehler

    Aussage Bewertung Korrekte Einordnung
    STARTUP bedeutet sofort OPEN.Zu kurz gedachtOracle durchläuft intern die notwendigen Startphasen.
    In NOMOUNT ist die Database bereits gemountet.FalschIn NOMOUNT existiert zunächst die Instance.
    MOUNT bedeutet normaler Benutzerbetrieb.FalschNormaler Betrieb erfolgt typischerweise erst in OPEN.
    SHUTDOWN ABORT ist nur eine schnellere Form von IMMEDIATE.FalschABORT ist ein abrupter Abbruch mit anderer Recovery-Folge.
    Ein Shutdown löscht die Database.FalschDie persistenten Datenbankdateien bleiben erhalten.
    Jeder Startup-Fehler ist ein Datafile-Problem.FalschDie Fehlerphase bestimmt, welche Komponenten zuerst untersucht werden sollten.

    23. Vorgehensweise bei einem fehlgeschlagenen Startup

    Bei einem fehlgeschlagenen Start ist die zuletzt erfolgreich erreichte Phase eine der wichtigsten Informationen. Dadurch wird der Suchraum eingegrenzt, ohne bereits eine Ursache vorwegzunehmen.

    1. Umgebung prüfen Host, ORACLE_SID und ORACLE_HOME müssen zur erwarteten Datenbankumgebung passen.
    2. Exakte Fehlermeldung erfassen Vollständigen Fehlertext des Startversuchs und Zeitpunkt dokumentieren, statt nur „Startup fehlgeschlagen“ festzuhalten.
    3. Alert Log lesen Die Startchronik zeigt, welche Phase erreicht wurde und welche Meldungen unmittelbar davor auftraten.
    4. Zustand bestimmen Wenn eine Verbindung noch möglich ist, Instance- und Database-Zustand read-only kontrollieren.
    5. Fehler der richtigen Ebene zuordnen Vor NOMOUNT: Umgebung/Parameter/Instance. Bei MOUNT: Controlfile-/Database-Zuordnung. Beim Übergang zu OPEN: spätere Database-Phase.
    6. Erst danach handeln Keine blinden STARTUP-Wiederholungen und keine vorschnellen Parameter-, Datei- oder Recovery-Aktionen.

    24. Was gehört in andere Kapitel?

    Thema Warum hier nicht doppelt? Vertiefung
    SGA / PGAHier reicht: SGA wird beim Instance-Start aufgebaut; PGA gehört zu Prozessen.SGA und PGA
    Background ProcessesHier reicht: Prozesse starten mit der Instance.Hintergrundprozesse
    Redo / CheckpointHier nur für Shutdown und Recovery einordnen.Redo Logs
    Sessions / ProzesseHier nur Auswirkungen der Shutdown-Varianten.Sessions und Prozesse
    Restore / RecoveryHier nur Abgrenzung zu Instance Recovery.Backup & Recovery

    25. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Administrator's Guide
    Starting Up and Shutting Down / Managing the Oracle Instance
    https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/starting-up-and-shutting-down.html

    Oracle Database 19c Concepts
    Oracle Instance, Database, Recovery und Multitenant-Grundlagen
    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/oracle-database-instance.html
    Vertiefende Oracle-19c-Quellen: Instance-Lebenszyklus · PDB-Verwaltung und Reichweite
    Praxis: Eine eigene Lern-Datenbank aufbauen und abnehmen

    Du kannst eine vorhandene Instanz starten. Jetzt geht es um den Schritt davor: Wie entsteht eine neue Datenbank? Softwareinstallation, Datenbankerstellung und Anwendungszugang sind drei getrennte Ergebnisse. Eine erfolgreiche Installation erzeugt noch nicht zwingend eine nutzbare PDB. In diesem Labor dokumentierst du jede Entscheidung und prüfst das Ergebnis mit einem anderen Werkzeug. Du arbeitest ausschließlich auf einem eigenen Lernhost, nicht in einem vorhandenen Produktions-Oracle-Home.

    1. Ausgangslage und Entscheidungen

    Geplant sind eine Oracle-19c-SE2-Single-Instance-Datenbank LABCDB und die Benutzer-PDB LABPDB auf einem unterstützten Lernhost. Entscheide dich für genau eine Plattform: Oracle Linux oder Solaris SPARC. Plattformpassende Installationsmedien, Betriebssystemvoraussetzungen, Benutzer/Gruppen, Pakete, RAM, Swap, Dateirechte und Hostnamensauflösung werden anhand des jeweiligen Installationshandbuchs geprüft. Linux-Anweisungen sind keine Solaris-Anweisungen. Der konkrete RU und die Installationsmedien gehören in dein Protokoll.

    EntscheidungLaborvorgabe und Begründung
    SoftwareEigenes neues Oracle Home; vorhandene Homes nicht überschreiben. SE2 auswählen.
    DateienDateisystem mit geprüftem freien Platz; OMF-Ziel festlegen. Kein ASM oder Cluster als Voraussetzung dieses Einstiegslabors.
    DatenbankCDB LABCDB, eine Benutzer-PDB LABPDB. DB_NAME, SID, globaler Datenbankname und Service getrennt notieren.
    ZeichensatzFür dieses neue Labor AL32UTF8. Das ist keine Anweisung, den Zeichensatz einer bestehenden WE8MSWIN1252-Datenbank zu ändern.
    SpeicherHostgerechtes Budget für SGA und PGA mit Reserve für OS und weitere Prozesse; keine Produktivwerte blind kopieren.
    ZugriffListener-Port und PDB-Service festlegen; Administratorpasswörter interaktiv vergeben und nicht ins Protokoll schreiben.

    2. Software installieren

    Lege das für die Plattform vorgesehene neue Home an und entpacke die passenden Medien gemäß Installationshandbuch. Starte den Installer als Software-Owner aus dem vorgesehenen Home. Wähle „Software only“, Single Instance und SE2. Arbeite die Prerequisite-Prüfung ab; Fehler werden gelöst, nicht pauschal ignoriert. Führe nur die vom Installer für diesen Host angeforderten Root-Skripte mit der passenden OS-Berechtigung aus. Sichere Installationslog und Inventarzuordnung. Bei einer Installation ohne grafische Sitzung verwende die dokumentierte Response-Datei der konkreten Medien; deren sensible Inhalte gehören nicht ins Wiki.

    Shell im vorbereiteten Oracle Home – startet den Installer; verändert den Host
    ./runInstaller

    Abnahme der Software: SQL*Plus und DBCA stammen aus dem neuen Home; das Inventar nennt das erwartete Produkt und Home. Ein vorhandenes Verzeichnis oder eine erfolgreiche Versionsausgabe allein ersetzt nicht den Abschluss der Installer-Prüfungen.

    3. Datenbank mit DBCA erstellen

    Shell des Software-Owners – startet den DBCA; Datenbankerstellung verändert Dateien
    "$ORACLE_HOME/bin/dbca"

    Wähle „Create Database“ und die erweiterte Konfiguration. Setze LABCDB und LABPDB wie geplant, den vorgesehenen Dateispeicher und die OMF-Verwaltung, Zeichensatz und Speicherbudget. Wähle einen vorhandenen passenden Listener oder richte den benötigten Listener mit dem dafür vorgesehenen Oracle-Net-Werkzeug ein. Kontrolliere vor dem Start die Zusammenfassung: Namen, Pfade, Edition, Speicher und Komponenten. Die genaue Dialogfolge hängt von den Medien ab. Notiere anschließend DBCA-Log, tatsächliche Dateipfade und Verbindungsdaten. Vergib keine unnötigen kostenpflichtigen Optionen oder Management Packs.

    4. Ergebnis unabhängig prüfen

    Verbinde dich zunächst lokal als berechtigter Administrator mit LABCDB. Lies dann im Root:

    SQL*Plus – lesende Kontrolle
    SELECT name, dbid, cdb, open_mode FROM v$database;
    SELECT instance_name, host_name, version FROM v$instance;
    SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;
    SELECT name, value FROM v$parameter
    WHERE name IN ('db_create_file_dest','sga_target','pga_aggregate_target');
    SELECT con_id, name FROM v$datafile ORDER BY con_id, file#;

    Erwartung: CDB=YES; LABPDB ist vorhanden und für die Folgeübungen READ WRITE. Dateipfade liegen im geplanten Laborbereich. Prüfe den tatsächlich veröffentlichten PDB-Service über Listener und Datenbank. Danach melde dich über diesen Service an und kontrolliere SYS_CONTEXT('USERENV','CON_NAME'). Ein erfolgreicher lokaler SYSDBA-Zugang beweist noch keinen funktionierenden Anwendungszugang über das Netz. Den gewünschten PDB-Startzustand stellst du mit dem bereits erklärten SAVE STATE ein.

    5. Fehlerfall und Rückweg

    Verwende für eine zusätzliche Verbindungsprobe absichtlich einen nicht existierenden Servicenamen. Vergleiche die Fehlermeldung mit dem funktionierenden Service und ordne die fehlerhafte Ebene zu. Für einen vollständigen Neuaufbau darf ausschließlich die eindeutig identifizierte Labor-Datenbank über DBCA gelöscht und anschließend neu erstellt werden. Oracle Home und Datenbank sind getrennte Objekte; kein rekursives Löschen eines gemeinsam genutzten Oracle-Verzeichnisses.

    Musterlösung und Abnahmekriterien

    Bestanden ist der Fall, wenn du Installation und Datenbankerstellung getrennt nachweist, die tatsächlichen Dateien zuordnest, LABPDB über ihren Service erreichst und den Unterschied zwischen lokaler Administratoranmeldung und Clientzugriff erklären kannst. Dokumentiere auch, warum dein Speicherbudget und die gewählten Pfade zum Lernhost passen.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. In NOMOUNT wird die Instanz mit ihrer Startkonfiguration aufgebaut. Die Datenbankdateien sind damit noch nicht für den normalen Zugriff geöffnet.
    2. In MOUNT öffnet Oracle die Controlfiles und ordnet die Instanz der Datenbank zu. In OPEN werden die für den Betrieb erforderlichen Datenbankdateien geöffnet.
    3. Der Status der CDB sagt nicht automatisch aus, ob jede PDB geöffnet ist. Instanzzustand, Datenbankzustand und PDB-Zustand müssen getrennt geprüft werden.
    4. Die Shutdown-Varianten unterscheiden sich im Umgang mit Sessions und offenen Transaktionen. Nach SHUTDOWN ABORT ist beim nächsten Start normalerweise Instance Recovery erforderlich.
    5. Bei Startproblemen wird zuerst die gescheiterte Phase bestimmt. Parameterdatei, Dateizugriff und Alert Log liefern anschließend die passenden Hinweise.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Entscheidend ist, dass du die Start- und Stopp-Phasen begründen kannst.
    Frage 1: Was existiert in NOMOUNT bereits und was noch nicht?
    Die Oracle-Instance mit Speicher und Prozessen existiert bereits. Die Controlfiles sind noch nicht geöffnet; damit ist die Database noch nicht gemountet.
    Frage 2: Warum benötigt Oracle in MOUNT die Controlfiles?
    Aus den Controlfiles kennt Oracle zentrale Struktur- und Zustandsinformationen der Database, unter anderem die zugehörigen Datafiles und Redo Logs.
    Frage 3: Ein Startup erreicht MOUNT, scheitert aber bei OPEN. Welche Ebene ist damit bereits erfolgreich?
    Die Instance wurde erfolgreich aufgebaut und die Controlfiles konnten für MOUNT verwendet werden. Die weitere Diagnose konzentriert sich deshalb auf die OPEN-Phase und deren Datei-/Recovery-Kontext.
    Frage 4: Warum ist SHUTDOWN IMMEDIATE nicht dasselbe wie SHUTDOWN ABORT?
    IMMEDIATE ist ein kontrollierter Shutdown, bei dem Sessions beendet und nicht bestätigte Transaktionen zurückgerollt werden. Das kann dauern. ABORT beendet die Instance ohne vorherigen Rollback; nach inkonsistentem Abbruch einer geöffneten Database folgt beim erneuten Öffnen automatische Instance Recovery.
    Frage 5: Welche zwei Views helfen read-only bei der grundlegenden Statusprüfung?
    V$INSTANCE bei laufender Instance für deren Zustand; V$DATABASE ab MOUNT für Open Mode und Database Role. In NOMOUNT ist ORA-01507 bei V$DATABASE erwartbar. PDB-Zustände werden in einer CDB zusätzlich geprüft.
    Frage 6: Warum sollte bei einem Startup-Fehler zuerst die erreichte Phase bestimmt werden?
    Weil NOMOUNT, MOUNT und OPEN unterschiedliche Komponenten verwenden. Die erreichte Phase grenzt deshalb den technischen Fehlerbereich wesentlich ein.
    Frage 7: Welche Startdatei wird bei SQL*Plus ohne PFILE-Angabe gesucht?
    Im plattformspezifischen Standardverzeichnis: spfile<SID>.ora, spfile.ora, init<SID>.ora. Eine PFILE kann auf eine SPFILE verweisen. Bei Oracle Restart ist das konfigurierte SRVCTL-Startverfahren zu beachten.
    Frage 8: Warum können Session-, Instance- und SPFILE-Werte voneinander abweichen?
    Die Quellen zeigen verschiedene Geltungsbereiche: eigene Session, Instance-Werte und gespeicherte Startkonfiguration. Sessionanpassungen oder für einen späteren Start gespeicherte Werte können Unterschiede erklären; sie beweisen keinen Fehler.
    Frage 9: Warum kann SHUTDOWN IMMEDIATE länger dauern?
    Oracle wartet nicht auf freiwilliges Abmelden, muss aber nicht bestätigte Transaktionen zurückrollen. Große Rollbacks benötigen Zeit.
    Frage 10: Eine CDB ist OPEN, TESTPDB ist MOUNTED. Kann die Anwendung dort normal arbeiten?
    Nein. Die Ziel-PDB ist noch nicht geöffnet. Der Zustand der CDB allein belegt keinen nutzbaren Anwendungszugang; PDB, Einschränkungen und Service werden getrennt geprüft.

    6. Oracle Prozesse – Client, Server- und Hintergrundprozesse verstehen

    Welche Prozessarten es gibt, wie sie mit Sessions und dem Betriebssystem zusammenhängen und wie ein DBA sie read-only analysiert.

    Lernkompass
    Einfach gesagt Du lernst, welche Prozessarten zwischen Client und Oracle Instance beteiligt sind und welche Aufgabe sie im Gesamtbild haben.
    Warum ist das wichtig? Bei Verbindungs-, Last- und Prozessproblemen muss unterschieden werden, ob Clientprozess, Server Process oder Oracle-Hintergrundprozess betrachtet wird.
    Nach diesem Kapitel Du kannst Client-, Server- und Hintergrundprozesse unterscheiden und Session-Informationen einem Betriebssystemprozess zuordnen.

    Einführung: Ein Prozess ist eine ausführende Einheit; eine Session beschreibt dagegen den logischen Arbeitskontext einer Datenbankanmeldung. Im Oracle-Betrieb begegnen dir Prozesse auf der Clientseite, Serverprozesse für die Bearbeitung von Anfragen und Hintergrundprozesse für gemeinsame Aufgaben. Die Zahl angemeldeter Sessions lässt sich deshalb nicht ohne Kenntnis der Serverkonfiguration mit der Zahl von Betriebssystemprozessen gleichsetzen.

    Dieses Kapitel verbindet die Oracle-Sicht mit der Hostsicht. Du verfolgst, wie sich eine Session einem Prozess zuordnen lässt, welche Unterschiede Dedicated und Shared Server verursachen und wie Ressourcenlimits gelesen werden. Solaris- und Linux-Kennungen werden dabei eingeordnet. Die einzelnen Hintergrunddienste und ihr Zusammenspiel sind anschließend Thema von Kapitel 21.

    Oracle 19c: fachliche Grundlage

    Abgrenzung zu Kapitel 21:

    Die einzelnen Oracle-Hintergrundprozesse werden hier nur als Prozessgruppe eingeordnet. Aufgaben, Zusammenspiel und Diagnose von DBWn, LGWR, CKPT, SMON, PMON und weiteren Prozessen folgen detailliert in Kapitel 21 – Oracle Hintergrundprozesse.

    1. Das Prozessmodell im Gesamtbild

    Ein Benutzer arbeitet typischerweise über ein Clientprogramm wie SQL*Plus, SQL Developer oder eine Anwendung. Der zugehörige Client Process stellt die Anfrage. Auf der Datenbankseite wird die Arbeit durch einen Server Process ausgeführt. Gleichzeitig besitzt die Oracle Instance eigene Background Processes.

    Damit ergibt sich als Grundmodell:

    Client Process → Session → Server Process → Oracle Instance / Database

    Parallel dazu arbeiten Background Processes innerhalb der Instance an internen Aufgaben.

    2. Die drei grundlegenden Prozesswelten

    Client Process Der Prozess auf der Client- oder Applikationsseite, der eine Oracle-Verbindung verwendet und Anfragen sendet.
    Server Process Oracle-Prozess auf Datenbankseite, der SQL und andere Datenbankarbeit für eine Session verarbeitet.
    Background Process Oracle-Prozess mit instanzweiten internen Aufgaben, der nicht einfach nur einer einzelnen Benutzeranfrage entspricht.

    3. Oracle Process ist nicht immer gleich Betriebssystemprozess

    Im klassischen Unix-/Solaris-Betrieb ist die Vorstellung eines Oracle-Prozesses als eigenständiger Betriebssystemprozess meist sehr anschaulich. Oracle 19c kennt jedoch auch einen Threaded Execution Mode. In diesem Modus können mehrere Oracle-Prozesse als Threads innerhalb eines Betriebssystemprozesses laufen.

    Für die Diagnose auf Solaris und Oracle Linux mit klassischem Prozessmodell bleibt SPID eine sehr wichtige Brücke zur OS-Sicht. Fachlich sollte man sich trotzdem merken: Oracle-Prozess und OS-Prozess sind Konzepte unterschiedlicher Ebenen und nicht unter allen Betriebsmodellen zwingend 1:1 identisch.

    4. Vom Client zum Oracle-Prozess

    Client Process → Oracle Net → Oracle Session → Server Process → Oracle Instance

    Die Session ist kein Betriebssystemprozess, sondern ein logischer Datenbankkontext. Der Serverprozess führt die Datenbankarbeit aus; im klassischen Solaris-Prozessmodell ist er ein Betriebssystemprozess. Die zuvor erklärte Ausnahme des Threaded Execution Mode bleibt zu beachten.

    Das vorangehende Ablaufbild verbindet Kommunikationsweg und logischen Sessionkontext. Die Session ist keine zusätzliche Station, die Netzwerkpakete weiterleitet.

    5. Foreground und Background – was bedeutet das?

    Der Begriff Foreground wird häufig für Prozesse verwendet, die im Zusammenhang mit Benutzer- oder Anwendungssessions arbeiten. Background Processes erledigen dagegen instanzweite Oracle-Aufgaben.

    Wichtig ist die Perspektive: Eine Benutzeranfrage kann Hintergrundprozesse indirekt auslösen oder von deren Arbeit abhängen. Trotzdem bleibt die fachliche Session von den Background Processes getrennt.

    6. Dedicated Server

    Im Dedicated-Server-Modell wird einer Clientverbindung ein eigener Server Process zugeordnet. Dieser Prozess bearbeitet die Datenbankaufrufe dieser Verbindung.

    Der Dedicated Server gehört zur Clientverbindung. Im einfachen Fall besteht darüber eine Session; eine Verbindung kann jedoch auch mehrere Sessions tragen. Mehrere Sessionzeilen mit derselben SPID sind daher selbst bei Dedicated Server möglich und nicht automatisch ein Abfragefehler. Die folgenden Abbildungen zeigen den vereinfachten Fall mit jeweils einer Session pro Verbindung.

    Session A ↔ Serverprozess A
    Session B ↔ Serverprozess B

    7. Shared Server

    Beim Shared-Server-Modell teilen sich mehrere Sessions einen Pool von Shared Server Processes. Dispatcher nehmen Clientanfragen entgegen und stellen sie in eine Anforderungswarteschlange. Ein verfügbarer Shared Server verarbeitet die Anfrage und legt das Ergebnis in die Antwortwarteschlange des Dispatchers. Dieser sendet es an den Client zurück.

    Dadurch ist die feste Zuordnung zwischen Session und ausführendem Shared Server nicht gegeben. Die Zuordnung des Dedicated Servers bezieht sich dagegen auf die Clientverbindung, nicht zwingend auf genau eine Session.

    Prozessanalysen müssen das verwendete Servermodell berücksichtigen. Eine Abfrage, die in Dedicated Server eine eindeutige Session-/SPID-Zuordnung zeigt, darf in Shared Server nicht unkritisch gleich interpretiert werden.

    8. SERVER-Spalte der Session lesen

    READ ONLY – Servermodell der User-Sessions
    SELECT
        server,
        status,
        COUNT(*) AS sessions
    FROM v$session
    WHERE type = 'USER'
    GROUP BY server, status
    ORDER BY server, status;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    SERVERSTATUSSESSIONS
    DEDICATEDACTIVE3
    DEDICATEDINACTIVE12

    Was sehe ich hier? Die 15 Benutzersessions nutzen hier Dedicated Server. Die Gruppierung zählt Sessions, nicht alle Oracle- oder Betriebssystemprozesse. Andere Umgebungen können weitere SERVER-Werte zeigen; eine Dedicated-Zuordnung gilt nicht pauschal für jede Session.

    9. Session und Prozess sind verschiedene Objekte

    Eigenschaft Session Prozess
    GrundideeLogischer DatenbankkontextOracle-Ausführungseinheit; je nach Betriebsmodell OS-Prozess oder Thread
    Typische ViewV$SESSIONV$PROCESS
    Wichtige KennungSID + SERIAL#SPID / PID
    AnwendungskontextUSERNAME, MODULE, ACTION, SQL_IDOS-Prozess und PGA-Kontext

    10. SID, SERIAL#, PID und SPID

    Threads beachten: Bei Threaded Execution kann dieselbe SPID mehrere Oracle-Prozesse bezeichnen. Dann zusätzlich STID oder die eindeutige SOSID aus V$PROCESS verwenden. STID allein ist auf Solaris nicht eindeutig. Die folgenden Zuordnungsbeispiele setzen das klassische lokale Dedicated-Server-Modell voraus.

    Diese Kennungen werden häufig verwechselt. SID und SERIAL# identifizieren eine Oracle-Session. PID ist eine Oracle-interne Prozessnummer in V$PROCESS. SPID ist die Betriebssystem-Prozess-ID des Oracle-Prozesses.

    Für die Verbindung von Datenbank- und Betriebssystemanalyse ist SPID besonders wichtig. Sie bildet die Brücke zur Prozessliste des Betriebssystems.
    KennungZuordnung
    V$SESSION.PROCESSOS-Kennung des Clientprozesses; kann zu einem anderen Host gehören.
    V$PROCESS.SPIDOS-PID des Oracle-Prozesses auf dem Datenbankhost.

    Client-PID und Server-PID dürfen nicht vertauscht werden. Für die OS-Suche zuerst Host und Instance bestimmen.

    11. Wie V$SESSION und V$PROCESS verbunden werden

    Im klassischen Dedicated-Server-Modell verweist V$SESSION.PADDR auf V$PROCESS.ADDR. Dadurch kann der DBA Sessioninformationen wie SQL_ID und MODULE mit der Betriebssystem-PID verbinden.

    Session dem Oracle- und OS-Prozess zuordnen
    SELECT
        s.sid,
        s.serial#,
        s.username,
        s.status,
        s.module,
        s.program,
        s.server,
        s.sql_id,
        p.pid,
        p.spid,
        p.program AS oracle_process
    FROM v$session s
    JOIN v$process p
      ON p.addr = s.paddr
    WHERE s.type = 'USER'
    ORDER BY s.sid;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten.

    SIDSERIAL#USERNAMESTATUSMODULE
    1423817APP_USERACTIVEBestellportal
    PROGRAMSERVERSQL_IDPIDSPIDORACLE_PROCESS
    JDBC Thin ClientDEDICATED7m2q6k9p4xabc454321oracle@dbhost (TNS V1-V3)

    So liest du das Ergebnis: SID 142 ist die Sessionkennung, PID 45 die Oracle-interne Prozessnummer und SPID 4321 die Betriebssystem-PID im klassischen Prozessmodell. SERVER=DEDICATED macht das verwendete Modell sichtbar. Gleiche SID-, PID- und SPID-Zahlenwerte wären Zufall, keine notwendige Gleichheit. Die Abfrage kann auch andere Servermodelle liefern; deren Zuordnung ist gesondert zu interpretieren.

    12. Was steht in V$PROCESS?

    V$PROCESS beschreibt Oracle-Prozesse aus Sicht der Instance. Neben PID und SPID enthält die View unter anderem Prozessbezeichnung und PGA-bezogene Speicherwerte.

    Die View ist besonders nützlich, wenn ein auffälliger Betriebssystemprozess zurück in den Datenbankkontext verfolgt werden soll.

    Oracle-Prozesse aus V$PROCESS
    SELECT
        pid,
        spid,
        pname,
        program,
        ROUND(pga_used_mem  / 1024 / 1024, 2) AS pga_used_mb,
        ROUND(pga_alloc_mem / 1024 / 1024, 2) AS pga_alloc_mb,
        ROUND(pga_max_mem   / 1024 / 1024, 2) AS pga_max_mb
    FROM v$process
    ORDER BY pid;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeilePIDSPIDPNAMEPROGRAMPGA_USED_MB
    1218002PMONoracle@db01 (PMON)2
    24218420NULLoracle@db01 (TNS V1-V3)12
    ZeilePGA_ALLOC_MBPGA_MAX_MB
    144
    21620

    Was sehe ich hier? PMON ist ein benannter Hintergrundprozess. Beim Vordergrundprozess kann PNAME NULL sein. USED, ALLOC und MAX zeigen aktuell verwendeten Speicher, aktuelle Zuteilung und die höchste Zuteilung während der bisherigen Prozesslebensdauer; die mit MB bezeichneten Werte werden hier binär durch 1024² umgerechnet.

    13. Was steht in V$SESSION?

    V$SESSION beschreibt den logischen Sessionkontext. Dort findet der DBA unter anderem Benutzer, Status, SQL_ID, Wait Event, MODULE, ACTION, MACHINE und PROGRAM.

    Die detaillierte Sessionanalyse bleibt im Kapitel Sessions und Prozesse. Hier ist nur wichtig, dass V$SESSION und V$PROCESS unterschiedliche Ebenen beschreiben.

    14. Vom auffälligen OS-Prozess zur SQL_ID

    EVENT beschreibt nur bei STATE=WAITING einen aktuellen Wait. Sonst kann es der vorherige Wait sein. Keine zugeordnete USER-Session beweist bei einem LEFT JOIN keinen verwaisten Prozess; Prozessart und Servermodell zuerst klären.

    Ein typischer DBA-Fall beginnt nicht in Oracle, sondern auf dem Betriebssystem: Ein Prozess fällt durch CPU- oder Speicherverbrauch auf. Über die OS-PID kann der Prozess in V$PROCESS gefunden und anschließend mit V$SESSION verbunden werden.

    OS-SPID auf Session und SQL zurückführen
    SELECT
        p.spid,
        p.pid,
        p.pname,
        p.program AS oracle_process,
        s.sid,
        s.serial#,
        s.username,
        s.status,
        s.module,
        s.machine,
        s.sql_id,
        s.state,
        s.event,
        s.wait_class
    FROM v$process p
    LEFT JOIN v$session s
      ON s.paddr = p.addr
    WHERE p.spid = '&OS_PID';

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten.

    SPIDPIDPNAMEORACLE_PROCESS
    432145NULLoracle@dbhost (TNS V1-V3)
    SIDSERIAL#USERNAMESTATUS
    1423817APP_USERACTIVE
    MODULEMACHINESQL_IDSTATEEVENT
    Bestellportalapphost7m2q6k9p4xabcWAITINGdb file sequential read
    WAIT_CLASS
    User I/O

    So liest du das Ergebnis: Für die Eingabe OS_PID=4321 zeigt die Stichprobe einen aktuellen I/O-Wait. Sie beweist keine durchgehend hohe CPU-Auslastung. Betriebssystem- und Datenbankmessung müssen zeitlich zusammenpassen. Durch den LEFT JOIN bleiben PID, PNAME und ORACLE_PROCESS auch ohne passende Sessionzeile sichtbar. Die Abfrage filtert nicht auf TYPE=USER und kann Hintergrundsessions zeigen. Keine Ergebniszeile verlangt zunächst eine Prüfung von Host, Instance, Lesesicht und Zeitpunkt. &OS_PID ist eine SQL*Plus-Substitutionsvariable; hier wird 4321 eingegeben.

    15. Solaris und Oracle Linux: Prozesse auf Betriebssystemebene

    Die gezeigten ps-Grundabfragen eignen sich für Solaris und Oracle Linux. %CPU ist ein vom Werkzeug und Betriebssystem abhängiger Wert, kein einheitlicher Momentanzähler. Für einen Verlauf unter Solaris prstat, unter Oracle Linux top oder ein vorhandenes pidstat verwenden. Der Filter ora_ findet Hintergrundprozessnamen, aber nicht zuverlässig alle Dedicated-Server-Prozesse.

    Auf Solaris und Oracle Linux kann der DBA mit der Prozessliste zunächst feststellen, welche Oracle-Prozesse laufen und welche Prozesse auffällig viel CPU verbrauchen. Die OS-Sicht allein sagt aber noch nicht, welche SQL oder Session dahintersteht.

    Solaris und Oracle Linux – reine OS-Diagnose
    /usr/bin/ps -eo pid,ppid,pcpu,pmem,args
    
    /usr/bin/ps -eo pid,args | /usr/bin/grep "[o]ra_"
    
    /usr/bin/ps -eo pcpu,pid,args | /usr/bin/sort -nr | /usr/bin/head -20

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    PIDPPID%CPU%MEMCOMMAND
    4321118.00.2oracleDEMODB (LOCAL=NO)

    Was sehe ich hier? Ausschnitt der ersten ps-Abfrage: PID 4321 gehört zum Prozess, PPID 1 bezeichnet dessen Elternprozess. %CPU ist die CPU-Kennzahl des Werkzeugs, %MEM der Anteil des Resident Set am physischen Speicher. %MEM misst nicht die Oracle-PGA. COMMAND zeigt den Kommando-/Argumenttext. Der zweite Befehl filtert nach ora_; der dritte sortiert Prozesse des gesamten Hosts nach CPU und ist nicht auf Oracle begrenzt.

    Ein hoher CPU-Wert eines Oracle-Serverprozesses ist zunächst nur eine Beobachtung. Erst die Zuordnung zu Session, SQL_ID, Waits und Anwendungskontext macht daraus eine belastbare Diagnose.

    16. USER- und BACKGROUND-Sessions auseinanderhalten

    Bei vielen Auswertungen soll nur die Anwendungslast betrachtet werden. Dann ist die Trennung über V$SESSION.TYPE wichtig. USER bezeichnet normale Benutzer-/Anwendungssessions, BACKGROUND Oracle-interne Hintergrundsessions.

    Sessions nach Typ und Status
    SELECT
        type,
        status,
        COUNT(*) AS sessions
    FROM v$session
    GROUP BY type,
             status
    ORDER BY type,
             status;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    TYPESTATUSSESSIONS
    BACKGROUNDACTIVE40
    USERACTIVE3
    USERINACTIVE12

    Was sehe ich hier? Diese Abfrage bezieht im Unterschied zur reinen Benutzersicht auch Hintergrundsessions ein. ACTIVE bei Hintergrundsessions darf nicht als Zahl rechnender Benutzer interpretiert werden.

    17. Background Processes nur richtig einordnen

    Zu den bekannten Background Processes gehören unter anderem PMON, SMON, LGWR, DBWn, CKPT, ARCn und LREG. Ihre Namen helfen bei der Orientierung, aber dieses Kapitel beschreibt nicht noch einmal ihre komplette interne Funktionsweise.

    Prozessgruppe Beispiele Vertiefung
    Redo / CommitLGWRRedo Logs und Hintergrundprozesse
    Datafile-I/O / CheckpointDBWn, CKPTHintergrundprozesse
    Recovery / BereinigungSMON, PMONHintergrundprozesse
    ArchivierungARCnRedo Logs
    Service-RegistrierungLREGOracle Net

    18. PROCESSES und SESSIONS sind nicht dasselbe

    Der Initialisierungsparameter PROCESSES begrenzt die Zahl der Oracle-Prozesse, die eine Instance gleichzeitig unterstützen kann. SESSIONS betrifft dagegen die Anzahl der Datenbanksessions.

    Deshalb darf die aktuelle Zahl der Sessions nicht einfach mit der Prozesszahl gleichgesetzt werden.

    PROCESSES muss auch Hintergrundprozesse und weitere Oracle-Prozesse berücksichtigen. Für SESSIONS lautet die dokumentierte Standardableitung in 19c (1,5 × PROCESSES) + 22; 300 ergibt beispielsweise 472. Explizite Konfiguration und tatsächliche Nutzung sind davon getrennt zu prüfen. Im CDB-Root gilt SESSIONS für die gesamte CDB; eine PDB kann zusätzlich ein eigenes Sessionlimit besitzen. PROCESSES ist nicht innerhalb einer PDB änderbar.

    19. Ressourcenlimits read-only prüfen

    Abfragekontext: Die Beispielwerte beschreiben eine Non-CDB beziehungsweise die Instance-Gesamtsicht im CDB-Root mit passenden Leserechten. PDB-spezifische Grenzen werden gesondert eingeordnet.

    Aktuelle und maximale Nutzung von Processes und Sessions
    SELECT
        resource_name,
        current_utilization,
        max_utilization,
        initial_allocation,
        limit_value
    FROM v$resource_limit
    WHERE resource_name IN ('processes','sessions')
    ORDER BY resource_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    RESOURCE_NAMECURRENT_UTILIZATIONMAX_UTILIZATIONINITIAL_ALLOCATIONLIMIT_VALUE
    processes85110300300
    sessions95125472472

    Was sehe ich hier? 85 Prozesse sind aktuell belegt; 110 war der bisherige Höchststand. Grenzen für Prozesse und Sessions sind getrennt zu lesen. INITIAL_ALLOCATION bezeichnet die anfängliche Zuteilung, LIMIT_VALUE die Grenze; im Beispiel stimmen beide überein. MAX_UTILIZATION nennt keinen Zeitpunkt des Peaks. 85 aktuell und 110 bisher maximal bei Grenze 300 liefern allein noch keinen Trend. Die Zahlen sind ein Lernbeispiel und keine Dimensionierungsempfehlung.

    CURRENT_UTILIZATION ist der aktuelle Wert. MAX_UTILIZATION ist der Peak seit Instance-Start. Beides muss getrennt interpretiert werden.

    20. Warum ein Prozesslimit erreicht werden kann

    Viele Clientverbindungen Ein wachsender Connection Pool kann immer mehr Serverprozesse erzeugen.
    Session-/Connection-Leak Verbindungen werden aufgebaut, aber nicht kontrolliert wiederverwendet oder beendet.
    Oracle-interne Prozesse Auch Background Processes belegen Prozessressourcen und müssen in der Gesamtbetrachtung berücksichtigt werden.

    21. Prozesse und PGA

    Jeder Oracle-Prozess kann privaten PGA-Speicher besitzen. Deshalb kann eine große Zahl von Prozessen auch einen hohen Gesamtspeicherverbrauch verursachen.

    Die Speicherarchitektur selbst wird nicht hier wiederholt. Details stehen im Kapitel SGA und PGA.

    Top-Prozesse nach PGA-Allokation
    SELECT *
    FROM (
        SELECT
            pid,
            spid,
            pname,
            program,
            ROUND(pga_used_mem  / 1024 / 1024, 2) AS used_mb,
            ROUND(pga_alloc_mem / 1024 / 1024, 2) AS alloc_mb,
            ROUND(pga_max_mem   / 1024 / 1024, 2) AS max_mb
        FROM v$process
        ORDER BY pga_alloc_mem DESC
    )
    WHERE ROWNUM <= 20;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeilePIDSPIDPNAMEPROGRAMUSED_MB
    14218420NULLoracle@db01 (TNS V1-V3)128
    24318421NULLoracle@db01 (TNS V1-V3)48
    ZeileALLOC_MBMAX_MB
    1160192
    26480

    Was sehe ich hier? Der erste gezeigte Prozess hat aktuell mehr PGA zugeteilt. MAX_MB kann über ALLOC_MB liegen, weil bereits Speicher freigegeben worden sein kann. Ausschnitt der absteigend sortierten Liste.

    PGA_ALLOC_MEM enthält auch freien, noch nicht ans Betriebssystem zurückgegebenen PGA-Speicher. Eine Differenz zu PGA_USED_MEM beweist daher kein Speicherleck. PGA_MAX_MEM ist ein historischer Prozesshöchstwert, kein aktueller Verbrauch und kein Instance-Gesamtwert.

    22. Typische DBA-Praxisfälle

    Fall 1: OS-Prozess hat hohe CPU SPID bestimmen, mit V$PROCESS und V$SESSION verbinden, SQL_ID und Anwendungskontext untersuchen.
    Fall 2: Processes fast am Limit V$RESOURCE_LIMIT lesen, Sessionzahlen nach Anwendung gruppieren und Trend beziehungsweise Peak einordnen.
    Fall 3: Prozess verbraucht viel PGA V$PROCESS nach PGA_ALLOC_MEM sortieren und anschließend Session-/SQL-Kontext herstellen.
    Fall 4: Oracle-Prozess ohne USER-Session Prüfen, ob es sich um einen Background Process oder einen Prozess ohne aktuell zugeordnete Benutzersession handelt.
    Durchgängiger Praxisfall: OS-PID 4321

    1. Auf dbhost wurde um 09:10 Uhr CPU-Aktivität für PID 4321 beobachtet. Host, Zeitpunkt und Messintervall werden notiert.

    2. Die Zuordnung in der richtigen Instance DEMODB zeigt Oracle-PID 45, SPID 4321 und Session 142 mit SERIAL# 3817. Das Dedicated-Modell und der Anwendungskontext Bestellportal werden geprüft.

    3. Die nachfolgende SQL-Stichprobe zeigt STATE=WAITING und EVENT=db file sequential read. Zu diesem Zeitpunkt wartet der Aufruf auf I/O. Die SQL_ID identifiziert die dabei beobachtete Anweisung; sie erklärt nicht automatisch die gesamte zuvor gemessene CPU-Zeit.

    4. Der Befund lautet: „CPU-Aktivität im OS-Intervall; anschließend I/O-Wait derselben zugeordneten Session beobachtet.“ Für eine Ursachenbewertung folgen zeitlich passende Messungen und die SQL-/Wait-Analyse. Eine automatische Zustandsänderung folgt daraus nicht.

    23. Systematische read-only Vorgehensweise

    Bei einem Prozessproblem sollte die Analyse immer von der beobachteten Ebene zur nächsten Ebene weitergeführt werden. So wird aus einer PID schrittweise eine technisch nachvollziehbare Ursache.

    24. Typische Missverständnisse

    Aussage Bewertung Korrekte Einordnung
    Eine Oracle-Session ist ein Betriebssystemprozess.FalschSession ist logisch; ein Oracle-Prozess wird als OS-Prozess oder Thread umgesetzt.
    SID und SPID sind dasselbe.FalschSID identifiziert die Session, SPID den OS-Prozess.
    Jeder Oracle-Prozess gehört zu genau einer USER-Session.FalschBackground Processes und Shared Server widersprechen dieser Vereinfachung.
    Hohe CPU eines Oracle-Prozesses beweist eine fehlerhafte SQL.FalschCPU ist zunächst eine Beobachtung; SQL und Workload-Kontext müssen analysiert werden.
    MAX_UTILIZATION zeigt die aktuelle Prozesszahl.FalschEs ist der Peak seit Instance-Start.
    Viele Prozesse bedeuten automatisch ein Problem.FalschEntscheidend sind Limits, Lastprofil, Servermodell und Anwendungskontext.

    25. Wo werden Teilthemen vertieft?

    Thema Vertiefung
    Sessions, ACTIVE/INACTIVE, SQL_IDSessions und Prozesse
    SGA, PGA, WorkareasSGA und PGA
    LGWR, DBWn, CKPT, PMON, SMON usw.Oracle Hintergrundprozesse
    Redo- und Commit-ZusammenhangRedo Logs
    Listener und ServicesOracle Net
    Was du nach diesem Kapitel erklären können solltest:
    Die Unterschiede zwischen Client Process, Server Process und Background Process, Dedicated und Shared Server, SID/SERIAL# und PID/SPID sowie den Diagnoseweg von einem auffälligen Betriebssystemprozess bis zur zugehörigen Oracle-Session und SQL_ID.

    26. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Concepts – Process Architecture
    Client Processes, Server Processes, Background Processes, Dedicated/Shared Server
    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/process-architecture.html

    Oracle Database 19c Reference – V$SESSION / V$PROCESS / V$RESOURCE_LIMIT
    Spaltenbedeutung und Dynamic Performance Views
    V$SESSION · V$PROCESS · V$RESOURCE_LIMIT · PROCESSES · SESSIONS
    Oracle Solaris 11.4 – ps(1)
    DBA-Diagnosekette bei Prozessauffälligkeiten:

    1. Betroffene Session beziehungsweise Anwendung identifizieren.
    2. In V$SESSION Sessionstatus, Benutzer, Service, Programm und Clientinformationen prüfen.
    3. Über PADDR die Session mit V$PROCESS verbinden.
    4. Die Oracle-SPID mit der Betriebssystemsicht abgleichen.
    5. Erst danach CPU-, Wait- oder Prozessauffälligkeiten der richtigen Ebene zuordnen.

    Die tiefergehende Wait-, SQL- und Performanceanalyse erfolgt in den dafür vorgesehenen Kapiteln.
    Vertiefende Oracle-19c-Quellen: Prozessarchitektur · Prozess- und Threadkennungen

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Clientprozesse stellen Anfragen, Serverprozesse bearbeiten sie und Hintergrundprozesse erledigen interne Datenbankaufgaben. Diese Rollen dürfen nicht miteinander verwechselt werden.
    2. Eine Session ist ein logischer Datenbankkontext, ein Prozess eine Ausführungseinheit. Eine Betriebssystem-PID und eine Oracle-Session-ID bezeichnen deshalb unterschiedliche Dinge.
    3. Dedicated Server ordnet einer Clientverbindung einen Serverprozess zu. Bei Shared Server können mehrere Sessions die verfügbaren Serverprozesse nutzen.
    4. V$SESSION und V$PROCESS verbinden Datenbank- und Betriebssystemsicht. SID, SERIAL#, PADDR, ADDR und SPID müssen entsprechend ihrer jeweiligen Bedeutung gelesen werden.
    5. PROCESSES und SESSIONS begrenzen unterschiedliche Ressourcen. Für eine Diagnose zählen aktuelle Nutzung, Spitzenwerte und die Herkunft der Verbindungen, nicht nur die eingestellten Grenzwerte.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Die Antworten prüfen vor allem, ob du die Ebenen Session, Oracle-Prozess und OS-Prozess sauber unterscheiden kannst.
    Frage 1: Was unterscheidet eine Oracle-Session von einem Serverprozess?
    Die Session ist ein logischer Datenbankkontext. Der Serverprozess führt Datenbankarbeit aus; im klassischen Prozessmodell ist er ein eigener OS-Prozess, bei Threaded Execution kann er als Thread umgesetzt sein.
    Frage 2: Welche Kennung brauchst du, um einen Oracle-Prozess im Betriebssystem wiederzufinden?
    Im klassischen Prozessmodell dient SPID aus V$PROCESS als Brücke zur OS-PID. Bei Threaded Execution sind zusätzlich SPID und STID zusammen oder SOSID nötig, um die Oracle-Ausführungseinheit zu unterscheiden. STID allein ist auf Solaris nicht eindeutig.
    Frage 3: Wie werden V$SESSION und V$PROCESS im Dedicated-Server-Modell verbunden?
    Typischerweise über V$SESSION.PADDR und V$PROCESS.ADDR.
    Frage 4: Warum ist Shared Server für die Prozesszuordnung besonders zu beachten?
    Weil mehrere Sessions einen Pool von Shared Server Processes verwenden können. Die dauerhafte Zuordnung eines Dedicated Servers zur Clientverbindung gilt hier nicht. Auch eine Dedicated-Verbindung kann mehrere Sessions tragen.
    Frage 5: Ein Oracle-Prozess hat auf Solaris hohe CPU. Was ist der nächste sinnvolle Schritt?
    Die PID/SPID mit V$PROCESS verbinden und, falls eine USER-Session zugeordnet ist, über V$SESSION SQL_ID, MODULE, STATUS und Wait-Kontext bestimmen. Host, Instance, Zeitpunkt und Messintervall müssen zusammenpassen; ein späterer Wait erklärt nicht automatisch frühere CPU-Last.
    Frage 6: Was unterscheidet CURRENT_UTILIZATION und MAX_UTILIZATION in V$RESOURCE_LIMIT?
    CURRENT_UTILIZATION zeigt die aktuelle Nutzung. MAX_UTILIZATION ist der seit Instance-Start erreichte Peak.
    Frage 7: Zwei Sessions haben dieselbe SPID. Ist die Abfrage zwangsläufig falsch?
    Nein. Eine Dedicated-Verbindung kann mehrere Sessions tragen. Bei Shared Server fehlt die dauerhafte Session-/Serverzuordnung; bei Threaded Execution können mehrere Oracle-Prozesse dieselbe OS-PID besitzen. Zuerst Verbindung, Servermodell und Threadkennungen prüfen.

    7. Tabellen, Indizes & Constraints – von den Grundlagen bis zur DBA-Diagnose

    Das Kapitel führt von Tabellen und Indizes über Constraints bis zu ihrem Zusammenspiel.

    Lernkompass
    Einfach gesagt Du lernst, welche Aufgaben Tabellen, Indizes und Constraints jeweils haben und warum diese drei Objektarten nicht miteinander verwechselt werden dürfen.
    Warum ist das wichtig? Bei Performance-, Datenqualitäts- und Objektproblemen muss zuerst klar sein, ob die Daten selbst, ein Zugriffsweg oder eine Integritätsregel betroffen ist.
    Nach diesem Kapitel Du kannst Tabellen, Indexarten und zentrale Constraint-Typen unterscheiden und ihre Beziehungen mit read-only Dictionary-Abfragen untersuchen.

    Einführung: Tabellen, Indizes und Constraints beantworten unterschiedliche Fragen: Welche Daten werden gespeichert, wie kann Oracle sie erreichen und welche Regeln müssen sie erfüllen? Diese Trennung hilft bei alltäglichen Befunden. Eine verletzte Datenregel ist beispielsweise eine andere Aufgabe als eine aufwendige Abfrage; ein zusätzlicher Index löst nicht automatisch beide Probleme.

    Das Kapitel führt von den Schemaobjekten zu ihren Eigenschaften und Beziehungen. Du lernst, vorhandene Definitionen zu lesen, Schlüssel und Fremdschlüssel einzuordnen und einen möglichen Zugriffsweg von einer Integritätsregel zu unterscheiden. Die Diagnoseabfragen machen diese Unterschiede an Metadaten sichtbar. Wie Oracle den Objekten Speicher zuordnet, folgt in Kapitel 8; die Auswahl von Zugriffswegen wird später beim Optimizer vertieft.

    Oracle 19c: fachliche Grundlage

    Oracle 19c SE2: Die folgenden Bitmap- und Partitionierungsabschnitte erklären editionenübergreifende Begriffe. Bitmap-Indizes und frei einsetzbare Partitionierung von Anwendungstabellen sind keine SE2-Funktionen. Oracle nennt eingeschränkte Sonderrechte für bestimmte interne Nutzungen; daraus folgt kein allgemeines Partitionierungsrecht für Anwendungstabellen. Normale Materialized Views sind außerdem von automatischem Materialized View Query Rewrite zu unterscheiden; letzteres ist keine SE2-Funktion. Oracle-Funktionsmatrix.

    1. Tabellen und weitere Schemaobjekte

    Eine gewöhnliche Tabelle ordnet fachliche Daten in Spalten mit Datentypen und Zeilen mit konkreten Werten. Schlüssel und weitere Constraints können Regeln festlegen. Die Speicherung einer Tabelle muss nicht genau einem Segment entsprechen, beispielsweise bei Partitionen oder LOB-Spalten; die Speicherebene folgt in Kapitel 8.

    Oracle verwaltet zu allen drei Objektarten Metadaten im Data Dictionary. Dadurch kann ein DBA read-only untersuchen, welche Spalten eine Tabelle besitzt, welche Indizes darauf definiert sind, welche Spalten ein Index enthält und welche Constraints beziehungsweise Fremdschlüsselbeziehungen existieren.

    Schemaobjekte im Überblick

    Benutzer, Schema und Objekttypen verstehen

    In einem Datenbankwerkzeug stehen unter einem Benutzer häufig Ordner für Tables, Views, Packages und weitere Objekte. Diese Einträge erfüllen unterschiedliche Aufgaben. Einige speichern Daten, andere beschreiben Abfragen oder enthalten Programmcode. Der Benutzer ist das Konto mit Berechtigungen; sein gleichnamiges Schema ist die Sammlung der zugehörigen Objekte. Ein Konto kann ein leeres Schema besitzen und trotzdem auf freigegebene fremde Objekte zugreifen. Die folgenden Namen sind erfundene Beispiele und beschreiben keine konkrete Anwendungsinstallation.

    Ein Objekt eindeutig benennen: In APP_DEMO.KUNDEN ist APP_DEMO der Schema- beziehungsweise Eigentümername und KUNDEN der Objektname. Das Schema ist kein Tablespace: Ein Tablespace organisiert Speicher, ein Schema organisiert die Eigentümerschaft. Ein Schema kann Objekte in verschiedenen Tablespaces besitzen. Mehrere Schemas können denselben Tablespace nutzen.

    ObjekttypAufgabeGemeinsames Beispiel
    TABLESpeichert Daten in Zeilen und Spalten.KUNDEN enthält Nummer, Name und Geburtsdatum.
    VIEWSpeichert eine Abfragedefinition, keine eigenen Ergebnisdaten.AKTUELLE_KUNDEN zeigt Kunden mit offenen Bestellungen.
    MATERIALIZED VIEWSpeichert ein Abfrageergebnis; ein Refresh aktualisiert es.BESTELLANZAHL_MV hält eine vorberechnete Übersicht bereit.
    INDEXZusätzliche Struktur für passende schnelle Zugriffe; benötigt Speicher und Pflege bei Änderungen.IX_KUNDEN_NAME unterstützt passende Namenssuchen.
    SEQUENCELiefert Zahlen für technische Schlüssel; Lücken sind möglich.SEQ_KUNDEN liefert neue Nummern.
    SYNONYMAlternativer Objektname; kopiert keine Daten und erteilt keine Rechte.KUNDEN verweist auf ein Objekt in einem anderen Schema.
    FUNCTIONGespeicherte Routine mit einem ausdrücklich definierten Rückgabewert.ALTER_BERECHNEN ermittelt ein Alter.
    PROCEDUREGespeicherter Ablauf; Ergebnisse können auch über Ausgabeparameter zurückkommen.BERICHT_VORBEREITEN erledigt mehrere zusammengehörige Schritte.
    PACKAGE / PACKAGE BODYSchnittstelle und Umsetzung zusammengehöriger Routinen.KUNDEN_SERVICE bündelt Funktionen und Prozeduren.
    TRIGGERWird von Oracle bei einem festgelegten Ereignis automatisch ausgeführt.Eine Tabellenänderung löst eine zusätzliche Prüfung aus.

    Die Programmtypen FUNCTION, PROCEDURE, PACKAGE und TRIGGER werden im PL/SQL-Kapitel ausführlich erklärt. Dort findest du auch die Unterscheidung von Package Specification und Body. Ein Package ist kein Ordner mit Tabellen und ein Funktionsname beweist nicht, dass der enthaltene Code ausschließlich liest.

    Wie sich gespeicherte Ergebnisse, Aktualisierung und technische Gültigkeit unterscheiden, erklärt die Erklärung zu Materialized Views anhand einer einfachen Bestellanzahl.

    SELECT: Welche Objekttypen sehe ich für ein Schema?

    Was sehe ich hier? ALL_OBJECTS zeigt Objekte, die für den angemeldeten Benutzer zugänglich sind. Die Abfrage beschränkt diese Sicht auf den Eigentümer APP_DEMO und zählt die Dictionary-Einträge je Typ. Ersetze den Beispielnamen durch den tatsächlich vorhandenen Eigentümernamen; gewöhnliche unquotiert angelegte Namen stehen im Dictionary in Großbuchstaben.

    READ ONLY – sichtbare Schemaobjekte
    SELECT object_type, COUNT(*) AS anzahl
    FROM all_objects
    WHERE owner = 'APP_DEMO'
    GROUP BY object_type
    ORDER BY object_type;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    OBJECT_TYPEANZAHL
    FUNCTION3
    MATERIALIZED VIEW1
    PACKAGE4
    PACKAGE BODY4
    TABLE12
    VIEW6

    Die vier PACKAGE- und vier PACKAGE-BODY-Einträge können zu vier zusammengehörigen Packages gehören. Die gleiche Anzahl allein beweist aber nicht die paarweise Zuordnung; dafür vergleichst du Eigentümer und Objektnamen. Die drei FUNCTION-Einträge zählen eigenständige Funktionen, nicht jede Funktion innerhalb eines Packages. Für Package-Routinen verwendest du die im PL/SQL-Kapitel erklärten Dictionary-Sichten.

    Wichtige Grenzen: Das ist kein vollständiges Inventar, wenn dein Konto nicht alle Objekte sehen darf. USER_OBJECTS beschreibt eigene Objekte und besitzt keine OWNER-Spalte. DBA_OBJECTS ermöglicht mit passenden Rechten die umfassendere Sicht im jeweiligen Datenbank-/Containerkontext. Eine Anmeldung als SYS zählt mit USER_OBJECTS die eigenen SYS-Objekte, nicht die eines Anwendungsbenutzers. Eine leere Ausgabe kann auf den Namen, Container oder fehlende Sichtbarkeit zurückgehen.

    Die Zahlen sind Dictionary-Einträge, keine Speichergrößen und keine Anzahl fachlicher Anwendungen. Unterobjekte und technische Begleitobjekte können zusätzlich erscheinen. Eine Materialized View besitzt eine zugrunde liegende Speicherstruktur und kann weitere TABLE-/INDEX-Einträge verursachen. Für Speicherbelegung nutzt du dafür vorgesehene Segment-Sichten, nicht COUNT(*) aus ALL_OBJECTS.

    Auch wichtig: Constraints. PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK und NOT NULL beschreiben Regeln für Tabellendaten. Sie sind keine vollständige eigene Objektgruppe in dieser ALL_OBJECTS-Auswertung; dafür gibt es beispielsweise ALL_CONSTRAINTS. Ein Index ist eine Zugriffsstruktur und nicht dasselbe wie eine fachliche Regel. Ihre Zusammenhänge werden in den vorhandenen Grundlagen vertieft.

    Objektstatus richtig lesen: VALID bedeutet bei einem Programmobjekt nicht „fachlich fehlerfrei“, und INVALID bedeutet nicht „Daten gelöscht“. Abhängigkeiten oder Übersetzungsfehler können eine Rolle spielen. Die Diagnose dazu steht unter PL/SQL: Programmstatus und Fehler. Ein VALID-Status einer Materialized View beantwortet außerdem nicht die Frage nach der Aktualität ihrer Daten.

    Oracle 19c: Views und weitere Schemaobjekte · ALL_OBJECTS

    Vertiefung: Objektabhängigkeiten und die Folgen einer Änderung

    Ein Bericht besteht oft aus mehreren Bausteinen. Eine Tabelle hält die Daten, eine View wählt passende Zeilen aus und ein Package verarbeitet diese Auswahl. Die Anwendung ruft anschließend eine Routine dieses Packages auf. Wenn ein Baustein eine Definition eines anderen verwendet, entsteht eine Abhängigkeit. Deshalb kann ein Fehler an einer Stelle sichtbar werden, obwohl seine Ursache weiter unten in der Kette liegt. Du lernst hier, die Richtung dieser Beziehungen zu lesen und den betroffenen Baustein einzugrenzen.

    Beispielumgebung: Alle Namen und Ausgaben in diesen Vertiefungen sind erfunden. APP_DEMO ist ein Lernschema, keine Beschreibung einer konkreten Anwendungssoftware. Die SELECT-Abfragen lesen Dictionary-Informationen. Ersetze die festen Beispielnamen durch die tatsächlich untersuchten Namen und verbinde dich mit der richtigen Datenbank beziehungsweise PDB. ALL_-Views sind auf die für deine Verbindung sichtbaren Objekte begrenzt; keine Ergebniszeile kann deshalb auch einen falschen Filter oder fehlende Sichtbarkeit bedeuten.

    1. Eine gemeinsame Auswertung als Beispiel

    BausteinAufgabe im Lernbeispiel
    BESTELLUNGEN (Tabelle)Enthält unter anderem REGION und ABGESCHLOSSEN_AM.
    OFFENE_BESTELLUNGEN (View)Wählt Bestellungen ohne Abschlussdatum aus.
    BESTELL_SERVICE (Package Body)Liest die View mit statischem SQL für eine Auskunft.
    AnwendungRuft die öffentliche Routine des Packages auf.

    Der Package Body hängt hier von der View ab; die View hängt von der Tabelle ab. Das ist die Richtung „verwendet“. Für eine geplante Tabellenänderung fragst du umgekehrt: „Wer verwendet diese Tabelle?“ Eine direkte Abhängigkeit umfasst einen Schritt. Das Package ist in diesem Beispiel indirekt von der Tabelle abhängig. Die Beziehung der Anwendung zum Package steht nicht automatisch als eigenes Schemaobjekt im Dictionary.

    2. Wer verwendet ein bestimmtes Objekt?

    Was sehe ich hier? Die folgende Abfrage sucht direkte, lokal referenzierende Objekte der Tabelle BESTELLUNGEN. REFERENCED_OWNER und REFERENCED_NAME bezeichnen das verwendete Ziel. OWNER, NAME und TYPE bezeichnen dagegen das davon abhängige Objekt. Der Typfilter verhindert Verwechslungen mit anderen Objektarten gleichen Namens.

    READ ONLY – Direkte Verwender einer Tabelle
    SELECT owner, name, type
    FROM all_dependencies
    WHERE referenced_owner = 'APP_DEMO'
      AND referenced_name = 'BESTELLUNGEN'
      AND referenced_type = 'TABLE'
      AND referenced_link_name IS NULL
    ORDER BY owner, name, type;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    OWNERNAMETYPE
    APP_DEMOOFFENE_BESTELLUNGENVIEW

    Die Zeile besagt: Diese View verwendet die Tabelle. Sie besagt nicht, dass die View fehlerhaft ist. Um die nächste Stufe zu untersuchen, setzt du REFERENCED_NAME auf OFFENE_BESTELLUNGEN und REFERENCED_TYPE auf VIEW. Im beschriebenen Lernbeispiel wäre BESTELL_SERVICE vom Typ PACKAGE BODY ein nächster Treffer. Die Abfrage verfolgt nicht automatisch alle Stufen und zeigt auch keine einzelnen Spaltenabhängigkeiten.

    Die Gegenrichtung „Welche Objekte verwendet dieses Package?“ findest du samt Abfrage unter PL/SQL: Abhängigkeiten untersuchen. Beide Richtungen beantworten unterschiedliche Fragen; sie sind keine doppelten Inventarlisten.

    3. Eine Änderung muss nicht alle Objekte ungültig machen

    Oracle berücksichtigt bei vielen lokalen Abhängigkeiten, welche Teile einer Definition tatsächlich verwendet werden. Eine zusätzliche, nicht verwendete Spalte muss deshalb nicht dieselbe Wirkung haben wie das Entfernen einer benötigten Spalte. Ein Datenwert zu ändern ist außerdem etwas anderes, als die Definition einer Tabelle oder View zu ändern. Umfang und Art der Änderung entscheiden über die Folgen; „jede Änderung macht alles INVALID“ wäre falsch.

    INVALID ist ein Hinweis zur technischen Verwendbarkeit, kein Beweis für zerstörte Daten. Oracle kann bei Verwendung eine Revalidierung versuchen. Fehlt jedoch weiterhin eine benötigte Spalte oder Berechtigung, beseitigt eine erneute Übersetzung die Ursache nicht. Objektstatus und Compilerhinweise werden in Kapitel 41, Abschnitte 7 und 8 gemeinsam gelesen.

    4. Praxisfall: Der Bericht scheitert nach einer Auslieferung

    Angenommen, die View referenziert ABGESCHLOSSEN_AM. Bei einer Auslieferung wurde diese Spalte umbenannt, die View aber nicht passend angepasst. Die Anwendung meldet einen Fehler beim Bericht. Zuerst hältst du den tatsächlich aufgerufenen Service, das Schema und die vollständige Fehlermeldung fest. Danach prüfst du die betroffenen Objekte und folgst den Abhängigkeiten. Entscheidend ist, ob View-Definition und aktuelle Tabellenstruktur noch zusammenpassen. Der Package-Fehler kann ein Folgefehler sein; aus ihm allein folgt noch nicht, dass die Berechnung im Package falsch ist.

    Ergebnis der Untersuchung: Benenne die konkrete unpassende Referenz und den betroffenen Objektstand. Eine abgestimmte Korrektur gehört zum Auslieferungsprozess. Bloß alle Objekte erneut zu kompilieren ersetzt diese Untersuchung nicht.

    5. Was die Abhängigkeitsliste nicht beweist

    Dynamisch zusammengesetztes SQL erzeugt keine entsprechenden statischen Objektabhängigkeiten. Auch externe Aufrufer und fachliche Zusammenhänge werden dadurch nicht vollständig erfasst. Unsere Abfrage beschränkt sich zusätzlich auf lokale Referenzen. Eine leere Trefferliste beweist daher nicht, dass eine Tabelle unbenutzt ist oder gefahrlos entfernt werden könnte. Nutze Quelltext, Anwendungskontext und vorhandene Betriebsdokumentation als Ergänzung.

    Oracle 19c: Objektabhängigkeiten, Invalidierung und Revalidierung; ALL_DEPENDENCIES.

    Materialized Views einfach erklärt: eine gespeicherte Übersicht

    Stell dir eine Liste mit Bestellungen vor. Für einen Bericht möchtest du wissen, wie viele Bestellungen bisher eingegangen sind. Eine normale View beschreibt die passende Abfrage und liest bei ihrem Aufruf die zugrunde liegenden Daten. Eine Materialized View speichert dagegen das berechnete Ergebnis. Der Bericht kann dieses vorbereitete Ergebnis später abfragen. Damit es neue Bestellungen berücksichtigt, muss es aktualisiert werden. Diese Aktualisierung heißt Refresh.

    1. Ein einfaches Beispiel mit Bestellungen

    Das Beispiel beschreibt eine gewöhnliche, separat aktualisierte Materialized View ohne On-Query Computation. Um 10:00 Uhr enthält die Tabelle BESTELLUNGEN genau 100 Bestellungen. Zu diesem Zeitpunkt wird auch die Materialized View BESTELLANZAHL_MV aktualisiert; sie speichert den Wert 100. Um 10:05 Uhr kommt eine weitere Bestellung hinzu und wird mit COMMIT bestätigt. Um 10:10 Uhr starten wir neue Abfragen im üblichen Modus READ COMMITTED. Die gespeicherte Übersicht wurde inzwischen noch nicht aktualisiert.

    Abfrage um 10:10 UhrAnzahl
    Bestellungen direkt zählen / normale View101
    Gespeicherte Übersicht lesen100

    Was bedeutet der Unterschied? Die neue Bestellung ist vorhanden. Die gespeicherte Übersicht zeigt lediglich noch den Stand ihrer vorherigen Aktualisierung. Nach einem erfolgreichen Refresh, der die zusätzliche Bestellung berücksichtigt, steht auch dort 101. Dabei nehmen wir an, dass sonst keine Bestellungen hinzukommen oder entfernt werden.

    2. Wie sieht eine Abfrage aus?

    Was sehe ich hier? Wir nehmen an, dass BESTELLANZAHL_MV bereits existiert und eine Spalte ANZAHL_BESTELLUNGEN enthält. Die folgende Abfrage liest ausschließlich das vorberechnete Ergebnis. Sie legt kein Objekt an und löst keinen Refresh aus.

    READ ONLY – gespeicherte Anzahl lesen
    SELECT anzahl_bestellungen
    FROM app_demo.bestellanzahl_mv;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Stand vor dem nächsten Refresh.

    ANZAHL_BESTELLUNGEN
    100

    Der Objektname allein verrät nicht, wie aktuell das Ergebnis ist. Eine Materialized View aktualisiert sich nicht dadurch, dass jemand sie mit SELECT liest. Ob sie beispielsweise nach einem Zeitplan oder zusammen mit Änderungen aktualisiert wird, hängt von ihrer Einrichtung ab.

    3. Wofür ist das sinnvoll?

    Bei 100 Bestellungen ist eine vorberechnete Anzahl kaum nötig. Bei großen Auswertungen über viele Tabellen kann das Vorberechnen wiederholte Arbeit sparen. Dafür werden zusätzlicher Speicher und Zeit für die Aktualisierung benötigt. Ein täglicher Bericht kommt möglicherweise mit dem Stand vom Morgen aus. Eine Anzeige, die jede neue Bestellung sofort berücksichtigen muss, benötigt einen dazu passenden Aktualisierungsablauf.

    Wenn eine Zahl unerwartet ist: Prüfe zuerst, welchen Zeitraum und welche Bestellungen die Auswertung zählt. Kläre dann, wann ihre Daten zuletzt erfolgreich aktualisiert wurden. Ein technisch gültiges Objekt kann trotzdem einen älteren Datenstand enthalten. Details zur Ausführung geplanter Aufgaben stehen im Scheduler-Kapitel.

    4. Refresh-Zustand read-only prüfen

    Was sehe ich hier? Die Abfrage unterscheidet die Aktualisierungsweise, den zuletzt dokumentierten Refresh und die technische Gültigkeit. ALL_MVIEWS zeigt nur die für diese Verbindung sichtbaren Materialized Views.

    READ ONLY – Aktualität und technische Gültigkeit
    SELECT owner, mview_name, refresh_mode,
           last_refresh_type, last_refresh_date, last_refresh_end_time,
           staleness, compile_state
    FROM all_mviews
    WHERE owner = 'APP_DEMO'
      AND mview_name = 'BESTELLANZAHL_MV';

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    OWNERMVIEW_NAMEREFRESH_MODELAST_REFRESH_TYPE
    APP_DEMOBESTELLANZAHL_MVDEMANDCOMPLETE
    LAST_REFRESH_DATELAST_REFRESH_END_TIMESTALENESSCOMPILE_STATE
    13.10.2026 10:00:0013.10.2026 10:00:02STALEVALID

    Beide Teilansichten bilden dieselbe Zeile ab. Die Übersicht ist technisch gültig, enthält aber einen älteren Datenstand. LAST_REFRESH_END_TIME bezeichnet das Ende des letzten Refreshs; die Datumsdarstellung hängt vom Client ab. UNKNOWN oder UNDEFINED belegt keine Aktualität. Ein NULL-Datum kann auf ein noch nicht befülltes Objekt hinweisen. Keine Ergebniszeile verlangt eine Prüfung von Name, Container und Sichtbarkeit. Diese SELECT-Abfrage löst keinen Refresh aus.

    Merksatz: Eine normale View ist eine gespeicherte Abfragedefinition. Eine Materialized View hält zusätzlich das Ergebnis bereit und benötigt eine passende Aktualisierung. Sie ersetzt kein Backup.

    Oracle 19c: Grundlagen zu Materialized Views · Referenz für Aktualisierungsinformationen

    2. Was ist ein Index?

    Ein Index ist eine separate Suchstruktur zu einer Tabelle. Er enthält ausgewählte Spaltenwerte und Verweise auf die zugehörigen Tabellenzeilen. Dadurch kann Oracle unter geeigneten Bedingungen gezielter zu den gesuchten Daten springen, statt die gesamte Tabelle zu lesen.

    Das Prinzip ist mit dem Stichwortverzeichnis eines Buches vergleichbar: Du liest nicht jede Seite, sondern suchst einen Begriff im Verzeichnis und springst anschließend zur passenden Seite.

    3. Wann hilft ein Index?

    • Wenn nur ein kleiner Teil einer großen Tabelle benötigt wird.
    • Bei Gleichheitsprädikaten wie WHERE kundennummer = 4711.
    • Bei geeigneten Bereichssuchen wie WHERE datum BETWEEN ....
    • Bei Joinspalten, wenn der Zugriffspfad und die Datenverteilung dazu passen.
    • Bei bestimmten Sortier- oder Gruppierungsanforderungen.

    4. Wann kann ein Full Table Scan besser sein?

    Wenn eine Abfrage einen großen Anteil der Tabelle benötigt, kann ein Full Table Scan günstiger sein. Ein Indexzugriff besteht oft aus zwei Schritten: Index lesen und danach viele Tabellenblöcke über RowIDs besuchen. Bei sehr vielen Treffern kann das teurer sein als ein sequenzieller Scan der Tabelle.

    Merksatz: Ein vorhandener Index muss nicht benutzt werden. Das ist nicht automatisch ein Fehler.

    5. B-Tree Index – der Standardfall

    Der klassische Oracle-Index ist der B-Tree-Index. Er eignet sich für viele OLTP-Zugriffsmuster, insbesondere für Gleichheits- und Bereichsprädikate. B-Tree bezeichnet die Struktur; Composite bezeichnet mehrere Schlüsselspalten, Function-Based einen Ausdruck als Indexbestandteil. Diese Eigenschaften sind kombinierbar: Ein B-Tree kann zusammengesetzt und funktionsbasiert sein. UNIQUE und INVISIBLE sind weitere Eigenschaften. Bitmap beschreibt eine andere Indexstruktur.

    Ein Bitmap-Index ist nicht einfach ein „Index für wenige verschiedene Werte“. Seine Eignung hängt stark von Workload, Änderungsverhalten und Abfragemustern ab. In schreibintensiven OLTP-Systemen können Bitmap-Indizes wegen ihrer Sperr- und Wartungseigenschaften problematisch sein. Die Auswahl eines Indextyps ist deshalb eine Designentscheidung und keine reine Kardinalitätsregel.

    NULL und Indexinhalt: Ein gewöhnlicher aufsteigender B-Tree-Index enthält keine Einträge für Zeilen, deren sämtliche Indexschlüsselspalten NULL sind. Ein einfacher Index auf einer optionalen Spalte repräsentiert deshalb nicht automatisch jede Tabellenzeile. Daraus folgt keine allgemeine Regel, dass IS NULL nie einen Index nutzen kann; Schlüsseldefinition und Zugriffsweg sind entscheidend.

    6. Typische B-Tree-Zugriffe im Execution Plan

    OperationEinfach erklärt
    INDEX UNIQUE SCANLiefert für einen vollständig mit Gleichheit gesuchten eindeutigen Indexschlüssel höchstens eine ROWID; keine bloße Mengenschätzung.
    INDEX RANGE SCANOracle liest einen passenden Bereich des Index.
    INDEX FULL SCANOracle liest den Index entlang seiner geordneten Leaf-Struktur.
    INDEX FAST FULL SCANOracle liest den Index eher wie eine kompakte Datenquelle, ohne garantierte Sortierreihenfolge.

    Ein PRIMARY KEY allein garantiert keinen INDEX UNIQUE SCAN: Wird die Regel durch einen geeigneten NONUNIQUE-Index unterstützt, kann ein INDEX RANGE SCAN erscheinen. Die Regel und der gewählte Zugriffsweg beantworten verschiedene Fragen.

    7. Unique Index

    Ein Unique Index verhindert doppelte Indexschlüssel nach der Oracle-Semantik für NULL-Werte. Er kann beispielsweise zur technischen Durchsetzung eines PRIMARY-KEY- oder UNIQUE-Constraints verwendet werden. Trotzdem bleiben Index und Constraint zwei verschiedene Konzepte.

    8. Composite Index – mehrere Spalten

    Ein zusammengesetzter Index enthält mehrere Spalten in einer festgelegten Reihenfolge. Diese Reihenfolge beeinflusst, für welche Prädikate der Index besonders gut nutzbar ist. Die erste Spalte beziehungsweise die führenden Spalten sind deshalb bei der Planung wichtig.

    Die verkürzte Aussage „ohne die erste Spalte kann Oracle den Index nie verwenden“ wäre jedoch falsch. Je nach Abfrage und Kostenmodell sind beispielsweise Index Skip Scans oder andere Zugriffsformen möglich. Ob Oracle einen Index tatsächlich auswählt, entscheidet der Optimizer; dieses Thema wird im Performance-/Execution-Plan-Bereich vertieft.

    9. Function-Based Index

    Ein Function-Based Index speichert nicht nur einen Rohwert, sondern das Ergebnis eines Ausdrucks. Das ist nützlich, wenn eine Abfrage denselben Ausdruck verwendet.

    ADMINISTRATIVES LERNBEISPIEL
    CREATE INDEX ix_person_upper_name
    ON person (UPPER(name));

    Eine Abfrage mit WHERE UPPER(name) = 'MEIER' kann von diesem Index profitieren. Der Index garantiert aber keinen bestimmten Plan.

    10. Bitmap Index

    Bitmap-Indizes speichern Werte in Bitmap-Strukturen. Sie können in analytischen Umgebungen mit relativ wenigen unterschiedlichen Werten nützlich sein. In stark schreibenden OLTP-Systemen sind sie wegen ihres DML-/Locking-Verhaltens oft ungeeignet.

    11. Invisible Index

    Ein Invisible Index bleibt physisch vorhanden und wird bei DML weiter gepflegt, steht dem Optimizer standardmäßig aber nicht als normal sichtbarer Zugriffspfad zur Verfügung. Das kann beim Test helfen, ob ein Index wirklich benötigt wird.

    12. UNUSABLE ist nicht dasselbe wie INVALID

    Bei Indizes ist insbesondere der Status UNUSABLE relevant. Ein unbenutzbarer Index ist nicht einfach nur „langsam“, sondern steht für normale Indexzugriffe nicht wie ein verwendbarer Index zur Verfügung. Die genaue Ursache muss aus dem betrieblichen Kontext ermittelt werden.

    EigenschaftINVISIBLEUNUSABLE
    OptimizerStandardmäßig nicht berücksichtigt.Für reguläre Indexzugriffe nicht verwendbar.
    DML-PflegeWird weiter gepflegt.Wird nicht wie ein verwendbarer Index gepflegt.
    DiagnoseGrund und Kontext der Sichtbarkeit prüfen.Ursache, betroffene Operation und Constraint-Bezug prüfen.

    Ein UNUSABLE-Index kann auch Änderungen an der Tabelle beeinträchtigen. SKIP_UNUSABLE_INDEXES beseitigt insbesondere bei eindeutigen Indizes nicht die Anforderungen der Integritätsprüfung. Aus dem Status folgt keine automatische Rebuild-Maßnahme. Ein unsichtbarer Index ist außerdem kein Beleg dafür, dass eine durch ihn unterstützte Datenregel deaktiviert wurde.

    13. Descending und partitionierte Indizes

    Descending Indexes speichern ausgewählte Schlüsselbestandteile absteigend. Bei partitionierten Tabellen gibt es unter anderem Local und Global Indexes. Local Indexes orientieren sich an den Tabellenpartitionen; Global Indexes besitzen eine davon unabhängigere globale Struktur.

    14. Warum benutzt Oracle meinen Index nicht?

    • Der Full Table Scan ist nach den geschätzten Kosten billiger.
    • Die Abfrage benötigt zu viele Zeilen.
    • Statistiken oder Datenverteilung führen zu einer anderen Kostenschätzung.
    • Eine Funktion oder implizite Datentypkonvertierung verändert das Prädikat.
    • Die Spaltenreihenfolge eines Composite Index passt nicht gut zum Zugriff.
    • Der Index ist invisible.
    • Der Clustering Factor macht viele Tabellenblockzugriffe wahrscheinlich.

    15. Read-only: vorhandene Indizes untersuchen

    Eingaben: &OWNER und &TABLE_NAME sind SQL*Plus-Substitutionsvariablen. Verwende für die zusammengehörigen Beispiele APP_DEMO und BESTELLUNGEN. UPPER passt zu gewöhnlichen unquotierten Namen; für bewusst mit Anführungszeichen und abweichender Groß-/Kleinschreibung angelegte Namen ist der Filter an den exakten Dictionary-Namen anzupassen.

    Bei partitionierten Indizes zusätzlich Partitions-/Subpartitionsstatus betrachten; ein übergeordneter STATUS kann N/A sein. Bei funktionsbasierten Indizes kann COLUMN_NAME einen intern erzeugten Namen zeigen. Den tatsächlichen Ausdruck erklärt DBA_IND_EXPRESSIONS, nicht allein die Spaltenliste.
    DBA_INDEXES + DBA_IND_COLUMNS
    SELECT
        i.owner,
        i.index_name,
        i.table_owner,
        i.table_name,
        i.index_type,
        i.uniqueness,
        i.status,
        i.visibility,
        i.blevel,
        i.leaf_blocks,
        i.distinct_keys,
        i.clustering_factor,
        i.last_analyzed,
        c.column_position,
        c.column_name,
        c.descend
    FROM dba_indexes i
    JOIN dba_ind_columns c
      ON c.index_owner = i.owner
     AND c.index_name  = i.index_name
    WHERE i.table_owner = UPPER('&OWNER')
      AND i.table_name  = UPPER('&TABLE_NAME')
    ORDER BY i.index_name, c.column_position;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileOWNERINDEX_NAMETABLE_OWNERTABLE_NAMEINDEX_TYPE
    1APP_DEMOBESTELLUNGEN_PKAPP_DEMOBESTELLUNGENNORMAL
    ZeileUNIQUENESSSTATUSVISIBILITYBLEVELLEAF_BLOCKS
    1UNIQUEVALIDVISIBLE140
    ZeileDISTINCT_KEYSCLUSTERING_FACTORLAST_ANALYZEDCOLUMN_POSITIONCOLUMN_NAME
    110000900008.10.2026 10:00:001BESTELLUNG_ID
    ZeileDESCEND
    1ASC

    Was sehe ich hier? Für &OWNER=APP_DEMO und &TABLE_NAME=BESTELLUNGEN wird ein einspaltiger Index gezeigt. COLUMN_POSITION ordnet die Indexspalten; BLEVEL und CLUSTERING_FACTOR sind Statistikwerte und keine alleinige Qualitätsnote. INDEX_TYPE, UNIQUENESS, STATUS und VISIBILITY ergänzen die Spalten- und Statistikangaben.

    Der Join liefert eine Zeile pro Indexspalte. Bei einem Composite Index wiederholen sich die indexbezogenen Werte; die Wiederholung bedeutet keine zusätzlichen Indizes.

    StatistikBedeutung
    BLEVELTiefe von der Wurzel bis zum Blatt; 0 bedeutet gemeinsamer Wurzel-/Blattblock.
    LEAF_BLOCKSAnzahl der Blattblöcke laut Statistik.
    DISTINCT_KEYSAnzahl unterschiedlicher vollständiger Indexschlüssel.
    CLUSTERING_FACTORBeschreibt die Verteilung der Tabellenzeilen beim Durchlaufen der Indexreihenfolge.
    LAST_ANALYZEDZeitpunkt der letzten Statistikermittlung.

    CLUSTERING_FACTOR=9000 ist ohne passende Tabellenblock- und Zeilenzahl nicht abschließend einzuordnen. Ein Wert nahe der Blockzahl deutet auf stärkere räumliche Bündelung hin, ein Wert nahe der Zeilenzahl auf stärkere Streuung. Der Wert allein begründet keinen Index-Rebuild. Die Tabellenvergleichswerte und ihr Statistikstand werden in Kapitel 9 untersucht.

    16. Indexstatistiken nicht mit Echtzeitmessung verwechseln

    Dictionary-Spalten wie NUM_ROWS, DISTINCT_KEYS, BLEVEL oder LEAF_BLOCKS können von gesammelten Optimizer-Statistiken abhängen. Sie sind deshalb nicht automatisch ein sekundengenauer Live-Zustand.

    Die fachliche Vertiefung zu Statistikalter, Cardinality und Histogrammen bleibt in Kapitel 9 – Optimizer-Statistiken.

    17. Was ist ein Constraint?

    Ein Constraint ist eine Datenregel. Oracle prüft damit, ob gespeicherte Daten bestimmten Bedingungen entsprechen. Constraints dienen in erster Linie der Datenqualität und Integrität, nicht der Performance.

    18. PRIMARY KEY

    Ein PRIMARY KEY identifiziert eine Tabellenzeile eindeutig. Die beteiligten Spalten dürfen nicht NULL sein und die Schlüsselkombination darf nicht doppelt vorkommen.

    19. UNIQUE Constraint

    NULL-Beispiel: Ein einspaltiger UNIQUE-Schlüssel erlaubt mehrere NULL-Werte. Bei einem zusammengesetzten Schlüssel ist die Aussage „NULL macht jede Kombination frei“ falsch: Zwei Zeilen (101, NULL) verletzen denselben zusammengesetzten UNIQUE-Schlüssel. Zeilen mit NULL in sämtlichen Schlüsselspalten verletzen den UNIQUE-Constraint nicht. PRIMARY KEY verlangt zusätzlich Werte in allen Schlüsselspalten.

    Ein UNIQUE Constraint erzwingt Eindeutigkeit nach Oracle-Semantik. Im Unterschied zum PRIMARY KEY kann eine Tabelle mehrere UNIQUE Constraints besitzen.

    20. FOREIGN KEY

    Ein FOREIGN KEY stellt eine Beziehung zwischen Child- und Parent-Daten her. Er verhindert beispielsweise, dass ein Child-Wert auf einen nicht vorhandenen Parent-Schlüssel verweist. Ziel ist ein PRIMARY-KEY- oder UNIQUE-Constraint, nicht bloß ein beliebiger Index. Ein Foreign Key verlangt nicht automatisch NOT NULL. Bei einem zusammengesetzten Foreign Key genügt bereits eine NULL-Komponente, damit die Fremdschlüsselbedingung erfüllt ist; zwingende Vollständigkeit benötigt zusätzliche Regeln.

    Oracle erzeugt für einen Foreign Key nicht automatisch einen Child-Index. Ein geeigneter Index kann aber für Joins und bestimmte Parent-DML-/Locking-Situationen wichtig sein.

    21. NOT NULL und CHECK

    NOT NULL verhindert NULL-Werte in einer Spalte. Ein CHECK-Constraint definiert eine fachliche Bedingung, beispielsweise preis >= 0. Beide sind Regeln und benötigen nicht automatisch einen eigenen Index. CHECK (preis >= 0) erlaubt auch NULL, weil die Bedingung dann UNKNOWN ist. Soll ein Preis zwingend vorhanden sein, wird zusätzlich NOT NULL benötigt.

    22. Beziehung zwischen Constraints und Indizes

    ConstraintIndex erforderlich?Wichtig
    PRIMARY KEYZur Durchsetzung einer aktivierten Regel verwendet Oracle einen geeigneten vorhandenen oder neu erzeugten Index.Constraint und Index bleiben getrennte Objekte.
    UNIQUEZur Durchsetzung einer aktivierten Regel verwendet Oracle einen geeigneten vorhandenen oder neu erzeugten Index.Constraint = Regel, Index = Datenstruktur.
    FOREIGN KEYNicht automatisch.Child-Index kann betrieblich sinnvoll sein.
    NOT NULLNeinSpaltenregel.
    CHECKNeinLogische Datenregel.

    Diese Zuordnung gilt für aktivierte Constraints auf den hier beschriebenen gewöhnlichen Tabellen. Der unterstützende Index muss nicht selbst UNIQUE sein: Auch ein geeigneter NONUNIQUE-Index kann verwendet werden. UNIQUENESS=NONUNIQUE widerlegt deshalb keinen PRIMARY KEY oder UNIQUE-Constraint. Maßgeblich ist die tatsächliche Zuordnung in DBA_CONSTRAINTS, nicht ein ähnlicher Name.

    23. Read-only: Constraints untersuchen

    DBA_CONSTRAINTS + DBA_CONS_COLUMNS
    SELECT
        c.owner,
        c.table_name,
        c.constraint_name,
        c.constraint_type,
        c.status,
        c.validated,
        c.r_owner,
        c.r_constraint_name,
        cc.position,
        cc.column_name
    FROM dba_constraints c
    JOIN dba_cons_columns cc
      ON cc.owner           = c.owner
     AND cc.constraint_name = c.constraint_name
     AND cc.table_name      = c.table_name
    WHERE c.owner      = UPPER('&OWNER')
      AND c.table_name = UPPER('&TABLE_NAME')
    ORDER BY c.constraint_name, cc.position;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileOWNERTABLE_NAMECONSTRAINT_NAMECONSTRAINT_TYPESTATUS
    1APP_DEMOBESTELLUNGENBESTELLUNGEN_PKPENABLED
    ZeileVALIDATEDR_OWNERR_CONSTRAINT_NAMEPOSITIONCOLUMN_NAME
    1VALIDATEDNULLNULL1BESTELLUNG_ID

    Was sehe ich hier? Für APP_DEMO.BESTELLUNGEN ist ein geprüfter Primärschlüssel aktiv. P bedeutet Primary Key; R_OWNER und R_CONSTRAINT_NAME wären bei einem Fremdschlüssel relevant und sind hier NULL. STATUS und VALIDATED unterscheiden aktive Durchsetzung und Prüfung des vorhandenen Datenbestands.

    Praxisbeispiel: Index vorhanden, SQL trotzdem langsam

    Auf einer großen Tabelle existiert ein Index, der Execution Plan zeigt aber einen Full Table Scan.

    Was prüfst du?
    Prüfe Trefferzahl, Indexspalten und deren Reihenfolge, Sichtbarkeit/Status, Datentypen und die Kostenschätzung des Optimizers.
    Lerneffekt: Ein nicht verwendeter Index ist kein Fehlerbeweis.
    Fremdschlüssel bis zur Parent-Tabelle und ihren Spalten verfolgen

    Was sehe ich hier? R_OWNER und R_CONSTRAINT_NAME identifizieren den referenzierten Constraint. Die zweite Spaltenzuordnung verwendet POSITION, damit bei zusammengesetzten Schlüsseln das richtige Spaltenpaar entsteht. Das Beispiel zeigt APP_DEMO.BESTELLUNGEN mit einem Verweis auf KUNDEN.

    READ ONLY – Child- und Parent-Spalten zuordnen
    SELECT fk.owner AS child_owner, fk.table_name AS child_table,
           fk.constraint_name AS foreign_key, fc.position,
           fc.column_name AS child_column,
           pk.owner AS parent_owner, pk.table_name AS parent_table,
           pc.column_name AS parent_column, fk.delete_rule
    FROM dba_constraints fk
    JOIN dba_constraints pk
      ON pk.owner = fk.r_owner
     AND pk.constraint_name = fk.r_constraint_name
    JOIN dba_cons_columns fc
      ON fc.owner = fk.owner
     AND fc.constraint_name = fk.constraint_name
    JOIN dba_cons_columns pc
      ON pc.owner = pk.owner
     AND pc.constraint_name = pk.constraint_name
     AND pc.position = fc.position
    WHERE fk.constraint_type = 'R'
      AND fk.owner = UPPER('&OWNER')
      AND fk.table_name = UPPER('&TABLE_NAME')
    ORDER BY fk.constraint_name, fc.position;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    CHILD_OWNERCHILD_TABLEFOREIGN_KEYPOSITIONCHILD_COLUMN
    APP_DEMOBESTELLUNGENBESTELLUNGEN_KUNDEN_FK1KUNDE_ID
    PARENT_OWNERPARENT_TABLEPARENT_COLUMNDELETE_RULE
    APP_DEMOKUNDENKUNDE_IDNO ACTION

    Die Teilansichten gehören zeilenweise zusammen. NO ACTION bedeutet keine automatische Löschung oder NULL-Setzung von Child-Zeilen beim Parent-Löschen; die Referenzprüfung bleibt zu beachten. CASCADE löscht betroffene Child-Zeilen mit, SET NULL setzt die Fremdschlüsselspalten auf NULL und kann mit weiteren Regeln kollidieren. Die Abfrage führt keine dieser Aktionen aus. Ohne Treffer zuerst Owner, Tabelle, Container, Rechte und vorhandene Fremdschlüssel prüfen.

    24. Constraint-Status: ENABLED, VALIDATED und DEFERRABLE

    ENABLED beschreibt die Durchsetzung; VALIDATED beschreibt die Prüfung vorhandener Daten. ENABLE NOVALIDATE ist deshalb kein Nachweis, dass der gesamte Altbestand die Regel erfüllt. DEFERRABLE beschreibt die Möglichkeit einer verzögerten Prüfung; DEFERRED den voreingestellten Prüfmodus, nicht eine vollständige Anzeige aller späteren Sessionentscheidungen.

    Bei der Diagnose reicht der Constraint-Name allein nicht. Oracle stellt auch Informationen dazu bereit, ob eine Regel aktiviert und validiert ist sowie ob sie verzögert geprüft werden kann. Ein Constraint kann daher strukturell vorhanden sein, ohne dass jede denkbare Statuskombination dasselbe bedeutet.

    READ ONLY – Constraints mit Status
    SELECT
        owner,
        table_name,
        constraint_name,
        constraint_type,
        status,
        validated,
        deferrable,
        deferred,
        index_owner,
        index_name
    FROM dba_constraints
    WHERE owner = UPPER('&OWNER')
      AND table_name = UPPER('&TABLE_NAME')
    ORDER BY constraint_type, constraint_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten.

    OWNERTABLE_NAMECONSTRAINT_NAMECONSTRAINT_TYPESTATUS
    APP_DEMOBESTELLUNGENBESTELLUNGEN_PKPENABLED
    VALIDATEDDEFERRABLEDEFERREDINDEX_OWNERINDEX_NAME
    VALIDATEDNOT DEFERRABLEIMMEDIATEAPP_DEMOBESTELLUNGEN_PK

    So liest du das Ergebnis: Der Primary Key ist aktiviert und validiert. Regel und unterstützender Index heißen hier gleich, bleiben aber unterschiedliche Strukturen. Diese einzelne Zeile ist kein vollständiges Inventar aller Regeln der Tabelle.

    Was sehe ich hier?

    CONSTRAINT_TYPE verwendet unter anderem P für Primary Key, U für Unique und R für Foreign Key. C umfasst CHECK und NOT NULL; NOT NULL hat keinen eigenen Typcode. Zur Unterscheidung werden Bedingung und Spaltenmetadaten gelesen. STATUS, VALIDATED und DEFERRABLE beschreiben Eigenschaften der Regel. INDEX_NAME kann bei indexgestützten Constraints die Beziehung zum verwendeten Index sichtbar machen.

    Gegenbeispiel: STATUS=ENABLED und VALIDATED=NOT VALIDATED bedeutet, dass die Regel durchgesetzt wird, ohne dass damit ein vollständig geprüfter Altbestand belegt ist. ENABLED allein beantwortet also nicht die Frage nach der bisherigen Datenqualität. DEFERRABLE bezeichnet die mögliche Verschiebung der Prüfung; DEFERRED den anfänglichen Modus.

    25. DBA-Praxis: Tabelle, Indizes und Constraints gemeinsam untersuchen

    Bei einer Objektanalyse sollte nicht nur eine einzelne Dictionary-View betrachtet werden. Erst die Kombination aus Tabellenstruktur, Indexdefinition und Constraints zeigt, welche Aufgabe ein Objekt im Schema erfüllt.

    Was sehe ich hier? Die folgende Abfrage beschreibt die Tabellenspalten. Ergänze sie um die bereits erläuterten Index- und Constraint-Abfragen. So entsteht eine gemeinsame Objektanalyse ohne erneute Inventarlisten.
    READ ONLY – Tabellenspalten
    SELECT owner,
           table_name,
           column_id,
           column_name,
           data_type,
           nullable
    FROM dba_tab_columns
    WHERE owner = UPPER('&OWNER')
      AND table_name = UPPER('&TABLE_NAME')
    ORDER BY column_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten.

    OWNERTABLE_NAMECOLUMN_IDCOLUMN_NAMEDATA_TYPE
    APP_DEMOBESTELLUNGEN1BESTELLUNG_IDNUMBER
    APP_DEMOBESTELLUNGEN2STATUSVARCHAR2
    NULLABLE
    N
    Y

    So liest du das Ergebnis: Die Abfrage beschreibt Spalten, nicht die Zeilen der Bestellungstabelle. NULLABLE=N sagt, dass ein Wert verlangt wird; es benennt allein noch keinen konkreten Primary-Key-Constraint. Dies ist eine Grundübersicht: VARCHAR2 allein zeigt weder Länge noch BYTE-/CHAR-Semantik. Dafür wären DATA_LENGTH, CHAR_LENGTH und CHAR_USED erforderlich; bei NUMBER helfen DATA_PRECISION und DATA_SCALE. Systemgenerierte versteckte Spalten werden von DBA_TAB_COLUMNS ausgefiltert.

    Constraint-Typen in DBA_CONSTRAINTS:

    P = Primary Key    U = Unique    R = Referential / Foreign Key    C = Check Constraint beziehungsweise intern dargestellte Check-Bedingung.
    Diagnoseprinzip:

    1. Zuerst das betroffene Tabellenobjekt und seine Spalten identifizieren.
    2. Danach vorhandene Indizes und deren Spaltenreihenfolge prüfen.
    3. Constraints getrennt betrachten und ihre Aufgabe bestimmen.
    4. Bei Foreign Keys die referenzierte Constraint-Beziehung nachvollziehen.
    5. Erst danach entscheiden, ob ein beobachtetes Problem Struktur, Integrität oder Performance betrifft.

    Ob ein Index für eine konkrete SQL-Anweisung tatsächlich sinnvoll oder verwendet wird, gehört in die spätere Optimizer- und Execution-Plan-Analyse.

    26. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Concepts – Indexes and Index-Organized Tables
    B-Tree, Bitmap, Function-Based und Composite Indexes
    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/indexes-and-index-organized-tables.html

    Oracle Database 19c Concepts – Data Integrity
    NOT NULL, Unique, Primary Key, Foreign Key und Check Constraints
    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/data-integrity.html

    Oracle Database 19c Reference
    DBA_INDEXES, DBA_IND_COLUMNS, DBA_CONSTRAINTS und DBA_CONS_COLUMNS
    DBA_INDEXES / ALL_INDEXES · Indexspalten · Constraints · Constraint-Spalten · Tabellenspalten · Materialized Views · UNUSABLE-Verhalten
    Primary/Unique Constraint und Index:

    Ein PRIMARY KEY oder UNIQUE Constraint ist eine Integritätsregel. Zur Durchsetzung der Eindeutigkeit verwendet Oracle einen geeigneten Index; dabei kann ein passender vorhandener Index genutzt oder ein Index erzeugt werden. Constraint und Index bleiben trotzdem unterschiedliche Objekte.
    Foreign Key und Index:

    Oracle erzeugt für die Spalten eines Foreign Keys nicht automatisch einen Index. Ob ein solcher Index sinnvoll ist, muss anhand der Zugriffs- und Änderungsmuster beurteilt werden. Eine pauschale Regel, nach der jeder Foreign Key zwingend einen eigenen Index benötigt, ist zu grob.
    Vertiefende Oracle-19c-Quellen: Constraint-Semantik · Indizes

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Tabellen speichern Daten, Indizes unterstützen Zugriffe und Constraints sichern fachliche Regeln. Diese drei Aufgaben sind miteinander verbunden, aber nicht austauschbar.
    2. Ein Index ist nicht für jede Abfrage der günstigste Weg. Datenmenge, Selektivität, Zugriffsmuster und zusätzlicher Tabellenzugriff beeinflussen die Planentscheidung.
    3. Bei zusammengesetzten und funktionsbasierten Indizes müssen Spaltenreihenfolge beziehungsweise Ausdruck zur Abfrage passen. Der bloße Bestand eines Index beweist noch keinen Nutzen.
    4. PRIMARY KEY, UNIQUE, FOREIGN KEY, NOT NULL und CHECK prüfen unterschiedliche Regeln. Ein Fremdschlüssel erzeugt nicht automatisch einen Index auf seinen Spalten.
    5. Bei der Diagnose werden Definition, Status und Statistiken gemeinsam betrachtet. UNUSABLE bei einem Index ist nicht dasselbe wie INVALID bei einem gespeicherten Programm.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Was ist der wichtigste Unterschied zwischen Index und Constraint?
    Ein Index ist eine Datenstruktur für Zugriff und gegebenenfalls technische Eindeutigkeitsprüfung. Ein Constraint ist eine Regel für Datenintegrität.
    Frage 2: Muss Oracle einen vorhandenen Index immer verwenden?
    Nein. Der Optimizer entscheidet kostenbasiert.
    Frage 3: Erzeugt Oracle automatisch einen Index für jeden Foreign Key?
    Nein. Der Foreign Key ist eine Integritätsregel; ein Child-Index wird nicht automatisch erzeugt. Seine Eignung hängt von Zugriffen und Parent-Änderungen ab, und ein vorhandener geeigneter Index kann bereits genügen.
    Frage 4: Ist ein vorhandener Constraint immer ein Nachweis für einen vollständig geprüften Altbestand?
    Nein. STATUS und VALIDATED gemeinsam lesen. ENABLED mit NOT VALIDATED ist eine andere Aussage als ENABLED mit VALIDATED.
    Frage 5: Was beweist ein INVALID-Programmobjekt über die Tabellendaten?
    Es beweist keinen Datenverlust. Abhängigkeiten, Quelltext und Compilerfehler prüfen; die Daten und die technische Verwendbarkeit des Programms sind verschiedene Ebenen.
    Frage 6: Kann ein NONUNIQUE-Index einen PRIMARY KEY unterstützen?
    Ja, wenn er geeignet ist. Die Eindeutigkeitsregel wird durch den Constraint durchgesetzt. Indexeigenschaft und Constraint-Zuordnung müssen getrennt gelesen werden.
    Frage 7: Verlangt CHECK (preis >= 0) einen ausgefüllten Preis?
    Nein. Bei NULL ist die Bedingung UNKNOWN und verletzt diesen CHECK nicht. Für einen zwingenden Wert ist zusätzlich NOT NULL erforderlich.
    Frage 8: Kann eine technisch gültige Materialized View veraltete Ergebnisse enthalten?
    Ja. COMPILE_STATE und STALENESS beantworten unterschiedliche Fragen. Refresh-Zeitpunkt und Datenstand müssen zusätzlich geprüft werden.

    8. Oracle Storage intern – vom Tablespace bis zum Datenblock

    Logischen Speicher verstehen, physische Dateien zuordnen und Kapazitätswerte read-only einordnen.

    Lernkompass
    Einfach gesagt Oracle organisiert Speicher in Tablespaces, Segmenten, Extents und Blöcken. Datafiles bilden die physische Grundlage.
    Warum ist das wichtig? Eine große Datei, ein großes Segment und viele Nutzdaten sind unterschiedliche Aussagen. Wer diese Ebenen trennt, kann Kapazitätsprobleme gezielt untersuchen.
    Nach diesem Kapitel Du kannst Speicherstrukturen unterscheiden, Dictionary-Werte interpretieren und vom betroffenen Tablespace zu seinen größten Segmenten und Dateien navigieren.

    Einführung: Oracle organisiert Speicher sowohl logisch als auch physisch. Ein Tablespace fasst Speicher für Datenbankobjekte zusammen; Datafiles stellen dafür die Dateien bereit. Innerhalb dieses Rahmens wird Platz in Blöcken, Extents und Segmenten zugeordnet. Für die Administration ist entscheidend, auf welcher Ebene eine Größenangabe gemessen wurde: Dateikapazität, zugeordneter Objektplatz und tatsächlicher Dateninhalt sind unterschiedliche Größen.

    Das Kapitel baut diese Ebenen vom Überblick bis zum Datenblock auf und verbindet sie mit lesenden Abfragen. Danach folgen Tablespace-Arten, Bigfile und Smallfile sowie Möglichkeiten zur Erweiterung. Du sollst eine Platzmeldung einordnen können, bevor du eine Datei vergrößerst oder zusätzliche Kapazität planst. Die technischen Voraussetzungen der jeweiligen Änderung stehen bei den Befehlen.

    Oracle 19c: fachliche Grundlage

    Die folgenden Ausgaben verwenden erfundene Lernwerte. Die Umrechnung mit 1024 liefert KiB, MiB beziehungsweise GiB; bestehende SQL-Aliase KB, MB und GB werden hier in diesem binären Sinn verwendet.

    Eine Tabelle ist nicht einfach ein Datafile. Ein Tablespace kann viele Segmente enthalten, beispielsweise Tabellen-, Index- und LOB-Segmente. Bei partitionierten Objekten können einzelne Partitionen eigene Segmente besitzen. Umgekehrt kann ein Segment Extents in mehreren Datafiles desselben Tablespaces haben.

    1. Logische und physische Speicherstrukturen

    Die logische Sicht beschreibt, wie Oracle Speicher verwaltet. Die physische Sicht beschreibt die Dateien auf Filesystem oder ASM. Ein permanenter Tablespace besitzt Datafiles; ein temporärer Tablespace besitzt Tempfiles. Smallfile-Tablespaces können mehrere Dateien enthalten, ein Bigfile-Tablespace genau eine potenziell sehr große Datei. Die Tablespace-Blockgröße bestimmt die Größe seiner Oracle-Blöcke; sie ist nicht mit der Blockgröße des Filesystems gleichzusetzen.

    2. Schaubild: die Storage-Beziehungen

    TABLESPACE
    Logischer Container
    →
    SEGMENT
    Zugeordneter Objektplatz
    →
    EXTENT
    Zusammenhängende Oracle-Blöcke
    →
    ORACLE BLOCK
    Logische Speichereinheit
    TABLESPACE
    Derselbe logische Container
    →
    DATAFILES
    Physische Dateien für seine Blöcke
    Die Verbindung zwischen beiden Bildern: Ein einzelnes Extent liegt vollständig in einem Datafile. Verschiedene Extents desselben Segments können auf mehrere Datafiles desselben Tablespaces verteilt sein. Ein Segment gehört zu genau einem Tablespace.

    3. Fachbegriffe verständlich erklärt

    BegriffBedeutungDBA-Einordnung
    TablespaceLogischer SpeichercontainerOrdnet Segmente und Dateien zusammen; PERMANENT, UNDO und TEMP unterscheiden.
    DatafilePhysische Datei eines permanenten oder UNDO-TablespacesDateigröße ist nicht identisch mit Nutzdatenmenge.
    TempfileDatei eines temporären TablespacesBeispielsweise für ausgelagerte Sortierungen und Hash-Operationen; separat prüfen.
    SegmentFür eine Speicherstruktur zugeordnete ExtentsBeispielsweise Tabelle, Index, LOB oder Partition; ein Objekt muss nicht genau einem Segment entsprechen.
    ExtentGruppe logisch zusammenhängender Oracle-BlöckeWird einem Segment zugeordnet und überspannt kein Datafile.
    Oracle BlockKleinste logische SpeichereinheitEnthält Verwaltungsinformationen und je nach Blocktyp Daten; kein reiner Nutzdatenbehälter.
    AutoextendErlaubte automatische DateivergrößerungMAXBYTES, Inkrement und real verfügbaren Storage gemeinsam betrachten.
    High Water MarkGrenze, oberhalb derer Datenblöcke noch unformatiert und nie benutzt sindGelöschte Zeilen bedeuten nicht automatisch weniger allokierte Extents oder kleinere Dateien.

    Speicherverwaltung: Locally Managed Tablespaces (LMT) verwalten die Zuordnung freier und belegter Extents mit Bitmaps. Automatic Segment Space Management (ASSM) verwaltet innerhalb geeigneter Segmente den für Zeilen verfügbaren Blockplatz. Das sind zwei verschiedene Verwaltungsebenen; weder LMT noch ASSM garantieren eine bestimmte Nutzdatenquote.

    Die HWM ist keine Anzeige der heutigen Nutzdatenmenge. Bei ASSM können zwischen Low HWM und HWM auch noch unformatierte Blöcke liegen; unterhalb der Low HWM sind alle Blöcke formatiert. Ein DELETE senkt diese Grenze nicht automatisch. LMT verwaltet Extents, ASSM den Blockplatz innerhalb von Segmenten.

    4. Warum diese Unterscheidung wichtig ist

    Angenommen, ein Datafile ist 20 GB groß und darin sind 15 GB Segmentplatz zugeordnet. Daraus folgt nicht, dass 15 GB fachliche Nutzdaten vorhanden sind: freie Bereiche innerhalb von Segmenten und Verwaltungsinformationen zählen mit. Freie Extents sind dagegen noch keinem Segment zugeordnet. Wird eine große Zahl von Zeilen gelöscht, kann der Segmentplatz weiterhin zugeordnet bleiben und später wiederverwendet werden. Die Datei wird dadurch nicht automatisch kleiner.

    Messwerte nicht vermischen: DBA_SEGMENTS.BYTES bezeichnet allokierten Segmentplatz. DBA_FREE_SPACE beschreibt freie Extents im Tablespace. Keiner dieser Werte allein beweist die fachliche Nettodatenmenge oder den freien Platz auf dem darunterliegenden Storage.
    Zu den folgenden Beispielen: Die Tabellen zeigen fiktive, gekürzte SQL-Ergebnisse. Die Darstellung ist für das Wiki aufbereitet; das Skript führt die Abfragen nicht aus. Größen werden mit 1024 umgerechnet: 1 GiB = 1024 MiB und 1 KiB = 1024 Bytes; bestehende SQL-Aliase mit MB/GB verwenden in diesem Kapitel ebenfalls diese binäre Umrechnung. Die Spaltentabellen erklären die Begriffe; die anschließenden Rechenwege wenden sie auf die Beispielwerte an.

    5. Tablespaces und Datafiles einordnen

    Was beantwortet diese Abfrage?

    Welche Dateien gehören zu den permanenten und UNDO-Tablespaces, und welche Wachstumsgrenzen sind für sie konfiguriert?

    READ ONLY – Dateien und Wachstumsgrenzen
    SELECT t.tablespace_name, t.contents, t.status AS tablespace_status,
           t.block_size, t.bigfile, d.file_id, d.file_name,
           ROUND(d.bytes / 1024 / 1024, 1) AS allocated_mb,
           d.autoextensible,
           ROUND(d.maxbytes / 1024 / 1024, 1) AS max_mb,
           ROUND(d.increment_by * t.block_size / 1024 / 1024, 1)
             AS next_increment_mb,
           d.online_status AS file_online_status
    FROM   dba_tablespaces t
    LEFT JOIN dba_data_files d
           ON d.tablespace_name = t.tablespace_name
    WHERE  t.contents IN ('PERMANENT', 'UNDO')
    ORDER BY t.tablespace_name, d.file_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Geteilte Beispielausgabe: Gleiche Beispielzeile gehört in beiden Teilansichten zusammen. „Beispielzeile“ dient nur der Darstellung und ist keine zusätzliche SQL-Ergebnisspalte.

    Spalten 1–6
    BeispielzeileTABLESPACE_NAMECONTENTSTABLESPACE_STATUSBLOCK_SIZEBIGFILEFILE_ID
    1APP_DATAPERMANENTONLINE8192NO7
    2APP_DATAPERMANENTONLINE8192NO8
    3UNDOTBS1UNDOONLINE8192NO3
    Spalten 7–12
    BeispielzeileFILE_NAMEALLOCATED_MBAUTOEXTENSIBLEMAX_MBNEXT_INCREMENT_MBFILE_ONLINE_STATUS
    1/oradata/DEMODB/app_data01.dbf20480.0YES30720.01024.0ONLINE
    2/oradata/DEMODB/app_data02.dbf10240.0YES20480.01024.0ONLINE
    3/oradata/DEMODB/undotbs01.dbf4096.0NO0.00.0ONLINE

    Die Spalten im Detail

    Spalte oder SpaltengruppeAusführliche Bedeutung
    TABLESPACE_NAME / CONTENTSDer Name bezeichnet den logischen Container. CONTENTS unterscheidet PERMANENT für dauerhafte Objektsegmente und UNDO für alte Datenversionen. Zwei gleiche Tablespace-Namen in verschiedenen Zeilen bedeuten hier zwei Dateien desselben Tablespaces, nicht zwei verschiedene Tablespaces.
    TABLESPACE_STATUS / FILE_ONLINE_STATUS / BIGFILETABLESPACE_STATUS beschreibt den Tablespace. FILE_ONLINE_STATUS zeigt dagegen den Online-Zustand der einzelnen Datei. Ein ONLINE-Tablespace beweist nicht, dass alle Dateien und I/O-Prüfungen unauffällig sind. DBA_DATA_FILES.STATUS mit AVAILABLE/INVALID wäre wiederum eine andere Eigenschaft. BIGFILE = NO beschreibt einen Smallfile-Tablespace, der mehrere Datafiles haben kann.
    BLOCK_SIZE / FILE_ID / FILE_NAMEBLOCK_SIZE wird in Bytes angegeben. 8192 Bytes entsprechen 8 KB. FILE_ID ist die Dateinummer innerhalb der betrachteten Datenbank beziehungsweise des Containerkontexts; FILE_NAME zeigt den physischen Pfad. Die Größe einzelner Extents wird später aus dieser Blockgröße verständlich.
    ALLOCATED_MBDie aktuelle Dateigröße wird aus BYTES berechnet. 20.480 MB sind 20 GB bei der hier verwendeten Umrechnung mit 1024. Dieser Wert beantwortet „Wie groß ist die Datei?“, nicht „Wie viele Nutzdaten stehen darin?“. Die Datei enthält auch Verwaltungsbereiche und noch nicht zugeordnete Extents.
    AUTOEXTENSIBLE / MAX_MBYES erlaubt automatische Erweiterung. MAX_MB ist die konfigurierte Obergrenze der Datei. Bei NO kann die Datei ohne einen separaten administrativen Eingriff nicht automatisch wachsen; ein angezeigter Maximalwert ist dann kein automatisch nutzbarer Spielraum.
    NEXT_INCREMENT_MBOracle erweitert eine dafür konfigurierte Datei in Schritten. Im Beispiel ist ein Schritt 1.024 MB groß. Der Wert ergibt sich aus INCREMENT_BY × BLOCK_SIZE; INCREMENT_BY ist eine Blockanzahl und kein MB-Wert.

    Schritt für Schritt: vom Zahlenwert zur Aussage

    Beginne mit APP_DATA: Datei 7 ist 20 GB groß und darf bis 30 GB wachsen. Ihr konfigurierter zusätzlicher Spielraum beträgt 10 GB. Datei 8 ist 10 GB groß und darf bis 20 GB wachsen; auch dort ergeben sich 10 GB. Zusammen sind aktuell 30 GB Dateigröße und zusätzlich theoretisch 20 GB automatische Erweiterung konfiguriert.

    Dieser zusätzliche Spielraum ist noch kein freier Platz innerhalb der vorhandenen Dateien. Bereits vorhandene freie Extents liest du in Abschnitt 8 aus. Freier Platz auf dem Filesystem oder ASM ist wiederum eine dritte Größe. Wenn der zugrunde liegende Storage nur noch 3 GB frei hat, sind die konfigurierten 20 GB Wachstum praktisch nicht vollständig erreichbar.

    UNDOTBS1 ist im Beispiel eine separate Speicheraufgabe. Seine 4 GB gehören nicht zum APP_DATA-Tablespace. DBA_FREE_SPACE zeigt nicht den gesamten innerhalb von Undo-Segmenten wiederverwendbaren Platz. Für UNDO sind ACTIVE, UNEXPIRED und EXPIRED in DBA_UNDO_EXTENTS sowie laufende Transaktionen und die Aufbewahrungsanforderungen relevant; Details stehen im UNDO-Kapitel.

    Kleiner DBA-Praxisfall:

    Eine Meldung „APP_DATA fast voll“ ist zunächst ein Anlass zum Prüfen. Vergleiche aktuelle Dateigröße, freien Extent-Platz, aktiviertes Autoextend und physisch verfügbaren Storage. Dokumentiere erst dann, ob die vorhandene Kapazität knapp ist, ein Wachstumsschritt möglich wäre oder eine konfigurierte Obergrenze erreicht wird. Ein YES in AUTOEXTENSIBLE allein ist keine Entwarnung.

    Zusätzlicher Hinweis: Für die DBA_-Views sind entsprechende Dictionary-Leserechte erforderlich. In einer CDB muss die Abfrage im passenden Container ausgeführt werden.

    6. Tablespace-Typen und besondere Aufgaben

    Ein Tablespace beantwortet zunächst die Frage, wofür Speicher bereitsteht. Die Dateiorganisation beantwortet eine andere Frage: Wie viele Dateien gehören dazu? Prüfe deshalb CONTENTS und BIGFILE getrennt. Ein Name wie DATA oder TEMP ist eine Konvention, kein technischer Nachweis.

    Typ / NameAufgabeWichtige Grenze
    PERMANENTDauerhafte Segmente, beispielsweise Tabellen und Indizes.Benutzerdaten gehören in dafür geplante Anwendungs-Tablespaces.
    TEMPORARYTemporäre Arbeitsbereiche, etwa für Sortierungen, die nicht im Arbeitsspeicher bleiben.Tempfiles und aktuelle Nutzung separat untersuchen; die freie Extent-Sicht permanenter Dateien genügt nicht.
    UNDOÄltere Datenversionen und Informationen zum Zurücknehmen von Änderungen.Belegung nach ACTIVE, UNEXPIRED und EXPIRED bewerten; Vertiefung in Kapitel 23.
    SYSTEMZentrale Dictionary-Strukturen.Kein Übungsziel für OFFLINE, READ ONLY oder Löschen.
    SYSAUXSpeicher für verschiedene Oracle-Komponenten.Wachstum dem jeweiligen Komponentenbeleg zuordnen, etwa über V$SYSAUX_OCCUPANTS; keine unbekannten Objekte pauschal löschen.

    Bigfile und Smallfile: Was ist der Unterschied?

    Ein Tablespace ist ein logischer Speicherbereich. Seine Dateien stellen den physischen Speicher bereit. Bigfile und Smallfile beschreiben die Dateiorganisation dieses Tablespaces, nicht die Größe einer Tabelle oder die Anzahl der enthaltenen Objekte.

    Ein Bigfile-Tablespace besitzt genau eine Datendatei. Diese einzelne Datei kann wesentlich größer werden als eine Datei eines Smallfile-Tablespaces. Bei einem temporären Bigfile-Tablespace ist es entsprechend genau ein Tempfile. Die Datei muss beim Anlegen noch nicht groß sein: „Bigfile“ bezeichnet den Typ und die mögliche Dateigröße. In einem permanenten Anwendungs-Tablespace können trotzdem viele Tabellen und Indizes liegen.

    Ein Smallfile-Tablespace besitzt eine oder mehrere Datendateien; bei einem temporären Tablespace sind es Tempfiles. Jede einzelne Datei hat eine kleinere technische Größenobergrenze. Der gesamte Tablespace kann dennoch groß werden, weil sich seine Kapazität aus mehreren Dateien zusammensetzen kann. Ein Segment kann sich dabei über mehrere Dateien desselben Tablespaces erstrecken.

    MerkmalSmallfile-TablespaceBigfile-Tablespace
    DateianzahlEine oder mehrere Dateien.Genau eine Datei.
    Technische Größenordnung je Datei bei 8-KiB-BlöckenUngefähr 32 GiB.Ungefähr 32 TiB.
    ErweiterungEine vorhandene Datei vergrößern oder eine weitere Datei hinzufügen.Die einzige Datei vergrößern; keine zweite Datei hinzufügen.
    Automatisches WachstumAUTOEXTEND je Datei konfigurierbar.AUTOEXTEND für die einzige Datei konfigurierbar.
    Erkennung in DBA_TABLESPACESBIGFILE = NO.BIGFILE = YES.

    Die Größenangaben sind Näherungswerte für die technische Obergrenze, keine zugesicherte nutzbare Kapazität. Smallfile-Dateien adressieren ungefähr 222 Oracle-Blöcke, Bigfile-Dateien ungefähr 232. Daraus ergibt sich bei gleicher Blockgröße die deutlich höhere Grenze je Bigfile-Datei. Bei 32-KiB-Blöcken liegt diese Größenordnung für Bigfile bei 128 TiB. Betriebssystem- und Dateisystemgrenzen, die konfigurierte MAXSIZE und tatsächlich verfügbarer Speicher können das Wachstum früher begrenzen. Ein höheres MAXSIZE reserviert keinen Speicherplatz.

    Merksatz: Ein Smallfile-Tablespace mit nur einer Datei bleibt ein Smallfile-Tablespace. Eine kleine Datei kann zu einem Bigfile-Tablespace gehören. Entscheidend ist der beim Anlegen festgelegte Typ, nicht die aktuelle Größe oder die momentan vorhandene Dateianzahl.

    Was bedeutet das für die Administration?

    Bei Smallfile kann zusätzlicher Platz durch eine weitere Datendatei mit ALTER TABLESPACE … ADD DATAFILE bereitgestellt werden. Bei Bigfile ist dieser Weg ausgeschlossen. Stattdessen wird die bestehende Datei vergrößert, beispielsweise auf Tablespace-Ebene mit ALTER TABLESPACE … RESIZE, oder ihr automatisches Wachstum passend konfiguriert. Die Befehlswege werden im Administrationsabschnitt dieses Kapitels wieder aufgegriffen.

    Bigfile reduziert die Anzahl der zu verwaltenden Dateien und vereinfacht die Zuordnung: Ein Tablespace entspricht genau einer Datei. Das macht Bigfile nicht automatisch schneller oder für jede Umgebung geeigneter. Oracle sieht diesen Typ insbesondere für ASM oder geeignete Volume-Manager mit Striping beziehungsweise RAID und dynamisch erweiterbaren logischen Volumes vor. Eine einzige Oracle-Datei bedeutet dort nicht, dass sämtliche Daten auf nur einer physischen Festplatte liegen. Die Verteilung übernimmt die darunterliegende Speicherverwaltung.

    Für die Auswahl zählen daher das Speicher-, Erweiterungs- und Backup-Konzept. Oracle weist bei fehlendem Striping auf mögliche Nachteile für parallele Abfragen und die RMAN-Backup-Parallelisierung hin. Bigfile-Tablespaces benötigen lokale Extent-Verwaltung und grundsätzlich automatische Segment-Space-Verwaltung (ASSM); Oracle nennt Ausnahmen von der ASSM-Anforderung für lokal verwaltete Undo-Tablespaces, temporäre Tablespaces und SYSTEM. ASSM ist nicht dasselbe wie AUTOEXTEND.

    So liest du die folgende Abfrage: CONTENTS beschreibt den Zweck des Tablespaces. BIGFILE zeigt unabhängig davon seinen Dateityp: YES steht für Bigfile, NO für Smallfile. BLOCK_SIZE liefert die Oracle-Blockgröße in Bytes. Aus diesen Angaben lässt sich die Dateiorganisation einordnen; die aktuelle Dateigröße und die eingestellte Wachstumsgrenze liest du zusätzlich aus den passenden Datei-Views.

    SQL*Plus – lesende Kontrolle
    SELECT tablespace_name, contents, bigfile, block_size,
           status, extent_management, segment_space_management
    FROM dba_tablespaces
    ORDER BY tablespace_name;

    Was sehe ich hier? CONTENTS zeigt die Aufgabe, BIGFILE die Dateiorganisation und STATUS die Verfügbarkeit des Tablespaces. LOCAL beschreibt die Extent-Verwaltung; AUTO bei SEGMENT_SPACE_MANAGEMENT beschreibt ASSM innerhalb von Segmenten. Beides ist unabhängig von AUTOEXTEND. Die Abfrage läuft mit Dictionary-Leserechten in der betroffenen PDB; gleiche Tablespace-Namen in anderen PDBs sind andere Speicherbereiche.

    7. Die größten Segmente finden

    Was beantwortet diese Abfrage?

    Welche Segmente belegen derzeit am meisten zugeordneten Speicher? Die Abfrage liefert höchstens 20 Ergebniszeilen.

    READ ONLY – Allokierter Segmentplatz
    SELECT owner, segment_name, partition_name,
           segment_type, tablespace_name,
           ROUND(bytes / 1024 / 1024, 1) AS allocated_mb,
           blocks, extents
    FROM   dba_segments
    ORDER BY bytes DESC, owner, segment_name, partition_name, segment_type
    FETCH FIRST 20 ROWS ONLY;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    OWNERSEGMENT_NAMEPARTITION_NAMESEGMENT_TYPETABLESPACE_NAMEALLOCATED_MBBLOCKSEXTENTS
    APP_USERORDERSNULLTABLEAPP_DATA1024.0131072128
    APP_USERORDER_ITEMSNULLTABLEAPP_DATA512.06553664
    APP_USERORDERS_PKNULLINDEXAPP_DATA128.01638416

    Die Spalten im Detail

    Spalte oder SpaltengruppeAusführliche Bedeutung
    OWNER / SEGMENT_NAMEOWNER bezeichnet das Schema, dem die Speicherstruktur gehört. SEGMENT_NAME ist der Name des Segments. Das Schema APP_USER enthält hier unter anderem die Tabelle ORDERS und den Index ORDERS_PK. Ein Segmentname allein ist ohne Owner nicht immer eindeutig.
    PARTITION_NAMEBei nicht partitionierten Segmenten ist dieser Wert NULL. Im Beispiel wird NULL sichtbar ausgeschrieben, damit keine unklare leere Zelle entsteht. Bei partitionierten Tabellen oder Indizes können einzelne Partitionen eigene Segmente mit eigenen Größen besitzen.
    SEGMENT_TYPE / TABLESPACE_NAMETABLE bezeichnet ein Tabellensegment und INDEX ein Indexsegment. Auch LOBSEGMENT, LOBINDEX oder TABLE PARTITION sind mögliche Typen. TABLESPACE_NAME ordnet den allokierten Platz dem logischen Container zu.
    ALLOCATED_MBDieser Wert ist der dem Segment zugeordnete Platz. Er umfasst Verwaltungsinformationen und möglicherweise intern wiederverwendbaren freien Platz. Er ist weder eine Zeilenzahl noch eine exakte Größe des fachlichen Inhalts.
    BLOCKS / EXTENTSBLOCKS zählt die allokierten Oracle-Blöcke; EXTENTS zählt die zugeordneten Extents. Ein Extent besteht aus mehreren Blöcken. Unterschiedliche Extents können unterschiedlich groß sein; die gleichmäßigen 8-MB-Extents sind eine bewusste Vereinfachung dieses Beispiels.

    Schritt für Schritt: vom Zahlenwert zur Aussage

    Die Abfrage sortiert absteigend nach BYTES. ORDERS steht in diesem Beispiel oben, weil 1.024 MB mehr sind als die 512 MB von ORDER_ITEMS und die 128 MB des Index ORDERS_PK. Die drei gezeigten Zeilen summieren sich auf 1.664 MB. Das ist nur ein gekürzter Ausschnitt und nicht die Gesamtbelegung von APP_DATA.

    Prüfe die Einheiten: 131.072 Blöcke × 8.192 Bytes ergeben 1.073.741.824 Bytes. Durch dreimaliges Teilen durch 1024 erhältst du 1 GB. Für dieses Segment ergeben 128 Extents mit jeweils 8 MB ebenfalls 1.024 MB.

    Ein großer Index ist nicht automatisch unnötig und eine große Tabelle nicht automatisch problematisch. Entscheidend sind Zweck, Wachstum und die tatsächlich beobachtete Situation. Falls viele Zeilen entfernt wurden, kann das Segment weiterhin gleich groß bleiben, weil seine Extents noch zugeordnet sind und später intern wiederverwendet werden können.

    Kleiner DBA-Praxisfall:

    APP_DATA wächst von Woche zu Woche. Speichere vergleichbare Messpunkte für die größten Segmente und prüfe, welche davon zunehmen. Ein einzelner Top-20-Ausschnitt zeigt lediglich den aktuellen Größenrang. Erst der Vergleich über die Zeit belegt Wachstum; daraus allein folgt noch keine automatische Reorganisation oder Löschung.

    Zusätzlicher Hinweis: Die Größenrangliste umfasst nur tatsächlich vorhandene Segmente. Editionsübergreifender Hinweis: Mit Deferred Segment Creation kann eine Tabelle vor ihrer ersten Speicherzuordnung ohne Zeile in DBA_SEGMENTS existieren. Diese Funktion gehört laut Oracle-19c-Funktionsmatrix nicht zu SE2. In SE2 ist eine fehlende Zeile deshalb nicht pauschal damit zu erklären; Name, Container, Objekttyp und Sichtbarkeit prüfen.

    8. Segment, Extent und Datafile verbinden

    Was beantwortet diese Abfrage?

    In welchen Datafiles liegen die Extents des ausgewählten nicht partitionierten Tabellensegments? Die Abfrage verbindet die logische Speicherstruktur mit den Dateipfaden.

    READ ONLY – Extent-Verteilung eines Segments
    SELECT e.owner, e.segment_name, e.partition_name,
           e.segment_type, e.extent_id, e.file_id, d.file_name,
           e.block_id, e.blocks,
           ROUND(e.bytes / 1024 / 1024, 2) AS extent_mb
    FROM   dba_extents e
    JOIN   dba_data_files d ON d.file_id = e.file_id
    WHERE  e.owner = UPPER('&OWNER')
    AND    e.segment_name = UPPER('&SEGMENT_NAME')
    AND    e.segment_type = 'TABLE'
    ORDER BY e.partition_name, e.segment_type, e.extent_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Geteilte Beispielausgabe: Gleiche Beispielzeile gehört in beiden Teilansichten zusammen. „Beispielzeile“ dient nur der Darstellung und ist keine zusätzliche SQL-Ergebnisspalte.

    Spalten 1–6
    BeispielzeileOWNERSEGMENT_NAMEPARTITION_NAMESEGMENT_TYPEEXTENT_IDFILE_ID
    1APP_USERORDERSNULLTABLE07
    2APP_USERORDERSNULLTABLE17
    3APP_USERORDERSNULLTABLE28
    Spalten 7–10
    BeispielzeileFILE_NAMEBLOCK_IDBLOCKSEXTENT_MB
    1/oradata/DEMODB/app_data01.dbf12810248.00
    2/oradata/DEMODB/app_data01.dbf115210248.00
    3/oradata/DEMODB/app_data02.dbf12810248.00

    Die Spalten im Detail

    Spalte oder SpaltengruppeAusführliche Bedeutung
    OWNER / SEGMENT_NAME / PARTITION_NAMEDiese Spalten sagen, zu welcher Speicherstruktur das Extent gehört. Bei partitionierten Objekten ist die Partition mitzulesen, weil verschiedene Partitionen eigenständige Segmente darstellen können. NULL bedeutet im dargestellten Beispiel ein nicht partitioniertes Segment.
    EXTENT_IDDas ist die laufende Extentnummer innerhalb des jeweiligen Segments. Die Zählung beginnt bei 0. EXTENT_ID = 2 ist somit das dritte Extent, keine Dateinummer und keine Blockadresse.
    FILE_ID / FILE_NAMEDiese Spalten geben an, in welchem Datafile das Extent liegt. Der Join verwendet FILE_ID, um den Dateipfad aus DBA_DATA_FILES hinzuzunehmen. Die Sicht gilt im jeweils ausgewählten Datenbank- beziehungsweise Containerkontext.
    BLOCK_IDBLOCK_ID ist der Startblock des Extents innerhalb seiner Datei. Eine Blocknummer ohne Dateinummer ist keine eindeutige physische Zuordnung. Deshalb dürfen verschiedene Dateien denselben BLOCK_ID-Wert besitzen.
    BLOCKS / EXTENT_MBBLOCKS ist die Anzahl der Oracle-Blöcke in diesem einzelnen Extent. Bei 8-KB-Blöcken ergeben 1.024 Blöcke genau 8 MB. EXTENT_MB beschreibt hier eine einzelne Speicherzuordnung, nicht die Größe des gesamten Segments.

    Schritt für Schritt: vom Zahlenwert zur Aussage

    Die erste Zeile ist Extent 0 in Datei 7. Es beginnt bei Block 128 und enthält 1.024 Blöcke. Sein Blockbereich reicht damit von 128 bis 1151: Startblock + Blockanzahl − 1. Die zweite Zeile beginnt bei Block 1152 derselben Datei und liegt im vereinfachten Beispiel direkt dahinter.

    Die dritte Zeile zeigt Extent 2 in Datei 8, ebenfalls ab Block 128. Das ist keine Überschneidung mit Datei 7: Die Datei ist eine andere. Das Beispiel macht sichtbar, wie ein Segment mehrere Datafiles nutzen kann, während jedes einzelne Extent vollständig innerhalb einer Datei bleibt.

    Die drei sichtbaren Extents ergeben 24 MB. Das widerspricht nicht der Segmentgröße von 1 GB aus Abschnitt 6, denn die Darstellung zeigt nur die ersten drei von 128 Extents. Die vollständige Abfrage kann entsprechend viele weitere Zeilen liefern. EXTENT_ID beschreibt die logische Reihenfolge und garantiert keine lückenlose physische Anordnung.

    Kleiner DBA-Praxisfall:

    Du möchtest verstehen, warum das Segment ORDERS trotz eines einzelnen Tabellennamens zwei Dateien verwendet. Lies FILE_ID je Extent und gruppiere die Beobachtung nach Dateien. Das belegt die Verteilung der Speicherzuordnung. Es belegt nicht, dass die I/O-Last gleichmäßig verteilt ist oder welche Datei gerade langsam ist; dafür wären zusätzliche, zeitbezogene I/O-Messwerte erforderlich.

    Zusätzlicher Hinweis: SQL*Plus fragt OWNER und SEGMENT_NAME ab. Die UPPER-Umwandlung eignet sich für gewöhnliche Objektnamen; mit Anführungszeichen angelegte Namen mit abweichender Groß-/Kleinschreibung benötigen eine angepasste Eingabe. Der Filter SEGMENT_TYPE=TABLE wählt hier gezielt das nicht partitionierte Tabellensegment. Für andere Segmenttypen muss er bewusst angepasst werden; Owner und Name allein unterscheiden nicht jede Speicherstruktur. Offline-Zustände können die Sichtbarkeit beeinflussen.

    9. Freie Extents untersuchen

    Was beantwortet diese Abfrage?

    Wie viel freier Extent-Platz liegt innerhalb der vorhandenen Datafiles, und wie groß ist der jeweils größte freie Bereich?

    READ ONLY – Freier logischer Tablespace-Platz
    SELECT tablespace_name, file_id,
           COUNT(*) AS free_extents,
           ROUND(SUM(bytes) / 1024 / 1024, 1) AS free_mb,
           ROUND(MAX(bytes) / 1024 / 1024, 1) AS largest_free_extent_mb
    FROM   dba_free_space
    GROUP BY tablespace_name, file_id
    ORDER BY tablespace_name, file_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    TABLESPACE_NAMEFILE_IDFREE_EXTENTSFREE_MBLARGEST_FREE_EXTENT_MB
    APP_DATA7104096.01024.0
    APP_DATA852048.01024.0
    UNDOTBS134512.0256.0

    Die Spalten im Detail

    Spalte oder SpaltengruppeAusführliche Bedeutung
    TABLESPACE_NAME / FILE_IDDie Abfrage gruppiert freie Extents je Tablespace und Datafile. Dadurch lässt sich der freie logische Platz den Dateien aus Abschnitt 5 zuordnen. Jede Zeile ist eine Zusammenfassung und keine Liste einzelner freier Extents.
    FREE_EXTENTSCOUNT(*) zählt die freien Extent-Bereiche, die DBA_FREE_SPACE für diese Datei liefert. Zehn Bereiche können sehr unterschiedliche Größen haben. Die Anzahl allein misst weder den freien Platz noch beweist sie ein Performanceproblem.
    FREE_MBSUM(BYTES) addiert die Größen aller hier sichtbaren freien Extents. Das ist Platz innerhalb der aktuellen Datei, der noch keinem Segment zugeordnet ist. Bereits allokierter, aber innerhalb eines Segments freier Platz wird nicht mitgezählt.
    LARGEST_FREE_EXTENT_MBMAX(BYTES) beschreibt den größten einzelnen freien Bereich. Dieser Wert ist neben der Summe hilfreich, um die räumliche Verteilung einzuordnen. Mehrere kleinere Bereiche werden für ein einzelnes Extent nicht einfach über Dateigrenzen hinweg zusammengefügt.

    Schritt für Schritt: vom Zahlenwert zur Aussage

    Ordne Datei 7 aus APP_DATA wieder zu: Sie ist aktuell 20.480 MB groß, und die freie-Extent-Abfrage zeigt 4.096 MB freien Platz. Für Datei 8 stehen 2.048 MB frei. Die Summe ist 6.144 MB. Bezogen auf 30.720 MB aktuelle Dateigröße ergibt 6.144 ÷ 30.720 × 100 eine illustrative freie Quote von 20 %.

    Die restlichen ungefähr 80 % sind nicht automatisch fachliche Nutzdaten. Dateiverwaltungsbereiche und allokierter Segmentplatz müssen korrekt eingeordnet werden; innerhalb von Segmenten kann ebenfalls ungenutzter Platz existieren. Für einen exakten Kapazitätsreport ist eine konsistente Berechnung mit allen relevanten Dateien und Zuständen erforderlich.

    In Datei 7 verteilen sich 4 GB freie Extents auf zehn Bereiche; der größte einzelne Bereich ist 1 GB. Die Summe allein sagt somit nichts über die Größe jedes einzelnen Bereichs. Umgekehrt ist die Zahl zehn kein Beleg für schädliche Fragmentierung. Bewertet werden muss die tatsächlich benötigte Speicherzuordnung.

    Fehlt eine erwartete Datei in der Ausgabe, prüfe zuerst den Kontext und ihren Zustand. Wenn keine freien Extents vorhanden sind, kann DBA_FREE_SPACE für diese Datei keine Zeile liefern. Eine fehlende Zeile wird deshalb nicht pauschal als unbekannter Wert oder als defekte Datei interpretiert.

    Kleiner DBA-Praxisfall:

    Eine Datei zeigt 0 beziehungsweise keine freien Extents, die zweite Datei desselben Tablespaces aber noch freien Platz. Beurteile deshalb den Tablespace mit allen seinen Dateien. Prüfe zusätzlich, ob eine benötigte neue Extent-Zuordnung in eine passende Datei passt und ob Autoextend überhaupt möglich ist. Der separate freie Filesystemplatz darf nicht als bereits vorhandener freier Tablespace-Platz ausgegeben werden.

    Zusätzlicher Hinweis: Bei Offline-Dateien kann die Sicht unvollständig sein. Vor einem Kapazitätsvergleich müssen deshalb Dateistatus und Containerkontext passen.

    10. TEMP separat betrachten

    Was beantwortet diese Abfrage?

    Welche Tempfiles gehören zu TEMP, wie groß sind sie und welche automatische Erweiterung ist konfiguriert?

    READ ONLY – Temporäre Dateien
    SELECT tablespace_name, file_id, file_name,
           ROUND(bytes / 1024 / 1024, 1) AS allocated_mb,
           autoextensible,
           ROUND(maxbytes / 1024 / 1024, 1) AS max_mb
    FROM   dba_temp_files
    ORDER BY tablespace_name, file_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    TABLESPACE_NAMEFILE_IDFILE_NAMEALLOCATED_MBAUTOEXTENSIBLEMAX_MB
    TEMP1/oradata/DEMODB/temp01.dbf8192.0YES16384.0
    TEMP2/oradata/DEMODB/temp02.dbf4096.0NO0.0

    Die Spalten im Detail

    Spalte oder SpaltengruppeAusführliche Bedeutung
    TABLESPACE_NAME / FILE_ID / FILE_NAMEDiese Spalten beschreiben die Dateien eines temporären Tablespaces. Die Daten stammen aus DBA_TEMP_FILES, nicht aus DBA_DATA_FILES. Ein gleichlautender FILE_ID-Wert in beiden Sichten ist kein ausreichender Grund für eine Verknüpfung.
    ALLOCATED_MBDie aktuelle Größe des Tempfiles wird in MB dargestellt. Sie ist die verfügbare Dateikapazität auf dieser Ebene, nicht die aktuell von einer Session benutzte Menge. Eine 8-GB-Datei kann im betrachteten Moment nur wenig aktive TEMP-Nutzung haben.
    AUTOEXTENSIBLE / MAX_MBDiese Werte erklären die konfigurierte automatische Wachstumsgrenze. Bei YES kann die Datei bis zu dieser Grenze wachsen, sofern der physische Storage und die sonstigen Bedingungen es zulassen. Bei NO erfolgt keine automatische Erweiterung.

    Schritt für Schritt: vom Zahlenwert zur Aussage

    Datei 1 ist 8.192 MB, also 8 GB groß. Ihr konfigurierter Maximalwert liegt bei 16.384 MB, also 16 GB. Somit beträgt ihr theoretischer zusätzlicher Wachstumsspielraum 8 GB. Datei 2 ist 4 GB groß und hat Autoextend deaktiviert; ihre aktuelle Größe zählt zur verfügbaren Kapazität, auch wenn MAX_MB hier 0 ist.

    Zusammen ergeben die beiden Dateien aktuell 12 GB. Die mögliche konfigurierte Größe beträgt 16 GB für Datei 1 plus die unveränderten 4 GB für Datei 2, also 20 GB. Eine bloße Summe von MAX_MB wäre hier irreführend, weil die zweite Datei ohne Autoextend dennoch 4 GB Kapazität besitzt.

    TEMP kann gebraucht werden, wenn bestimmte Sortierungen oder Hash-Operationen nicht vollständig in ihren Speicherarbeitsbereichen abgewickelt werden. Eine große TEMP-Datei beweist aber weder aktuell hohe Nutzung noch zu wenig PGA. Für diese Aussage fehlen Angaben zu aktiven Operationen, Sessions und Arbeitsbereichen.

    Aktuelle TEMP-Zuordnungen und Benutzerkontext können mit V$TEMPSEG_USAGE untersucht werden; DBA_TEMP_FREE_SPACE hilft bei der Kapazitätseinordnung. Werte sollten zeitnah zueinander erhoben werden, weil TEMP-Nutzung mit laufenden SQL-Operationen rasch wechseln kann. Das Ende einer Operation muss nicht die physische Datei verkleinern.

    Kleiner DBA-Praxisfall:

    Ein Bericht meldet hohen TEMP-Verbrauch. Lies zuerst die Dateistruktur, danach die zeitnah gemessene aktuelle Belegung und die beteiligten Sessions beziehungsweise SQL-Operationen. Eine Datei von 12 GB sagt für sich allein nicht, ob eine einzelne Abfrage 10 GB benötigt oder viele Abfragen jeweils kleine Mengen verwenden. Erst diese Zuordnung erlaubt eine belastbare Ursachenanalyse.

    Zusätzlicher Hinweis: Eine Kapazitätsaussage gilt immer für den Messzeitpunkt. Bei wechselnder Last müssen Dateigröße, aktive Nutzung und Sessioninformationen zeitnah zusammen erhoben werden.
    TEMP-Kapazität und wiederverwendbaren Platz read-only prüfen

    Was sehe ich hier? Die nächste Abfrage ergänzt die Dateisicht um die Kapazität auf Tablespace-Ebene. SHARED und INST_ID halten den von der View gelieferten Geltungsbereich sichtbar.

    READ ONLY – TEMP-Platz zum Messzeitpunkt
    SELECT tablespace_name, shared, inst_id,
           ROUND(tablespace_size / POWER(1024,3), 2) AS size_gib,
           ROUND(allocated_space / POWER(1024,3), 2) AS allocated_gib,
           ROUND(free_space / POWER(1024,3), 2) AS free_gib,
           ROUND((tablespace_size - free_space) / POWER(1024,3), 2)
             AS used_gib
    FROM dba_temp_free_space
    ORDER BY tablespace_name, inst_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    TABLESPACE_NAMESHAREDINST_IDSIZE_GIBALLOCATED_GIBFREE_GIBUSED_GIB
    TEMPSHARED1121093

    Von 12 GiB sind hier 9 GiB frei beziehungsweise wiederverwendbar; die Differenz beträgt 3 GiB. ALLOCATED_GIB=10 umfasst sowohl benutzten als auch bereits zugeteilten, wiederverwendbaren Platz. ALLOCATED_GIB und FREE_GIB überlappen deshalb und dürfen nicht addiert werden. Die 10 GiB sind nicht gleichbedeutend mit 10 GiB aktiver Sessionnutzung. Für die Verursacher folgen zeitnahe V$TEMPSEG_USAGE- und Sessioninformationen; diese Kapazitätsabfrage identifiziert keine einzelne SQL-Anweisung. Aus Größe und Belegung allein folgt keine PGA-Erhöhung.

    Vertiefung: LOBs – warum eine kleine Tabelle viel Speicher benötigen kann

    Eine Dokumententabelle enthält häufig nur wenige kurze Angaben wie Dokumentnummer und Erfassungsdatum sowie den eigentlichen Inhalt. Dieser Inhalt kann sehr viel größer sein als die übrigen Spalten zusammen. Oracle bietet dafür Large Objects, kurz LOBs. Ein Blick auf das Tabellensegment allein kann den zugeordneten Speicher daher deutlich unterschätzen. Für die Diagnose werden Spalten, LOB-Segmente und Indexsegmente zusammen betrachtet. Die folgenden Schritte zeigen diese Zuordnung, ohne Dokumentinhalte auszulesen.

    Lernumgebung: APP_DEMO.DOKUMENTE ist eine erfundene, nicht partitionierte gewöhnliche Heap-Tabelle mit der BLOB-Spalte INHALT und einem normalen Index. Die Namen sind an die eigene Umgebung anzupassen. Benötigt werden Leserechte auf die genannten DBA_- und V$-Views. In einer Multitenant-Datenbank wird im passenden PDB-Kontext gearbeitet. Fehlende Rechte sind kein Beleg dafür, dass keine LOBs existieren.

    1. BLOB, CLOB und NCLOB unterscheiden

    TypInhaltLernbeispiel
    BLOBBinäre Daten ohne automatische Zeichensatzumwandlung.Ein PDF-Dokument.
    CLOBZeichendaten im Datenbankzeichensatz.Ein langer Berichtstext.
    NCLOBZeichendaten im nationalen Zeichensatz.Text mit entsprechendem Zeichensatzbedarf.

    NCLOB bedeutet nicht automatisch „besserer CLOB“. Die Anwendung muss den Datentyp und die Zeichensatzverarbeitung unterstützen. Ein BFILE verweist dagegen auf eine externe Datei; deren Inhalt liegt außerhalb der Datenbankdateien. Er wird durch eine reine Segmentgrößenabfrage nicht mitgezählt. Zeichensätze werden in Kapitel 28 ausführlich erklärt.

    2. Datentyp und Speicherverfahren sind zwei verschiedene Fragen

    BLOB oder CLOB beschreibt die Art des Inhalts. BasicFiles und SecureFiles beschreiben dagegen die LOB-Speicherung. SecureFiles setzt einen Tablespace mit Automatic Segment Space Management, kurz ASSM, voraus. Beide Speicherverfahren können in einer Datenbank vorkommen. Der Name SecureFiles beweist insbesondere nicht, dass ein Inhalt verschlüsselt ist.

    Je nach Speicherdefinition und Größe kann ein LOB-Inhalt innerhalb der Tabellenzeile oder außerhalb in einem LOB-Segment liegen. Ein Locator ist eine Referenz für den Zugriff auf den LOB; er ist nicht der vollständige Dokumentinhalt. Deshalb darfst du aus der Zahl der Tabellenzeilen weder die LOB-Datenmenge noch deren Platzbedarf ableiten.

    Oracle 19c SE2: Die normale SecureFiles-Speicherung ist von Zusatzfunktionen zu unterscheiden. Advanced LOB Compression und Advanced LOB Deduplication gehören zur Advanced Compression Option, die für SE2 nicht verfügbar ist. Sie werden hier nicht als mögliche SE2-Platzoptimierung empfohlen.

    3. Die LOB-Spalte ihrem Segment zuordnen

    Was sehe ich hier? Die Abfrage zeigt die LOB-Spalten der Beispiel-Tabelle, deren Segmentnamen und das Speicherverfahren. SECUREFILE ist eine Eigenschaft der jeweiligen LOB-Spalte; ein automatisch erzeugter Segmentname allein ist keine ausreichende fachliche Zuordnung.

    READ ONLY – LOB-Zuordnung
    SELECT column_name, segment_name, tablespace_name, securefile
    FROM dba_lobs
    WHERE owner = 'APP_DEMO'
      AND table_name = 'DOKUMENTE'
    ORDER BY column_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    COLUMN_NAMESEGMENT_NAMETABLESPACE_NAMESECUREFILE
    INHALTDOKUMENTE_INHALT_LOBAPP_LOBYES

    Die Spalte INHALT gehört hier zum SecureFiles-LOB DOKUMENTE_INHALT_LOB im Tablespace APP_LOB. Das Dictionary beschreibt die Zuordnung; die zugewiesenen Bytes werden anschließend aus DBA_SEGMENTS gelesen. Der zugehörige interne LOB-Index ist über DBA_LOBS.INDEX_NAME auffindbar. Er ist nicht mit einem selbst angelegten fachlichen Suchindex gleichzusetzen.

    4. Tabellen-, Index- und LOB-Segmente gemeinsam auswerten

    Was sehe ich hier? Die nächste Abfrage sammelt die Segmentnamen der Beispiel-Tabelle und ihrer Indizes sowie der LOB-Segmente und LOB-Indizes. Die Zuordnung verwendet Eigentümer, Namen und Segmenttyp. Tabellen und Indizes dürfen im selben Schema gleich heißen; der Typ verhindert daher die Zuordnung eines nur zufällig gleichnamigen fremden Segments. UNION entfernt doppelte Zuordnungen derselben Kombination. Gewöhnliche B-Tree-Indizes werden aus DBA_INDEXES, interne LOB-Indizes separat aus DBA_LOBS ermittelt. Die Ausgabe fasst nach Segmenttyp zusammen. MiB bedeutet hier Bytes geteilt durch 1024².

    READ ONLY – Zugewiesener Speicher der einfachen Beispiel-Tabelle
    WITH segmentnamen AS (
      SELECT owner, table_name AS segment_name, 'TABLE' AS segment_type
      FROM dba_tables
      WHERE owner = 'APP_DEMO' AND table_name = 'DOKUMENTE'
      UNION
      SELECT owner, index_name, 'INDEX'
      FROM dba_indexes
      WHERE table_owner = 'APP_DEMO' AND table_name = 'DOKUMENTE'
        AND index_type IN ('NORMAL', 'NORMAL/REV', 'FUNCTION-BASED NORMAL',
                           'FUNCTION-BASED NORMAL/REV')
      UNION
      SELECT owner, segment_name, 'LOBSEGMENT'
      FROM dba_lobs
      WHERE owner = 'APP_DEMO' AND table_name = 'DOKUMENTE'
      UNION
      SELECT owner, index_name, 'LOBINDEX'
      FROM dba_lobs
      WHERE owner = 'APP_DEMO' AND table_name = 'DOKUMENTE'
    )
    SELECT s.segment_type,
           ROUND(SUM(s.bytes) / POWER(1024, 2), 2) AS zugewiesen_mib
    FROM dba_segments s
    JOIN segmentnamen n
      ON n.owner = s.owner AND n.segment_name = s.segment_name
     AND n.segment_type = s.segment_type
    WHERE s.partition_name IS NULL
    GROUP BY s.segment_type
    ORDER BY s.segment_type;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    SEGMENT_TYPEZUGEWIESEN_MIB
    INDEX16
    LOBINDEX1
    LOBSEGMENT2048
    TABLE64

    Zusammen sind das 2129 MiB. Wer nur TABLE betrachtet, sieht dagegen 64 MiB. Der LOB-Speicher ist damit der größte zugeordnete Anteil und ein sinnvoller erster Prüfpunkt. Erst vergleichbare Messungen über die Zeit belegen, welcher Anteil tatsächlich wächst. Die Ausgabe beweist allerdings noch nicht, dass alle 2048 MiB des LOB-Segments mit aktuellen Nutzdaten gefüllt sind.

    Geltungsbereich: Diese Abfrage ist für die beschriebene nicht partitionierte Heap-Tabelle mit normalen Indizes bestimmt. Sie ist keine vollständige Größenberechnung für partitionierte Tabellen, IOTs, Cluster, Nested Tables oder Zusatzsegmente spezieller Indextypen. Partitionen werden ausdrücklich ausgeschlossen. Keine Ergebniszeile bedeutet nicht automatisch „0 Bytes Nutzdaten“; Name, Container und vorhandene Segmente sind zu prüfen.

    5. Zugewiesener Platz ist nicht gleich Dokumentgröße

    DBA_SEGMENTS.BYTES misst zugewiesenen Segmentspeicher. Darin können Verwaltungsdaten, freie Bereiche und bei LOBs noch benötigte ältere Versionen enthalten sein. Nach einem DELETE werden die Dateien deshalb nicht automatisch entsprechend kleiner. Frei gewordener Platz innerhalb eines Segments, freie Extents im Tablespace und freier Platz im Dateisystem sind unterschiedliche Ebenen. Eine Platzrückgabe ist eine separate Betriebsmaßnahme, keine Folge dieser Diagnose.

    Auch die logische Länge ist gesondert zu betrachten: Bei einem BLOB wird sie in Bytes gemessen, bei CLOB und NCLOB in Zeichen. Eine Zeichenanzahl darf nicht als physischer Byteverbrauch ausgegeben werden. Eine vollständige Längenanalyse über viele Dokumente kann zudem Aufwand verursachen; für den ersten Überblick reichen hier die Metadaten. Die Anwendung entscheidet, welche fachlichen Dokumente noch benötigt werden.

    6. Temporäre LOBs und TEMP-Verbrauch einordnen

    Bei der Verarbeitung können LOBs als vorübergehende Arbeitswerte entstehen, beispielsweise beim Aufbau eines langen Textes. Sie gehören nicht wie die gespeicherten Dokumente dauerhaft zur Beispiel-Tabelle. Für ihre Untersuchung bietet Oracle V$TEMPORARY_LOBS. Diese View zählt LOBs; sie misst nicht deren Speichergröße.

    READ ONLY – Temporäre LOBs im aktuellen Container
    SELECT sid, cache_lobs, nocache_lobs, abstract_lobs
    FROM v$temporary_lobs
    WHERE NVL(cache_lobs, 0) + NVL(nocache_lobs, 0)
        + NVL(abstract_lobs, 0) > 0
    ORDER BY sid;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    SIDCACHE_LOBSNOCACHE_LOBSABSTRACT_LOBS
    142310

    Hier werden drei gecachte und ein nicht gecachter temporärer LOB gemeldet; die vier Objekte sind keine vier Megabyte. ABSTRACT_LOBS ist eine weitere von Oracle ausgewiesene Kategorie. Ein einzelner hoher Zähler beweist weder ein Speicherleck noch eine volle TEMP-Datei. Die SID muss zeitnah einer Session mit ihrer SERIAL# zugeordnet werden. Verlauf, Anwendungsvorgang und die vorhandene TEMP-Diagnose in diesem Kapitel gehören zur weiteren Untersuchung. In einer CDB-weiten Betrachtung ist zusätzlich CON_ID nötig; unser Beispiel setzt den passenden Container voraus.

    7. Praxisfall: Speicherwachstum trotz unveränderter Zeilenzahl

    Angenommen, die Zahl der Dokumentdatensätze bleibt über eine Woche ungefähr gleich, der Tablespace wächst aber. Einige Dokumente könnten durch größere Fassungen ersetzt worden sein. Ebenso müssen ältere Versionen und bereits zugewiesene Reserven eingeordnet werden. Vergleiche deshalb dieselben zugehörigen Segmente zu dokumentierten Zeitpunkten und kläre die Anwendungsabläufe. Aus einer konstanten Zeilenzahl folgt kein konstanter Speicherbedarf.

    Belastbarer erster Befund: „Für DOKUMENTE sind in dieser Messung insgesamt 2129 MiB in den erfassten Segmenten zugewiesen; davon 2048 MiB als LOBSEGMENT.“ Eine Aussage über löschbare Dokumente oder rückgewinnbaren Speicher lässt sich daraus noch nicht ableiten.

    Oracle 19c: LOB-Grundlagen; LOB-Speicherung; LOB-Verwaltung; DBA_LOBS / ALL_LOBS; DBA_SEGMENTS; V$TEMPORARY_LOBS; Editionsabhängige Funktionen.

    11. Kapazität planen: fünf Grenzen getrennt prüfen

    GrenzeFrage vor einer Erweiterung
    Aktuelle DateigrößeWie viele Bytes sind den Dateien bereits zugewiesen?
    Freie ExtentsWelche Bereiche stehen innerhalb der vorhandenen Online-Dateien für neue Extents bereit?
    Autoextend / MAXSIZEWelche Datei darf um welchen Schritt bis zu welcher Grenze wachsen?
    Physischer SpeicherReicht der tatsächlich verfügbare Platz am richtigen Ziel, auch unter konkurrierender Last?
    BenutzerquotaDarf der Objekt-Owner überhaupt weiteren Segmentplatz belegen?

    Die vorhandene geführte Kapazitätsübung am Kapitelende verbindet diese Zahlen. Ergänze jede Messung um Zeitpunkt, Container und Wachstum pro Zeitintervall. Eine Prognose aus wenigen ruhigen Stunden muss einen großen Import nicht abbilden. MAXSIZE ist kein reservierter Storage. MAXSIZE UNLIMITED hebt technische Dateigrenzen und physische Kapazitätsgrenzen nicht auf. Bei mehreren Dateien ist die Erweiterung je Datei zu prüfen.

    INCREMENT_BY in DBA_DATA_FILES ist eine Anzahl von Blöcken. Für MiB multiplizierst du mit BLOCK_SIZE des zugehörigen Tablespaces und teilst durch 1024². Nicht mit einer pauschal angenommenen Blockgröße rechnen. Fehlende freie Extents dürfen nur bei passendem Online-Zustand als null gewertet werden. DBA_DATA_FILES.STATUS und ONLINE_STATUS beantworten unterschiedliche Fragen.

    12. Anlegen und Erweitern: den passenden Verwaltungsweg wählen

    Plane zuerst Zweck, PDB, Dateiablage, Startgröße, Wachstumsschritt und Obergrenze. OMF benötigt ein wirksames DB_CREATE_FILE_DEST. Ohne OMF sind eindeutige vollständige Dateipfade und passende OS-Rechte nötig. Das ausführbare Labor am Kapitelende verwendet neue kleine OMF-Tablespaces. Alle Administrationsbeispiele sind Lerntext; der Wiki-Generator führt sie nicht aus.

    ZielGeeigneter WegVorher klären
    Neuen permanenten Speicher bereitstellenCREATE TABLESPACECREATE TABLESPACE-Privileg, Container, Name, Dateiziel und Kapazität.
    Vorhandene Smallfile-Datei vergrößernALTER DATABASE DATAFILE … RESIZEALTER DATABASE-Privileg; exakter Dateiname und gewünschte absolute Zielgröße.
    Smallfile um eine Datei erweiternALTER TABLESPACE … ADD DATAFILEALTER TABLESPACE-Privileg; Dateizahl, OMF oder neuer eindeutiger Pfad.
    Bigfile vergrößernALTER TABLESPACE … RESIZEDie einzelne Datei vergrößern; kein ADD DATAFILE.
    Temporären Speicher erweiternTempfile vergrößern oder bei Smallfile ADD TEMPFILETemporären Verbrauch und gleichzeitige Arbeitsspitzen verstehen.

    Nach der Änderung dieselbe Dateiabfrage wiederholen. Prüfe Anzahl, Pfad, Größe und Autoextend-Werte; eine Erfolgsmeldung allein belegt nicht die beabsichtigte Konfiguration. Neue Dateien und geänderte Kapazitäten gehören anschließend in Betriebsdokumentation und Sicherungsplanung.

    13. Verkleinern: freier Platz ist nicht automatisch rückgebbar

    DELETE, Segmentverkleinerung und Datafile-RESIZE arbeiten auf verschiedenen Ebenen. Gelöschte Zeilen können Platz innerhalb eines Segments zur Wiederverwendung hinterlassen. Erst freigegebene Extents stehen anderen Segmenten zur Verfügung. Für eine Dateiverkleinerung muss außerdem der Bereich hinter der neuen Dateigrenze frei von benötigten Blöcken sein. Eine große Summe freier Extents am Dateianfang genügt nicht.

    ORA-03297 bei RESIZE ist deshalb kein Auftrag, dieselbe Größe wiederholt zu versuchen. Ermittle die betroffene Datei und die Belegung in ihrem hinteren Bereich. Aus DBA_EXTENTS lässt sich die Segmentverteilung untersuchen, aber keine allgemein sichere Minimalgröße für jede Datei garantieren. Verwaltungsbereiche und weitere Restrictions bleiben zu berücksichtigen. Reorganisationen brauchen eine eigene Planung zu Sperren, Platzbedarf, Edition und Rückweg.

    Bei TEMP kann ALTER TABLESPACE … SHRINK SPACE mit KEEP eine Untergrenze vorgeben; aktive Belegung und Verwaltungsbedingungen begrenzen die Rückgabe. Das ist nicht derselbe Vorgang wie das Verkleinern eines permanenten Tabellensegments. Für diesen Einstieg reicht die begründete Auswahl des Verfahrens; eine pauschale automatische Verkleinerung ist kein Lernziel.

    14. Default-Tablespace, TEMP und Quota zuordnen

    Der Default-Tablespace ist das voreingestellte Ziel für geeignete neue Objekte ohne explizite Tablespace-Angabe. Eine Änderung verschiebt keine vorhandenen Tabellen. Der Temporary-Tablespace dient temporärer Arbeit. Eine Quota begrenzt die Speicherzuweisung an den Benutzer in einem permanenten Tablespace; sie reserviert keine Bytes. Das Recht, eine Tabelle anzulegen, und die Erlaubnis, dafür Speicher zu belegen, sind getrennte Voraussetzungen.

    SQL*Plus – lesende Kontrolle
    SELECT username, default_tablespace, temporary_tablespace
    FROM dba_users WHERE username='LAB_OWNER';
    SELECT username, tablespace_name, bytes, max_bytes
    FROM dba_ts_quotas WHERE username='LAB_OWNER';

    Was sehe ich hier? Die erste Abfrage zeigt Zuordnungen, die zweite vorhandene Quota-Einträge. MAX_BYTES = -1 bedeutet eine unbegrenzte Quota. Keine Zeile beweist weder einen falschen Tablespace noch allein einen fehlenden Zugriff: Benutzerexistenz, Container und UNLIMITED TABLESPACE müssen mitbetrachtet werden. TEMP erhält keine Benutzerquota nach diesem Modell.

    Das folgende Beispiel setzt den in Kapitel 12 angelegten LAB_OWNER und die Labor-Tablespaces voraus. Es ist eine gesonderte Zuordnungsübung für den Administrator in LABPDB, kein notwendiger Schritt vor dem Storage-Labor:

    SQL*Plus – administrative Zuordnung nach dem Rechte-Labor
    ALTER USER lab_owner DEFAULT TABLESPACE lab_data
      TEMPORARY TABLESPACE lab_tmp QUOTA 16M ON lab_data;

    Notiere vorher die vorhandenen Zuordnungen und Quotas. Prüfe danach erneut. Für einen Rückweg sind genau diese vorherigen Werte maßgeblich; Quota 0 ist kein allgemeiner Ersatz für den ursprünglichen Zustand. Die vollständige Benutzeranlage und wirksame Rechteketten stehen in Kapitel 12.

    15. Verfügbarkeit und Fehlerfälle sicher unterscheiden

    Zustand / BefundBedeutung und nächster Prüfschritt
    ONLINETablespace grundsätzlich verfügbar; einzelne Dateizustände weiterhin prüfen.
    OFFLINEObjekte im Tablespace stehen nicht normal zur Verfügung. OFFLINE NORMAL, TEMPORARY und IMMEDIATE haben unterschiedliche Recovery-Folgen.
    READ ONLYVorhandene Daten lesbar, Datenänderungen nicht erlaubt. Das ist keine umfassende Sperre gegen jede administrative DDL.
    ORA-01653 / ORA-01654Tabellen- beziehungsweise Indexsegment konnte nicht erweitert werden: Ziel, Datei- und Extentkapazität untersuchen.
    ORA-01536 / ORA-01950Quota überschritten beziehungsweise keine passende Speicherberechtigung: Owner und Rechte prüfen.
    ORA-01652Temporäres Segment konnte nicht erweitert werden. Den genannten Tablespace prüfen; der Fehler ist nicht ausschließlich ein Beweis für ein volles TEMP.
    OS meldet keinen freien PlatzZiel-Dateisystem und begleitenden Fehlerstack prüfen; eine höhere MAXSIZE schafft keinen physischen Speicher.

    Ein Statuswechsel ist eine Betriebsmaßnahme mit Auswirkungen auf Anwendungen. OFFLINE NORMAL schreibt die notwendigen Checkpoints und benötigt nach erfolgreichem Abschluss kein Media Recovery zum erneuten Online-Schalten. OFFLINE IMMEDIATE benötigt dagegen Recovery; es ist in NOARCHIVELOG nicht zulässig. OFFLINE TEMPORARY kann bei nicht erfolgreich geschriebenen Dateien Recovery erfordern. SYSTEM, aktives UNDO und temporäre Tablespaces sind keine normalen Ziele für diese Übung.

    Für READ ONLY muss der Tablespace unter anderem online und darf nicht in einem offenen Backup sein; aktive Transaktionen können den Übergang verzögern. Das folgende Labor übt ausschließlich den normalen permanenten LAB_DATA-Tablespace. Recovery-Verfahren stehen in Kapitel 25.

    16. Diagnosekette: „Der Tablespace wird voll“

    1. Betroffenen Tablespace und Container bestimmen; PERMANENT, UNDO und TEMP unterscheiden.
    2. Aktuelle Dateien, Größen, Autoextend und Maximalgrößen auslesen.
    3. Freie Extents prüfen und fehlende Ergebniszeilen richtig einordnen.
    4. Größte Segmente beziehungsweise aktuelle TEMP-Verbraucher identifizieren.
    5. Bei einem Segment die Extent-Verteilung und gegebenenfalls Partitionen untersuchen.
    6. Werte über die Zeit vergleichen: Ein einzelner Messpunkt zeigt keinen Wachstumstrend.
    7. Den freien Platz auf Filesystem oder ASM getrennt bewerten; erst mit allen Befunden eine Betriebsmaßnahme planen.

    Praxisfall: Ein Tablespace ist fast vollständig allokiert, obwohl viele Zeilen entfernt wurden. Prüfe zunächst die größten Segmente und den freien Extent-Platz. Zeilenlöschungen können Platz innerhalb eines Segments freigeben, ohne Extents an den Tablespace zurückzugeben. Daraus folgt weder automatisch ein Storage-Fehler noch die Notwendigkeit einer Vergrößerung. Dieses Wiki führt keine Reorganisation und keine Änderung aus.

    17. Ergebnisse zusammenführen und weiterlesen

    Tablespaces weiter vertiefen: Kapitel 12: Benutzer und Quotas · Kapitel 23: UNDO · Kapitel 24: REMAP_TABLESPACE und Transport · Kapitel 25: Wiederherstellung · Kapitel 29: regelmäßige Kapazitätskontrolle.

    Die fünf grundlegenden Storage-Sichten ergänzen sich: Die Dateisicht liefert die aktuelle Kapazität und Wachstumsgrenzen, die Segmentsicht zeigt die größten Speicherstrukturen, und die Extentsicht verbindet diese mit konkreten Dateien. Der freie Extent-Platz erklärt, welche Bereiche noch zugeordnet werden können. TEMP bleibt eine separate Betrachtung. Halte im Analyseergebnis fest, auf welche Ebene und welchen Zeitpunkt sich jede Zahl bezieht; so werden Dateigröße, Segmentplatz und aktuelle Nutzung nicht versehentlich gleichgesetzt.

    Weiterlesen: Kapitel 7 – Tabellen, Indizes und Constraints, Kapitel 9 – Optimizer-Statistiken, UNDO und Flashback und Data Dictionary Explorer.

    Zusätzliche Referenzen: Dateien und Online-Status · TEMP-Kapazität · UNDO-Zustände · Bezug der Belegungsquote · Objektnamen und Namensräume · SE2-Funktionsmatrix.

    Oracle-Referenzen: Logical Storage Structures (19c), DBA_SEGMENTS und DBA_EXTENTS.

    Vertiefende Oracle-19c-Quellen: Logische Speicherstrukturen · Freie Extents
    Geführte Praxisübung: Wie voll ist ein Tablespace wirklich?

    So arbeitest du mit der Übung: Lies zuerst die Situation, betrachte die Abfrage und beantworte die Fragen anhand der Beispielausgabe. Öffne anschließend die Musterlösung. Alle Werte sind erfundene Lernbeispiele. Die SELECT-Abfragen lesen Informationen; der Wiki-Generator führt sie nicht aus. Voraussetzung sind passende Leserechte und die Verbindung zur betroffenen Datenbank beziehungsweise PDB.

    Situation: Eigenständiges Lernbeispiel mit anderem Messstand als die 30-GiB-Dateisicht oben: Ein Bericht meldet für APP_DATA eine hohe Belegung. Du möchtest unterscheiden, wie viel Platz in den bereits vorhandenen Dateien frei ist und wie weit diese Dateien laut Einstellung automatisch wachsen dürfen. Stell dir den Tablespace als Regal vor: Freie Fächer im vorhandenen Regal sind etwas anderes als Platz für eine mögliche Vergrößerung.

    Prüfung: Dieses Beispiel gilt für einen normalen permanenten Tablespace mit online verfügbaren Datafiles. TEMP und UNDO haben eigene Bewertungsregeln. APP_DATA ist ein Beispielname.

    WITH files AS (
      SELECT tablespace_name, SUM(bytes) AS aktuell,
             SUM(CASE WHEN autoextensible = 'YES'
                      THEN GREATEST(bytes, maxbytes)
                      ELSE bytes END) AS dateigrenze
      FROM dba_data_files
      WHERE tablespace_name = 'APP_DATA'
      GROUP BY tablespace_name
    ), frei AS (
      SELECT tablespace_name, SUM(bytes) AS freie_bytes
      FROM dba_free_space
      WHERE tablespace_name = 'APP_DATA'
      GROUP BY tablespace_name
    )
    SELECT f.tablespace_name,
           ROUND(f.aktuell / POWER(1024,3), 2) AS aktuell_gib,
           ROUND(NVL(r.freie_bytes,0) / POWER(1024,3), 2) AS frei_gib,
           ROUND(f.dateigrenze / POWER(1024,3), 2) AS grenze_gib
    FROM files f
    LEFT JOIN frei r ON r.tablespace_name = f.tablespace_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im Client abweichen.

    Was sehe ich hier? AKTUELL_GIB ist die heutige Dateigröße. FREI_GIB sind freie Extents innerhalb dieser Dateien. GRENZE_GIB summiert die eingestellten automatischen Dateigrenzen; bei ausgeschaltetem Autoextend zählt nur die aktuelle Größe. GiB bedeutet Bytes geteilt durch 1024³. Die beiden WITH-Abschnitte rechnen Dateien und freie Bereiche getrennt zusammen, damit ein Join die Dateigrößen nicht mehrfach zählt.

    TABLESPACE_NAMEAKTUELL_GIBFREI_GIBGRENZE_GIB
    APP_DATA1008160

    Deine Aufgabe: Wie viel ist innerhalb der bestehenden Dateien belegt? Sind bereits 68 GiB frei verfügbar? Welche Information fehlt für die Beurteilung der Erweiterung?

    Musterlösung und nächster Prüfschritt

    100 minus 8 ergibt 92 GiB, die nicht als freie Extents gemeldet werden. Bezogen auf die derzeitige Dateigröße sind das 92 Prozent. Das bedeutet nicht, dass genau 92 GiB reine Nutzdaten gespeichert sind: Zugewiesene Segmente enthalten unter anderem intern freien Platz, und Dateien besitzen Verwaltungsbereiche. Sofort frei gemeldet sind 8 GiB.

    Die Differenz zwischen Dateigrenze und aktueller Größe beträgt 60 GiB. Zusammen mit den 8 GiB ergibt sich rechnerisch eine Reserve von 68 GiB, sofern das automatische Wachstum tatsächlich möglich ist. Die 60 GiB sind noch keine bereits bereitgestellten freien Extents. Prüfe deshalb die freien Kapazitäten des Dateisystems beziehungsweise Storage, mögliche Container-Grenzen und die Autoextend-Einstellungen der einzelnen Dateien. Mehrere Tablespaces können um denselben Storage konkurrieren.

    Für die Dringlichkeit brauchst du zusätzlich den Wachstumsverlauf: 8 GiB können bei geringem Wachstum lange reichen und bei einem großen Import sehr schnell verbraucht sein. Auch die Größe des nächsten benötigten Extents ist relevant. Im bestehenden Kapitel findest du die Details zu Datafiles und Autoextend.

    Grenze der Aussage: DBA_FREE_SPACE liefert für vollständig belegte Dateien keine Zeile. Deshalb verwendet die Abfrage LEFT JOIN und NVL. Bei offline liegenden Dateien können ebenfalls Informationen fehlen; dann ist die Null-Ersetzung keine belastbare Belegungsmessung. Keine Ausgabe kann auch einen falschen Namen oder Container bedeuten. Die Dateigrenze dieser Rechnung ist nicht identisch mit der unter Berücksichtigung verfügbarer Kapazitäten berechneten Größe in DBA_TABLESPACE_USAGE_METRICS.

    Oracle 19c: DBA_FREE_SPACE · Datafiles und automatische Erweiterung

    Praxis: Tablespace planen, anlegen, verändern und nachweisen

    Dieses Labor ergänzt die lesende Kapazitätsdiagnose um Verwaltung. Arbeite in LABPDB aus dem Datenbankaufbau-Labor als berechtigter Administrator. LAB_DATA und LAB_TMP dürfen dort noch nicht existieren. Für die folgenden namenlosen Dateiangaben muss OMF durch ein wirksames DB_CREATE_FILE_DEST vorbereitet sein. Der freie Platz des tatsächlichen Dateisystems wird zusätzlich kontrolliert. Die Zahlen sind kleine Laborwerte, keine Dimensionierungsempfehlung für Anwendungen.

    1. Vorhersage und Vorbereitung

    SQL*Plus – lesende Kontrolle
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS container_name FROM dual;
    SELECT name, value FROM v$parameter WHERE name='db_create_file_dest';
    SELECT tablespace_name, contents, bigfile FROM dba_tablespaces
    WHERE tablespace_name IN ('LAB_DATA','LAB_TMP');

    Erwartung: LABPDB, ein nicht leerer geeigneter OMF-Zielwert und keine vorhandenen LAB-Tablespaces. Sage voraus, ob ein Tablespace ohne eigene Tabellen trotzdem bereits eine Datei besitzt. Begründe außerdem, warum MAXSIZE keinen Speicherplatz auf dem Dateisystem reserviert.

    2. Geplant anlegen

    SQL*Plus in LABPDB – administrative Laborbefehle
    CREATE SMALLFILE TABLESPACE lab_data
      DATAFILE SIZE 64M AUTOEXTEND ON NEXT 16M MAXSIZE 128M
      EXTENT MANAGEMENT LOCAL
      SEGMENT SPACE MANAGEMENT AUTO;
    CREATE TEMPORARY TABLESPACE lab_tmp
      TEMPFILE SIZE 32M AUTOEXTEND OFF;
    SQL*Plus – lesende Kontrolle
    SELECT tablespace_name, file_id, file_name,
           bytes/1024/1024 AS allocated_mib, autoextensible,
           maxbytes/1024/1024 AS max_mib
    FROM dba_data_files WHERE tablespace_name='LAB_DATA';
    SELECT tablespace_name, file_name, bytes/1024/1024 AS allocated_mib,
           autoextensible
    FROM dba_temp_files WHERE tablespace_name='LAB_TMP';

    Erwartung: eine 64-MiB-Datendatei mit Autoextend und maximal 128 MiB sowie eine 32-MiB-Tempdatei ohne Autoextend. Oracle erzeugt die OMF-Dateinamen. Übernimm den tatsächlich gelesenen Dateinamen für den nächsten Schritt, nicht eine angenommene Standardbenennung.

    3. Eine Änderung mit Vorher-/Nachher-Nachweis

    SQL*Plus – Schablone; ausschließlich LAB_DATA-Datei einsetzen
    ALTER DATABASE DATAFILE '<exakter_Dateiname_aus_DBA_DATA_FILES>' RESIZE 80M;

    Die erneute Dateiabfrage muss 80 MiB zeigen; MAXSIZE und aktuelle Dateigröße sind weiterhin verschiedene Werte. Eine spätere Verkleinerung kann wegen Blöcken hinter der Zielgrenze scheitern. Freie Extents irgendwo in der Datei garantieren deshalb kein erfolgreiches RESIZE. Für Bigfile-Tablespaces gelten andere Verwaltungswege als das Hinzufügen weiterer Dateien; das Beispiel ist ausdrücklich Smallfile.

    4. Eine zweite Smallfile-Datei hinzufügen

    Nach Schritt 3 besitzt LAB_DATA eine 80-MiB-Datei. Sage die Dateizahl und Gesamtgröße nach dem folgenden Schritt voraus. Die OMF-Voraussetzung gilt weiterhin; führe ADD DATAFILE in diesem Versuch genau einmal aus.

    SQL*Plus – erweitert ausschließlich den Labor-Tablespace
    ALTER TABLESPACE lab_data ADD DATAFILE SIZE 32M AUTOEXTEND OFF;
    SQL*Plus – lesende Kontrolle
    SELECT file_id, file_name, bytes/1024/1024 AS allocated_mib, autoextensible
    FROM dba_data_files WHERE tablespace_name='LAB_DATA' ORDER BY file_id;

    Erwartung: zwei Dateien mit 80 und 32 MiB, zusammen 112 MiB. Nur die erste darf automatisch wachsen. Bei unverändertem MAXSIZE 128M der ersten Datei beträgt die Summe der konfigurierten Dateigrenzen 160 MiB. Das ist keine Garantie für freien Storage.

    5. READ ONLY und READ WRITE beobachten

    Führe diesen Schritt vor dem Rechte-Labor aus, solange LAB_DATA noch keine Anwendungsobjekte enthält und keine andere Übung darauf zugreift. Prüfe den Status vor jedem Wechsel. Bei unerwartetem Warten untersuche aktive Transaktionen; keine Sessions pauschal beenden.

    SQL*Plus – Laborzustand ändern
    ALTER TABLESPACE lab_data READ ONLY;
    SQL*Plus – lesende Kontrolle
    SELECT tablespace_name, status FROM dba_tablespaces
    WHERE tablespace_name='LAB_DATA';

    Erwartung: READ ONLY. Dieser Versuch belegt den Zustandswechsel; ohne Tabelle und Schreibversuch belegt er noch keinen getesteten Anwendungszugriff.

    SQL*Plus – Laborzustand zurücksetzen
    ALTER TABLESPACE lab_data READ WRITE;

    Wiederhole die Statusabfrage: Erwartung ONLINE. Erst danach die Folgeübungen beginnen. OFFLINE wird hier nicht ausgeführt. Erkläre anhand des Grundlagenabschnitts, weshalb ein beliebiger OFFLINE-Modus kein geeigneter Rückweg wäre.

    6. Weitere Verfahren begründet auswählen

    VerfahrenZu erklärender Unterschied
    OMFOracle verwaltet die Dateinamen; das ersetzt weder ein Kapazitätsbudget noch Backups.
    Datafile verschiebenEin unterstützter Online-Move braucht Platz für die vorübergehende Kopie. Offline-/Online-Verfahren, Dateityp und Umgebung unterscheiden; kein OS-mv an einer offenen Datei.
    Segment verkleinernSHRINK ist kein allgemeiner Ersatz für DELETE oder Datafile-RESIZE. Objekttyp, ASSM, Row Movement und weitere Restrictions prüfen.
    ResumableEine dafür geeignete aktivierte Operation kann bei bestimmten Platzproblemen warten; sie schafft selbst keinen Platz und kann nach Timeout scheitern.
    Deferred Segment Creation / KompressionFunktions- und Editionsgrenzen vor der Nutzung prüfen. Theoriekenntnis ist keine automatische SE2-Freigabe.

    7. Rückweg

    LAB_DATA und LAB_TMP werden im Rechte-Labor weiterverwendet. Lösche sie daher erst nach Abschluss aller abhängigen Übungen. Zuvor alle Laborbenutzer und deren Default-/Temporary-Zuordnung sowie verbliebene Objekte prüfen. Die folgenden Befehle sind ausschließlich für diese entbehrlichen Labor-Tablespaces bestimmt:

    SQL*Plus – abschließender Laborabbau, löscht Daten und Dateien
    DROP TABLESPACE lab_data INCLUDING CONTENTS AND DATAFILES;
    DROP TABLESPACE lab_tmp INCLUDING CONTENTS AND DATAFILES;
    Musterlösung und Abnahmekriterien

    Du kannst anlegen und messen, die Änderung von 64 auf 80 MiB nachweisen und erklären, warum Autoextend, Quota, Segmentbelegung und Dateisystemplatz unterschiedliche Grenzen bilden. Eine Tabelle zu löschen muss die zugehörige Datafile nicht verkleinern. Für den Nachweis zählen Vorher-/Nachher-Abfragen und deine Begründung, nicht allein eine Erfolgsmeldung.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Tablespace, Segment, Extent und Block beschreiben logische Speicherstrukturen. Datafiles bilden die physische Dateiebene; ein Tablespace kann mehrere Datafiles besitzen.
    2. Permanente Daten, UNDO und TEMP erfüllen unterschiedliche Aufgaben. Deshalb lassen sich ihre Belegung und ihr freier Platz nicht mit derselben Sicht vollständig bewerten.
    3. Tablespace-Kapazität hängt von aktuellem Dateivolumen, freien Extents, Autoextend, maximaler Dateigröße und verfügbarem Storage ab. Autoextend ersetzt keine Kapazitätsplanung.
    4. Freier Platz innerhalb eines Segments oder einer Datei ist nicht automatisch an das Dateisystem zurückgebbar. Für eine Verkleinerung ist auch die Lage noch belegter Bereiche entscheidend.
    5. Bei Platzproblemen werden betroffene Objekte, Tablespace, Dateien und Storage gemeinsam geprüft. Default-Tablespace, TEMP-Zuordnung und Benutzerquota beantworten dabei unterschiedliche Fragen.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Gehört ein Segment direkt zu einer einzelnen Datei?
    Ein Segment gehört zu einem Tablespace. Seine Extents können in mehreren Datafiles dieses Tablespaces liegen.
    Frage 2: Kann ein einzelnes Extent zwei Datafiles überspannen?
    Nein. Ein Extent liegt vollständig in einem Datafile.
    Frage 3: Was bedeutet DBA_SEGMENTS.BYTES?
    Den für das Segment allokierten Platz, nicht die genaue fachliche Nutzdatenmenge.
    Frage 4: Beweist MAXBYTES ausreichend freien Storage?
    Nein. Es ist eine konfigurierte Dateigrenze. Physisch verfügbarer Platz muss getrennt geprüft werden.
    Frage 5: Warum werden Tempfiles getrennt geprüft?
    TEMP dient temporären Arbeitsbereichen. DBA_TEMP_FILES beschreibt diese Dateien; aktuelle Belegung und permanente Segmentzuordnung sind unterschiedliche Fragen.
    Frage 6: Beweist ein ONLINE-Tablespace, dass jede Datei online ist?
    Nein. TABLESPACE_STATUS und FILE_ONLINE_STATUS sind getrennte Ebenen. Dateizustände müssen vor der Interpretation fehlender Freiplatzzeilen geprüft werden.
    Frage 7: Warum verbindet die LOB-Größenabfrage auch den Segmenttyp?
    Tabellen und Indizes können im selben Schema gleich heißen. Owner und Name allein können deshalb ein nicht zugehöriges Segment treffen. Der passende Typ verhindert diese Verwechslung.
    Frage 8: TEMP meldet 10 GiB allokiert und 9 GiB frei bei 12 GiB Größe. Ist das widersprüchlich?
    Nein. Allokierter TEMP-Platz kann bereits wiederverwendbaren Platz enthalten. Frei umfasst wiederverwendbaren und noch nicht allokierten Platz. Die Differenz aus Größe und frei beträgt im Beispiel 3 GiB.
    Frage 9: Kann ein Bigfile-Tablespace durch eine zweite Datei erweitert werden?

    Nein. Er besitzt genau eine Datei. Diese wird bei Bedarf unter Beachtung der Grenzen vergrößert.

    Frage 10: Verschiebt ein neuer Default-Tablespace vorhandene Tabellen?

    Nein. Er verändert die Voreinstellung für geeignete künftige Objekte. Bestehende Segmente bleiben an ihrem bisherigen Ort.

    Frage 11: Warum kann RESIZE trotz vieler freier Extents scheitern?

    Benötigte Blöcke können hinter der gewünschten neuen Dateigrenze liegen. Die Summe freien Platzes allein bestimmt keine sichere Zielgröße.

    Frage 12: Was zeigt das erweiterte Labor nach dem Hinzufügen der Datei?

    Zwei Dateien mit 80 und 32 MiB, insgesamt 112 MiB. Nach READ ONLY und anschließendem READ WRITE zeigt DBA_TABLESPACES wieder ONLINE.

    9. Optimizer-Statistiken – warum Oracle Informationen über deine Daten braucht

    Der Abschnitt führt vom Grundprinzip zu den technischen Begriffen und ihrer Bedeutung für die Administration.

    Lernkompass
    Einfach gesagt Du lernst, welche Informationen Oracle-Statistiken über Tabellen, Spalten und Indizes liefern und warum der Optimizer diese Informationen für seine Schätzungen benötigt.
    Warum ist das wichtig? Der Optimizer entscheidet kostenbasiert. Veraltete, fehlende oder ungeeignete Statistiken können deshalb zu falschen Kardinalitätsschätzungen und damit zu ungünstigen Ausführungsentscheidungen beitragen.
    Nach diesem Kapitel Du kannst Statistikstatus, Aktualität, grundlegende Tabellen-/Spaltenstatistiken und Histogramme read-only einordnen, ohne vorschnell Statistiken neu zu sammeln.

    Einführung: Optimizer-Statistiken beschreiben Eigenschaften von Tabellen, Spalten und Indizes, die Oracle für die Planung einer SQL-Ausführung verwendet. Sie helfen etwa dabei, die erwartete Ergebnismenge eines Filters abzuschätzen. Diese Informationen sind Schätzgrundlagen und keine laufende Messung jeder Abfrage. Ein Statistikbefund muss deshalb mit der betroffenen SQL und ihrem Plan zusammen betrachtet werden.

    Wir beginnen mit der Frage, welche Information der Optimizer benötigt, und lesen anschließend den vorhandenen Statistikbestand. Danach werden Aktualität, Datenverteilung und Möglichkeiten der Sammlung erklärt. Du lernst, einen auffälligen Wert zu begründen, statt allein wegen eines alten Datums neue Statistiken anzustoßen. Kapitel 10 knüpft daran mit der eigentlichen Planentscheidung an.

    Oracle 19c: fachliche Grundlage

    SE2-Abgrenzung: Partitionierungsstatistiken werden hier zum Verständnis erklärt; frei einsetzbare Anwendungspartitionierung und parallele Statistiksammlung gehören nicht zum Oracle-19c-SE2-Betrieb. Die seriellen Beispiele verwenden DEGREE = 1. Oracle-Funktionsmatrix.

    Die zusammenhängende Erklärung der Planentscheidungen findest du in Kapitel 10 – Optimizer und Ausführungspläne verstehen.

    1. Ein einfacher Diagnoseweg

    Bei Statistikproblemen ist eine einfache Reihenfolge hilfreich: Objekt identifizieren → vorhandene Statistiken prüfen → Aktualität und Stale-Status bewerten → Datenverteilung berücksichtigen → erst danach einen Zusammenhang mit dem SQL-Plan untersuchen.

    Wichtig ist dabei die Trennung zwischen Befund und Maßnahme. Ein altes LAST_ANALYZED beweist noch nicht, dass ein Performanceproblem durch Statistiken verursacht wird. Ebenso bedeutet STALE_STATS='YES' nicht automatisch, dass sofort manuell neue Statistiken gesammelt werden müssen.

    2. Welche Fragen beantwortet eine Statistik?

    FrageBeispielstatistik
    Wie groß ist die Tabelle ungefähr?NUM_ROWS, BLOCKS
    Wie viele unterschiedliche Werte gibt es?NUM_DISTINCT
    Wie lang ist eine durchschnittliche Zeile?AVG_ROW_LEN
    Welche Informationen braucht Oracle über Zugriffspfade?Auch Indexstatistiken fließen in die Kostenschätzung ein; die Indexdetails stehen im Fachkapitel Indizes & Constraints.

    3. Optimizer-Statistiken sind keine Performance-Statistiken

    Oracle trennt zwei Statistikwelten, die im DBA-Alltag leicht verwechselt werden. Optimizer-Statistiken beschreiben Datenbankobjekte und Eigenschaften, die der Optimizer für Kostenschätzungen verwendet. Performance-Statistiken aus dynamischen Performance Views wie V$SYSSTAT oder V$SESSION beschreiben dagegen Laufzeitaktivität der Instance beziehungsweise Sessions.

    DBA_TAB_STATISTICS.NUM_ROWS und V$SYSSTAT beantworten daher grundverschiedene Fragen. Kapitel 9 bleibt bei den Optimizer-Statistiken; Laufzeitdiagnose gehört in die Performance-Kapitel.

    4. NUM_ROWS – ein häufiger Fehlschluss

    COUNT(*) ermittelt dagegen eine Zeilenzahl für die konsistente Sicht der konkreten Abfrage. Es ist keine dauerhaft aktuelle Zahl und kann auf großen Tabellen erheblichen Aufwand verursachen.

    NUM_ROWS ist kein Live-Zähler. Der Wert gehört zum gespeicherten Optimizer-Statistikstand und kann auf einer Stichprobe beruhen. Er ist deshalb auch nicht in jedem Fall eine exakte Zählung zum Erfassungszeitpunkt. Wenn seitdem viele Zeilen eingefügt oder gelöscht wurden, kann er vom aktuellen Bestand abweichen.

    Deshalb bedeutet NUM_ROWS = 100000 nicht: „Die Tabelle hat jetzt garantiert exakt 100.000 Zeilen.“

    5. Was bedeutet „Selektivität“?

    Selektivität ist der geschätzte Trefferanteil zwischen 0 und 1. Ein kleiner Zahlenwert bedeutet starke Einschränkung: 1 von 1.000.000 entspricht 0,000001. Umgangssprachlich heißt das „sehr selektiv“.

    Wenn aus einer Million Zeilen nur eine Zeile passt, ist das sehr selektiv. Wenn 800.000 Zeilen passen, ist die Bedingung wenig selektiv. Diese Einschätzung beeinflusst, ob ein Index attraktiv ist.

    6. Was bedeutet „Cardinality“?

    Cardinality bezeichnet eine Zeilenanzahl. Im geschätzten Execution Plan ist damit die vom Optimizer geschätzte Ausgabezeilenzahl einer Operation gemeint; gemessene Zeilenmengen werden in Kapitel 10 davon getrennt.

    Beispiel: Oracle erwartet 10 Zeilen, tatsächlich entstehen 500.000. Diese Fehleinschätzung kann dazu führen, dass Oracle einen Plan wählt, der für eine kleine Datenmenge gut, für die reale große Datenmenge aber schlecht ist.

    7. Warum ist die Datenverteilung wichtig?

    Nicht jede Spalte ist gleichmäßig verteilt. Stell dir eine Spalte STATUS vor: 99 % der Zeilen enthalten CLOSED, nur 1 % enthalten OPEN.

    Eine Abfrage auf OPEN kann sehr selektiv sein, eine Abfrage auf CLOSED dagegen nicht. Der Optimizer sollte diesen Unterschied kennen.

    8. Histogramme – erst jetzt wird es technischer

    Normale Spaltenstatistiken beschreiben unter anderem die Anzahl unterschiedlicher Werte. Bei ungleichmäßiger Datenverteilung kann diese Zusammenfassung für bestimmte Prädikate zu grob sein. Histogramme liefern dem Optimizer zusätzliche Informationen über die Verteilung von Spaltenwerten.

    Ein Histogramm ist jedoch nicht pauschal für jede Spalte mit wenigen oder ungleich verteilten Werten erforderlich. Oracle entscheidet bei der automatischen Statistikermittlung anhand verschiedener Informationen, unter anderem Nutzung und Datenverteilung, ob Histogramme sinnvoll sind. Ein vorhandenes Histogramm ist deshalb zunächst ein Statistikmerkmal und nicht automatisch ein Problem.

    9. Histogrammtypen in Oracle 19c

    Oracle 19c kennt verschiedene Histogrammtypen. In DBA_TAB_COL_STATISTICS.HISTOGRAM können unter anderem NONE, FREQUENCY, TOP-FREQUENCY und HYBRID erscheinen. Der Typ beschreibt, wie Oracle Informationen über die Werteverteilung gespeichert hat.

    Ein Histogramm sollte nicht allein anhand seines Typs als gut oder schlecht bewertet werden. Entscheidend ist, ob die Statistik die relevante Datenverteilung sinnvoll beschreibt. Die konkrete Auswirkung auf einen Execution Plan gehört in das Plan-/SQL-Tuning-Kapitel.

    HISTOGRAMBedeutung
    NONEKein Histogramm.
    FREQUENCYHäufigkeiten der einzelnen unterschiedlichen Werte.
    TOP-FREQUENCYKonzentriert sich auf die häufigsten Werte, die den Großteil der Daten ausmachen.
    HYBRIDVerbindet Buckets mit zusätzlichen Häufigkeitsinformationen an ihren Endpunkten.
    HEIGHT BALANCEDVerteilt Zeilen auf Buckets mit ungefähr gleicher Besetzung; auch unter 19c bei entsprechender Sammlung möglich.

    10. Weitere Informationen für die Kostenschätzung

    Auch Eigenschaften eines Index fließen in die Kostenschätzung ein. Die Bedeutung von B-Tree, Leaf Blocks, Clustering Factor und den verschiedenen Indexzugriffen wird bewusst nur im zentralen Fachkapitel Indizes & Constraints erklärt. Hier reicht der Zusammenhang: Der Optimizer verwendet auch Indexstatistiken, wenn er Zugriffskosten vergleicht.

    11. Extended Statistics: wenn Einzelspalten nicht genügen

    Einzelne Spaltenstatistiken können Zusammenhänge zwischen mehreren Spalten nicht immer ausreichend beschreiben. Oracle unterstützt deshalb Extended Statistics, beispielsweise Column-Group-Statistiken für korrelierte Spalten oder Statistiken auf Ausdrücken.

    Dieses Kapitel beschränkt sich auf das Konzept. Das Anlegen oder Verändern solcher Statistiken ist eine administrative Aktion und wird in der read-only Diagnose nicht automatisch ausgeführt.

    READ ONLY – vorhandene Statistik-Erweiterungen
    SELECT
        owner,
        table_name,
        extension_name,
        extension
    FROM dba_stat_extensions
    WHERE owner = UPPER('&OWNER')
      AND table_name = UPPER('&TABLE_NAME')
    ORDER BY extension_name;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    OWNERTABLE_NAMEEXTENSION_NAMEEXTENSION
    APP_DEMOBESTELLUNGENSYS_STU_DEMO("LAND","REGION")

    Was sehe ich hier? Angenommen &OWNER=APP_DEMO und &TABLE_NAME=BESTELLUNGEN: Eine Spaltengruppe verbindet LAND und REGION. Der intern erzeugte Name ist hier schematisch; maßgeblich ist die Definition in EXTENSION. Ohne Erweiterung liefert die Abfrage keine Zeile.

    LAND und REGION können voneinander abhängen. Werden beide Filter wie unabhängige Merkmale geschätzt, kann ihre gemeinsame Treffermenge falsch ausfallen. Eine Spaltengruppe kann diese Abhängigkeit abbilden. Der Eintrag in DBA_STAT_EXTENSIONS zeigt zunächst die Definition; er beweist weder aktuelle Statistikwerte noch ihre Verwendung im konkreten Plan.

    12. Wann wurden Statistiken zuletzt gesammelt?

    LAST_ANALYZED zeigt den Zeitpunkt der letzten Statistik-Erfassung. Ein altes Datum bedeutet nicht automatisch ein Problem: Wenn sich die Daten kaum verändert haben, können alte Statistiken weiterhin gut passen.

    STALE_STATS zeigt, ob Oracle die Statistiken nach seiner Änderungsbeobachtung als veraltet einstuft. Auch das ist ein Diagnosehinweis, kein Beweis für eine Performanceursache.

    13. STALE_STATS: keine fest eingebaute 10-%-Wahrheit

    Oracle verwendet die STALE_PERCENT-Präferenz, um zu bestimmen, ab welchem Änderungsumfang Statistiken als stale gelten. Der Default liegt typischerweise bei 10 Prozent. Weil diese Präferenz verändert werden kann, sollte ein DBA nicht pauschal behaupten: „Oracle markiert Statistiken immer exakt ab 10 Prozent als stale.“

    STALE_STATS='YES' bedeutet außerdem nicht, dass die Statistik automatisch die Ursache eines Problems ist. Es bedeutet zunächst, dass Oracle sie anhand seiner Monitoringinformationen und der geltenden Präferenz als veraltet einstuft.

    STALE_STATSEinordnung
    YESAls veraltet eingestuft; keine bewiesene Performanceursache.
    NONicht als veraltet eingestuft; keine Garantie für passende Schätzungen.
    NULLStatistiken wurden nicht gesammelt.

    14. Read-only: Tabellenstatistiken ansehen

    Die Abfrage filtert auf OBJECT_TYPE=TABLE und zeigt damit Tabellenstatistiken. Partitionen und Subpartitionen werden im eigenen Abschnitt mit ihren Namen dargestellt. Sonst könnten mehrere Zeilen derselben Tabelle fälschlich als Duplikate oder widersprüchliche Gesamtwerte erscheinen.
    DBA_TAB_STATISTICS
    SELECT owner,
           table_name,
           num_rows,
           blocks,
           avg_row_len,
           sample_size,
           last_analyzed,
           stale_stats
    FROM dba_tab_statistics
    WHERE object_type = 'TABLE'
      AND owner      = UPPER('&OWNER')
      AND table_name = UPPER('&TABLE_NAME');

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    OWNERTABLE_NAMENUM_ROWSBLOCKSAVG_ROW_LEN
    APP_DEMOBESTELLUNGEN100000020000120
    SAMPLE_SIZELAST_ANALYZEDSTALE_STATS
    10000002026-10-01 02:00:00YES

    So liest du das Ergebnis: Eine Million ist der Statistikwert, keine live gezählte Menge. YES begründet die Prüfung von Änderungen und Präferenzen. Es beweist keine bestimmte aktuelle Zeilenzahl und keinen ursächlichen Planfehler.

    Was sehe ich hier?
    Du siehst den Statistik-Steckbrief der Tabellen: geschätzte Zeilenanzahl, Blockanzahl, durchschnittliche Zeilenlänge und den Zeitpunkt der letzten Sammlung.

    15. Read-only: Tabellenänderungen seit der Statistikbasis

    READ ONLY – DBA_TAB_MODIFICATIONS
    SELECT
        table_owner,
        table_name,
        partition_name,
        inserts,
        updates,
        deletes,
        timestamp,
        truncated
    FROM dba_tab_modifications
    WHERE table_owner = UPPER('&OWNER')
      AND table_name  = UPPER('&TABLE_NAME')
      AND partition_name IS NULL
      AND subpartition_name IS NULL
    ORDER BY table_name;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileTABLE_OWNERTABLE_NAMEPARTITION_NAMEINSERTSUPDATES
    1APP_DEMOBESTELLUNGENNULL150000120
    ZeileDELETESTIMESTAMPTRUNCATED
    12008.10.2026 10:00:00NO

    Was sehe ich hier? Beispiel für APP_DEMO.BESTELLUNGEN ohne Partitionen: Änderungszähler wurden erfasst, kein TRUNCATE. Die Sicht wird zeitverzögert aktualisiert; die Werte ersetzen keine exakte Zeilenzählung. Seit Oracle 12.2 ist für diese Diagnose kein routinemäßiges DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO erforderlich.

    Die Abfrage begrenzt sich ausdrücklich auf die Tabellenebene. Die ungefähren INSERT-/UPDATE-/DELETE-Zähler sind weder eine aktuelle Zeilenzählung noch die Anzahl unterschiedlicher geänderter Zeilen: dieselbe Zeile kann mehrfach geändert werden. Eine leere Ausgabe beweist nicht, dass keine Änderung stattgefunden hat. TIMESTAMP ist kein Beginn des gesamten Zählzeitraums. Die 150.000 Inserts im Beispiel passen als Änderungsbefund zur zuvor als stale markierten Millionen-Tabelle.

    16. Read-only: Spaltenstatistiken ansehen

    DBA_TAB_COL_STATISTICS
    SELECT owner,
           table_name,
           column_name,
           num_distinct,
           num_nulls,
           density,
           histogram,
           num_buckets,
           last_analyzed
    FROM dba_tab_col_statistics
    WHERE owner      = UPPER('&OWNER')
      AND table_name = UPPER('&TABLE_NAME')
    ORDER BY column_name;

    Fiktive Beispielausgabe:

    Zusammengehörige Teilansichten derselben Ergebniszeilen.

    OWNERTABLE_NAMECOLUMN_NAMENUM_DISTINCTNUM_NULLS
    APP_DEMOBESTELLUNGENSTATUS20
    DENSITYHISTOGRAMNUM_BUCKETSLAST_ANALYZED
    5e-07FREQUENCY22026-10-01 02:00:00

    So liest du das Ergebnis: Zwei verschiedene Werte und zwei Buckets passen zu einem Frequency-Histogramm. Die Zeile zeigt aber nicht, welcher Wert wie häufig ist. DENSITY darf bei Histogrammen nicht pauschal als Trefferanteil jedes Werts gelesen werden.

    Was sehe ich hier?
    Du siehst, wie viele unterschiedliche Werte Oracle kennt, wie viele NULL-Werte erfasst wurden und ob ein Histogramm vorhanden ist.

    17. Partitionierte Tabellen: global, Partition und Subpartition trennen

    Bei partitionierten Tabellen kann Oracle Statistiken auf mehreren Ebenen speichern: für die gesamte Tabelle, einzelne Partitionen und bei Composite Partitioning auch Subpartitionen. Ein DBA darf deshalb nicht aus einem einzigen LAST_ANALYZED-Wert auf den Statistikzustand aller Partitionen schließen.

    Oracle kann bei geeigneter Konfiguration inkrementelle Statistiken verwenden, um globale Statistiken partitionierter Tabellen effizienter zu pflegen. Die Konfiguration davon ist administrativ; die Diagnose des vorhandenen Zustands bleibt hier read-only.

    READ ONLY – Statistikstatus je Partition
    SELECT
        owner,
        table_name,
        object_type,
        partition_name,
        subpartition_name,
        num_rows,
        last_analyzed,
        stale_stats
    FROM dba_tab_statistics
    WHERE owner = UPPER('&OWNER')
      AND table_name = UPPER('&TABLE_NAME')
    ORDER BY object_type, partition_name NULLS FIRST, subpartition_name NULLS FIRST;

    Fiktive Beispielausgabe:

    Eigenständiges Partitionierungsbeispiel für APP_DEMO.BESTELLUNGEN_P, kein SE2-Anwendungsbeispiel. Ausgewählte Zeilen, alphabetisch nach OBJECT_TYPE sortiert; die zwei Teilansichten gehören über Zeile zusammen.

    ZeileOWNERTABLE_NAMEOBJECT_TYPEPARTITION_NAMESUBPARTITION_NAME
    1APP_DEMOBESTELLUNGEN_PPARTITIONP_2026_10NULL
    2APP_DEMOBESTELLUNGEN_PSUBPARTITIONP_2026_10P_2026_10_NORD
    3APP_DEMOBESTELLUNGEN_PTABLENULLNULL
    ZeileNUM_ROWSLAST_ANALYZEDSTALE_STATS
    11000002026-10-08 02:00:00YES
    2400002026-10-08 02:00:00YES
    310000002026-10-01 02:00:00YES

    Was sehe ich hier? Tabellen-, Partitions- und Subpartitionswerte beschreiben unterschiedliche Ebenen. Sie dürfen nicht zu einer Gesamtzeilenzahl addiert werden. Die spätere Sammlung einer Partition beweist keine ebenso aktuelle globale Statistik.

    18. Abgrenzung zum Indexkapitel

    Die read-only Diagnose von Indizes und deren Statistikwerten steht gesammelt im Kapitel Tabellen, Indizes & Constraints. Dadurch bleibt dieses Kapitel auf die Frage konzentriert, warum der Optimizer Statistiken braucht.

    19. Sammelt Oracle Statistiken automatisch?

    Oracle 19c kann Optimizer-Statistiken automatisch in Maintenance Windows sammeln. Das ist die normale Grundlage vieler Systeme.

    Trotzdem gibt es Situationen, in denen ein DBA genauer hinschauen muss: sehr große Tabellen, starke Datenänderungen, spezielle Batchläufe oder auffällige Planänderungen.

    20. Read-only: geltende DBMS_STATS-Präferenzen prüfen

    Bevor man Aussagen über Staleness, Histogramme oder automatische Sammlung trifft, sollte man die für das Objekt geltenden Präferenzen kennen. DBMS_STATS.GET_PREFS liest diese Einstellungen und verändert keine Statistiken.

    READ ONLY – Statistik-Präferenzen
    SELECT
        DBMS_STATS.GET_PREFS('STALE_PERCENT',
                             UPPER('&OWNER'),
                             UPPER('&TABLE_NAME')) AS stale_percent,
        DBMS_STATS.GET_PREFS('ESTIMATE_PERCENT',
                             UPPER('&OWNER'),
                             UPPER('&TABLE_NAME')) AS estimate_percent,
        DBMS_STATS.GET_PREFS('METHOD_OPT',
                             UPPER('&OWNER'),
                             UPPER('&TABLE_NAME')) AS method_opt,
        DBMS_STATS.GET_PREFS('CASCADE',
                             UPPER('&OWNER'),
                             UPPER('&TABLE_NAME')) AS cascade,
        DBMS_STATS.GET_PREFS('PREFERENCE_OVERRIDES_PARAMETER',
                             UPPER('&OWNER'), UPPER('&TABLE_NAME')) AS pref_overrides,
        DBMS_STATS.GET_PREFS('PUBLISH',
                             UPPER('&OWNER'), UPPER('&TABLE_NAME')) AS publish,
        DBMS_STATS.GET_PREFS('NO_INVALIDATE',
                             UPPER('&OWNER'), UPPER('&TABLE_NAME')) AS no_invalidate
    FROM dual;

    Fiktive Beispielausgabe:

    STALE_PERCENTESTIMATE_PERCENTMETHOD_OPTCASCADE
    1020FOR ALL COLUMNS SIZE AUTOTRUE

    Was sehe ich hier? Angenommen &OWNER=APP_DEMO und &TABLE_NAME=BESTELLUNGEN und für diese Tabelle wurden die gezeigten Präferenzen gesetzt: ESTIMATE_PERCENT=20 ist hier eine individuelle Voreinstellung für die Stichprobe; CASCADE=TRUE sieht die Sammlung von Indexstatistiken vor. Explizite Aufrufparameter können diese Werte übersteuern. Das Beispiel zeigt mögliche individuelle Werte, keine Oracle-Standardwerte oder Empfehlung.

    PREF_OVERRIDESPUBLISHNO_INVALIDATE
    FALSETRUEDBMS_STATS.AUTO_INVALIDATE

    Fortsetzung derselben Beispielzeile. GET_PREFS zeigt die Voreinstellungen. Bei PREFERENCE_OVERRIDES_PARAMETER=FALSE haben explizite Aufrufparameter normalerweise Vorrang; bei TRUE gelten die entsprechenden Präferenzen. Deshalb kann das spätere Beispiel AUTO_SAMPLE_SIZE verwenden, obwohl hier 20 steht. PUBLISH=FALSE würde neue Statistiken zunächst unveröffentlicht halten. NO_INVALIDATE steuert abhängige Cursor; AUTO_INVALIDATE überlässt Oracle den Zeitpunkt der Invalidierung. Erfolgreiche Sammlung bedeutet somit nicht automatisch sofort einen neuen Plan für jede Ausführung.

    21. Gesperrte Statistiken

    Optimizer-Statistiken können gesperrt sein. Das ist für die Diagnose wichtig, weil eine automatische oder manuelle Sammlung dann nicht einfach wie bei einem ungesperrten Objekt wirkt. Ein alter Statistikstand kann deshalb bewusst konserviert worden sein.

    READ ONLY – Statistik-Lock
    SELECT
        owner,
        table_name,
        stattype_locked,
        last_analyzed,
        stale_stats
    FROM dba_tab_statistics
    WHERE object_type = 'TABLE'
      AND owner = UPPER('&OWNER')
      AND table_name = UPPER('&TABLE_NAME');

    Fiktive Beispielausgabe:

    OWNERTABLE_NAMESTATTYPE_LOCKEDLAST_ANALYZEDSTALE_STATS
    APP_DEMOBESTELLUNGENALL08.10.2026 10:00:00YES

    Was sehe ich hier? Für APP_DEMO.BESTELLUNGEN sind die Statistiken hier gesperrt und zugleich als veraltet markiert. Nicht unüberlegt entsperren: Zuerst klären, warum die Sperre gesetzt wurde.

    Die gesperrte Tabelle ist ein eigenständiger Diagnosefall. Das folgende administrative Sammelbeispiel setzt eine gesondert geprüfte Konfiguration voraus und ist keine Aufforderung, diese Sperre zu umgehen.

    22. DBMS_STATS – jetzt kommt die Administration

    ADMINISTRATIV – nicht read-only

    Sammel-, Set- und Löschoperationen von DBMS_STATS verändern Optimizer-Statistiken. Dadurch können sich zukünftige Execution Plans ändern. Lesende Funktionen wie GET_PREFS sind davon zu unterscheiden. Deshalb wird eine Statistik-Sammlung nicht reflexartig als Fix ausgeführt.

    Neue Statistik und neuer Plan sind verschiedene Schritte. Gesammelte Statistiken müssen für die Optimierung veröffentlicht beziehungsweise im betreffenden Kontext verwendbar sein. Außerdem hat ein bereits vorhandener Cursor seinen Plan schon erhalten. Die Invalidierungssteuerung, unter anderem NO_INVALIDATE beziehungsweise AUTO_INVALIDATE, beeinflusst, wann abhängige Cursor neu aufbereitet werden. Eine laufende Ausführung wechselt durch die Sammlung nicht einfach mitten im Plan den Weg. Vergleiche deshalb Statistikzeitpunkt, Cursor und tatsächlichen Plan; eine unveränderte Planausgabe beweist keine erfolglose Sammlung. Oracle 19c.

    Das Package enthält sowohl lesende Funktionen als auch verändernde Prozeduren. Der konkrete Aufruf entscheidet über seine Wirkung.

    23. Gather-Stats-Skript Schritt für Schritt

    Das folgende Beispiel sammelt Statistiken für genau ein ausdrücklich benanntes Lernschema. Konto-Status und Default-Tablespace sind keine verlässlichen Auswahlkriterien für die zu bearbeitenden Schemas. Fehler werden nicht abgefangen und als bloße Textmeldung verschluckt; SQL*Plus beendet sich bei einem SQL-/PLSQL-Fehler mit Fehlerstatus. Bereits erfolgte Statistikänderungen sind dadurch nicht automatisch zurückgenommen.

    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE lässt Oracle die Stichprobengröße bestimmen. cascade => TRUE bezieht Indexstatistiken ein. SIZE AUTO überlässt Oracle die Histogrammentscheidung. degree => 1 ist eine bewusst konservative Einstellung ohne Parallelität.

    Reichweite: GATHER_SCHEMA_STATS mit OPTIONS=GATHER ist schemaweit angelegt, nicht nur für BESTELLUNGEN oder ausschließlich für stale Statistiken. Eine Auffälligkeit an einer Tabelle begründet diese Reichweite nicht. GATHER AUTO wählt notwendige Sammlungen selbst und ignoriert verschiedene weitere Aufrufparameter; es ist kein austauschbarer Schalter bei unverändertem Parametersatz. Die Parametererklärung setzt PREFERENCE_OVERRIDES_PARAMETER=FALSE voraus. Präferenzen und Sperren sind vorher objektbezogen zu prüfen.
    ADMINISTRATIVES PRAXISBEISPIEL
    -- ADMINISTRATIVES LERNBEISPIEL: verändert Statistiken, nicht Diagnose!
    -- Nur nach Prüfung der betroffenen SQL und des genehmigten Schemas.
    -- APP_DEMO ist ein fiktiver, vor Verwendung ausdrücklich zu ersetzender Name.
    WHENEVER SQLERROR EXIT FAILURE
    SET SERVEROUTPUT ON
    BEGIN
      DBMS_STATS.GATHER_SCHEMA_STATS(
        ownname          => 'APP_DEMO',
        estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
        cascade          => TRUE,
        method_opt       => 'FOR ALL COLUMNS SIZE AUTO',
        options          => 'GATHER',
        degree           => 1
      );
      DBMS_OUTPUT.PUT_LINE('Statistiksammlung abgeschlossen.');
    END;
    /

    24. Was bedeuten die Parameter?

    ParameterEinfach erklärt
    ownnameWelches Schema wird bearbeitet?
    estimate_percentWie groß ist die Stichprobe? AUTO_SAMPLE_SIZE lässt Oracle entscheiden.
    cascadeSollen Indexstatistiken mit erfasst werden?
    method_optWie sollen Spaltenstatistiken und Histogramme behandelt werden?
    optionsGATHER: schemaweite Sammlung; keine Beschränkung auf die zuvor untersuchte Tabelle oder nur stale Objekte.
    degreeWie stark darf die Sammlung parallel arbeiten?

    25. Diagnosekette: Statistikzustand eines Objekts

    1. Objekt bestimmen
    Welche Tabelle beziehungsweise Partition wird untersucht?
    →
    2. Statistikstatus
    NUM_ROWS, LAST_ANALYZED und STALE_STATS lesen.
    →
    3. Änderungen
    DML-Änderungsaktivität und Stale-Einstufung einordnen.
    →
    4. Verteilung
    Spaltenstatistiken und Histogramm-Metadaten betrachten.
    →
    5. Präferenzen
    DBMS_STATS-Präferenzen read-only prüfen, bevor eine Maßnahme geplant wird.
    Merksatz: Langsames SQL bedeutet nicht automatisch: Statistiken neu sammeln.
    Praxisbeispiel: Geschätzte und tatsächliche Zeilenzahl weichen stark voneinander ab

    Beispielbefund: Die Tabellenstatistik nennt NUM_ROWS=1000000 und STALE_STATS=YES. Für die betrachtete Ausführung ist die Trefferzahl wesentlich größer als geschätzt; ein früherer Plan oder ein Wachstumsverlauf ist damit noch nicht nachgewiesen. Im vorhandenen Plan werden 10 Treffer geschätzt, tatsächlich 10000 geliefert.

    1. SQL_ID, Child Cursor und den zum Vorfall passenden Ausführungsumfang festhalten.
    2. Tabellen- und Spaltenstatistiken sowie Änderungsbeobachtung lesen.
    3. Prädikat, Bind-Datentyp und Verteilung der relevanten Statuswerte vergleichen.
    4. Eine begründete Hypothese und einen kontrollierten Prüfplan dokumentieren.

    Musterlösung: Die Fehlabschätzung ist sichtbar; ihre Ursache ist noch nicht allein durch STALE_STATS bewiesen. Ein ungeeigneter Bind-Kontext oder veränderte Verteilung kann ebenfalls beitragen. Statistikänderungen werden erst nach dieser Einordnung geplant.

    26. DBA-Praxis: Statistikzustand read-only untersuchen

    Tabellen- und Spaltenstatistiken stehen bereits in den entsprechenden Diagnoseabschnitten. Hier ergänzt die Indexstatistik den Befund. Ein INDEX-Filter vermeidet das Vermischen mit Indexpartitionen. Die drei Statistikarten werden anschließend zusammen mit der konkreten SQL bewertet.
    Für den gemeinsamen Befund nutze die oben erläuterten Tabellen- und Spaltenstatistiken. Die folgende Abfrage ergänzt die Indexstatistik. Alle drei Quellen werden auf dasselbe Objekt und denselben Diagnosezeitraum bezogen.
    Ziel der folgenden Abfrage:
    Auch Indizes besitzen Optimizer-Statistiken. Diese Abfrage zeigt ihren Statistikstand, ohne daraus bereits eine Performancebewertung abzuleiten.
    READ ONLY – Indexstatistiken
    SELECT owner,
           index_name,
           table_name,
           blevel,
           leaf_blocks,
           distinct_keys,
           clustering_factor,
           num_rows,
           sample_size,
           last_analyzed
    FROM dba_ind_statistics
    WHERE object_type = 'INDEX'
      AND table_owner = UPPER('&OWNER')
      AND table_name  = UPPER('&TABLE_NAME')
    ORDER BY index_name;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileOWNERINDEX_NAMETABLE_NAMEBLEVELLEAF_BLOCKS
    1APP_DEMOBESTELLUNGEN_PKBESTELLUNGEN22500
    ZeileDISTINCT_KEYSCLUSTERING_FACTORNUM_ROWSSAMPLE_SIZELAST_ANALYZED
    11000000900000100000010000002026-10-01 02:00:00

    Was sehe ich hier? Für APP_DEMO.BESTELLUNGEN zeigt der Indexstand 1.000.000 Einträge und unterschiedliche Schlüssel zum selben Statistikzeitpunkt wie die Tabellen- und Spaltenausgabe. Ein hoher CLUSTERING_FACTOR kann bei vielen Tabellenzugriffen über den Index teuer werden; seine Bewertung hängt von der Abfrage ab.

    Wichtig für die Interpretation:

    NUM_ROWS ist eine Statistik und keine Zählung des für eine Abfrage gültigen Lesestands wie COUNT(*).
    LAST_ANALYZED ist ein Zeitpunkt, keine Qualitätsnote.
    STALE_STATS='YES' ist ein Hinweis auf relevante Änderungen, kein Beweis für die Ursache eines langsamen SQL.
    Ein Histogramm ist zusätzliche Verteilungsinformation und nicht automatisch gut oder schlecht.
    DBA-Diagnosekette:

    1. Betroffenes Objekt und konkrete SQL-Auffälligkeit bestimmen.
    2. Tabellen-, Spalten- und gegebenenfalls Indexstatistiken read-only prüfen.
    3. LAST_ANALYZED und STALE_STATS im Kontext der Änderungsrate bewerten.
    4. Bei Selektivitätsfragen Datenverteilung und Histogramme einordnen.
    5. Erst im nächsten Schritt E-Rows/A-Rows und Execution Plan untersuchen.
    6. Statistikänderungen niemals allein aufgrund eines einzelnen Kennwerts ableiten.

    27. Typische Fehlannahmen bei Optimizer-Statistiken

    AussageBewertungKorrekte Einordnung
    NUM_ROWS ist die aktuelle exakte Zeilenzahl.FalschNUM_ROWS ist ein Optimizer-Statistikwert.
    LAST_ANALYZED ist alt, also sind die Statistiken schlecht.Zu pauschalEntscheidend ist auch, wie stark sich die Daten seitdem verändert haben.
    Oracle verwendet immer unveränderlich 10 % für stale.Falsch10 % ist der typische Default von STALE_PERCENT; die Präferenz kann abweichen.
    STALE_STATS=YES beweist die Ursache eines Performanceproblems.FalschEs ist ein Statistikzustand, keine Ursachenanalyse.
    Ein Histogramm ist automatisch gut.FalschEs ist zusätzliche Verteilungsinformation und muss im Datenkontext betrachtet werden.
    DBMS_STATS ist read-only.FalschGather-/Set-/Delete-Operationen verändern Optimizer-Statistiken; GET_PREFS liest Voreinstellungen.

    Oracle 19c: DBMS_STATS · Statistik-Präferenzen · Histogramme · Extended Statistics · Änderungszähler

    28. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c SQL Tuning Guide – Optimizer Statistics Concepts
    Tabellen-, Spalten-, Index-, Systemstatistiken, Histogramme und Extended Statistics
    https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/optimizer-statistics-concepts.html

    Oracle Database 19c SQL Tuning Guide – Gathering Optimizer Statistics
    Automatic Statistics, stale statistics, Partitionen und DBMS_STATS
    https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/gathering-optimizer-statistics.html
    Vertiefende Oracle-19c-Quellen: Statistiksammlung und Staleness · Statistikebenen

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Optimizer-Statistiken beschreiben Datenmengen und Datenverteilungen als Grundlage der Planwahl. Sie sind keine Messung der aktuellen Laufzeit einer SQL-Anweisung.
    2. NUM_ROWS ist ein Statistikwert und kein laufend aktualisierter Zeilenzähler. Sammelzeitpunkt, Änderungsumfang und Statistikzustand gehören zur Interpretation dazu.
    3. Selektivität beschreibt, welcher Anteil der Daten voraussichtlich passt; Cardinality die erwartete Zeilenmenge. Fehlerhafte Schätzungen können sich über mehrere Planoperationen verstärken.
    4. Histogramme und Extended Statistics können Verteilungen und Zusammenhänge genauer abbilden. Sie sind gezielte Hilfsmittel und keine pauschale Lösung für jedes Planproblem.
    5. Vor dem Sammeln werden Präferenzen, Sperren und Partitionierung geprüft. Neue Statistiken führen nicht zwangsläufig sofort zu einem neuen Plan für jeden bereits vorhandenen Cursor.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Was sind Optimizer-Statistiken in einem Satz?
    Ein Steckbrief des Datenbestands, den Oracle für die Kostenschätzung von Execution Plans verwendet.
    Frage 2: Ist NUM_ROWS eine Live-Zeilenanzahl?
    Nein. NUM_ROWS ist ein gespeicherter Statistikwert und kann auf einer Stichprobe beruhen; zwischenzeitliche Änderungen müssen darin nicht abgebildet sein.
    Frage 3: Was bedeutet Cardinality?
    Im geschätzten Plan die erwartete Zeilenanzahl eines Schritts. Tatsächlich erfasste Ausgabezeilen werden getrennt als A-Rows betrachtet; bei mehrfach gestarteten Schritten muss der Bezugsumfang passen.
    Frage 4: Warum sind Histogramme nützlich?
    Sie helfen Oracle, ungleichmäßig verteilte Werte besser einzuschätzen.
    Frage 5: Ist DBMS_STATS read-only?
    DBMS_STATS ist ein Package: GATHER-, SET- und DELETE-Operationen verändern Statistiken; GET_PREFS liest Präferenzen. Der konkrete Aufruf entscheidet.
    Frage 6: Was unterscheidet STALE_STATS=NO von NULL?
    NO bedeutet nicht als veraltet eingestuft; NULL bedeutet nicht gesammelte Statistiken. NO garantiert keinen guten Plan.
    Frage 7: Begründet eine auffällige Tabelle eine schemaweite Sammlung?
    Nein. GATHER_SCHEMA_STATS mit GATHER hat einen breiteren Umfang; Ursache und betroffene Objekte müssen zuerst geklärt werden.
    Frage 8: Warum können GET_PREFS und der Sammelaufruf unterschiedliche Werte zeigen?
    GET_PREFS zeigt Voreinstellungen. Explizite Parameter haben normalerweise Vorrang; PREFERENCE_OVERRIDES_PARAMETER=TRUE kehrt dies für entsprechende Präferenzen um.

    10. Optimizer und Ausführungspläne verstehen

    Wie Oracle Zugriffswege auswählt und wie du seine Entscheidungen mit vorhandenen Cursorinformationen nachvollziehst.

    Lernkompass
    Einfach gesagt Der Optimizer entwirft einen Arbeitsplan. Er schätzt, welcher Weg unter den betrachteten Möglichkeiten am günstigsten ist.
    Warum ist das wichtig? Ein langsames SQL lässt sich nicht allein anhand eines Indexnamens beurteilen. Entscheidend ist, welche Datenmengen die einzelnen Operationen tatsächlich verarbeiten.
    Nach diesem Kapitel Du kannst Planentscheidungen begründen, Schätzungen von Messwerten trennen und einen Cursor mit SQL_ID und Child Number gezielt untersuchen.

    Einführung: Der Optimizer wählt für eine SQL-Anweisung einen Ausführungsplan aus den betrachteten Möglichkeiten. Ein solcher Plan beschreibt die Arbeitsschritte, mit denen Oracle das angeforderte Ergebnis ermitteln soll. Die Entscheidung beruht auf Schätzungen und einem Kostenmodell. Ein niedrig geschätzter Aufwand ist daher nicht mit einer garantierten kurzen Laufzeit gleichzusetzen.

    Das Kapitel verbindet die Statistikgrundlagen mit Zugriffspfaden, Joinverfahren und Planentscheidungen. Du lernst, warum unterschiedliche Datenmengen unterschiedliche Arbeitswege rechtfertigen können und wie sich Planung und tatsächliche Ausführung vergleichen lassen. Der Schwerpunkt liegt auf dem Verständnis der Entscheidung. Das ausführliche Lesen verschachtelter Pläne übst du anschließend im Plan-Trainer.

    Oracle 19c: fachliche Grundlage

    Einordnung im Wiki:Kapitel 3 erklärt Parse, Cursor, Execute und Fetch; Kapitel 9 erklärt die Statistikdaten. Hier steht die Entscheidung zwischen Arbeitswegen im Mittelpunkt. Das ausführliche Lesen verschachtelter Pläne und die Übungen findest du im Execution-Plan-Trainer.

    1. Vom SQL-Ergebnis zum Arbeitsplan

    Stelle dir eine Tabelle ORDERS mit einer Million Bestellungen vor. Eine Suche nach einer bestimmten ORDER_ID braucht typischerweise sehr wenige Ergebniszeilen. Ein Monatsbericht kann dagegen einen großen Teil der Tabelle benötigen. Obwohl beide Abfragen dieselbe Tabelle verwenden, unterscheiden sich ihre sinnvollen Arbeitswege.

    Der Optimizer betrachtet unter anderem verfügbare Zugriffspfade, Joinreihenfolgen und Joinmethoden. Außerdem können zulässige Query-Transformationen die interne Form verändern, ohne das fachliche Ergebnis zu verändern. SQL-Text und Plan sind deshalb nicht Zeile für Zeile identisch. Der gewählte Plan ist eine kostenbasierte Entscheidung unter den berücksichtigten Möglichkeiten; er ist kein Beweis, dass es unter jeder späteren Lastsituation keinen besseren Weg geben kann.

    2. Kosten, Cardinality und Selectivity zusammen verstehen

    BegriffRolle bei der EntscheidungBeispiel
    CardinalityGeschätzte Anzahl der von einer Operation gelieferten Zeilen.Ein Filter liefert voraussichtlich 100 Zeilen aus 1.000.000.
    SelectivityGeschätzter Anteil der Zeilen, die ein Prädikat erfüllen.100 / 1.000.000 = 0,0001, also 0,01 %.
    CostInterner Schätzwert für Ressourcenaufwand, beispielsweise I/O und CPU.Der Indexweg wird für diesen Filter mit geringerem Aufwand bewertet als ein umfassender Scan.

    Die Verbindung ist entscheidend: Eine angenommene kleine Ergebnismenge kann einen gezielten Indexzugriff attraktiv machen. Werden später sehr viel mehr Zeilen verarbeitet, kann derselbe Weg zahlreiche Tabellenblockzugriffe verursachen. Ein Schätzfehler kann dadurch nicht nur eine Zahl verändern, sondern die gesamte Joinstrategie beeinflussen.

    Cost ist weder eine Zeit in Sekunden noch eine gemessene CPU-Auslastung. Ein Plan mit Cost 100 muss nicht doppelt so lange laufen wie ein Plan mit Cost 50. Auch ein Vergleich der Kosten verschiedener SQL-Anweisungen ist keine zuverlässige Rangliste ihrer realen Laufzeiten. Gemessene Ausführung und Kostenmodell werden getrennt beurteilt.

    3. Full Table Scan oder Indexzugriff?

    ArbeitswegWann er plausibel sein kannWas zusätzlich zu prüfen ist
    Full Table ScanViele relevante Zeilen, kleine Tabelle oder günstiges sequenzielles Lesen.Gelesene Datenmenge, Filterwirkung, Laufzeit und physische Reads.
    Index Range ScanEin geeigneter Index grenzt eine überschaubare Wertemenge ein.Wie viele Treffer anschließend Tabellenzugriffe benötigen; Datenverteilung und Clustering.
    Index Unique ScanDie Suchbedingungen erlauben eine eindeutige Suche über einen geeigneten eindeutigen Index.Ob alle erforderlichen Bedingungen für diesen Zugriff vorliegen.
    Index ohne anschließenden TabellenzugriffDie benötigten Informationen können bereits aus dem Index gewonnen werden.Welche Spalten wirklich gebraucht werden und welche Indexoperation verwendet wird.

    Ein Index ist ein zusätzlicher Suchweg, keine allgemeine Beschleunigungsgarantie. Wenn viele Treffer über ROWID in verstreuten Tabellenblöcken nachgeladen werden, kann der zusätzliche Aufwand größer sein als bei einem Scan. Der Clustering Factor hilft dem Optimizer einzuschätzen, wie gut Indexreihenfolge und physische Verteilung der Tabellenzeilen zusammenpassen.

    Es gibt keine allgemeingültige Prozentgrenze, ab der Oracle zwingend einen Full Table Scan wählen muss. Tabellenumfang, Zeilenbreite, Cachezustand, Systemstatistiken und die konkret benötigten Spalten wirken zusammen. Beurteile deshalb die beobachtete Arbeit, statt den Namen der Operation als Ampel zu verwenden.

    4. Joinmethoden als unterschiedliche Arbeitsstrategien

    MethodeGrundideeTypische Prüffrage
    Nested LoopsFür jede äußere Zeile wird der passende innere Zugriff ausgeführt.Ist die äußere Ergebnismenge wirklich klein, und ist der innere Zugriff pro Start günstig?
    Hash JoinFür eine Eingabemenge wird eine Hashstruktur aufgebaut; die andere wird damit abgeglichen, mit mindestens einer Gleichheitsbedingung zwischen den Eingaben; zusätzliche Bedingungen sind möglich.Wie groß sind beide Eingaben, und passt die Arbeitsstruktur in den verfügbaren Speicher?
    Sort Merge JoinPassend geordnete Eingaben werden zusammengeführt; erforderlichenfalls werden sie vorher sortiert.Sind die Eingaben bereits günstig geordnet oder verursacht das Sortieren zusätzliche Arbeit?

    Nehmen wir 20 ausgewählte Kunden und einen passenden Index auf ORDERS.CUSTOMER_ID: Nested Loops kann die Bestellungen je Kunde gezielt nachladen. Wenn der äußere Filter stattdessen 200.000 Kunden liefert, wird derselbe innere Zugriff sehr häufig gestartet. Dann ist nicht zwingend jeder einzelne Zugriff teuer; die große Zahl der Wiederholungen kann das Problem erklären.

    Ein Hash Join kann große Gleichheitsverknüpfungen effizient bearbeiten, braucht aber einen Arbeitsbereich. Reicht dessen Speicher nicht aus, kann TEMP hinzukommen. Das ist ein Anlass, Arbeitsspeicher, Datenmenge und Laufzeit zusammen zu betrachten. Sort Merge kann unter anderem bei passenden Ordnungen oder geeigneten Vergleichsbedingungen sinnvoll sein. Keine der drei Methoden ist allein aufgrund ihres Namens gut oder schlecht.

    5. Joinreihenfolge und Prädikate

    Die Reihenfolge beeinflusst, wie viele Zwischenzeilen nachfolgende Operationen verarbeiten. Wird ein wirksamer Filter früh angewendet, kann der Rest des Plans mit einer kleinen Menge arbeiten. Werden zunächst große Mengen verknüpft, kann die Zwischenarbeit erheblich wachsen. Die geschätzten Zeilenmengen sind deshalb auch für die Joinreihenfolge zentral.

    In der Predicate Information eines Plans beschreibt access beispielsweise Bedingungen, mit denen eine Indexsuche oder Joinoperation eingegrenzt wird. filter beschreibt Bedingungen, die an einer Operation zur Auswahl der Zeilen geprüft werden. Ein Filter ist nicht automatisch schlecht; wichtig ist, wie viele Zeilen zuvor verarbeitet werden mussten. Funktionen auf Spalten, implizite Datentypumwandlungen oder unpassende Bind-Datentypen können die nutzbaren Zugriffswege beeinflussen. Eine sichtbare Funktion beweist aber noch nicht, dass kein geeigneter function-based Index vorhanden ist.

    6. Einen konkreten Cursor auswählen

    Ziel der folgenden Abfrage:

    Die Abfrage zeigt die Child Cursor einer bekannten SQL_ID aus dem aktuellen Cursorcache. Sie sucht keine historische Ausführung. Gib eine bereits ermittelte SQL_ID ein; die Beispielkennung ist fiktiv.

    READ ONLY – Child Cursor und kumulierte Messwerte
    SELECT sql_id, child_number, plan_hash_value,
           executions, end_of_fetch_count,
           ROUND(elapsed_time / 1000000, 3) AS elapsed_s_total,
           buffer_gets, disk_reads,
           is_bind_sensitive, is_bind_aware
    FROM   v$sql
    WHERE  sql_id = '&SQL_ID'
    ORDER BY child_number;

    Fiktive Beispielausgabe:

    gekürzte Ergebniszeilen; alle Namen und Werte im Kapitel dienen dem Lernen.

    Geteilte Beispielausgabe: Gleiche Beispielzeile gehört in beiden Teilansichten zusammen. „Beispielzeile“ dient nur der Darstellung und ist keine zusätzliche SQL-Ergebnisspalte.

    Spalten 1–6
    BeispielzeileSQL_IDCHILD_NUMBERPLAN_HASH_VALUEEXECUTIONSEND_OF_FETCH_COUNTELAPSED_S_TOTAL
    17m2q6k9p4xabc0123456789010010012.000
    27m2q6k9p4xabc1234567890120208.000
    Spalten 7–10
    BeispielzeileBUFFER_GETSDISK_READSIS_BIND_SENSITIVEIS_BIND_AWARE
    150000200YN
    2800001000YY

    Die Zahlen schrittweise lesen: Child 0 hat 100 registrierte Ausführungen und kumuliert 12 Sekunden Elapsed Time. Die einfache Durchschnittsrechnung ergibt 12 / 100 = 0,12 Sekunden je registrierter Ausführung. Child 1 ergibt 8 / 20 = 0,4 Sekunden. Das ist eine erste Zusammenfassung der Lebensdauerwerte im Cache, kein Beweis für die Laufzeit einer bestimmten letzten Ausführung.

    Auch BUFFER_GETS und DISK_READS sind hier kumuliert. Unterschiedliche Cursorlebensdauer, Bind-Werte, Ergebnisgrößen, Abbrüche und laufende Ausführungen können den Vergleich verzerren. END_OF_FETCH_COUNT unterstützt die Prüfung, wie viele Ausführungen vollständig bis zum Ende geholt wurden; auch gleiche Zähler garantieren keine identische Arbeitsmenge. Bei paralleler Ausführung hat ELAPSED_TIME zusätzliche Aggregationseigenschaften. Die Beispielrechnung ist für den hier angenommenen seriellen Betrieb gedacht.

    Die verschiedenen PLAN_HASH_VALUE-Werte weisen auf unterschiedliche Planstrukturen hin. Die Kennung ist kein vollständiger Fingerabdruck aller Prädikate, Bind-Werte oder Laufzeitbedingungen. IS_BIND_SENSITIVE und IS_BIND_AWARE beschreiben den Cursorstatus bezüglich Bind-Sensitivität und adaptivem Cursor Sharing; ein Y ist kein Fehlerstatus. Wähle für die nächste Abfrage SQL_ID und CHILD_NUMBER gezielt aus.

    7. Vorhandenen Plan read-only anzeigen

    Ziel der folgenden Abfrage:

    DISPLAY_CURSOR zeigt den bereits vorhandenen Plan des ausgewählten Child Cursors. Die Table Function wird mit SELECT gelesen; es wird kein EXPLAIN PLAN erzeugt und die ursprüngliche Anwendungsabfrage wird nicht ausgeführt.

    READ ONLY – Plan und vorhandene Laufzeitstatistik
    SELECT *
    FROM   TABLE(DBMS_XPLAN.DISPLAY_CURSOR(
             sql_id          => '&SQL_ID',
             cursor_child_no => &CHILD_NUMBER,
             format          => 'ALLSTATS LAST +PREDICATE'));
    Voraussetzung: Benötigt werden passende Rechte für DBMS_XPLAN und seine zugrunde liegenden Views. ALLSTATS LAST zeigt die letzte im Cursor vorhandene Laufzeitstatistik, soweit diese zuvor erhoben wurde. Der Aufruf sammelt keine fehlenden Messwerte nachträglich ein. Wenn A-Rows, Starts oder Buffers fehlen, bleibt die Erklärung auf Schätzungen und Planstruktur begrenzt. Dieses Skript aktiviert keine Statistikparameter und ergänzt keinen Mess-Hint.

    Die Identität ist wichtig: Ein anderer Child Cursor kann einen anderen Plan oder andere Bind-Eigenschaften haben. Die letzte verfügbare Ausführung dieses Cursors muss außerdem nicht die vom Anwender gemeldete langsame Ausführung sein. Kontrolliere den zeitlichen Zusammenhang und lies Notes sowie Predicate Information mit. Adaptive Pläne können inaktive Alternativen enthalten; diese dürfen nicht als vollständig ausgeführte Zusatzarbeit interpretiert werden.

    Für das folgende E-Rows/A-Rows-Beispiel wird die Abfrage vollständig abgearbeitet. Holt eine Anwendung nur einen Teil des Ergebnisses ab, darf die beobachtete Zeilenmenge nicht ungeprüft mit der Schätzung für das vollständige Ergebnis verglichen werden. END_OF_FETCH_COUNT aus Abschnitt 6 hilft bei der Einordnung, identifiziert aber nicht allein den fraglichen Lauf.

    8. Beispiel: Schätzung und gemessene Zeilenmenge

    Was sehe ich hier?

    Ein eigenständiges Lehrbeispiel mit APP_DEMO.ORDERS. Der Index ORDERS_STATUS_IX beginnt mit STATUS; die weiteren benötigten Spalten stehen nicht vollständig im Index. Der Index liefert ROWIDs, über die Oracle die Tabellenzeilen nachliest. :status ist eine Bind-Variable mit passendem Datentyp, im angenommenen Lauf mit dem Wert OPEN.

    READ ONLY – zugrunde liegende Beispielabfrage, nicht ausgeführt
    SELECT order_id, customer_id, order_date
    FROM   app_demo.orders
    WHERE  status = :status;

    Fiktive Beispielausgabe:

    Vereinfachter Planausschnitt, nicht das vollständige DBMS_XPLAN-Textformat. Eigenständiger Lauf; die kumulierten Werte aus Abschnitt 6 gehören nicht zu diesem Beispiel.

    IdOperationNameStartsE-RowsA-RowsBuffersReads
    0SELECT STATEMENT—1—1000024000800
    1TABLE ACCESS BY INDEX ROWIDORDERS1101000024000800
    2INDEX RANGE SCANORDERS_STATUS_IX11010000502

    Spaltenbedeutung: Id identifiziert die Planoperation, nicht ihre chronologische Ausführungsreihenfolge. Operation nennt den Arbeitsschritt und Name das zugehörige Objekt, soweit vorhanden. Starts zählt die Starts einer Operation im betrachteten Messumfang. E-Rows ist ihre geschätzte Ausgabezeilenzahl; A-Rows zeigt die tatsächlich gelieferten Zeilen des Messumfangs. „—“ steht im Beispiel für einen nicht ausgewiesenen Wert.

    Hier startet der Indexzugriff einmal. Geschätzt wurden 10 Treffer, beobachtet wurden 10.000. Die Abweichung beträgt den Faktor 1.000 (10.000 geteilt durch 10). Die Operation über dem Index lädt diese Treffer aus ORDERS nach. Eine sinnvolle erste Hypothese lautet deshalb: Die angenommene Filterwirkung war für diese Ausführung wesentlich zu hoch. Prüfe das konkrete Prädikat, den Datentyp, die verwendeten Bind-Werte und den Statistikbezug. Der Zahlenunterschied beweist noch nicht, dass eine Statistikerneuerung die richtige Maßnahme ist.

    Die 50 Buffers beim Index und 24.000 Buffers bei der Tabellenoperation lenken den Blick auf das Nachladen der Tabellenzeilen. Messwerte übergeordneter Operationen können Arbeit untergeordneter Schritte enthalten. Addiere deshalb nicht alle Zeilen der Anzeige zu einer vermeintlichen Gesamtarbeit. Für diesen Ausschnitt dürfen insbesondere die 24.000 bei Id 0 und Id 1 nicht zweimal gezählt werden.

    Fiktive Predicate Information zum Beispiel:

    2 - access("STATUS"=:STATUS)

    Die 2 verweist auf den INDEX RANGE SCAN. Die Bedingung grenzt die Indexsuche ein. Im dargestellten Fall gibt es keinen zusätzlichen Tabellenfilter. Bei einer weiteren Bedingung, etwa auf ORDER_DATE, könnte eine filter-Angabe an Operation 1 die dortige zusätzliche Auswahl beschreiben. Das wäre ein anderer Befund: Zugriffseingrenzung und nachgelagerte Auswahl sind getrennt zu lesen.

    9. Starts beachten: häufige innere Zugriffe

    IdOperationNameStartsE-RowsA-Rows
    1NESTED LOOPS—1606000
    2TABLE ACCESS FULLCUSTOMERS1202000
    3INDEX RANGE SCANORDERS_CUSTOMER_IX200036000

    Der äußere Zugriff liefert 2.000 Kunden statt geschätzter 20. Der innere Indexzugriff startet deshalb 2.000-mal und liefert insgesamt 6.000 Zeilen. Für diesen einfachen Fall ergibt A-Rows / Starts = 6.000 / 2.000 = 3 Zeilen pro Start. Die innere Schätzung von 3 Zeilen passt damit zur durchschnittlichen tatsächlichen Trefferzahl pro Start.

    Ein direkter Vergleich „E-Rows 3 gegen A-Rows 6.000“ würde die innere Schätzung irrtümlich als stark falsch darstellen. Das eigentliche frühe Schätzproblem liegt hier beim äußeren Zugriff: Er liefert hundertmal so viele Kunden wie angenommen. Genau dadurch vervielfacht sich die Zahl der inneren Zugriffe. Suche deshalb die erste relevante Abweichung im Datenfluss, bevor du die letzte auffällige Planzeile zum Verursacher erklärst.

    Diese Normalisierung ist eine Interpretationshilfe für den dargestellten einfachen Nested-Loops-Fall. Bei parallelen, adaptiven oder komplexer wiederholt gestarteten Operationen müssen Ausführungsumfang und Planform zusätzlich berücksichtigt werden.

    Im vereinfachten Modell passen 20 geschätzte Kunden mal 3 geschätzte Bestellungen zu 60 geschätzten Join-Zeilen. Reale gerundete Planwerte lassen sich nicht immer so nachrechnen. Der passende Durchschnitt von 3 tatsächlichen Zeilen je Start bedeutet außerdem nicht, dass jeder Kunde genau 3 Bestellungen hat. Für das Beispiel genügt der Index zur Ermittlung der Bestelltreffer; ein zusätzlicher Tabellenzugriff ist nicht dargestellt.

    10. Buffers, Reads und Laufzeit auseinanderhalten

    Buffers beschreibt logische Buffer-Zugriffe im jeweiligen Planmessumfang. Viele logische Zugriffe können CPU und Speicherarbeit verursachen, selbst wenn nur wenige physische Reads nötig sind. Reads bezeichnet physische Lesezugriffe im angezeigten Messkontext; das sind nicht automatisch dieselben Zähler wie DISK_READS aus einer separat gelesenen V$SQL-Zeile. Quelle, Zeitraum und Aggregation müssen zusammenpassen.

    Eine Abfrage mit vielen Buffers und wenigen Reads kann trotzdem langsam sein. Eine Abfrage mit vielen Reads kann bei großem, sinnvoll angefordertem Datenumfang normal sein. Erst die Verbindung mit Laufzeit, gelieferter Datenmenge und gegebenenfalls beobachteten Waits erklärt den Aufwand. Ein warmer Cache kann Reads reduzieren, ohne dass der gewählte Arbeitsweg oder seine logische Arbeit geändert wurde.

    A-Time in einer Plananzeige ist ein Laufzeitmesswert der Operation im dargestellten Umfang. Zeiten verschachtelter Schritte dürfen ebenfalls nicht blind addiert werden. Ein niedriger Cost und eine hohe gemessene Laufzeit sind kein Widerspruch: Das erste ist ein Modellwert, das zweite ein beobachteter Ablauf unter konkreten Bedingungen.

    Merksatz: 24.000 Buffers bedeuten 24.000 logische Zugriffe, nicht zwingend 24.000 unterschiedliche Blöcke. Derselbe Block kann wiederholt angefordert werden.

    AnzeigeBedeutung
    TimeGeschätzte Zeit des Kostenmodells.
    A-TimeGemessene Zeit im dargestellten Ausführungsumfang; verschachtelte Zeiten nicht addieren.

    11. Einzeloperationen mit ihren letzten Messwerten auslesen

    Ziel der folgenden Abfrage:

    Diese alternative Dictionary-Abfrage zeigt die Operationshierarchie und zuletzt vorhandene Messwerte direkt. Sie ist hilfreich, wenn du eine einzelne Zeile gezielt vergleichen möchtest.

    READ ONLY – Letzte vorhandene Row-Source-Messwerte
    SELECT id, parent_id, operation, options,
           object_name, cardinality AS e_rows,
           last_starts AS starts,
           last_output_rows AS a_rows,
           last_cr_buffer_gets + last_cu_buffer_gets AS buffers,
           last_disk_reads AS reads,
           ROUND(last_elapsed_time / 1000000, 3) AS elapsed_s_last
    FROM   v$sql_plan_statistics_all
    WHERE  sql_id = '&SQL_ID'
    AND    child_number = &CHILD_NUMBER
    ORDER BY id;

    Fiktive Beispielausgabe:

    drei ausgewählte Operationen aus dem Beispiel in Abschnitt 8; NULL bezeichnet hier einen nicht ausgewiesenen Wert.

    Geteilte Beispielausgabe: Gleiche Beispielzeile gehört in beiden Teilansichten zusammen. „Beispielzeile“ dient nur der Darstellung und ist keine zusätzliche SQL-Ergebnisspalte.

    Spalten 1–6
    BeispielzeileIDPARENT_IDOPERATIONOPTIONSOBJECT_NAMEE_ROWS
    10NULLSELECT STATEMENTNULLNULLNULL
    210TABLE ACCESSBY INDEX ROWIDORDERS10
    321INDEXRANGE SCANORDERS_STATUS_IX10
    Spalten 7–11
    BeispielzeileSTARTSA_ROWSBUFFERSREADSELAPSED_S_LAST
    1110000240008002.000
    2110000240008002.000
    31100005020.010

    PARENT_ID macht die Beziehung sichtbar: Operation 2 liefert an Operation 1, diese an Operation 0. Die Zusammenfassung von LAST_CR_BUFFER_GETS und LAST_CU_BUFFER_GETS berücksichtigt konsistente und aktuelle Buffer-Zugriffe. Die verwendeten LAST_-Spalten beziehen sich auf den zuletzt verfügbaren Ausführungsumfang dieses Cursors. LAST_ELAPSED_TIME wird von Mikrosekunden in Sekunden umgerechnet. Die beiden übergeordneten Zeiten enthalten überlappende Arbeit und dürfen nicht addiert werden. NULL oder fehlende Messwerte sind keine gesicherte Aussage „keine Arbeit“.

    Die Abfrage ist eine alternative Darstellung der gleichen Messgrundlage, keine unabhängige Gegenmessung zur Plananzeige. Sie erklärt daher die zusätzlichen Spalten und die Hierarchie; die Interpretation der 10 gegenüber 10.000 Zeilen steht bereits in Abschnitt 8. Wenn der Cursor aus dem Cache entfernt wurde, kann die Abfrage keine Zeilen liefern. Das beweist weder einen Fehler der SQL-Anweisung noch, dass sie nie ausgeführt wurde.

    12. Warum derselbe SQL-Text mehrere Pläne haben kann

    Ein Plan entsteht im Kontext seiner Optimizer-Umgebung, Objektmetadaten und Bind-Eigenschaften. Ein späterer Hard Parse kann unter anderen Bedingungen eine andere Entscheidung treffen. Geänderte Statistiken oder Objektstrukturen können ebenfalls relevant sein. Mehrere Child Cursor bedeuten jedoch nicht automatisch mehrere unterschiedliche Planstrukturen; prüfe Child Number, Plananzeige und Kontext gemeinsam.

    Bind Peeking kann beim Hard Parse einen vorhandenen Bind-Wert in die Schätzung einbeziehen. Wenn verschiedene Werte sehr unterschiedliche Trefferzahlen besitzen, kann eine für einen Wert günstige Strategie für einen anderen Wert teuer sein. Adaptive Cursor Sharing kann dafür unterschiedliche geeignete Cursorvarianten entstehen lassen. Das bedeutet nicht, dass Oracle für jeden Bind-Wert zwingend einen neuen Plan erstellt.

    Eine Laufzeitänderung beweist umgekehrt keinen Planwechsel. Derselbe Plan kann mit anderen Ergebnisgrößen, Cachezuständen, I/O-Zeiten oder konkurrierender Last anders laufen. Ein gemeldeter langsamer Lauf muss deshalb sowohl mit seiner Planidentität als auch mit seinem tatsächlichen Ausführungsumfang verbunden werden.

    MechanismusUnterscheidung
    Adaptiver PlanEin Plan enthält alternative Wege; die Ausführung kann anhand beobachteter Datenmengen einen Weg auswählen. Inaktive Alternativen nicht als ausgeführte Arbeit zählen.
    Adaptive Cursor SharingUnterschiedliche Bind-Selektivitäten können zu geeigneten unterschiedlichen Child-Cursor-Varianten führen; nicht zwingend ein Cursor je Wert.

    13. Diagnosekette für eine langsame Abfrage

    1. Konkreten Zeitraum, SQL_ID und gemeldetes Symptom festhalten.
    2. Passenden Child Cursor und vorhandene Planidentität prüfen.
    3. Kontrollieren, ob Laufzeitstatistik verfügbar ist und zur fraglichen Ausführung passt.
    4. Prädikate und den Datenfluss lesen; zuerst die frühe relevante Abweichung von geschätzter zu tatsächlicher Zeilenmenge suchen.
    5. Bei wiederholten Zugriffen Starts berücksichtigen und die Arbeit pro Start von der Zahl der Starts trennen.
    6. Buffers, Reads, Laufzeit und Ergebnisgröße im gleichen Messumfang beurteilen.
    7. Eine konkrete Hypothese formulieren und mit weiteren passenden Beobachtungen prüfen.
    Praxisfall:

    Ein Statusbericht ist heute langsam. Die Planstruktur ist unverändert, aber der Statuswert trifft inzwischen deutlich mehr Bestellungen. Die Plananzeige zeigt weiterhin eine kleine Schätzung und viele Tabellenzugriffe nach dem Index. Dokumentiere die Abweichung und prüfe Datenverteilung, Bind-Kontext und Statistikbezug. Ein pauschales „Index kaputt“ erklärt diese Beobachtung nicht. Maßnahmen werden außerhalb dieses read-only Wikis geplant.

    14. Weiterführende Vertiefung und Quellen

    Statistikdetails stehen in Kapitel 9, Cursor-Sharing im SQL-Verarbeitungskapitel, Workareas im SGA-/PGA-Kapitel und Planübungen im Execution-Plan-Trainer. So bleibt die fachliche Vertiefung jeweils an einer Stelle.

    Oracle 19c: Query Optimizer Concepts, Joins, DBMS_XPLAN, V$SQL_PLAN_STATISTICS_ALL.

    Read-only: Alle Diagnosebeispiele lesen vorhandene Cursorinformationen. Keine Änderung von Parametern oder Statistiken, kein EXPLAIN PLAN, keine automatische Optimierung. Für dieses Kapitel werden keine AWR-, ASH-, ADDM- oder SQL-Monitoring-Berichte verwendet.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Der Optimizer wählt einen Ausführungsplan anhand von Schätzungen. Cost ist eine Vergleichsgröße des Optimizers und keine zugesagte Laufzeit in Millisekunden.
    2. Indexzugriff, Full Table Scan und Joinmethoden sind unterschiedliche Arbeitsstrategien. Ihre Eignung hängt von der konkreten Datenmenge und den Zugriffsbedingungen ab.
    3. Für eine belastbare Analyse muss der passende tatsächlich ausgeführte Cursor gewählt werden. Ein geschätzter Plan allein zeigt keine gemessene Arbeit.
    4. E-Rows, A-Rows und Starts werden gemeinsam gelesen. Fehlende Laufzeitstatistiken oder ein nur teilweise abgeholtes Ergebnis begrenzen die Aussagekraft des Vergleichs.
    5. Buffers, Reads und Laufzeit beschreiben unterschiedliche Aspekte des Aufwands. Die Untersuchung verfolgt, an welcher Planstelle unnötige Arbeit oder eine falsche Schätzung entsteht.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Ist ein Full Table Scan immer ein schlechter Plan?
    Nein. Bei passenden Datenmengen und Zugriffskosten kann er der sinnvolle Weg sein.
    Frage 2: Was sagt Cost 100 über die Laufzeit aus?
    Es ist ein interner Ressourcen-Schätzwert, keine Laufzeit in Sekunden.
    Frage 3: E-Rows 3, A-Rows 6000, Starts 2000: Ist die innere Schätzung zwingend falsch?
    Im einfachen gezeigten Fall werden durchschnittlich 3 Zeilen je Start geliefert. Die Zahl der Starts muss beim Vergleich berücksichtigt werden.
    Frage 4: Erhebt ALLSTATS LAST fehlende Messwerte nachträglich?
    Nein. Es zeigt vorhandene Statistik des Cursors; nicht vorhandene Werte werden dadurch nicht erzeugt.
    Frage 5: Beweist eine höhere Laufzeit einen Planwechsel?
    Nein. Datenmenge, Cachezustand und konkurrierende Last können die Laufzeit desselben Plans verändern.
    Frage 6: Bedeuten 24.000 Buffers 24.000 unterschiedliche Blöcke?
    Nein. Derselbe Block kann mehrfach angefordert werden.
    Frage 7: Darf man A-Time aller Planzeilen addieren?
    Nein. Übergeordnete Operationen können die Zeit ihrer untergeordneten Schritte enthalten.
    Frage 8: Warum kann ein teilweise abgeholtes Ergebnis den Zeilenvergleich verfälschen?
    Die gemessene Arbeit kann nur den abgeholten Teil betreffen, während die Schätzung das vollständige Ergebnis beschreibt.

    11. Transaktionen und Read Consistency verstehen

    Einfach erklärt: Änderungen zusammenhalten und verstehen, was andere Benutzer sehen.

    Lernkompass
    Einfach gesagt Zusammengehörige Änderungen bilden ein Paket. Erst die Bestätigung macht dieses Paket für andere Benutzer sichtbar.
    Warum ist das wichtig? Zwei Benutzer können unterschiedliche Werte sehen, obwohl beide Abfragen korrekt sind. Der Zeitpunkt und die eigene offene Arbeit erklären den Unterschied.
    Nach diesem Kapitel Du verstehst Bestätigen, Zurücknehmen und den festen Lesestand einer Abfrage. Technische Diagnose kannst du bei Bedarf aufklappen.

    Einführung: Eine Transaktion fasst Datenbankarbeit zu einer Einheit zusammen, die bestätigt oder zurückgenommen werden kann. Gleichzeitig benötigen andere Benutzer einen konsistenten Blick auf die Daten. Transaktionskontrolle und Read Consistency lösen diese zusammenhängenden Aufgaben: Die Anwendung legt die Grenzen ihrer Arbeit fest, und Oracle steuert Bestätigung, Rücknahme und Sichtbarkeit innerhalb dieser Regeln.

    Am bestehenden Überweisungsbeispiel verfolgen wir, warum zwei fachlich zusammengehörende Änderungen nicht unabhängig behandelt werden dürfen. Danach werden COMMIT, ROLLBACK, Savepoints und konkurrierende Zugriffe erklärt. Ziel ist, den Unterschied zwischen einer ausgeführten und einer bestätigten Änderung zu verstehen. Die benötigten UNDO-Informationen und ihre Aufbewahrung werden in Kapitel 23 vertieft.

    Oracle 19c: fachliche Grundlage

    1. Was ist eine Transaktion?

    Bei der bestehenden Überweisung werden 100 Euro von einem Konto abgebucht und einem anderen gutgeschrieben. Beide Anweisungen müssen innerhalb derselben fachlichen Arbeitseinheit liegen. Die Datenbank kann die beabsichtigte Zusammengehörigkeit nicht allein aus den beiden Beträgen erkennen.

    Eine Transaktion kann mehrere einzelne Anweisungen enthalten. Eine erfolgreich ausgeführte Änderung ist deshalb nicht automatisch schon dauerhaft bestätigt. Die Anwendung bestimmt, wann das Arbeitspaket abgeschlossen wird. Manche Programme bestätigen automatisch nach jedem Schritt; diese Einstellung heißt Autocommit.

    Fehlerfall zur Überweisung: Das Abbuchen gelingt, das Gutschreiben scheitert. Die erfolgreiche Abbuchung ist dadurch nicht automatisch ebenfalls zurückgenommen. Die Anwendung muss den Fehler behandeln und verhindern, dass anschließend nur die Abbuchung bestätigt wird. Die Datenbank kennt die fachlich zusammengehörigen Schritte nur über die von der Anwendung gesetzten Transaktionsgrenzen.

    2. Bestätigen oder zurücknehmen

    BegriffEinfach erklärt
    COMMIT„Das Paket ist fertig. Übernimm meine Änderungen dauerhaft.“
    ROLLBACK„Nimm meine noch nicht bestätigten Änderungen zurück.“
    SAVEPOINTEine Zwischenmarkierung innerhalb des offenen Pakets.
    ROLLBACK TO SAVEPOINTZur Zwischenmarkierung zurückgehen. Frühere Arbeit des Pakets bleibt offen.

    Ein Savepoint ist wie ein Lesezeichen, nicht wie ein fertig gespeichertes zweites Paket. Erst das abschließende Bestätigen macht die Arbeit dauerhaft. Ein späteres Rollback kann eine bereits bestätigte Überweisung nicht einfach rückgängig machen.

    Diese Begriffe werden hier nur erklärt. Das Wiki führt keine Überweisung, Änderung oder Bestätigung aus.

    3. Was sieht ein anderer Benutzer?

    Rahmen der Geschichte: Beide Sessions arbeiten hier mit READ COMMITTED und lesen dieselbe Datenbank beziehungsweise PDB. Es gibt keine weiteren Änderungen an der Beispielzeile. So lässt sich der Unterschied zwischen eigener offener Arbeit und fremden bestätigten Änderungen eindeutig nachvollziehen.

    Anna und Ben arbeiten mit derselben Datenbank. Der bestätigte Betrag einer Beispielzeile ist 100. Anna ändert ihn auf 120, bestätigt aber noch nicht. Anna sieht ihre eigene Änderung bereits. Ben sieht weiterhin 100.

    Das verhindert, dass Ben einen unfertigen Zwischenstand übernimmt. Bestätigt Anna ihre Änderung, kann Bens danach neu gestartete Abfrage 120 sehen. Nimmt Anna ihre Änderung zurück, bleibt der bestätigte Wert 100.

    SchrittAnnaBen
    AusgangslageLiest 100.Liest 100.
    Änderung noch offenÄndert auf 120 und sieht selbst 120.Eine neue gewöhnliche Abfrage sieht weiterhin 100.
    Anna bestätigtDie Änderung ist übernommen.Eine danach gestartete neue Abfrage sieht 120.

    4. Warum bleibt eine laufende Abfrage beim alten Stand?

    Eine Abfrage soll ein zusammenpassendes Ergebnis liefern. Deshalb liest sie nach festen Regeln einen Datenstand. Stell dir diesen Stand wie eine Momentaufnahme vor. Oracle nennt ihn einen Snapshot; es wird dafür jedoch nicht jedes Mal eine vollständige Kopie aller Tabellen angelegt.

    Ben startet einen langen Bericht, während der Wert noch 100 ist. Anna bestätigt währenddessen 120. Bens bereits laufender Bericht wechselt dadurch nicht mittendrin auf den neuen Stand. Ein danach gestarteter Bericht kann den neuen Wert berücksichtigen.

    Dieses Verhalten heißt Read Consistency, also konsistentes Lesen. „Konsistent“ bedeutet hier: Die Daten passen zu dem für die Abfrage geltenden Stand. Es bedeutet nicht: Jede Anzeige zeigt jederzeit den allerneuesten Wert.

    5. Woher bekommt Oracle den älteren Stand?

    Wenn Daten geändert werden, bewahrt Oracle Informationen zum früheren Zustand auf. Diese Informationen heißen UNDO. Sie helfen sowohl beim Zurücknehmen offener Änderungen als auch beim Lesen eines passenden älteren Standes.

    Oracle ordnet Datenstände mit einer internen Nummer ein, der SCN. Du kannst sie dir als logische Fortschrittsmarke vorstellen. Sie ist keine Uhrzeit und wird nicht in Sekunden gemessen. Für das Grundverständnis reicht: Oracle kann erkennen, welche Version zur Abfrage gehört.

    Wie UNDO gespeichert wird, erklärt das UNDO-Kapitel. Hier bleibt der Schwerpunkt auf dem sichtbaren Verhalten.

    COMMIT beendet die Transaktion, entfernt aber nicht sofort alle zugehörigen UNDO-Informationen. Bereits laufende Abfragen können diese älteren Informationen weiterhin brauchen. Ihre spätere Wiederverwendung hängt von UNDO-Verwaltung, Retention und verfügbarem Platz ab.

    6. Warum antworten zwei Abfragen manchmal unterschiedlich?

    Im üblichen Oracle-Verhalten bekommt jede neue Abfrage ihren eigenen Lesestand. Die erste Abfrage von Ben kann 100 zeigen. Bestätigt Anna danach 120, kann Bens zweite Abfrage 120 zeigen. Beide Ergebnisse sind richtig für ihren jeweiligen Zeitpunkt.

    Konsistent lesen verhindert nicht jedes Überschreiben. Die Lesesicht schützt den Zusammenhang einer Abfrage. Sie reserviert die gelesenen Zeilen aber nicht automatisch für eine spätere Änderung. Wenn eine Anwendung erst liest und später einen aus diesem alten Stand berechneten Wert zurückschreibt, kann sie inzwischen bestätigte Änderungen überdecken. Oracle bezeichnet dieses Anwendungsproblem als Lost Update. Eine passende Konfliktprüfung beim Schreiben oder eine bewusst eingesetzte Sperrstrategie gehört deshalb zum Transaktionsentwurf. ACID und automatisch vergebene Row Locks ersetzen diese fachliche Entscheidung nicht. Oracle 19c.

    Der Fachname für dieses übliche Verhalten ist READ COMMITTED: Gelesen werden bestätigte Daten, wobei die eigene offene Arbeit der jeweiligen Session berücksichtigt wird. Eine Session ist der logische Arbeitskontext einer Anmeldung in Oracle. Die Verbindung ist der Kommunikationsweg zur Instanz; beides ist technisch zu unterscheiden. Im einfachen Beispiel arbeitet jede Verbindung mit einer Session.

    Es gibt auch Arbeitsweisen, die mehrere Abfragen innerhalb eines Arbeitspakets auf einen gemeinsamen älteren Stand beziehen. Dazu gehört SERIALIZABLE. Wenn dort eine konkurrierende Änderung nicht passt, kann Oracle einen Konflikt melden. Die Anwendung muss damit richtig umgehen. Das ist ein Vertiefungsthema, keine Voraussetzung für die ersten Beispiele.

    7. Was bedeutet ACID?

    ACID ist eine Abkürzung für vier Eigenschaften von Transaktionen. Die Namen sind englisch; die Grundidee ist einfach:

    EigenschaftMerksatz
    Atomicity – als EinheitDie Überweisung soll nicht nur zur Hälfte dauerhaft werden.
    Consistency – Regeln einhaltenGültige Datenregeln sollen erhalten bleiben; fachliche Regeln muss die Anwendung korrekt umsetzen.
    Isolation – Arbeit voneinander trennenAndere Benutzer sehen nicht einfach fremde unfertige Änderungen.
    Durability – dauerhaftBeim üblichen synchronen Commit ist erfolgreich bestätigte Arbeit durch dauerhaft geschriebenes Redo abgesichert und nach einem Ausfall wiederherstellbar.

    Die Regeln garantieren nicht, dass jede fachliche Entscheidung richtig ist. Wenn die Anwendung den falschen Empfänger auswählt, kann die Überweisung technisch korrekt und trotzdem fachlich falsch sein.

    8. Warum kann „Snapshot too old“ auftreten?

    Ben liest sehr lange an seinem Bericht. Währenddessen ändern andere Benutzer weiter Daten. Für einige Stellen braucht der Bericht deshalb ältere Informationen. Sind die benötigten alten Informationen nicht mehr verfügbar, kann Oracle den passenden Stand nicht vollständig herstellen.

    Die Meldung heißt ORA-01555: Snapshot too old. Sie bedeutet nicht, dass Ben ein altes Programm benutzt. Es fehlen Informationen für die benötigte ältere Datenversion. Laufzeit, Änderungen im gleichen Zeitraum und UNDO-Situation werden zusammen untersucht.

    Eine einzelne Zahl oder ein häufiger Commit ist keine allgemeine Lösung. Die passende Diagnose steht in der folgenden aufklappbaren Vertiefung.

    9. Für Interessierte: technische Vertiefung

    Transaktionsregeln genauer verstehen

    Eine Transaktion ist eine fachliche Arbeitseinheit

    Eine einzelne Transaktion kann mehrere SQL-Anweisungen enthalten. Umgekehrt ist nicht jede neue SQL-Anweisung automatisch eine neue Transaktion. Eine Anwendung muss ihre Grenzen bewusst festlegen; ein Client mit aktiviertem Autocommit kann diese Grenzen anders setzen als erwartet. Auch erfolgreiche Ausführung und dauerhafte Bestätigung sind zwei verschiedene Zustände.

    Oracle unterstützt zusätzlich die Atomarität einer einzelnen Anweisung: Scheitert eine Anweisung, werden ihre Änderungen zurückgenommen. Frühere erfolgreiche Anweisungen derselben noch offenen Transaktion werden dadurch nicht grundsätzlich ebenfalls rückgängig gemacht. Die Anwendung muss deshalb Fehlerbehandlung und die gesamte fachliche Einheit zusammen betrachten.

    Grenzen von Bestätigung und Teil-Rollback

    Die Grundwirkungen der Transaktionsbefehle stehen in Abschnitt 2. Für die technische Einordnung ist entscheidend: Ein SAVEPOINT bestätigt keine Daten und ersetzt kein Backup; ein ROLLBACK ist keine allgemeine Wiederherstellung beliebiger älterer Datenstände.

    Bei einem Teil-Rollback werden spätere Savepoints und die seit dem Zielpunkt angefallene Arbeit zurückgenommen. Ein abschließendes Commit oder vollständiges Rollback entfernt die Savepoints dieser Transaktion. Ob einzelne Sperren nach einem Teil-Rollback freigegeben werden, hängt mit der zurückgenommenen Arbeit zusammen; Details dazu stehen im Lock-Kapitel.

    Vor syntaktisch gültiger DDL erfolgt ein impliziter Commit, auch wenn ihre Ausführung anschließend scheitert. Nach erfolgreicher DDL folgt ebenfalls ein Commit. Eine erfolglose DDL bedeutet deshalb nicht, dass vorherige offene Änderungen noch rücknehmbar sind. Deshalb darf eine Anwendung DDL nicht so behandeln, als wäre es eine gewöhnliche, später vollständig rücknehmbare DML-Anweisung. Hier werden alle diese Befehle nur erklärt: Es gibt keine kopierbaren Änderungsbeispiele und das Wiki führt sie nicht aus.

    Beim üblichen synchronen Commit wartet die erfolgreiche Rückmeldung auf das dauerhafte Schreiben der zugehörigen Redo-Information. Nicht alle geänderten Datenblöcke müssen dafür bereits in den Datendateien stehen. Asynchrone Commit-Einstellungen haben andere Rückmeldebedingungen. Geht die Verbindung während des Commits verloren, beweist eine fehlende Erfolgsmeldung allein noch keinen Rollback; der Ausgang muss geklärt werden.

    READ COMMITTED und SERIALIZABLE

    EigenschaftREAD COMMITTEDSERIALIZABLE
    LesesichtNeuer Snapshot je gewöhnlicher Anweisung.Transaktionsbezogener Snapshot plus eigene Änderungen.
    Fremde offene ÄnderungenNicht sichtbar.Nicht sichtbar.
    Spätere fremde CommitsFür später gestartete Anweisungen sichtbar.Nicht einfach in die bestehende Transaktionssicht übernommen.
    Konkurrierende ÄnderungSperren und erneute Prüfung beeinflussen den Ablauf.Ein Konflikt kann ORA-08177 verursachen.

    SERIALIZABLE bedeutet nicht, dass Oracle alle beteiligten Sessions physisch nacheinander ausführt. Die Transaktionen laufen weiterhin gleichzeitig, während Oracle die festgelegte Sicht und Konfliktregeln beachtet. Kann eine Änderung in diesem Kontext nicht serialisiert werden, kann ORA-08177 entstehen. Die Anwendung benötigt dafür eine fachlich korrekte Wiederholungs- und Fehlerstrategie; einfach die letzte Anweisung ungeprüft zu wiederholen ist keine allgemeine Lösung.

    Oracle besitzt außerdem read-only Transaktionen mit einer gemeinsamen Lesesicht über mehrere Abfragen. Diese Zusage von SET TRANSACTION READ ONLY gilt laut Oracle nicht für den Benutzer SYS. Das ist eine SQL-Transaktionseigenschaft und darf nicht mit dem read-only Charakter dieses Diagnose-Skripts verwechselt werden. Das Skript setzt keinen Isolation Level und startet keine solche Transaktion.

    Offene Transaktionen erkennen – SELECT und Beispiel

    Aktive Transaktionen Sessions zuordnen

    Was beantwortet die Abfrage?

    Welche in V$TRANSACTION registrierten Transaktionen sind derzeit einer Benutzer-Session zugeordnet? Die Verknüpfung über die Transaktionsadresse ist wichtiger als der Sessionstatus allein.

    READ ONLY – Transaktion, Session und UNDO-Nutzung
    SELECT s.sid, s.serial#, s.username,
           s.status AS session_status,
           t.xidusn || '.' || t.xidslot || '.' || t.xidsqn AS xid,
           TO_CHAR(t.start_date, 'DD.MM.YYYY HH24:MI:SS') AS start_time,
           t.used_ublk, t.used_urec
    FROM   v$session s
    JOIN   v$transaction t ON t.addr = s.taddr
    WHERE  s.type = 'USER'
    ORDER BY t.start_date, s.sid;

    Fiktive Beispielausgabe:

    zwei ausgewählte Sessions.

    SIDSERIAL#USERNAMESESSION_STATUSXIDSTART_TIMEUSED_UBLKUSED_UREC
    1258123APP_USERINACTIVE7.12.345630.09.2026 04:10:0024180
    2094731BATCH_USERACTIVE9.5.781230.09.2026 04:35:003205400

    Spalten lesen: SID und SERIAL# identifizieren die aktuell betrachtete Session. USERNAME ordnet sie einem Datenbankbenutzer zu. SESSION_STATUS beschreibt die aktuelle Sessionaktivität, nicht den Bestätigungszustand ihrer Änderungen. XID kombiniert die Bestandteile der Transaktionskennung. START_TIME ist hier die formatierte START_DATE der registrierten Transaktion, nicht der erste Login. Sortiert wird nach dem DATE-Wert START_DATE, nicht nach der Zeichenkette V$TRANSACTION.START_TIME; so bleibt die Reihenfolge auch über Datumsgrenzen chronologisch.

    USED_UBLK und USED_UREC zeigen verwendete UNDO-Blöcke beziehungsweise UNDO-Records dieser Transaktion. Sie sind keine Zeilenzähler der Anwendung und USED_UBLK ist kein MB-Wert. Eine Umrechnung in Bytes braucht die passende UNDO-Blockgröße; ein pauschales Gleichsetzen mit Zeilen oder Nettodaten wäre falsch.

    SID 125 ist INACTIVE und besitzt trotzdem eine Transaktion. Die Anwendung kann nach einer Änderung gerade auf Benutzereingaben warten, ohne bestätigt zu haben. SID 209 arbeitet aktiv und verwendet mehr UNDO; daraus allein folgt keine Störung. Erst Alter, Anwendungskontext, Fortschritt und mögliche Sperrwirkung ergeben eine Bewertung.

    Grenze: V$TRANSACTION ist keine vollständige Liste aller fachlichen oder ausschließlich lesenden Transaktionen. Keine Ergebniszeile beweist daher nicht, dass keine Abfrage läuft. Die Views sind Momentaufnahmen und können sich während der Diagnose ändern. Benötigt werden passende Leserechte; in Multitenant muss der Containerkontext berücksichtigt werden.
    Eine SCN ansehen – SELECT und Beispiel

    Eine beobachtete SCN richtig einordnen

    READ ONLY – Aktuelle Datenbank-SCN
    SELECT name, current_scn
    FROM   v$database;

    Fiktive Beispielausgabe:

    NAMECURRENT_SCN
    DEMODB8450123456

    NAME bezeichnet die Datenbank; CURRENT_SCN ist ihre zum Lesen der View beobachtete aktuelle SCN. Diese Zahl hilft, den Begriff als logische Fortschrittsmarke zu verstehen. Die Ausgabe nennt nicht automatisch die Snapshot-SCN einer bestimmten bereits laufenden Anwendungsabfrage.

    Wenn du die View später nochmals liest, kann der Wert weitergestiegen sein. Eine Differenz von 1.000 SCNs ist aber keine Dauer von 1.000 Sekunden und kein Beweis für 1.000 fachliche Transaktionen. Auch in einer PDB ist V$DATABASE nicht mit einer eigenständigen Datenbankidentität der PDB gleichzusetzen. Für eine konkrete Lesesicht sind Abfrage, Transaktionskontext und Zeitpunkt erforderlich.

    UNDO und ORA-01555 prüfen – SELECT und Beispiel

    UNDO-Intervalle zum Fehlerzeitraum lesen

    Was beantwortet die Abfrage?

    Welche UNDO-Nutzung, langen Abfragen und registrierten ORA-01555-Ereignisse lagen in den jüngsten Intervallen vor? Gezeigt werden sechs ausgewählte Intervalle, nicht alle Ereignisdetails.

    READ ONLY – UNDO-Nutzung und Snapshot-too-old-Zähler
    SELECT TO_CHAR(begin_time, 'DD.MM.YYYY HH24:MI') AS interval_start,
           TO_CHAR(end_time, 'DD.MM.YYYY HH24:MI') AS interval_end,
           undoblks, txncount, maxquerylen,
           tuned_undoretention, ssolderrcnt, nospaceerrcnt,
           maxqueryid
    FROM   v$undostat
    ORDER BY begin_time DESC
    FETCH FIRST 6 ROWS ONLY;

    Fiktive Beispielausgabe:

    zwei der sechs angeforderten Intervalle.

    ZeileINTERVAL_STARTINTERVAL_ENDUNDOBLKSTXNCOUNTMAXQUERYLEN
    130.09.2026 04:3030.09.2026 04:40800024001800
    230.09.2026 04:2030.09.2026 04:3050001800600
    ZeileTUNED_UNDORETENTIONSSOLDERRCNTNOSPACEERRCNTMAXQUERYID
    11200107m2q6k9p4xabc
    21500008m2q6k9p4xabd

    Die Teilansichten gehören über Zeile zusammen; Zeile ist keine SQL-Ergebnisspalte. Die SQL_IDs sind fiktiv.

    Die Spalten im Detail: UNDOBLKS zeigt im Intervall verbrauchte UNDO-Blöcke und ist weder der aktuelle freie UNDO-Platz noch ein MB-Wert. TXNCOUNT zählt Transaktionen im Intervall. MAXQUERYLEN misst die längste beobachtete Abfragedauer in Sekunden vom Öffnen des Cursors bis zum letzten Fetch beziehungsweise Execute. Berücksichtigt werden im Intervall abgeholte oder ausgeführte Cursor. MAXQUERYID nennt die längste beobachtete SQL, nicht automatisch die von ORA-01555 betroffene SQL. TUNED_UNDORETENTION beschreibt die automatisch bestimmte Retention in Sekunden. SSOLDERRCNT zählt registrierte ORA-01555-Ereignisse; NOSPACEERRCNT zählt UNDO-Platzfehler.

    Die Abfrage kann schon vor dem Zehn-Minuten-Intervall begonnen haben: Die gesamte Dauer muss nicht innerhalb des Intervalls liegen. Im neueren Beispielintervall entsprechen 1.800 Sekunden 30 Minuten Abfragedauer und 1.200 Sekunden 20 Minuten getunter Retention. Gleichzeitig ist ein ORA-01555-Ereignis registriert. Das ist ein plausibler Anlass, die lange Abfrage und die Verfügbarkeit ihrer benötigten Versionen gezielt zu untersuchen. Der Zahlenvergleich beweist weder, welche SQL betroffen war, noch dass genau diese Dauer den Fehler verursacht hat.

    NOSPACEERRCNT = 0 bedeutet hier, dass in diesem Intervall kein solcher Platzfehler gezählt wurde. Es schließt ORA-01555 nicht aus: Benötigte ältere Versionen können fehlen, ohne dass gleichzeitig einer aktuellen Transaktion kein UNDO-Platz zugeordnet werden konnte. Das ältere Intervall mit beiden Fehlerzählern 0 sagt wiederum nur etwas über sein eigenes Zeitfenster.

    V$UNDOSTAT arbeitet gewöhnlich mit zehnminütigen Intervallen; der neueste Eintrag kann noch unvollständig sein. Die Statistikquelle und der Containerkontext müssen zur betrachteten Instanz und Abfrage passen. Die sechs jüngsten Intervalle sind ein Einstieg, kein gezielter Filter für einen älteren Vorfall. Für diesen ist der passende BEGIN_TIME-/END_TIME-Zeitraum zu wählen. Die View hält regulär einen Vier-Tage-Zyklus vor und ist keine Zuordnungsliste einzelner fehlerhafter SQL-Ausführungen.

    10. Ein einfacher Diagnoseweg

    1. Frage zuerst: Geht es um unterschiedliche Anzeigen, eine offene Änderung oder eine Fehlermeldung?
    2. Prüfe, welche Benutzer und Datenbankverbindungen betroffen sind.
    3. Kläre Autocommit-Einstellung und Isolation Level der betroffenen Sessions.
    4. Kläre, wann die Abfragen gestartet und wann Änderungen bestätigt wurden.
    5. Berücksichtige, dass jemand seine eigene offene Änderung schon sehen kann.
    6. Nutze erst danach die passende technische Vertiefung; Sperrprobleme gehören ins Lock-Kapitel.
    Vertiefende Oracle-19c-Quellen: Konsistenz und Isolation

    Oracle 19c: COMMIT · V$TRANSACTION · V$UNDOSTAT · SET TRANSACTION

    11. Weiterführende Informationen

    UNDO und Flashback, Locks und Blockierungen sowie Redo und Recovery vertiefen die technischen Zusammenhänge.

    Oracle 19c: Transactions und Data Concurrency and Consistency.

    Read-only: Die Diagnosebeispiele lesen vorhandene Werte. Alle Änderungen in der Geschichte sind nur erklärt und werden nicht ausgeführt.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Eine Transaktion fasst zusammengehörige Änderungen zu einer Einheit zusammen. COMMIT bestätigt sie, ROLLBACK nimmt noch nicht bestätigte Änderungen zurück.
    2. Andere Sessions sehen unbestätigte Änderungen nicht. Oracle verwendet ältere Datenversionen, damit eine Abfrage einen konsistenten Datenstand lesen kann.
    3. Im üblichen READ-COMMITTED-Modus können zwei nacheinander ausgeführte Abfragen unterschiedliche bestätigte Datenstände sehen. Die Konsistenz einer einzelnen Abfrage bedeutet keine unveränderliche Sicht für die ganze Transaktion.
    4. UNDO ermöglicht unter anderem Rollback und konsistentes Lesen. Fehlen benötigte ältere Versionen, kann eine Abfrage mit ORA-01555 scheitern.
    5. Read Consistency verhindert nicht automatisch jedes Überschreiben zwischenzeitlicher Änderungen. Die Anwendung muss konkurrierende Änderungen passend erkennen oder durch geeignete Sperren koordinieren.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Sieht eine andere Session offene Änderungen mit einer gewöhnlichen Abfrage?
    Nein. Die schreibende Session sieht ihre eigenen Änderungen; andere Sessions lesen nach den geltenden Snapshotregeln.
    Frage 2: Kann eine INACTIVE-Session eine offene Transaktion haben?
    Ja. Sie kann momentan keine SQL ausführen und trotzdem ihre bisherige Arbeit noch nicht bestätigt haben.
    Frage 3: Springt eine laufende Abfrage nach einem fremden Commit auf den neuesten Stand?
    Nein. Ihr Snapshot bleibt bestehen; eine neue Anweisung unter READ COMMITTED kann einen neueren Stand sehen.
    Frage 4: Ist ein Savepoint eine dauerhaft bestätigte Teiltransaktion?
    Nein. Er markiert einen Rückkehrpunkt innerhalb der noch laufenden Transaktion.
    Frage 5: Beweist SSOLDERRCNT = 1, welche SQL fehlerhaft war?
    Nein. Es ist ein Intervallzähler. Die konkrete SQL und das Fehlerereignis müssen zusätzlich zugeordnet werden.
    Frage 6: Wird beim Scheitern der zweiten Anweisung immer die ganze Transaktion zurückgenommen?
    Nein. Frühere erfolgreiche Arbeit kann offen bleiben; die Anwendung muss die fachliche Einheit korrekt behandeln.
    Frage 7: Kann erfolglose DDL vorherige Änderungen bereits bestätigt haben?
    Ja. Vor syntaktisch gültiger DDL erfolgt ein impliziter Commit, auch wenn die Ausführung danach scheitert.
    Frage 8: Warum kann MAXQUERYLEN länger als das Statistikintervall sein?
    Ein im Intervall abgeholter oder ausgeführter Cursor kann bereits vorher geöffnet worden sein.

    12. Benutzer, Rollen und Berechtigungen – Rechtestrukturen wirklich verstehen

    Wie Oracle Identität, Schema, Anmeldung und Berechtigungen trennt und wie daraus ein kontrollierbares Sicherheitsmodell entsteht.

    Lernkompass
    Einfach gesagt Du lernst, wie Oracle Benutzer, Rollen sowie System- und Objektberechtigungen voneinander trennt.
    Warum ist das wichtig? Bei Zugriffsproblemen muss nachvollziehbar sein, ob eine Anmeldung scheitert, ein Privileg fehlt, ein Recht über eine Rolle kommt oder der Zugriff auf ein konkretes Objekt nicht erlaubt ist.
    Nach diesem Kapitel Du kannst Benutzerstatus, Rollen, Systemprivilegien und Objektprivilegien read-only untersuchen und einen Berechtigungspfad nachvollziehen.

    Einführung: Ein Datenbankzugriff benötigt eine Identität und die zur Aufgabe passenden Berechtigungen. Ein Konto beantwortet, wer handelt; Privilegien erlauben bestimmte Aktionen, und Rollen bündeln solche Rechte. Das Schema bezeichnet die zu einem Benutzer gehörenden Objekte. Diese Begriffe hängen zusammen, sind aber für die Analyse eines fehlgeschlagenen Zugriffs getrennt zu betrachten.

    Das Kapitel führt vom Benutzerkonto über direkte und rollenbasierte Rechte bis zum Ausführungskontext von Programmen. An der bestehenden Berichtsanwendung wird untersucht, wie eine Berechtigung zustande kommt und welche Informationen eine Prüfung benötigt. Danach kannst du eine Rechteanforderung präzise formulieren, ohne aus einem einzelnen Fehler vorschnell weitreichende Administratorrechte abzuleiten.

    Oracle 19c: fachliche Grundlage

    Für die Analyse hilft ein einfaches Modell: Wer? beschreibt Benutzer und Authentifizierung. Was darf er grundsätzlich? betrifft Systemprivilegien. Auf welches konkrete Objekt darf er zugreifen? betrifft Objektprivilegien. Wie wurde das Recht zugewiesen? führt zu direkten Grants oder Rollen.

    Grundidee: Ein Benutzer beantwortet die Frage „Wer bin ich?“. Rollen und Privilegien beantworten die Frage „Was darf ich?“. Das Schema beantwortet die Frage „Welche Objekte gehören mir?“.

    1. Benutzer, Schema und Account unterscheiden

    Ein Oracle-Benutzer ist eine Datenbankidentität, die authentifiziert und mit Privilegien ausgestattet werden kann. Zu einem Benutzer gehört ein gleichnamiges Schema. Das Schema ist der Namensraum für Objekte, die diesem Benutzer gehören, beispielsweise Tabellen, Views oder Packages.

    Schema-Owner

    Besitzt Tabellen, Views, Packages, Sequences und andere Objekte. Er sollte möglichst nicht als allgemeiner Benutzeraccount verwendet werden.

    Login-/Read-only-User

    Besitzt typischerweise CREATE SESSION und fachliche Rollen, aber keine eigenen Applikationsobjekte.

    2. Authentifizierung und Autorisierung sind zwei getrennte Prüfungen

    Authentifizierung beantwortet die Frage, ob Oracle die Identität eines Benutzers akzeptiert. Autorisierung beantwortet danach, welche Aktionen diese Identität ausführen darf. Ein korrektes Passwort garantiert daher nicht, dass CREATE SESSION vorhanden ist oder ein bestimmtes Objekt gelesen werden darf.

    Bei der Diagnose sollte die Fehlerphase zuerst eingeordnet werden: scheitert bereits die Identitätsprüfung, die Session-Erstellung oder erst der Zugriff auf ein Objekt beziehungsweise eine administrative Aktion?

    3. Warum trennt man Schema-Owner und Login-Benutzer?

    Wenn sich alle Anwender direkt als Objekt-Owner anmelden, besitzen sie automatisch einen sehr großen Wirkungskreis. Eine Trennung erlaubt dagegen, Objektbesitz und Nutzungsrechte sauber auseinanderzuhalten. Das vereinfacht Least Privilege, Passwortwechsel, Auditing und den Entzug einzelner Rechte.

    Warum wichtig? Ein kompromittierter Read-only-Account mit wenigen Rechten ist deutlich weniger gefährlich als ein kompromittierter Schema-Owner, der alle Objekte des Schemas besitzt.

    4. Objekt-Owner besitzt Rechte anders als ein Grantee

    Der Owner eines Schemaobjekts besitzt auf sein eigenes Objekt einen anderen Sicherheitskontext als ein fremder Benutzer, der ein Objektprivileg benötigt. Deshalb sollte bei jeder Rechteanalyse zuerst geklärt werden, wer Owner des betroffenen Objekts ist und unter welchem Benutzer die Operation tatsächlich läuft.

    READ ONLY – Objekt-Owner bestimmen
    SELECT
        owner,
        object_name,
        object_type,
        status
    FROM dba_objects
    WHERE object_name = UPPER('&OBJECT_NAME')
    ORDER BY owner, object_type;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    OWNEROBJECT_NAMEOBJECT_TYPESTATUS
    APPBESTELLUNGENTABLEVALID

    Was sehe ich hier? Für &OBJECT_NAME=BESTELLUNGEN wird das Objekt dem Schema APP zugeordnet. Mehrere Treffer wären möglich, wenn gleichnamige Objekte in unterschiedlichen Schemas existieren.

    5. CREATE USER – mehr als Benutzername und Passwort

    Beim Anlegen eines Benutzers werden neben der Authentifizierung auch Default Tablespace, Temporary Tablespace, Profile und gegebenenfalls Quotas festgelegt. Diese Eigenschaften bestimmen nicht nur, ob sich der Benutzer anmelden kann, sondern auch, wo eigene Segmente entstehen dürfen und welche Accountregeln gelten.

    Das Beispiel beschreibt einen lokalen REPORT_USER in der vorgesehenen PDB APP_PDB. Die administrative Session muss bereits dort arbeiten; es ist kein CREATE-USER-Beispiel für CDB$ROOT. Alle folgenden CREATE-/GRANT-Blöcke sind ausschließlich Lehrtext und werden vom Generator nicht ausgeführt.

    ADMINISTRATIVES LERNBEISPIEL – verändert Benutzer
    CREATE USER REPORT_USER
    IDENTIFIED BY "<individuell_sicher_bereitgestelltes_Kennwort>"
    DEFAULT TABLESPACE USERS
    TEMPORARY TABLESPACE TEMP
    PROFILE DEFAULT
    QUOTA 0 ON USERS;
    Typische Fehlinterpretation: CREATE USER bedeutet nicht, dass der Account sich bereits anmelden oder Objekte anlegen kann. Anmeldung, Objektanlage und Platznutzung werden durch separate Privilegien bzw. Quotas gesteuert.

    6. CREATE SESSION – die Eintrittskarte zur Datenbank

    CREATE SESSION ist das grundlegende Systemprivileg für eine normale Anmeldung. Fehlt es, kann ein Benutzer trotz korrektem Passwort nicht regulär arbeiten. Das macht deutlich, dass Authentifizierung und Autorisierung zwei verschiedene Schritte sind: Oracle kann einen Benutzer kennen, ihm aber trotzdem die Anmeldung verweigern.

    Die CREATE-/GRANT-Beispiele beschreiben einen administrativen Lernablauf. Der Kennwortplatzhalter ist kein verwendbares Beispielkennwort und keine Empfehlung, Geheimnisse in Skripten abzulegen. Voraussetzungen wie Tablespace, Profil, Objekte und ausführende Berechtigungen müssen vorher bestehen.

    ADMINISTRATIVES LERNBEISPIEL – verändert Berechtigungen
    GRANT CREATE SESSION TO REPORT_USER;

    7. Systemprivilegien – Rechte auf Datenbankebene

    Systemprivilegien erlauben Aktionen, die nicht auf ein einzelnes Objekt beschränkt sind. CREATE TABLE erlaubt beispielsweise das Anlegen eigener Tabellen. Besonders kritisch sind Privilegien mit ANY, weil sie oft schemaübergreifend wirken.

    Ein DBA sollte deshalb immer fragen: Ist ein breites Systemprivileg wirklich notwendig oder kann dieselbe Aufgabe mit wenigen gezielten Objektprivilegien gelöst werden?

    8. Objektprivilegien – Rechte auf konkrete Objekte

    Objektprivilegien beziehen sich auf ein bestimmtes Objekt. SELECT ON APP.KUNDE ist wesentlich enger als SELECT ANY TABLE. Genau diese Granularität macht Objektprivilegien für fachliche Rollen besonders geeignet.

    ObjekttypTypische RechteBeispiel
    Tabelle/ViewSELECT, INSERT, UPDATE, DELETEGRANT SELECT ON APP.KUNDE
    PackageEXECUTEGRANT EXECUTE ON APP.PKG_REPORT
    SequenceSELECTGRANT SELECT ON APP.SEQ_X
    DirectoryREAD, WRITEData-Pump-Zugriff
    Systemprivileg und Objektprivileg unterscheiden:

    Systemprivilegien erlauben Aktionen auf Datenbankebene oder auf einer Objektklasse, zum Beispiel CREATE SESSION oder CREATE TABLE.

    Objektprivilegien beziehen sich auf ein konkretes Objekt, zum Beispiel SELECT auf eine bestimmte Tabelle oder EXECUTE auf ein bestimmtes Package.
    PrivilegBedeutung
    READGewöhnliche Abfragen auf dem freigegebenen Objekt; keine SELECT-FOR-UPDATE-Berechtigung aus diesem Grant.
    SELECTErlaubt zusätzlich sperrende Zugriffe wie SELECT FOR UPDATE und LOCK TABLE.

    Für die reine Berichtsanwendung wird im Rollenbeispiel READ verwendet. Beide Rechte erlauben SQL-Abfragen mit SELECT. Ein zusätzlicher SELECT-Grant oder ein anderes weiterreichendes Recht wird durch READ nicht eingeschränkt.

    9. Rollen – warum sie die Administration vereinfachen

    Eine Rolle ist ein benannter Container für Privilegien. Wenn zehn Benutzer dieselben 30 Leserechte benötigen, ist es wesentlich sauberer, diese Rechte einmal einer Rolle zuzuweisen und anschließend die Rolle an zehn Benutzer zu vergeben.

    Ändert sich das fachliche Berechtigungsmodell, wird nur die Rolle angepasst. Dadurch werden Rechte konsistent und leichter auditierbar.

    ADMINISTRATIVES LERNBEISPIEL – verändert Rollen und Berechtigungen
    CREATE ROLE APP_READ_ROLE;
    
    GRANT READ ON APP.KUNDE       TO APP_READ_ROLE;
    GRANT READ ON APP.BESTELLUNGEN TO APP_READ_ROLE;
    GRANT READ ON APP.POSITION    TO APP_READ_ROLE;
    
    GRANT APP_READ_ROLE TO REPORT_USER;

    10. Eine Rechtekette Schritt für Schritt lesen

    REPORT_USER→APP_READ_ROLE→READ→APP.KUNDE

    Der Benutzer REPORT_USER besitzt in diesem Beispiel nicht direkt READ auf APP.KUNDE. Er besitzt die Rolle APP_READ_ROLE, und diese Rolle besitzt das Objektprivileg. Bei einer Rechteanalyse muss deshalb zunächst die Rollenzuweisung und danach der Inhalt der Rolle betrachtet werden.

    11. Rollen-Hierarchien

    Rollen können wiederum Rollen enthalten. Das ist praktisch, kann aber schnell zu mehrstufigen Berechtigungsketten führen. Je tiefer die Verschachtelung, desto schwieriger wird die Frage „Warum darf dieser Benutzer das eigentlich?“ zu beantworten.

    12. Direkte Grants versus Rollen

    Für normale Benutzerrechte sind Rollen meist sinnvoll. Bei Stored PL/SQL mit Definer Rights kann jedoch ein direktes Objektprivileg notwendig sein. Ein interaktiver SELECT kann funktionieren, während eine Prozedur mit ORA-01031 scheitert, weil Rollen in diesem Rechtekontext nicht wie erwartet wirken.

    Praxisfall: Der Programmowner kann interaktiv eine fremde Tabelle über eine Rolle lesen; sein Package kompiliert nicht. Zuerst die konkrete Compile-Meldung und den referenzierten Owner prüfen, danach die benötigten direkten Compile-Rechte. Die AUTHID-Abfrage im nächsten Abschnitt klärt zusätzlich den Laufzeitkontext. Ein Wechsel auf CURRENT_USER ersetzt fehlende Compile-Rechte nicht.
    GRANT OPTION und ADMIN OPTION sind nicht dasselbe:

    WITH GRANT OPTION betrifft Objektprivilegien und erlaubt dem Empfänger, dieses Objektprivileg weiterzugeben.
    WITH ADMIN OPTION wird bei Systemprivilegien beziehungsweise Rollen verwendet und erlaubt deren Weitergabe beziehungsweise Administration im entsprechenden Kontext.

    13. Definer Rights: Rollen des Owners sind im benannten PL/SQL-Block deaktiviert

    Präzisierung für Oracle 19c: Gewöhnliche Owner-Rollen ersetzen bei der Übersetzung gespeicherter statischer SQL keine benötigten direkten Rechte. Das gilt auch für AUTHID CURRENT_USER: AUTHID ändert diese Compile-Prüfung nicht. Codebezogen an Programme vergebene Rollen können gesondert bei Laufzeitprüfungen wirken. Deshalb ist „Rollen wirken in PL/SQL niemals“ zu pauschal.

    Named PL/SQL Units laufen standardmäßig mit Definer Rights, sofern nicht Invoker Rights festgelegt wurden. In einem Definer-Rights-Programm wirken die gewöhnlich aktivierten Benutzerrollen des Owners nicht wie in seiner interaktiven Sitzung. PUBLIC bleibt berücksichtigt; zusätzlich an die Programmeinheit vergebene Rollen sind ein gesonderter Mechanismus (Code Based Access Control). Benötigte Rechte auf referenzierte fremde Objekte müssen deshalb dem Owner in den relevanten Fällen direkt erteilt sein.

    Das erklärt einen klassischen DBA-Fall: Ein Benutzer kann interaktiv eine Tabelle lesen, weil das SELECT über eine Rolle kommt. Derselbe Zugriff kann beim Kompilieren oder Ausführen eines Definer-Rights-Packages scheitern, weil der Package-Owner das Recht nicht direkt besitzt.

    14. Invoker Rights: Rechte des Aufrufers werden relevant

    Invoker Rights ist kein automatischer Reparaturschalter. Zusätzlich können Aufrufkette und INHERIT PRIVILEGES relevant sein. Compile-Fehler und Laufzeitfehler getrennt dokumentieren; die AUTHID-Abfrage allein zeigt noch keinen vollständigen effektiven Berechtigungspfad.

    Ein Programm mit AUTHID CURRENT_USER verwendet Invoker Rights. Hier wird der Sicherheitskontext des Aufrufers relevant; aktivierte Rollen des Invokers können für entsprechende Laufzeitprüfungen wirksam sein. Das ist ein anderes Modell als Definer Rights.

    Bei PL/SQL-Berechtigungsproblemen muss deshalb zuerst festgestellt werden, ob die betroffene Unit als Definer- oder Invoker-Rights-Programm arbeitet. Ohne diese Information kann dieselbe Grant-Liste falsch interpretiert werden.

    READ ONLY – AUTHID eines Programms
    SELECT
        owner,
        object_name,
        procedure_name,
        authid
    FROM dba_procedures
    WHERE owner = UPPER('&OWNER')
      AND object_name = UPPER('&OBJECT_NAME')
    ORDER BY procedure_name;

    Fiktive Beispielausgabe:

    OWNEROBJECT_NAMEPROCEDURE_NAMEAUTHID
    APPBESTELL_APIANLEGENDEFINER
    APPBESTELL_APINULLDEFINER

    Was sehe ich hier? Für &OWNER=APP und &OBJECT_NAME=BESTELL_API zeigt DEFINER die Ausführung mit Definer-Rechten. Die Zeile ohne PROCEDURE_NAME beschreibt das Package selbst; sie ist keine weitere aufrufbare Prozedur.

    15. WITH ADMIN OPTION und WITH GRANT OPTION

    Beide Optionen erlauben Weitergabe, gelten aber für unterschiedliche Rechtearten. WITH ADMIN OPTION betrifft Rollen bzw. Systemprivilegien; WITH GRANT OPTION betrifft Objektprivilegien. Dadurch wird der Empfänger selbst zu einem weiteren Glied in der Berechtigungskette.

    16. PUBLIC – unsichtbare Rechtequelle

    Ein Grant an PUBLIC steht grundsätzlich allen Benutzern zur Verfügung. Deshalb kann ein Benutzer ein Recht besitzen, obwohl weder ein direkter Grant noch eine fachliche Rolle sichtbar ist. PUBLIC-Grants gehören deshalb zwingend in eine vollständige Rechteanalyse.

    17. ANY-Privilegien

    Privilegien wie SELECT ANY TABLE oder EXECUTE ANY PROCEDURE wirken weit über ein einzelnes Anwendungsschema hinaus. Sie sind administrativ bequem, aber sicherheitstechnisch sehr weitreichend. In einem Least-Privilege-Modell sollten sie nur nach bewusster Risikoabwägung vergeben werden.

    18. Tablespace-Quotas verstehen

    Bei verzögerter Segmenterzeugung kann eine Tabellendefinition zunächst ohne zugeordneten Segmentplatz existieren. Ein Quota-Problem kann daher erst beim ersten Einfügen sichtbar werden. Der Default-Tablespace bestimmt keine Quota; TEMP-Platz wird ebenfalls nicht durch eine permanente Tablespace-Quota erklärt.

    CREATE TABLE erlaubt das Erstellen einer Tabelle, aber nicht automatisch die Belegung beliebigen Speicherplatzes. Für permanente Segmente benötigt der Benutzer eine passende Quota oder ein entsprechendes weitreichendes Privileg. ORA-01950 ist deshalb oft kein fehlendes CREATE TABLE, sondern ein Platzberechtigungsproblem.

    READ ONLY – Quota des Objektowners
    SELECT username, tablespace_name,
           ROUND(bytes / 1024 / 1024, 2) AS used_mib,
           CASE WHEN max_bytes = -1 THEN 'UNBEGRENZT'
                ELSE TO_CHAR(ROUND(max_bytes / 1024 / 1024, 2))
           END AS quota_mib
    FROM dba_ts_quotas
    WHERE username = UPPER('&OWNER')
    ORDER BY tablespace_name;

    Fiktive Beispielausgabe:

    USERNAMETABLESPACE_NAMEUSED_MIBQUOTA_MIB
    APPUSERS128512

    Was sehe ich hier? Eigenständiger Speicherfall: APP besitzt 128 MiB belegten Platz bei 512 MiB Quota. MAX_BYTES=-1 würde unbegrenzt bedeuten. Bei Platzanforderungen ist der Owner des zu erweiternden Objekts maßgeblich, nicht automatisch der angemeldete Benutzer.

    READ ONLY – Übersteuernde Speicherberechtigung
    SELECT grantee, privilege, admin_option
    FROM dba_sys_privs
    WHERE grantee = UPPER('&OWNER')
      AND privilege = 'UNLIMITED TABLESPACE';

    Fiktive Beispielausgabe:

    Keine Zeilen im Beispiel für APP.

    UNLIMITED TABLESPACE würde einzelne Quotas übersteuern. Dieses Systemprivileg kann nicht an Rollen erteilt werden. Eine fehlende Quota-Zeile allein beweist deshalb keine fehlende Speicherberechtigung; beide Befunde gehören zusammen. QUOTA 0 ON USERS ist keine globale Read-only-Einstellung.

    19. Profiles und Password Policies

    Profiles beschreiben keine Objektberechtigungen. Sie steuern Account- und Ressourceneigenschaften wie Passwortlaufzeit, Fehlversuche oder Lock-Zeiten. Rollen und Profiles erfüllen damit völlig unterschiedliche Aufgaben.

    20. Account Status lesen

    OPEN, LOCKED, EXPIRED und Kombinationen daraus zeigen, ob ein Account verwendbar ist oder durch Passwort-/Sperrregeln eingeschränkt wird. Bei Login-Problemen sollte der Status zu den ersten read-only Kontrollen gehören.

    Benutzerstatus
    SELECT username,
           account_status,
           lock_date,
           expiry_date,
           default_tablespace,
           temporary_tablespace,
           profile
    FROM dba_users
    WHERE username = UPPER('&USERNAME');

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    USERNAMEACCOUNT_STATUSLOCK_DATEEXPIRY_DATEDEFAULT_TABLESPACE
    REPORT_USEROPENNULL2026-12-01 00:00:00USERS
    TEMPORARY_TABLESPACEPROFILE
    TEMPDEFAULT

    So liest du das Ergebnis: Der Account ist laut Kontostatus offen. Netzwerkzugang, CREATE SESSION und Objektrechte müssen dennoch gesondert stimmen. NULL bei LOCK_DATE beschreibt hier keinen gesetzten Sperrzeitpunkt.

    21. Direkte Rollen ermitteln

    DBA_ROLE_PRIVS
    SELECT grantee,
           granted_role,
           admin_option,
           default_role
    FROM dba_role_privs
    WHERE grantee = UPPER('&USERNAME')
    ORDER BY granted_role;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    GRANTEEGRANTED_ROLEADMIN_OPTIONDEFAULT_ROLE
    REPORT_USERAPP_READ_ROLENOYES

    So liest du das Ergebnis: Die Rolle wird standardmäßig aktiviert, wurde aber nicht mit ADMIN OPTION erteilt. Ihr Name ist keine Berechtigungsliste; im nächsten Schritt wird der Rolleninhalt untersucht.

    22. Aktive Rollen sind nicht dasselbe wie erteilte Rollen

    DBA_ROLE_PRIVS zeigt gespeicherte Rollenzuweisungen. SESSION_ROLES zeigt dagegen Rollen, die in der aktuellen Session wirksam sind. Diese Unterscheidung ist wichtig, weil eine erteilte Rolle nicht in jedem Kontext zwangsläufig aktiv sein muss.

    Auch verschachtelte Rollen erweitern die Security Domain. Eine vollständige Diagnose betrachtet deshalb direkte Rollenzuweisungen, Rollen in Rollen und die im konkreten Ausführungskontext aktivierten Rollen.

    23. Systemprivilegien ermitteln

    DBA_SYS_PRIVS
    SELECT grantee,
           privilege,
           admin_option
    FROM dba_sys_privs
    WHERE grantee = UPPER('&GRANTEE')
    ORDER BY privilege;

    Fiktive Beispielausgabe:

    GRANTEEPRIVILEGEADMIN_OPTION
    REPORT_USERCREATE SESSIONNO

    Was sehe ich hier? Für &GRANTEE=REPORT_USER ist CREATE SESSION direkt vergeben, ohne Weitergaberecht. Die Abfrage zeigt nicht automatisch alle Privilegien aus verschachtelten Rollen.

    24. Objektprivilegien ermitteln

    DBA_TAB_PRIVS enthält Objektgrants, aber keine vollständige Liste spaltenbezogener Rechte. Dafür ist DBA_COL_PRIVS relevant. Ebenso dürfen Eigentümerrechte, passende Systemprivilegien und PUBLIC nicht aus einer leeren direkten Grantliste ausgeschlossen werden.
    DBA_TAB_PRIVS
    SELECT grantee,
           owner,
           table_name,
           privilege,
           grantable
    FROM dba_tab_privs
    WHERE grantee = UPPER('&GRANTEE')
    ORDER BY owner, table_name, privilege;

    Fiktive Beispielausgabe:

    GRANTEEOWNERTABLE_NAMEPRIVILEGEGRANTABLE
    REPORT_USERAPPBESTELLUNGENSELECTNO

    Was sehe ich hier? In diesem eigenständigen Diagnosefall besitzt REPORT_USER zusätzlich einen direkten SELECT-Grant auf APP.BESTELLUNGEN. Dieser Grant wurde ohne GRANT OPTION erteilt. Andere Weitergabebefugnisse, etwa GRANT ANY OBJECT PRIVILEGE, werden dadurch nicht ausgeschlossen. Objektname und Eigentümer gehören zusammen; dies zeigt keine UPDATE-Berechtigung.

    25. Rollen rekursiv auflösen

    Bei verschachtelten Rollen reicht eine einfache Abfrage nach GRANTEE nicht. Die Hierarchie muss aufgelöst werden, damit auch indirekt enthaltene Rollen sichtbar werden.

    Rollenhierarchie
    SELECT LEVEL,
           grantee,
           granted_role,
           admin_option
    FROM dba_role_privs
    START WITH grantee = UPPER('&USERNAME')
    CONNECT BY NOCYCLE PRIOR granted_role = grantee
    ORDER BY LEVEL, grantee, granted_role;

    Fiktive Beispielausgabe:

    LEVELGRANTEEGRANTED_ROLEADMIN_OPTION
    1REPORT_USERAPP_READ_ROLENO
    2APP_READ_ROLEORDER_READ_ROLENO

    So liest du das Ergebnis: Die zweite Zeile zeigt eine eingeschlossene Rolle. Der aktuelle Aktivierungszustand einer bestimmten fremden Anwendungssession ist damit noch nicht festgestellt.

    26. Direkte System- und Objektprivilegien einer Rolle anzeigen

    READ ONLY – Inhalt einer Rolle
    SELECT 'SYSTEM' AS privilege_type,
           grantee,
           privilege,
           CAST(NULL AS VARCHAR2(128)) AS owner,
           CAST(NULL AS VARCHAR2(128)) AS object_name
    FROM dba_sys_privs
    WHERE grantee = UPPER('&ROLE_NAME')
    
    UNION ALL
    
    SELECT 'OBJECT',
           grantee,
           privilege,
           owner,
           table_name
    FROM dba_tab_privs
    WHERE grantee = UPPER('&ROLE_NAME')
    ORDER BY privilege_type, owner, object_name, privilege;

    Fiktive Beispielausgabe:

    PRIVILEGE_TYPEGRANTEEPRIVILEGEOWNEROBJECT_NAME
    OBJECTAPP_READ_ROLEREADAPPBESTELLUNGEN

    Was sehe ich hier? Für &ROLE_NAME=APP_READ_ROLE zeigt der Ausschnitt einen direkten READ-Grant. Die Abfrage könnte zusätzlich direkte Systemrechte liefern; dafür wären OWNER und OBJECT_NAME NULL. CREATE SESSION ist im Hauptbeispiel direkt dem Benutzer erteilt. Weitere enthaltene Rollen werden nicht rekursiv aufgelöst. Spaltenbezogene Objektgrants aus DBA_COL_PRIVS fehlen ebenfalls. Für die gesamte Rechtekette sind diese Quellen ergänzend zu prüfen.

    27. PUBLIC-Grants kontrollieren

    PUBLIC-Objektrechte
    SELECT owner,
           table_name,
           privilege,
           grantable
    FROM dba_tab_privs
    WHERE grantee = 'PUBLIC'
    ORDER BY owner, table_name, privilege;

    Fiktive Beispielausgabe:

    OWNERTABLE_NAMEPRIVILEGEGRANTABLE
    APPPRODUKTKATALOGSELECTNO

    Was sehe ich hier? Ein angenommenes SELECT-Recht für PUBLIC erlaubt allen entsprechenden Datenbankbenutzern den Objektzugriff. Dies ist ein Prüfbeispiel für eine bewusst zu bewertende Vergabe, keine Empfehlung.

    28. Typische Fehlerbilder

    FehlerBedeutungDenkrichtung
    ORA-01045CREATE SESSION fehlt.Anmelderecht prüfen.
    ORA-01031Privileg fehlt oder wirkt in diesem Kontext nicht.Direkter Grant? Rolle? PL/SQL-Kontext?
    ORA-01950Quota fehlt.Tablespace-Quota prüfen.
    ORA-28000Account gesperrt.ACCOUNT_STATUS und Profile untersuchen.

    29. Saubere Rechtestruktur als Praxisbeispiel

    APP (Owner)→APP_READ_ROLE→REPORT_USER

    Der Owner APP besitzt die Objekte. APP_READ_ROLE erhält nur die freigegebenen Leserechte. REPORT_USER besitzt CREATE SESSION und diese Rolle. Dadurch muss REPORT_USER weder Ownerrechte noch breite ANY-Privilegien erhalten.

    30. Diagnoseablauf bei einem Berechtigungsproblem

    31. Common User und Local User in Multitenant

    In einer CDB kommt zur Rechteanalyse die Container-Ebene hinzu. Ein Local User existiert nur in einer bestimmten PDB. Ein Common User ist containerübergreifend bekannt. Ebenso gibt es Common und Local Roles.

    Ein Grant kann lokal für den aktuellen Container oder common für den vorgesehenen Containerbereich gelten. Deshalb ist bei Multitenant-Rechteproblemen die Frage „In welchem Container wurde der Grant erteilt und wo wird er benötigt?“ zwingend.

    READ ONLY – Benutzer und Container-Kontext
    SELECT
        SYS_CONTEXT('USERENV','CON_NAME') AS current_container
    FROM dual;
    
    SELECT
        username,
        common,
        inherited,
        account_status,
        profile
    FROM dba_users
    WHERE username = UPPER('&USERNAME');

    Fiktive Beispielausgabe:

    SELECT 1.

    CURRENT_CONTAINER
    APPPDB

    Einordnung zu SELECT 1: Die erste Abfrage zeigt den aktuellen Container.

    Fiktive Beispielausgabe:

    SELECT 2.

    USERNAMECOMMONINHERITEDACCOUNT_STATUSPROFILE
    REPORT_USERNONOOPENDEFAULT

    Einordnung zu SELECT 2: Für &USERNAME=REPORT_USER ist dies ein lokaler, nicht geerbter Benutzer im Container APPPDB. OPEN bedeutet nicht, dass Netzwerk und alle benötigten Objektberechtigungen bereits stimmen.

    32. CDB_-Views: Grants containerübergreifend untersuchen

    Wenn die Session im Root mit ausreichenden Dictionary-Rechten arbeitet, können CDB_*-Views den Containerkontext sichtbar machen. CON_ID ist dabei entscheidend. Eine reine DBA_*-Abfrage innerhalb einer PDB beantwortet dagegen primär die Sicht dieses Containers.

    READ ONLY – Rollen mit CON_ID
    SELECT
        con_id,
        grantee,
        granted_role,
        admin_option,
        default_role,
        common,
        inherited
    FROM cdb_role_privs
    WHERE grantee = UPPER('&USERNAME')
    ORDER BY con_id, granted_role;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileCON_IDGRANTEEGRANTED_ROLEADMIN_OPTIONDEFAULT_ROLE
    13REPORT_USERAPP_READ_ROLENOYES
    ZeileCOMMONINHERITED
    1NONO

    Was sehe ich hier? Für &USERNAME=REPORT_USER stammt diese sichtbare Rollenzuweisung aus Container 3. Der Umfang einer CDB_-Abfrage hängt von Container, Rechten und Sichtbarkeit ab; eine fehlende Zeile beweist nicht global fehlende Rechte.

    33. Administrative Privilegien nach Aufgaben unterscheiden

    Die Rolle DBA und eine Anmeldung AS SYSDBA sind nicht dasselbe. Normale Rollen gehören zum Berechtigungsmodell einer Datenbanksession; administrative Privilegien ermöglichen besondere Betriebsaufgaben, teilweise auch bei noch nicht geöffneter Datenbank. Der Name des angemeldeten Accounts, der administrative Modus und der aktuelle Container müssen deshalb gemeinsam dokumentiert werden.

    PrivilegTypische AufgabeWichtige Grenze
    SYSDBAUmfassende Datenbankadministration.Sehr weitreichend; kein Standardzugang für normale Anwendungsarbeit.
    SYSOPERBetriebsaufgaben wie Starten, Stoppen und bestimmte Recovery-Aktionen.Kein allgemeines Recht, beliebige Anwendungsdaten zu lesen.
    SYSBACKUPBackup und Recovery mit RMAN beziehungsweise SQL*Plus.Aufgabenspezifisch, aber keineswegs ungefährlich: Der Umfang enthält auch weitreichende Betriebsaktionen.
    SYSDG / SYSKMData-Guard-Aufgaben beziehungsweise TDE-Schlüsselverwaltung.Privileg und Nutzungsberechtigung einer Funktion sind getrennte Fragen; kein automatischer SE2-Funktionsumfang.

    Die Aufgabe lautet: zuerst die Tätigkeit bestimmen, dann das dafür vorgesehene Recht und dessen Geltungsbereich prüfen. Die folgende Bestandsaufnahme liest Password-File-Einträge, vergibt aber keine Rechte.

    SQL*Plus – administrative Lesesitzung im Root der Labor-CDB
    SELECT username, sysdba, sysoper, sysbackup, sysdg, syskm, con_id
    FROM v$pwfile_users
    ORDER BY con_id, username;

    Was sehe ich hier? Die Kennzeichen zeigen administrative Privilegien der Password-File-Einträge. Diese Sicht ist keine vollständige Liste aller Personen mit administrativem Zugriff: Berechtigungen über OS-Gruppen müssen zusätzlich auf dem Host geprüft werden. CON_ID gehört zum Befund. Ein leeres oder nicht zugängliches Ergebnis beweist nicht, dass niemand administrieren darf.

    34. DBA-Praxis: Berechtigungspfad read-only untersuchen

    Bei einem Berechtigungsproblem sollte zuerst der Benutzerstatus geprüft und anschließend nachvollzogen werden, ob ein relevantes Recht direkt oder über eine Rolle erteilt wurde. Die folgenden Abfragen verändern keine Benutzer oder Berechtigungen.

    Kontostatus, direkte System- und Objektrechte sowie Rollenzuweisungen werden mit den oben erläuterten Abfragen gelesen. Die folgende Ergänzung zeigt ausschließlich Rechte und Rollen der eigenen aktuellen Session.
    Ziel der folgenden Abfrage:
    In der eigenen Session zeigen SESSION_PRIVS und SESSION_ROLES, welche Systemprivilegien beziehungsweise Rollen aktuell wirksam sind. Das ist etwas anderes als nur die DBA-seitig gespeicherten Grants zu betrachten.
    READ ONLY – In der aktuellen Session wirksame Rechte
    SELECT privilege
    FROM session_privs
    ORDER BY privilege;
    
    SELECT role
    FROM session_roles
    ORDER BY role;

    Fiktive Beispielausgabe:

    SELECT 1.

    PRIVILEGE
    CREATE SESSION

    Einordnung zu SELECT 1: Die aktuelle Session verfügt hier über das Systemprivileg CREATE SESSION. Objektrechte sind nicht Teil von SESSION_PRIVS.

    Fiktive Beispielausgabe:

    SELECT 2.

    ROLE
    APP_READ_ROLE

    Einordnung zu SELECT 2: APP_READ_ROLE ist in dieser Session aktiviert. Zugewiesene, aber nicht aktivierte Rollen erscheinen hier nicht.

    DBA-Diagnosekette bei Zugriffsproblemen:

    1. Exakte ORA-Meldung und betroffenen Benutzer bestimmen.
    2. Bei Loginproblemen zuerst Authentifizierung und ACCOUNT_STATUS prüfen.
    3. Bei Berechtigungsfehlern das konkrete Objekt beziehungsweise die benötigte Aktion bestimmen.
    4. Direkte System- und Objektprivilegien prüfen.
    5. Rollen und deren Verschachtelung beziehungsweise Wirksamkeit im Ausführungskontext berücksichtigen.
    6. Bei Stored PL/SQL besonders zwischen direkt erteilten Rechten und Rollen unterscheiden.
    7. Erst danach über eine administrative GRANT-/REVOKE-Änderung entscheiden.

    35. Typische Fehlannahmen im Berechtigungsmodell

    AussageBewertungKorrekte Einordnung
    Korrektes Passwort bedeutet, dass der Benutzer arbeiten darf.FalschAuthentifizierung und Autorisierung sind getrennt; CREATE SESSION und weitere Rechte sind separat.
    Eine erteilte Rolle ist in jedem PL/SQL-Kontext wirksam.FalschBei Definer-Rights Named PL/SQL sind Rollen des Owners für die Privilegprüfung deaktiviert.
    Wenn DBA_TAB_PRIVS keinen Grant an den Benutzer zeigt, besitzt er kein Recht.FalschDas Recht kann auch aus Rollen, PUBLIC, Eigentümerbefugnissen oder passenden Systemprivilegien folgen.
    CREATE TABLE reicht immer zum Anlegen einer Tabelle.FalschFür erforderliche Segmentbelegung muss die Speicherberechtigung passen; Definition und tatsächliche Speicherbelegung unterscheiden.
    DBA_ROLE_PRIVS zeigt automatisch alle aktuell wirksamen Rechte einer Session.FalschGespeicherte Grants und aktuell aktivierte Rollen sind unterschiedliche Sichten.
    Ein Grant in einer PDB gilt automatisch in allen PDBs.FalschLocal/Common und der Container des Grants müssen berücksichtigt werden.

    Oracle 19c: READ und SELECT · Grants und Weitergabe · Quotas

    36. OS-Authentifizierung, Password File und Wallet auseinanderhalten

    ZugangswegWas wird geprüft?Typischer Irrtum
    Lokale OS-AuthentifizierungPassende administrative OS-Gruppen und Oracle-Umgebung auf dem Datenbankhost.Ein OS-Login namens oracle ist nicht allein der Nachweis für die konkrete Gruppenzuordnung oder Zielinstanz.
    Password-File-AuthentifizierungAdministrative Berechtigung und Kennwort über das dafür vorgesehene Password File.Das Password File ist nicht die Passwortablage aller gewöhnlichen Anwendungsbenutzer.
    Normale DatenbankanmeldungBenutzer, Authentifizierung, Accountstatus und benötigte Rechte.Ein korrektes Passwort ersetzt CREATE SESSION und Objektprivilegien nicht.
    Client-Wallet / Secure External Password StoreGeschützte Bereitstellung von Zugangsdaten für einen Verbindungsnamen.Ein Wallet verleiht keine zusätzlichen Datenbankrechte.
    SQL*Plus – lesende Kontrolle
    SELECT name, value FROM v$parameter
    WHERE name='remote_login_passwordfile';

    NONE bedeutet, dass Oracle ein Password File für die administrative Authentifizierung ignoriert. EXCLUSIVE erlaubt die dafür vorgesehenen Änderungen an administrativen Benutzereinträgen; SHARED schränkt solche Änderungen ein. Der Parameter allein beweist weder Dateiexistenz noch einen erfolgreichen Login. Dateiablage, Format, Dateirechte und tatsächlicher Zugang sind getrennt zu prüfen. Ein vorhandenes Password File wird nicht probeweise mit ORAPWD überschrieben.

    Bei einer administrativen Anmeldung kann sich das Sitzungsschema vom angegebenen Benutzernamen unterscheiden; insbesondere erfolgt AS SYSDBA im Schema SYS. Halte den ursprünglichen Zugangsweg im Protokoll fest. Kennwörter gehören nicht in Kommandozeilen oder Logs. Wallet-Details in Kapitel 16; normale Anwendungsanmeldungen bleiben von diesem administrativen Modell getrennt.

    37. Ein Benutzerkonto durch seinen Lebenszyklus begleiten

    PhaseArbeitsauftragPrüfbares Ergebnis
    PlanenZweck, Verantwortlichen, PDB, Anmeldeart und notwendige Objekte festlegen.Eine konkrete Aufgabe mit begrenztem Rechteumfang.
    EinrichtenKonto, Profil, Speicherzuordnung und gezielte Grants einrichten.Erlaubter Zugriff gelingt; ein ausdrücklich nicht erlaubter Zugriff scheitert.
    ÄndernNeue Aufgaben und bestehende Abhängigkeiten vergleichen.Zusätzliche Rechte begründet; nicht mehr benötigte Rechte entfernt.
    Kennwort wechselnVerbraucher wie Jobs, Pools und Wallet-Einträge ermitteln und abgestimmt aktualisieren.Eine frische Verbindung des betroffenen Verbrauchers funktioniert; keine Geheimnisse im Nachweis.
    StilllegenNeue Anmeldungen sperren und vorhandene Sessions sowie Hintergrundverwendung gesondert behandeln.Keine unbeabsichtigte Weiterverwendung; Objektbesitz und Aufbewahrung geklärt.
    LöschenErst nach Abhängigkeitsprüfung und gesichertem Umgang mit den Objekten.Gezielter Abbau statt ungeprüftem DROP USER CASCADE.

    Dies ist ein empfohlenes Arbeitsverfahren, keine pauschale Oracle- oder ISO-Freigabe. ACCOUNT LOCK verhindert neue normale Anmeldungen, beendet aber keine bestehenden Sessions. Ein Kennwortwechsel beendet ebenfalls nicht einfach alle laufenden Verbindungen. PASSWORD EXPIRE und ACCOUNT LOCK verfolgen unterschiedliche Ziele. Bei technischen Konten muss auch die Anwendung neue Zugangsdaten verwenden können.

    SQL*Plus – lesende Kontrolle
    SELECT username, account_status, authentication_type, profile,
           default_tablespace, temporary_tablespace, common
    FROM dba_users
    WHERE username IN ('LAB_OWNER','LAB_READER');

    Was sehe ich hier? Kontostatus und Konfiguration in der aktuellen PDB. Aus einem Status OPEN folgt nicht, dass jeder Anwendungsaufruf funktioniert. Aus einem fehlenden Benutzer folgt zunächst nur, dass er in dieser Sicht nicht gefunden wurde. Container, Schreibweise und Leserechte prüfen.

    38. Rechte entziehen und die tatsächliche Wirkung prüfen

    Ein REVOKE entfernt einen bestimmten Berechtigungspfad. Derselbe Zugriff kann weiterhin über eine andere Rolle, einen direkten Grant, PUBLIC oder ein Systemprivileg möglich sein. Dokumentiere deshalb den geprüften Pfad und wiederhole genau den ursprünglichen Zugriff.

    Wird eine Rolle einem Benutzer entzogen, kann eine bereits aktivierte Rolle in dessen laufender Session weiter wirksam bleiben, solange sie aktiviert bleibt. Für eine klare Abnahme prüfst du deshalb eine neue Session und behandelst bestehende Sessions separat. Das ist nicht auf jede Art von REVOKE übertragbar: Der Entzug eines Objektprivilegs besitzt andere Wirksamkeitsregeln. Bei weitergereichten Objektprivilegien können abhängige Grants betroffen sein; der Entzug eines Systemprivilegs bedeutet nicht automatisch das Zurücknehmen aller früher damit erteilten Grants.

    Der Nachweis besteht aus vier Teilen: vorheriger Rechtepfad, gezielte Änderung, Ergebnis mit neuer Verbindung und Bewertung verbleibender Zugangswege. Eine erfolgreiche REVOKE-Meldung allein genügt nicht. Im nächsten Labor wird nur die Rolle des LAB_READER entzogen; der Objektgrant an die Rolle bleibt absichtlich bestehen.

    39. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Security Guide – Privileges and Roles
    System-/Objektprivilegien, Rollen, PUBLIC und Security Domains
    https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/privileges-and-roles.html

    Oracle Database 19c Security Guide – Definer's and Invoker's Rights
    Direkte Grants, Rollenverhalten und AUTHID-Kontext
    https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/definers-rights-and-invokers-rights.html

    Oracle Database 19c Security Guide – Common and Local Roles
    Multitenant-Rechte und Container-Scope
    https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/managing-common-roles-and-local-roles.html
    Rollen und Stored PL/SQL: Compile-Prüfung und Laufzeitkontext getrennt untersuchen. Die Diagnose und Sonderfälle stehen in den Abschnitten 12 bis 14.
    Praxis: Einen Anwendungszugang mit minimalen Rechten aufbauen

    Voraussetzung sind LABPDB sowie LAB_DATA und LAB_TMP aus dem Storage-Labor. Alle folgenden Benutzer und Rollen sind neu und ausschließlich für diese Übung bestimmt. Der Administrator legt sie in LABPDB an; es werden keine gemeinsamen CDB-Benutzer benötigt. LAB_OWNER erstellt Tabellen, LAB_READER darf ausgewählte Daten lesen. Die Passwortplatzhalter müssen vor Verwendung durch eigene Laborpasswörter ersetzt werden; keine echten Passwörter in Mitschnitten, Tickets oder veröffentlichten Skripten hinterlegen.

    1. Administrator: getrennte Aufgaben vergeben

    SQL*Plus als Administrator in LABPDB – Rechte werden verändert
    CREATE USER lab_owner IDENTIFIED BY "<eigenes_Owner_Laborpasswort>"
      DEFAULT TABLESPACE lab_data TEMPORARY TABLESPACE lab_tmp
      QUOTA 16M ON lab_data;
    GRANT CREATE SESSION, CREATE TABLE TO lab_owner;
    CREATE USER lab_reader IDENTIFIED BY "<eigenes_Reader_Laborpasswort>"
      DEFAULT TABLESPACE lab_data TEMPORARY TABLESPACE lab_tmp;
    GRANT CREATE SESSION TO lab_reader;
    CREATE ROLE lab_read_role;
    GRANT lab_read_role TO lab_reader;

    Der Reader erhält weder CREATE TABLE noch eine Quota, weil er keine eigenen Tabellen anlegen soll. Die leere Rolle gewährt noch keinen Zugriff auf die spätere Tabelle. Vergib nicht DBA, um einen fehlgeschlagenen Zugriff abzukürzen.

    2. Owner: kleine Beispieldaten erstellen

    Melde dich über den geprüften LABPDB-Service als LAB_OWNER an; SQL*Plus fragt das Passwort interaktiv ab. Prüfe USER und CON_NAME, bevor du die Tabelle anlegst.

    SQL*Plus als LAB_OWNER – erstellt und befüllt Laborobjekte
    CREATE TABLE lab_order (
      order_id NUMBER CONSTRAINT lab_order_pk PRIMARY KEY,
      customer_name VARCHAR2(40 CHAR) NOT NULL,
      quantity NUMBER CONSTRAINT lab_order_qty_ck CHECK (quantity > 0)
    ) TABLESPACE lab_data;
    INSERT INTO lab_order VALUES (101, 'Alpha', 2);
    INSERT INTO lab_order VALUES (102, 'Beta', 5);
    INSERT INTO lab_order VALUES (103, 'Alpha', 1);
    COMMIT;

    3. Negativtest, gezielter Grant, Positivtest

    Führe als LAB_READER zunächst die folgende Query aus. Ohne weitere Grants ist der Zugriff nicht möglich. Danach gewährt LAB_OWNER der Rolle SELECT; der Reader verbindet sich für einen eindeutigen Rollenkontext erneut.

    SQL*Plus – lesende Kontrolle
    SELECT order_id, customer_name, quantity
    FROM lab_owner.lab_order ORDER BY order_id;
    SQL*Plus als LAB_OWNER – gezieltes Objektprivileg
    GRANT SELECT ON lab_order TO lab_read_role;

    Erwartete Daten nach dem Grant: 101/Alpha/2, 102/Beta/5 und 103/Alpha/1. Der Lernende muss den vollständigen Rechtepfad nennen: Reader → aktive Rolle → SELECT auf LAB_OWNER.LAB_ORDER. Ein Synonym würde nur die Namensauflösung erleichtern und kein fehlendes SELECT-Recht ersetzen.

    4. Nachweise und Fehleranalyse

    SQL*Plus – lesende Kontrolle
    SELECT role FROM session_roles WHERE role='LAB_READ_ROLE';
    SELECT owner, table_name, privilege
    FROM role_tab_privs
    WHERE role='LAB_READ_ROLE' AND owner='LAB_OWNER'
      AND table_name='LAB_ORDER';

    Diese Kontrolle läuft als Reader mit der aktiven Rolle. Stelle als Denkaufgabe die Frage: Würde derselbe Rechtepfad automatisch zur Kompilierung jeder Definer-Rights-Prozedur genügen? Nein; dafür gelten die im Fachkapitel erklärten Regeln zu direkten Rechten und Ausführungskontext. Ein Login-Test allein prüft weder alle Tabellen noch alle Programmwege.

    5. Rollenentzug mit bestehender und neuer Session vergleichen

    Voraussetzung: Der Positivtest aus Schritt 3 gelingt; LAB_READER hat ausschließlich den vorgesehenen Rechtepfad. Lass diese Reader-Session A geöffnet. In der Administrationssitzung in LABPDB entziehst du jetzt die Rolle:

    SQL*Plus – Administrator in LABPDB; Rollenentzug
    REVOKE lab_read_role FROM lab_reader;

    Wiederhole in A die SELECT-Abfrage auf LAB_OWNER.LAB_ORDER. Solange die Rolle dort noch aktiviert ist, kann der Zugriff weiterhin gelingen. Öffne danach eine zweite frische Reader-Session B und prüfe dieselbe Query. Erwartung für B: Anmeldung möglich, Tabellenzugriff ohne anderen Rechtepfad nicht möglich. Typisch ist ORA-00942; die Fehlermeldung allein beweist nicht, dass die Tabelle physisch fehlt.

    SQL*Plus – Administrator: gespeicherte Rollenzuweisung prüfen
    SELECT grantee, granted_role, default_role
    FROM dba_role_privs
    WHERE grantee='LAB_READER';

    Für den Rückweg vergibt der Administrator die Rolle erneut. Beende A und B und prüfe mit einer frischen Reader-Verbindung, dass der Zugriff wieder funktioniert.

    SQL*Plus – Administrator in LABPDB; Laborrechte wiederherstellen
    GRANT lab_read_role TO lab_reader;

    6. Kontosperre von Sessionende unterscheiden

    Lass eine wieder erfolgreich angemeldete Reader-Session geöffnet. Sperre ausschließlich LAB_READER aus der Administrationssitzung:

    SQL*Plus – Administrator in LABPDB; Laborkonto sperren
    ALTER USER lab_reader ACCOUNT LOCK;

    Ein neuer normaler Login muss nun scheitern; die bereits bestehende Session wird dadurch nicht beendet. Prüfe den Kontostatus über DBA_USERS und wiederhole in der bestehenden Session die Abfrage. Dieser Unterschied erklärt, weshalb eine Kontosperre kein vollständiger Nachweis für eine beendete Nutzung ist. Beende die Laborsession selbst; verwende keinen pauschalen KILL-Befehl.

    SQL*Plus – Administrator in LABPDB; Laborzustand wiederherstellen
    ALTER USER lab_reader ACCOUNT UNLOCK;

    Prüfe erneut eine frische Anmeldung und den Tabellenzugriff. Rückgabezustand für Folgeübungen: LAB_READER ist entsperrt, LAB_READ_ROLE wieder vergeben, LAB_OWNER und LAB_ORDER unverändert. Protokolliere die vier Beobachtungen: gespeicherter Grant, aktive alte Session, frische Session und Kontostatus.

    7. Rückweg und Abnahme

    Behalte die Objekte für SQL-, Lock- und Datenladeübungen. Der Administrator entfernt nach deren Abschluss zuerst LAB_READER, dann LAB_OWNER einschließlich seiner Laborobjekte und anschließend LAB_READ_ROLE. Prüfe vor dem Abbau den Container und die Namen; dies ist kein Verfahren für bestehende Anwendungsschemas.

    Beende vor dem Löschen alle Sitzungen der beiden Laborbenutzer. Führe die folgenden Befehle anschließend über die Administrationsverbindung in LABPDB aus.

    SQL*Plus als Administrator in LABPDB – abschließender Laborabbau
    DROP USER lab_reader;
    DROP USER lab_owner CASCADE;
    DROP ROLE lab_read_role;
    Musterlösung und Abnahmekriterien

    Du weist drei verschiedene Ergebnisse nach: Anmeldung möglich, Lesen vor Grant nicht möglich, Lesen nach gezieltem Grant möglich. Du kannst erklären, warum der Reader keine Tabellen-Quota benötigt und welche Rechte der Owner für die Anlage brauchte. Als Transferaufgabe entwirfst du eine zweite Rolle für genau eine weitere Tabelle, ohne pauschale ANY-Privilegien.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Authentifizierung klärt, wer sich anmeldet; Autorisierung, was dieser Benutzer tun darf. Benutzerkonto, Schema und administrative Anmeldung sind getrennt zu betrachten.
    2. Systemprivilegien erlauben bestimmte Aktionen, Objektprivilegien den Zugriff auf konkrete Objekte. Rollen bündeln Rechte, während PUBLIC-Grants allen Benutzern zugutekommen können.
    3. Erteilte Rollen sind nicht automatisch in jedem Ausführungskontext wirksam. Besonders bei Definer-Rights-PL/SQL ist die Unterscheidung zwischen direkten Grants und Rollen entscheidend.
    4. Profile, Account-Status und Tablespace-Quotas steuern unterschiedliche Aspekte eines Kontos. Ein erfolgreicher Login beweist daher noch nicht, dass eine Anwendung alle benötigten Aktionen ausführen kann.
    5. Eine Rechteprüfung verfolgt den vollständigen Berechtigungspfad im richtigen Container. Benötigte Rechte werden gezielt ermittelt, statt Fehler pauschal durch weitreichende DBA- oder ANY-Privilegien zu umgehen.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Warum sollte man Benutzer und Schema fachlich unterscheiden?
    Der Benutzer ist die Identität, das Schema der Namensraum seiner Objekte. Diese Trennung hilft bei Sicherheits- und Berechtigungskonzepten.
    Frage 2: Warum kann ein interaktiver SELECT funktionieren, während PL/SQL mit ORA-01031 scheitert?
    Weil Rollen in bestimmten Definer-Rights-Kontexten nicht wie direkte Objektprivilegien wirken.
    Frage 3: Warum müssen PUBLIC-Grants geprüft werden?
    Weil sie jedem Benutzer Rechte vermitteln können, ohne dass ein direkter Grant auf seinen Namen existiert.
    Frage 4: Zeigt SESSION_ROLES die aktiven Rollen von REPORT_USER, wenn du als DBA verbunden bist?
    Nein. Es zeigt die Rollen der eigenen Session. Eine gespeicherte Zuweisung an REPORT_USER wird getrennt über die Grants untersucht.
    Frage 5: Beseitigt AUTHID CURRENT_USER fehlende Compile-Rechte automatisch?
    Nein. Bei der Übersetzung statischer SQL bleiben die erforderlichen Rechte des Programmowners relevant. Laufzeit- und Compile-Prüfung sind getrennt.
    Frage 6: Was unterscheidet READ von SELECT?
    READ erlaubt gewöhnliche Abfragen. SELECT erlaubt zusätzlich sperrende Zugriffe wie SELECT FOR UPDATE.
    Frage 7: Was belegt GRANTABLE=NO?
    Der gezeigte Grant enthält keine GRANT OPTION. Andere administrative Weitergaberechte sind dadurch nicht ausgeschlossen.
    Frage 8: Warum genügt eine einzelne Quota nicht zur Beurteilung?
    UNLIMITED TABLESPACE übersteuert einzelne Quotas; außerdem müssen Objektowner und tatsächlich benötigter Tablespace stimmen.
    Frage 9: Ist SYSBACKUP eine harmlose Leseberechtigung?

    Nein. Es ist ein auf Backup und Recovery ausgerichtetes administratives Privileg mit weitreichenden Betriebsbefugnissen.

    Frage 10: Beendet ACCOUNT LOCK vorhandene Sessions?

    Nein. Neue normale Anmeldungen werden verhindert. Bestehende Sessions und andere Nutzungspfade müssen gesondert betrachtet werden.

    Frage 11: Warum kann eine Session nach Rollenentzug noch lesen?

    Eine bereits aktivierte Rolle kann in der laufenden Session weiter wirksam bleiben. Der Versuch mit einer frischen Verbindung prüft den neuen Anmeldekontext.

    Frage 12: Erfasst V$PWFILE_USERS alle administrativ berechtigten Personen?

    Nein. OS-Gruppen und weitere Authentifizierungswege müssen zusätzlich geprüft werden.

    13. Multitenant – CDB und PDB verstehen

    Dieses Kapitel erklärt den gemeinsamen Rahmen einer Container Database, die Rolle der Pluggable Databases und die wichtigsten Schritte für den DBA-Alltag.

    Lernkompass
    Einfach gesagt Du lernst das Grundmodell einer Container Database mit CDB$ROOT, PDB$SEED und den eigentlichen Pluggable Databases.
    Warum ist das wichtig? Viele administrative Abfragen und Befehle wirken nur im aktuellen Container. Deshalb muss vor jeder Diagnose klar sein, ob die Session im Root oder in einer bestimmten PDB arbeitet.
    Nach diesem Kapitel Du kannst CDB und PDB unterscheiden, den aktuellen Container bestimmen, PDB-Zustände prüfen und das Öffnen, Schließen sowie SAVE STATE fachlich einordnen.

    Einführung: Stell dir eine Container Database (CDB) zunächst als gemeinsamen Rahmen vor, in dem mehrere getrennte Anwendungsdatenbanken Platz finden. Diese einzelnen Datenbanken heißen Pluggable Databases (PDBs). Eine PDB enthält zum Beispiel die Tabellen und Benutzer einer Anwendung. Die CDB stellt den gemeinsamen Oracle-Unterbau bereit, etwa ihre Oracle-Instanz(en), die Speicherbereiche und Hintergrundprozesse. Eine PDB ist deshalb eine logisch eigene Datenbank für ihre Anwendung, aber keine separat gestartete Oracle-Instanz.

    Am Anfang lernst du die drei Bausteine kennen: den Verwaltungsbereich CDB$ROOT, die Oracle-Vorlage PDB$SEED und die Anwendungs-PDBs. Danach zeigt das Kapitel, wie du den richtigen Container erkennst, PDBs prüfst und verwaltest und eine Anwendung über den passenden Service verbindest. Die Reihenfolge folgt einer einfachen DBA-Frage: Wo bin ich, was sehe ich dort und welche Aktion betrifft genau diesen Container?

    Oracle 19c: fachliche Grundlage

    1. Das Grundmodell: CDB$ROOT, PDB$SEED und PDBs

    Die Abkürzungen beschreiben unterschiedliche Teile derselben CDB. CDB meint den gesamten Rahmen. CDB$ROOT ist nur dessen zentraler Verwaltungscontainer und nicht die ganze CDB. PDB$SEED ist eine von Oracle gelieferte Vorlage. Die übrigen PDBs werden für Anwendungen angelegt.

    In einer Anwendungs-PDB liegen typischerweise die Schemas, Tabellen und weiteren Anwendungsobjekte. Sie hat ihren eigenen logischen Datenbankkontext. Die PDB startet aber keine eigene Instanz: Sie nutzt die Instanz der CDB, einschließlich deren SGA und Hintergrundprozessen wie LGWR. Deshalb teilen sich die PDBs wichtige Laufzeitressourcen, während ihre Anwendungsdaten logisch den jeweiligen PDBs zugeordnet sind.

    Für den Einstieg hilft dieses Bild: Die CDB ist das ganze Gebäude, CDB$ROOT ist die zentrale Verwaltung, PDB$SEED ist die Vorlage für neue Bereiche und jede Anwendungs-PDB ist ein eigener Bereich mit den Daten einer Anwendung. Der Vergleich erklärt die Rollen; er bedeutet nicht, dass jede PDB eigene Hardware oder eine eigene Oracle-Instanz erhält.

    Grundbild:

    CDB – der gemeinsame Oracle-Rahmen
    ├─ CDB$ROOT – zentrale Oracle-Verwaltung
    ├─ PDB$SEED – Vorlage zum Erstellen von PDBs
    ├─ PDB1 – Daten und Benutzer einer Anwendung
    └─ PDB2 – getrennte Daten und Benutzer einer weiteren Anwendung
    Wie viele PDBs sind erlaubt? Für Oracle Database 19c nennt Oracle pro CDB höchstens drei benutzererzeugte PDBs, wenn die kostenpflichtige Oracle-Multitenant-Option nicht lizenziert ist. Das gilt sowohl für SE2 als auch für Enterprise Edition ohne diese kostenpflichtige Option. Mit lizenzierter Oracle-Multitenant-Option sind bei Enterprise Edition bis zu 252 PDBs möglich. CDB$ROOT und die Oracle-Vorlage PDB$SEED zählen nicht als benutzererzeugte PDBs. Die Zahl beschreibt die Lizenzgrenze und ist von der technischen Leistungsfähigkeit des Servers zu unterscheiden; Cloud-Angebote können eigene Bedingungen haben. Vor einem Einsatz sind Edition, Option und Vertragsumfang zu prüfen.
    READ ONLY – CDB erkennen
    SELECT name,
           cdb AS is_cdb,
           open_mode
    FROM v$database;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    NAMEIS_CDBOPEN_MODE
    ORCLYESREAD WRITE

    Was sehe ich hier? IS_CDB=YES kennzeichnet eine Containerdatenbank. Der Öffnungsmodus beantwortet noch nicht, welche einzelnen PDBs geöffnet sind.

    READ ONLY – Container der CDB anzeigen
    SELECT con_id,
           name,
           open_mode
    FROM v$containers
    ORDER BY con_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    CON_IDNAMEOPEN_MODE
    1CDB$ROOTREAD WRITE
    2PDB$SEEDREAD ONLY
    3APP_PDBREAD WRITE
    4TEST_PDBMOUNTED

    So liest du das Ergebnis: Aus dem Root gelesen: Die Seed-PDB ist die Vorlage. TEST_PDB ist geschlossen, obwohl Root und APP_PDB offen sind. Es existieren hier zwei benutzererzeugte PDBs.

    2. In welchem Container bin ich gerade?

    Eine Datenbank-Session arbeitet immer in einem aktuellen Container. Das ist vergleichbar mit dem Bereich, den du gerade ausgewählt hast: Eine Abfrage nach Benutzern oder Tabellen bezieht sich dann auf diesen Kontext. Prüfe ihn vor einer Diagnose oder Änderung, damit du nicht versehentlich im Root statt in der Anwendungs-PDB arbeitest.

    SQL*Plus
    SHOW CON_NAME
    Alternativ per SQL
    SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS current_container
    FROM dual;

    Fiktive Beispielausgabe:

    CURRENT_CONTAINER
    APP_PDB

    Was sehe ich hier? Die aktuelle Session arbeitet in APP_PDB. Vor einem administrativen Eingriff ist dieser Kontext entscheidend; ein gleichnamiges Objekt kann in einer anderen PDB etwas anderes sein.

    3. Welche PDBs gibt es und welchen Status haben sie?

    Nachdem du den eigenen Container geprüft hast, kannst du dir aus dem Root eine Übersicht der PDBs anzeigen lassen. So erkennst du, welche Anwendungsbereiche vorhanden sind und ob sie für ihre Nutzung geöffnet sind.

    Die Bestandsabfragen V$CONTAINERS und V$PDBS werden hier aus CDB$ROOT mit passenden Rechten gelesen. Innerhalb einer PDB ist die Sicht eingeschränkt. MOUNTED beschreibt eine geschlossene PDB, während die CDB-Instanz trotzdem OPEN sein kann. Ein PDB-Zustand ist nicht dasselbe wie V$INSTANCE.STATUS.
    Read-only: PDBs und Open Mode
    SELECT
        con_id,
        name,
        open_mode,
        restricted
    FROM v$pdbs
    ORDER BY con_id;

    Fiktive Beispielausgabe:

    CON_IDNAMEOPEN_MODERESTRICTED
    2PDB$SEEDREAD ONLYNO
    3APP_PDBREAD WRITENO
    4TEST_PDBMOUNTEDNULL

    Was sehe ich hier? Im CDB-Root werden hier die Vorlage und die geöffnete Anwendungs-PDB sichtbar. TEST_PDB ist weiterhin geschlossen. NULL bei RESTRICTED ist hier kein Nachweis eines uneingeschränkten geöffneten Betriebs. Die Sicht aus einer PDB ist eingeschränkt.

    BefundBedeutung
    MOUNTEDPDB geschlossen; kein normaler Anwendungsbetrieb.
    READ ONLYPDB für lesenden Betrieb geöffnet.
    READ WRITEPDB für schreibenden Betrieb geöffnet; Konto, Rechte und Service müssen zusätzlich passen.
    RESTRICTED=YESAnmeldung eingeschränkt; passende RESTRICTED-SESSION-Berechtigung ist zusätzlich relevant.

    4. Was bedeutet CON_ID?

    Wenn Oracle Informationen mehrerer Container gemeinsam ausgibt, muss erkennbar bleiben, zu welchem Container jede Zeile gehört. Dafür dient CON_ID: Sie ist eine technische Nummer, die Oracle einem Container zuordnet.

    CON_ID=1 bezeichnet CDB$ROOT, CON_ID=2 die Seed-PDB. CON_ID=0 steht je nach View für Daten zur gesamten CDB oder für eine Non-CDB. Höhere Werte identifizieren weitere Container; Nummern nicht dauerhaft mit einem Namen gleichsetzen, sondern V$CONTAINERS zur Zuordnung verwenden.
    READ ONLY – aktueller Container
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS con_name,
           SYS_CONTEXT('USERENV','CON_ID') AS con_id
    FROM dual;

    Fiktive Beispielausgabe:

    CON_NAMECON_ID
    APP_PDB3

    So liest du das Ergebnis: Diese Session befindet sich in APP_PDB. Der anschließende administrative Wechsel wäre eine eigene Aktion; die SELECT-Abfrage wechselt nichts.

    5. Von CDB$ROOT in eine PDB wechseln

    Wenn du bereits mit der CDB verbunden bist, kannst du mit einer passenden Berechtigung den Arbeitskontext deiner bestehenden Session auf eine PDB umstellen. Die Verbindung bleibt dieselbe; geändert wird der Container, in dem deine Befehle ausgeführt werden.

    ADMINISTRATIVER SESSIONWECHSEL – nicht read-only
    ALTER SESSION SET CONTAINER = PDB_NAME;

    Dafür muss ein Common User das erforderliche SET CONTAINER-Privileg besitzen, entweder common oder lokal im Zielcontainer. Ein Local User kann damit nicht beliebig in andere PDBs wechseln. Containerwechsel und Neuanmeldung über einen Service sind verschiedene Vorgänge.

    Nach dem Wechsel solltest du mit SHOW CON_NAME kontrollieren, ob du wirklich in der erwarteten PDB arbeitest.

    6. Von einer PDB zurück nach CDB$ROOT

    Für manche Verwaltungsabfragen wechselst du aus der PDB zurück in den Root. Auch hier bleibt die Session bestehen. Prüfe nach dem Wechsel den angezeigten Containernamen, bevor du weitere Befehle ausführst.

    ADMINISTRATIVER SESSIONWECHSEL – nicht read-only
    ALTER SESSION SET CONTAINER = CDB$ROOT;

    7. Eine PDB öffnen

    Die folgenden benannten PDB-Befehle sind Verwaltungsbeispiele aus CDB$ROOT mit passenden administrativen Rechten. PDB_NAME ist zu ersetzen. Vor OPEN oder CLOSE zuerst den tatsächlichen Container und den aktuellen PDB-Zustand prüfen; die Schritte sind keine pauschal nacheinander auszuführende Checkliste.

    Eine PDB besitzt einen eigenen Open Mode. Ist sie nur MOUNTED, steht sie Anwendungen noch nicht normal für Read/Write-Arbeit zur Verfügung. Zum Öffnen wird ALTER PLUGGABLE DATABASE verwendet.

    ADMINISTRATIV – verändert den PDB-Zustand
    ALTER PLUGGABLE DATABASE PDB_NAME OPEN;

    OPEN bedeutet bei einer normalen Primary-CDB standardmäßig READ WRITE. Wenn du bewusst nur lesend öffnen willst, kann OPEN READ ONLY verwendet werden.

    8. Eine PDB schließen

    Das Schließen betrifft die ausgewählte PDB und ihre Anwendungssessions. Es fährt nicht automatisch die ganze CDB herunter. Weil aktive Arbeit betroffen sein kann, ist dieser Befehl eine Verwaltungsaktion und muss gezielt geplant werden.

    ADMINISTRATIV – verändert den PDB-Zustand
    ALTER PLUGGABLE DATABASE PDB_NAME CLOSE IMMEDIATE;

    CLOSE IMMEDIATE trennt Sessions in der betroffenen PDB und rollt offene Transaktionen zurück. Der Rollback kann Zeit benötigen; IMMEDIATE bedeutet nicht, dass der Vorgang unabhängig vom Rollbackaufwand sofort abgeschlossen ist. Der Befehl ist eine Verwaltungsaktion und gehört nicht in read-only Diagnoseabläufe.

    9. Warum ist die PDB nach einem CDB-Neustart wieder geschlossen?

    Für das gezeigte SAVE STATE ist eine Root-Verbindung mit ALTER DATABASE erforderlich. Diese Berechtigung ist etwas anderes als das Recht zum bloßen Containerwechsel.
    SAVE STATE speichert den Öffnungszustand für spätere Instanzstarts; es öffnet eine gerade geschlossene PDB nicht. DISCARD STATE schließt eine aktuell geöffnete PDB nicht. Der gespeicherte Sollzustand lässt sich mit DBA_PDB_SAVED_STATES nachsehen; der tatsächliche Zustand bleibt in V$PDBS zu prüfen.
    ADMINISTRATIV – speichert den gewünschten PDB-Open-State
    ALTER PLUGGABLE DATABASE PDB_NAME SAVE STATE;

    Damit merkt sich Oracle den Open State für nachfolgende CDB-Starts. Mit DISCARD STATE kann dieser gespeicherte Zustand wieder verworfen werden.

    Was beantwortet die Abfrage? Aus dem Root wird der gespeicherte Zustand gelesen. Er ist vom aktuellen OPEN_MODE in V$PDBS zu unterscheiden.

    READ ONLY – Gespeicherter PDB-Zustand
    SELECT con_id, con_name, instance_name, state, restricted
    FROM dba_pdb_saved_states
    ORDER BY con_id, instance_name;

    Fiktive Beispielausgabe:

    CON_IDCON_NAMEINSTANCE_NAMESTATERESTRICTED
    3APP_PDBorclOPENNO

    APP_PDB besitzt in diesem fiktiven Beispiel einen gespeicherten offenen Zustand für die Instanz orcl. STATE ist die Darstellung dieser View, nicht dieselbe Spalte wie V$PDBS.OPEN_MODE. Für TEST_PDB ist kein Eintrag gezeigt; das beweist nicht, dass sie jetzt geschlossen ist. Aktuellen Zustand, gespeicherten Zustand und einen möglichen zusätzlichen Startablauf getrennt prüfen. SAVE STATE startet keinen Listener und garantiert keine Erreichbarkeit eines Anwendungsservices.

    10. Direkt mit einer PDB verbinden oder Container wechseln?

    Für den normalen Anwendungszugriff ist meist eine direkte Verbindung zum Service der PDB sinnvoll. Ein Containerwechsel ist vor allem ein Verwaltungsweg für berechtigte DBAs. Beide Wege führen in den PDB-Kontext, funktionieren aber unterschiedlich: Der Service legt den Zielcontainer beim Verbindungsaufbau fest; ALTER SESSION ändert den Kontext einer bestehenden Session.

    Für den Sessionwechsel ist ein entsprechendes Administrationsrecht erforderlich. Prüfe nach dem Wechsel den aktuellen Container. Anwendungen sollten normalerweise direkt über einen PDB-bezogenen Service verbinden.

    READ ONLY – Container und Service der eigenen Session
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS con_name,
           SYS_CONTEXT('USERENV','SERVICE_NAME') AS service_name
    FROM dual;

    Fiktive Beispielausgabe:

    CON_NAMESERVICE_NAME
    APP_PDBapp_service

    Dieses Beispiel setzt eine direkte Verbindung über app_service voraus. Die Abfrage zeigt die eigene Session und prüft weder fremde Sessions noch die Erreichbarkeit vom Client aus.

    11. Common User und Local User

    Benutzer können entweder für die CDB gemeinsam oder nur für eine einzelne PDB angelegt sein. Diese Unterscheidung beantwortet zunächst, wo die Benutzeridentität gilt. Sie sagt für sich allein noch nicht, welche Daten oder Befehle der Benutzer verwenden darf.

    BenutzertypEinfach erklärt
    CDB Common UserEin Benutzer, dessen Identität innerhalb derselben CDB im Root und ihren PDBs bekannt ist; nicht automatisch in anderen CDBs. Seine Rechte gelten trotzdem nicht automatisch uneingeschränkt in jedem Container.
    Local UserEin Benutzer, der nur in einer bestimmten PDB existiert.

    12. CDB-Views und Container-Kontext

    Oracle stellt Ansichten bereit, mit denen du Verwaltungsinformationen aus einem Container oder aus mehreren Containern abfragen kannst. Welche Zeilen du tatsächlich siehst, hängt neben der View auch von deinem aktuellen Container und deinen Rechten ab.

    Viele klassische DBA_*-Views zeigen Informationen des aktuellen Containers. CDB_*-Views können aus dem Root Informationen mehrerer Container liefern und enthalten dafür typischerweise CON_ID.

    Eine Root-Verbindung macht das Ergebnis nicht automatisch vollständig. Bei Container-Data-Objekten bestimmen Rechte, CONTAINER_DATA und die Zugänglichkeit der Container, welche PDB-Zeilen sichtbar sind. Eine fehlende PDB in einer Objektabfrage beweist deshalb nicht, dass diese PDB oder das Objekt nicht existiert. Für die Bestandsprüfung werden Containerliste und Objektquelle getrennt betrachtet.

    Das ist einer der wichtigsten Multitenant-Lerneffekte: Wenn eine Abfrage „zu wenig“ oder „andere“ Daten zeigt, prüfe zuerst den Container-Kontext.

    13. Kleine DBA-Diagnosekette

    Wenn etwas in einer Anwendung scheinbar fehlt, prüfe zuerst den Ort der Abfrage. Arbeite dich dann Schritt für Schritt vom CDB-Aufbau über den PDB-Status bis zum Verbindungsservice vor. So trennst du Containerprobleme von Benutzer-, Service- oder Listenerproblemen.

    1. CDB?
    V$DATABASE.CDB
    →
    2. Wo bin ich?
    SHOW CON_NAME
    →
    3. PDB offen?
    V$PDBS.OPEN_MODE
    →
    4. Richtiger Service?
    Verbindungsziel prüfen
    Praxisbeispiel: Benutzer existiert angeblich nicht

    Ein DBA sucht einen lokalen Anwendungsbenutzer und findet ihn in der aktuellen Session nicht.

    Was prüfst du?
    Erster Check: SHOW CON_NAME. Wenn die Session in CDB$ROOT arbeitet, der Benutzer aber lokal in einer PDB existiert, wird im falschen Container gesucht.
    Lerneffekt: In Multitenant zuerst den Container-Kontext prüfen.

    14. Services und PDBs zusammenbringen

    Dieser Abschnitt verbindet die bisher erklärte Containerstruktur mit dem Zugang, den Anwendungen und DBAs beim Verbindungsaufbau verwenden.

    Auch CDB_SERVICES ist ein Datenbankinventar, kein Nachweis einer Listener-Registrierung. Die Beispielabfrage gehört in den Root mit passenden Rechten. PDB-Zuordnung, aktiver Service und Listener-Erreichbarkeit sind getrennt zu überprüfen.

    Clients verbinden sich typischerweise über einen Datenbankservice mit einer PDB. Ein Service kann einen PDB-Bezug besitzen; dadurch startet eine neue Session direkt im vorgesehenen Container. Das ist die Verbindung zwischen dem Multitenant-Modell und dem bereits in Kapitel 4 behandelten Oracle-Net-Verbindungsweg.

    Ziel der folgenden Abfrage:
    Die Abfrage zeigt Services und den zugeordneten PDB-Namen. Damit kann read-only kontrolliert werden, welcher Service zu welchem Container führt.
    READ ONLY – Services und PDB-Zuordnung
    SELECT name,
           network_name,
           pdb
    FROM cdb_services
    ORDER BY pdb, name;

    Fiktive Beispielausgabe:

    NAMENETWORK_NAMEPDB
    app_serviceapp_serviceAPP_PDB

    Was sehe ich hier? Ausschnitt: Der Service ist der PDB APP_PDB zugeordnet. Die Konfiguration allein bestätigt noch nicht die Listener-Registrierung oder Erreichbarkeit.

    DBA-Diagnosekette bei Multitenant-Problemen:

    1. Prüfen, ob die Database tatsächlich eine CDB ist.
    2. Aktuellen Container der Session bestimmen.
    3. Vorhandene PDBs und deren Open Mode prüfen.
    4. Erwartete PDB und tatsächlichen Session-Kontext vergleichen.
    5. Bei Clientproblemen den verwendeten Service und seine PDB-Zuordnung prüfen.
    6. Erst danach über Containerwechsel oder PDB-Open/Close-Aktionen entscheiden.
    Multitenant-Kernkontrolle:

    Eine PDB ist keine zusätzliche Oracle Instance. Sie ist ein Container innerhalb der CDB und nutzt die Instance der CDB. Eine Session arbeitet immer in genau einem aktuellen Container.

    Oracle 19c: Containerwechsel · PDB-Zustände · Gespeicherte Zustände

    Ein lokaler Benutzer gehört zu einer PDB. Derselbe lokale Name in einer anderen PDB ist eine andere Identität. Ein CDB Common User besitzt eine gemeinsame Identität innerhalb derselben CDB; daraus folgen nicht automatisch Anmelderechte und Objektzugriff in jedem Container. Application Common Users gehören zum besonderen Modell eines Application Containers und werden nicht mit CDB Common Users gleichgesetzt.

    Bei einem Grant sind drei Fragen getrennt zu beantworten: Wo wurde er erteilt? Ist er lokal oder gemeinsam erteilt? Ist er im aktuellen Ausführungskontext wirksam? CONTAINER=CURRENT und CONTAINER=ALL sind keine austauschbaren Schreibweisen. Das Labor verwendet lokale Anwendungsbenutzer, damit keine unnötigen gemeinsamen Rechte entstehen.

    SQL*Plus – Administrator in LABPDB; lokale Benutzer einordnen
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS container_name,
           SYS_CONTEXT('USERENV','SESSION_USER') AS session_user
    FROM dual;
    SELECT username, common, inherited, account_status
    FROM dba_users
    WHERE username IN ('LAB_OWNER','LAB_READER');

    Was sehe ich hier? Für die im Rechte-Labor lokal angelegten Konten wird COMMON=NO erwartet. INHERITED beschreibt die Herkunft der Definition; es ist kein Ersatz für eine vollständige Privilegprüfung. Root-Abfragen über CDB_-Views können je nach Rechten, CONTAINER_DATA und PDB-Zuständen eingeschränkt sein. Eine leere Root-Ausgabe ist daher kein sicherer Nachweis, dass das Objekt in keiner PDB existiert.

    Eine PDB erhält einen Default-Service. Für Anwendungen empfiehlt Oracle eigene Services; dadurch lässt sich der Zugang gezielt verwalten. Die einfachen LABPDB-Verbindungen der bisherigen Übungen dienen dem Einstieg. Der neue Laborservice zeigt die Trennung von PDB-Name und Anwendungszugang.

    EbeneNachweisWas dadurch noch nicht bewiesen ist
    KonfigurationCDB_SERVICES: Service und zugehörige PDB.Der Service läuft jetzt und ist erreichbar.
    AktivitätV$ACTIVE_SERVICES: aktiver Service im richtigen Container.Ein bestimmter Client erreicht den Listener.
    Listenerlsnrctl services für den tatsächlich verwendeten Listener.Anmeldung und Objektzugriff des Anwendungsbenutzers gelingen.
    ClientNeue Verbindung; CON_NAME, SERVICE_NAME und konkrete Query prüfen.Alle anderen Anwendungswege oder bereits ausgeliehenen Pool-Verbindungen funktionieren.
    SQL*Plus – Root der Labor-CDB; Servicebestand und Aktivität
    SELECT con_id, name, network_name, pdb
    FROM cdb_services ORDER BY con_id, name;
    SELECT con_id, name, network_name
    FROM v$active_services ORDER BY con_id, name;

    Die Spalten NAME und NETWORK_NAME können unterschiedlich sein. Im Client wird der veröffentlichte Netzwerkname verwendet. Verwaltet Oracle Restart oder Oracle Clusterware die Ressourcen, erfolgt die Serviceverwaltung über SRVCTL. Das folgende DBMS_SERVICE-Labor gilt nur für eine eigenständige Single-Instance-Lernumgebung ohne diese Verwaltung und ohne VCS-Steuerung. Ein produktiver Cluster hat einen eigenen Betriebsablauf.

    SAVE STATE speichert den Öffnungszustand einer PDB für das Wiederöffnen nach einem CDB-Neustart. DISCARD STATE entfernt diesen gespeicherten Zustand; es schließt eine bereits offene PDB nicht. DBA_PDB_SAVED_STATES beschreibt die gespeicherte Vorgabe, V$PDBS den aktuellen Zustand. Im Single-Instance-Labor beziehen sich die Einträge auf die dortige Instanz.

    SQL*Plus – Administrator in CDB$ROOT
    SELECT con_id, name, open_mode, restricted
    FROM v$pdbs ORDER BY con_id;
    SELECT con_name, instance_name, state, restricted
    FROM dba_pdb_saved_states ORDER BY con_name, instance_name;

    Was sehe ich hier? Aktueller Zustand und Neustartvorgabe können voneinander abweichen. Ohne passenden gespeicherten Zustand bleibt eine Benutzer-PDB nach dem CDB-Neustart normalerweise MOUNTED; zusätzliche Startautomatisierung kann das Ergebnis verändern. Dokumentiere deshalb, wer PDBs und Services tatsächlich startet. SAVE STATE ist keine allgemeine Zusicherung, dass jeder Anwendungsservice startet oder jeder Client wieder funktioniert.

    Sichere zuerst den vollständigen Fehlerstack mit Zeitpunkt, PDB und Instanz. Wiederholtes OPEN ohne neue Erkenntnisse ist keine Diagnose. Prüfe den aktuellen Zustand, den passenden Alert-Log-Zeitraum und gegebenenfalls die Plug-in-Meldungen. Eine alte Warnung muss vom aktuellen Fehler unterschieden werden.

    STATUS und TYPE beantworten verschiedene Fragen: PENDING bezeichnet den noch ausstehenden Zustand, RESOLVED den erledigten und IGNORE einen gesonderten ignorierten Zustand. ERROR oder WARNING steht dagegen in TYPE. Die folgende Abfrage zeigt gezielt PENDING. Für eine vollständige Historie wird der Statusfilter weggelassen und jede Zeile mit Zeitpunkt, Meldung und Handlungshinweis gelesen; IGNORE wird nicht pauschal als offener Fehler gezählt. Oracle 19c.

    SQL*Plus – Root; offene Plug-in-Meldungen für LABPDB
    SELECT time, name, type, status, message, action
    FROM pdb_plug_in_violations
    WHERE name='LABPDB' AND status = 'PENDING'
    ORDER BY time;
    BefundNächster begründeter Schritt
    MOUNTED nach einem NeustartGespeicherten Zustand und zuständige Startsteuerung prüfen.
    READ WRITE, aber RESTRICTED=YESGrund des eingeschränkten Zugangs und offene Integrationsmeldungen prüfen; nicht pauschal RESTRICTED SESSION vergeben.
    Dateizugriff oder Recovery-FehlerDateipfad, Storage und vollständigen Fehlerstack mit dem Recovery-Kapitel abgleichen.
    Patch-/KomponentenmeldungKonkrete MESSAGE/ACTION und Patchzustand auswerten; keine beliebigen Upgrade-Skripte ausführen.
    PDB offen, Client meldet FehlerService, Listener, Clientziel und anschließend Benutzerrechte prüfen.

    Keine offenen Plug-in-Meldungen schließen andere Ursachen nicht aus. Ebenso beweist eine WARNUNG allein nicht, dass die PDB unbenutzbar ist. Eine Abnahme benötigt den tatsächlichen Status und einen passenden Anwendungstest. Recovery in Kapitel 25 und Patching in Kapitel 26 beschreiben die weiterführenden Verfahren.

    Vertiefung: Undo-Modi und PDB-bezogene Einstellungen wie UNDO_RETENTION gehören zum weiterführenden Thema. Sie werden in Kapitel 23 erklärt. Auch dort gilt: Vor der Prüfung den richtigen PDB-Kontext bestimmen.

    19. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Multitenant Administrator's Guide
    CDB/PDB, Container, Services und CON_ID
    https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/overview-of-the-multitenant-architecture.html

    Oracle Database 19c Licensing Information
    Ohne Oracle-Multitenant-Lizenz: bis zu drei benutzererzeugte PDBs pro CDB; mit Oracle-Multitenant-Option bei EE: bis zu 252 PDBs
    https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/Licensing-Information.html
    Vertiefende Oracle-19c-Quellen: PDB-Verwaltung und SAVE STATE · Editionsgrenzen
    Praxis: PDB erstellen, klonen und Unplug/Plug nachvollziehen

    Dieses Labor setzt eine eigene LABCDB mit der bereits vorhandenen LABPDB voraus. LABNEW und LABCOPY existieren noch nicht. Es werden höchstens drei Benutzer-PDBs gleichzeitig verwendet. Die Dateiverwaltung ist OMF mit einem passenden DB_CREATE_FILE_DEST; bei manuellen Dateipfaden ist stattdessen eine korrekt geplante FILE_NAME_CONVERT-Zuordnung nötig. Die Schritte laufen als SYSDBA im Root der Labor-CDB. Prüfe vor jedem Schritt CON_NAME, PDB-Liste und freie Kapazität.

    1. PDB aus der Seed anlegen und öffnen

    SQL*Plus in CDB$ROOT – administrative Schablone mit Passwortplatzhalter
    CREATE PLUGGABLE DATABASE labnew
      ADMIN USER labadmin IDENTIFIED BY "<eigenes_PDB_Laborpasswort>";
    ALTER PLUGGABLE DATABASE labnew OPEN;
    ALTER PLUGGABLE DATABASE labnew SAVE STATE;
    SELECT name, open_mode, restricted FROM v$pdbs ORDER BY name;

    Erwartung: LABNEW wird zunächst erstellt und anschließend READ WRITE geöffnet. Das erste Öffnen schließt notwendige Integrationsschritte ab. Prüfe zusätzlich PDB_PLUG_IN_VIOLATIONS auf offene Meldungen für LABNEW und bewerte sie; ein angezeigter Name allein ist keine vollständige Abnahme. Ein Servicezugang muss danach separat getestet werden.

    2. Einen bewusst einfachen lokalen Klon herstellen

    Für dieses Einstiegslabor wird LABNEW geschlossen und READ ONLY geöffnet. So hängt der Fall nicht von den zusätzlichen Voraussetzungen eines Hot Clone einer schreibend geöffneten Quelle ab. Stelle sicher, dass niemand die Labor-PDB benötigt.

    SQL*Plus in CDB$ROOT – lokaler OMF-Klon
    ALTER PLUGGABLE DATABASE labnew CLOSE IMMEDIATE;
    ALTER PLUGGABLE DATABASE labnew OPEN READ ONLY;
    CREATE PLUGGABLE DATABASE labcopy FROM labnew;
    ALTER PLUGGABLE DATABASE labcopy OPEN;
    SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;

    LABCOPY ist eine eigene PDB mit eigenen Dateien. Prüfe im Root V$DATAFILE nach CON_ID und vergleiche die Pfade. Öffne LABNEW nach der Klonprüfung wieder READ WRITE, wenn du sie weiterverwenden möchtest. Die kopierten Daten beweisen keine automatische laufende Synchronisation zwischen beiden PDBs.

    3. Unplug/Plug als kontrollierter Dateilebenszyklus

    Diese Fortsetzung verwendet ausschließlich die entbehrliche LABNEW. Das Verzeichnis /lab/pdb_export muss auf dem Datenbankserver bereits existieren und für den Oracle-Software-Owner beschreibbar sein. XML-Datei und Datenfiles sind verschiedene Bestandteile. Beende vor dem Unplug alle Arbeit in LABNEW; verwende die Schritte nicht als Sicherungsverfahren für eine produktive PDB.

    SQL*Plus in CDB$ROOT – entfernt die Registrierung, erhält die Datafiles
    ALTER PLUGGABLE DATABASE labnew CLOSE IMMEDIATE;
    ALTER PLUGGABLE DATABASE labnew UNPLUG INTO '/lab/pdb_export/labnew.xml';
    DROP PLUGGABLE DATABASE labnew KEEP DATAFILES;

    Vor dem erneuten Plug prüfst du die Kompatibilität. Die boolesche Funktion liefert einen Prüfhinweis; zusätzlich sind die konkreten Meldungen auszuwerten. Ein FALSE wird nicht durch wiederholtes CREATE umgangen.

    SQL*Plus – Kompatibilitätsprüfung; kann Prüfmeldungen erzeugen
    SET SERVEROUTPUT ON
    DECLARE
      ok BOOLEAN;
    BEGIN
      ok := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
        pdb_descr_file => '/lab/pdb_export/labnew.xml',
        pdb_name => 'LABNEW');
      IF ok THEN
        DBMS_OUTPUT.PUT_LINE('Kompatibilitaetspruefung: TRUE');
      ELSE
        DBMS_OUTPUT.PUT_LINE('Kompatibilitaetspruefung: FALSE');
      END IF;
    END;
    /
    SELECT name, type, status, message, action
    FROM pdb_plug_in_violations
    WHERE name='LABNEW' AND status = 'PENDING'
    ORDER BY time;
    SQL*Plus – nur nach akzeptierter Kompatibilitätsprüfung und mit vorbereitetem OMF
    CREATE PLUGGABLE DATABASE labnew
      USING '/lab/pdb_export/labnew.xml' COPY;
    ALTER PLUGGABLE DATABASE labnew OPEN;
    ALTER PLUGGABLE DATABASE labnew SAVE STATE;

    COPY erzeugt neue Zieldateien; die zuvor erhaltenen Quelldateien verschwinden dadurch nicht automatisch. Dokumentiere alte und neue Pfade getrennt und lasse alte Exportdateien erst nach erfolgreicher Abnahme gezielt bereinigen. Eine XML-Datei allein enthält keine vollständige Kopie der Nutzdaten.

    4. Rückweg und Transferaufgabe

    Nach Abschluss können LABCOPY und LABNEW jeweils geschlossen und über DROP PLUGGABLE DATABASE ... INCLUDING DATAFILES entfernt werden, sofern sie ausschließlich diese Laborobjekte enthalten. LABPDB bleibt für die anderen Übungen bestehen. Das Entfernen der neu eingebundenen PDB löscht nicht automatisch die zuvor mit KEEP DATAFILES erhaltenen alten Dateien.

    Musterlösung und Abnahmekriterien

    Du kannst für jeden Schritt sagen, ob er nur den Open Mode, die Registrierung oder Dateien verändert. Als Transfer entwirfst du einen Plug in eine andere CDB: Release/RU, Optionen, Zeichensatzkompatibilität, Dateien, Berechtigungen, Kapazität und Meldungen prüfen. Ein erfolgreicher Ablauf innerhalb derselben CDB beweist nicht automatisch die Eignung eines beliebigen Zielsystems.

    Praxis: PDB-Zustand und Anwendungsservice getrennt prüfen

    Voraussetzungen: eigene entbehrliche LABCDB mit LABPDB, LAB_OWNER und LAB_ORDER aus Kapitel 12; keine fremde Nutzung, keine Cluster- oder Restart-Verwaltung. LAB_APP ist ein neuer im Listener-Umfeld eindeutiger Service. Nutze eine separate lokale SYSDBA-Administrationssitzung. Die vorhandenen LABPDB-Verbindungen dienen als Rückweg. Alle Befehle sind statischer Lerninhalt.

    1. Kontext prüfen und eigenen Service anlegen

    SQL*Plus – Administrator in LABPDB
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS container_name FROM dual;
    SELECT name, network_name FROM dba_services WHERE name='LAB_APP';

    Erwartung: LABPDB und kein vorhandener LAB_APP-Eintrag. Bei einem bestehenden Namen zuerst dessen Besitzer und Zweck klären; nicht löschen oder überschreiben.

    SQL*Plus – Administrator in LABPDB; Service anlegen und starten
    BEGIN
      DBMS_SERVICE.CREATE_SERVICE(service_name => 'LAB_APP',
                                  network_name => 'LAB_APP');
      DBMS_SERVICE.START_SERVICE(service_name => 'LAB_APP');
    END;
    /

    Prüfe die Serviceaktivität und anschließend lsnrctl services für den vorgesehenen Listener. Bei fehlender Registrierung zuerst Listeneradresse und Registrierungsweg aus Kapitel 4 prüfen. Ein Dictionary-Eintrag genügt nicht.

    2. Eine neue Clientverbindung nachweisen

    Shell – LABHOST und Port an die eigene Lernumgebung anpassen
    sqlplus -L lab_owner@//LABHOST:1521/LAB_APP

    SQL*Plus fragt das Kennwort interaktiv ab. Keine Anmeldung AS SYSDBA für diesen Anwendungstest.

    SQL*Plus – LAB_OWNER über LAB_APP
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS container_name,
           SYS_CONTEXT('USERENV','SERVICE_NAME') AS service_name FROM dual;
    SELECT order_id, customer_name, quantity FROM lab_order ORDER BY order_id;

    Erwartung: LABPDB und LAB_APP sowie die drei bekannten Laborzeilen. Dokumentiere Ziel, Sessionkontext und Datenprüfung getrennt.

    3. Kontrollierter Fehlerfall: PDB offen, Service gestoppt

    Beende die eigene LAB_APP-Clientsession. In der Administrationssession in LABPDB:

    SQL*Plus – ausschließlich eigenen Laborservice stoppen
    EXEC DBMS_SERVICE.STOP_SERVICE(service_name => 'LAB_APP');

    Prüfe im Root V$PDBS: LABPDB bleibt offen. Prüfe außerdem V$ACTIVE_SERVICES und die Listeneranzeige. Eine neue Verbindung zu LAB_APP muss nach aktualisierter Registrierung scheitern; der genaue Fehler hängt vom Verbindungsweg ab. Die weiterhin vorhandene Servicedefinition ist kein Gegenbeweis. Stoppen eines Service ist nicht dasselbe wie das Schließen der PDB.

    SQL*Plus – Administrator in LABPDB; Laborservice wieder starten
    EXEC DBMS_SERVICE.START_SERVICE(service_name => 'LAB_APP');

    Wiederhole die neue Clientverbindung und Query aus Schritt 2. Das ist die Wirkungsprüfung des Rückwegs.

    4. Gespeicherten Zustand mit einem echten Neustart überprüfen

    Diese Teilübung unterbricht die gesamte eigene LABCDB einschließlich aller PDBs. Beende vorher alle eigenen Laborarbeiten. Notiere Open Modes, gespeicherte Zustände und aktive Services. Sie ist nur für die hier beschriebene isolierte Lern-CDB bestimmt. Ausgangszustand: LABPDB ist READ WRITE und nicht eingeschränkt geöffnet. Eine vorhandene gespeicherte Vorgabe muss ebenfalls diesem Zustand entsprechen; andernfalls diesen Versuch in einer getrennten Lernumgebung vorbereiten, statt die abweichende Vorgabe zu überschreiben.

    SQL*Plus – lokale SYSDBA-Sitzung in CDB$ROOT; Neustart der gesamten Lern-CDB
    ALTER PLUGGABLE DATABASE labpdb SAVE STATE;
    SELECT con_name, instance_name, state, restricted
    FROM dba_pdb_saved_states WHERE con_name='LABPDB';
    SHUTDOWN IMMEDIATE
    STARTUP
    SELECT name, open_mode, restricted FROM v$pdbs ORDER BY name;

    Erwartung: LABPDB öffnet nach dem CDB-Neustart wieder READ WRITE und ohne Restricted-Modus. Prüfe LAB_APP separat über die Aktivitätssicht und den Listener. Falls der eigene Service nicht aktiv ist, starte ihn als Administrator in LABPDB mit dem zuvor gezeigten START_SERVICE und teste eine frische Clientverbindung. Ein erfolgreicher PDB-Neustart ersetzt diesen Servicenachweis nicht. Ohne ausgeführten Neustart lautet das Ergebnis nur „Vorgabe gespeichert“, nicht „Wiederanlauf getestet“.

    5. Rückweg und Abnahme

    Beende die LAB_APP-Clientsession. Stoppe den Service, falls er aktiv ist, und entferne ausschließlich den in dieser Übung neu angelegten LAB_APP:

    SQL*Plus – Administrator in LABPDB; Laborservice abbauen
    EXEC DBMS_SERVICE.STOP_SERVICE(service_name => 'LAB_APP');
    EXEC DBMS_SERVICE.DELETE_SERVICE(service_name => 'LAB_APP');

    Prüfe danach Servicedefinition und Aktivität. LABPDB, LAB_OWNER und LAB_ORDER bleiben erhalten. War vor der Übung kein SAVE-STATE-Eintrag für LABPDB vorhanden, entferne ausschließlich die neu angelegte Vorgabe im Root mit ALTER PLUGGABLE DATABASE labpdb DISCARD STATE. Bestand bereits dieselbe Vorgabe, bleibt sie erhalten. Vergleiche nach dem CDB-Neustart auch die übrigen Labor-PDBs und Services mit dem vorher protokollierten Zustand; stelle nur bewusst benötigte Laborzustände wieder her.

    Musterlösung und Abnahmekriterien

    Bestanden ist die Übung, wenn du vier Befunde auseinanderhalten kannst: PDB-Open-Mode, gespeicherter Neustartzustand, Serviceaktivität und erfolgreicher neuer Anwendungszugriff. Der Fehlerfall zeigt eine offene PDB mit nicht verfügbarem Anwendungsservice. Jede ausgelassene Teilprüfung wird als noch offen dokumentiert.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Eine CDB enthält CDB$ROOT, die Vorlage PDB$SEED und die zugehörigen PDBs. Eine PDB ist ein eigener Container innerhalb dieser gemeinsamen Architektur.
    2. Vor jeder Diagnose muss der aktuelle Container feststehen. CON_ID hilft, Ergebnisse und gleichnamige Objekte dem richtigen Container zuzuordnen.
    3. Common User und Local User haben unterschiedliche Geltungsbereiche. Sichtbarkeit und Berechtigungen in CDB_-Views hängen auch vom Benutzer und Containerkontext ab.
    4. Eine geöffnete CDB bedeutet nicht, dass alle PDBs offen sind. Aktueller PDB-Zustand, gespeicherter Öffnungszustand und verfügbare Services sind getrennte Prüfungen.
    5. Bei Verbindungs- oder Öffnungsproblemen werden Service, PDB-Zustand und Fehlermeldungen zusammengeführt. In PDB_PLUG_IN_VIOLATIONS kennzeichnet PENDING noch offene Einträge; IGNORE bedeutet nicht dasselbe.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Was ist der Unterschied zwischen CDB$ROOT und einer PDB?
    CDB$ROOT ist die gemeinsame Verwaltungsebene der CDB. Eine PDB ist ein pluggbarer Container, in dem typischerweise Anwendungsobjekte und lokale Benutzer liegen.
    Frage 2: Wie viele benutzererzeugte PDBs erlaubt Oracle 19c SE2 pro CDB?
    Maximal 3 benutzererzeugte PDBs pro CDB nach der Oracle-19c-Lizenzdokumentation.
    Frage 3: Wie prüfst du den aktuellen Container?
    Zum Beispiel mit SHOW CON_NAME oder SYS_CONTEXT('USERENV','CON_NAME').
    Frage 4: Wie wechselst du als entsprechend berechtigter Common User in eine PDB?
    ALTER SESSION SET CONTAINER = PDB_NAME;
    Frage 5: Ist ALTER PLUGGABLE DATABASE ... OPEN read-only?
    Nein. Der Befehl verändert den Betriebszustand der PDB und ist ein administrativer Befehl.
    Frage 6: Existiert ein CDB Common User automatisch in anderen CDBs?
    Nein. Die gemeinsame Identität bezieht sich auf die Container derselben CDB.
    Frage 7: Beweist ein SAVE-STATE-Eintrag, dass die PDB gerade offen ist?
    Nein. Den aktuellen Zustand zeigt V$PDBS; DBA_PDB_SAVED_STATES beschreibt den gespeicherten Zustand.
    Frage 8: Beweist ein Serviceeintrag die Listener-Erreichbarkeit?
    Nein. Servicezuordnung, tatsächliche Aktivität und Erreichbarkeit sind getrennte Befunde.
    Frage 9: Darf ein Common User automatisch überall arbeiten?

    Nein. Gemeinsame Identität, Anmelderecht und Objektprivilegien sind getrennt; der Geltungsbereich der Grants muss passen.

    Frage 10: Schließt DISCARD STATE eine offene PDB?

    Nein. Es entfernt den gespeicherten Neustartzustand. Der aktuelle Open Mode ist separat zu prüfen.

    Frage 11: Beweist eine vorhandene Servicedefinition einen erreichbaren Zugang?

    Nein. Aktivität, Listenerregistrierung und eine frische Clientverbindung mit Objektzugriff sind zusätzliche Nachweise.

    Frage 12: Was beweist ein leeres Ergebnis der gezeigten PENDING-Abfrage auf PDB_PLUG_IN_VIOLATIONS?

    Die Abfrage findet im gewählten Kontext keine PENDING-Meldung für die gefilterte PDB. Sie sagt nichts über ausgeschlossene RESOLVED-/IGNORE-Zeilen aus und schließt andere Ursachen eines Open- oder Anwendungsfehlers nicht aus. PDB-Zustand, vollständiger Fehlerstack und Clientweg bleiben getrennte Prüfungen.

    14. Oracle Security – Zugriffe und Auditing

    Anmeldung, Berechtigungen und Protokollierung auseinanderhalten.

    Lernkompass
    Einfach gesagt Anmeldung, Berechtigungen und Protokollierung auseinanderhalten.
    Warum ist das wichtig? Ein erfolgreicher Login sagt noch nichts über die zulässigen Tabellenzugriffe aus.
    Nach diesem Kapitel Du kannst Konto, wirksame Rechte und Audit-Erfassung getrennt prüfen.

    Einführung: Datenbanksicherheit verbindet die Prüfung einer Identität, die Begrenzung ihrer Handlungsmöglichkeiten und die Nachvollziehbarkeit ausgewählter Aktivitäten. Ein erfolgreicher Login beantwortet nur einen Teil dieser Aufgabe. Ebenso beweist ein vorhandenes Auditprotokoll nicht, dass sämtliche gewünschten Vorgänge erfasst oder unerlaubte Zugriffe verhindert werden.

    Das Kapitel betrachtet den Zugang einer Berichtsanwendung und baut darauf die Prüfung von Konten, Rechten und Auditing auf. Du lernst, Sicherheitsanforderungen in konkrete Fragen und überprüfbare Befunde zu übersetzen. Die Rechteverwaltung aus Kapitel 12 bildet dafür die Grundlage; Verschlüsselung, Wallet und Hardening erhalten in den nächsten Kapiteln jeweils ihren eigenen Schwerpunkt.

    Oracle 19c: fachliche Grundlage

    1. Zugriffe, Rechte und Auditing

    Drei verschiedene Fragen

    FrageFachbegriffBeispiel
    Wer bist du?Authentifizierung – Identität prüfen.Ein Benutzer meldet sich mit seinem vorgesehenen Anmeldeverfahren an.
    Was darfst du?Autorisierung – Berechtigungen prüfen.Die Berichtsanwendung darf eine freigegebene Datensicht lesen.
    Was wurde festgehalten?Auditing – ausgewählte Vorgänge protokollieren.Ein Anmeldeversuch wird nach den eingerichteten Regeln aufgezeichnet.

    Eine Anmeldung kann auch bei richtigem Passwort scheitern, etwa wegen eines gesperrten Kontos. Die nachfolgende Rechteprüfung und das konfigurierte Auditing sind gesondert zu untersuchen.

    2. Unser Beispiel: eine Berichtsanwendung

    Die Anwendung erstellt eine Übersicht aus freigegebenen Daten. Sie soll lesen, aber keine Datensätze ändern oder Benutzer verwalten. Dafür braucht sie einen passenden Zugang und passende Leserechte. Rechte für die gesamte Datenbank sind für diese Aufgabe nicht automatisch nötig.

    Das Prinzip heißt Least Privilege: nur die Rechte, die für die Aufgabe tatsächlich gebraucht werden. Es ist wie ein Schlüsselbund mit den benötigten Schlüsseln. Weniger unnötige Schlüssel begrenzen die Folgen eines Fehlers oder eines missbrauchten Zugangs.

    Welche Tabellen und Sichten fachlich freigegeben sind, muss bekannt sein. Ein technisch funktionierendes SELECT ist noch kein Nachweis, dass die angezeigten Daten für jeden Empfänger bestimmt sind.

    3. Benutzerkonto, Rolle und tatsächlicher Zugriff

    Ein Benutzerkonto ist der Datenbankzugang. Eine Rolle bündelt mehrere Berechtigungen, ähnlich einem Schlüsselpaket. Rechte können direkt am Benutzer oder über Rollen vergeben sein. Das bestehende Kapitel 12 erklärt diese Bausteine im Detail.

    Für die Sicherheit interessiert die Gesamtsicht: Welche Rechte kann die konkrete Anwendung in ihrem Ausführungskontext tatsächlich nutzen? Eine Liste direkt vergebener Rollen ist dafür ein Ausgangspunkt, aber kein vollständiger Beweis. Weitere Rollen, direkte Rechte, Rechte für PUBLIC und die verwendeten Programmobjekte können hinzukommen. PUBLIC bezeichnet dabei die allgemeine Benutzergruppe, keinen einzelnen Anwender.

    Ein gemeinsames Anwendungskonto zeigt außerdem nicht automatisch, welcher Mensch innerhalb der Anwendung gehandelt hat. Für Nachvollziehbarkeit braucht es eine passende Zuordnung zwischen Anwendung und Datenbankverbindung.

    4. Welche Daten sollen eigentlich geschützt werden?

    Sicherheit beginnt vor der Rechteabfrage: Welche Daten sind enthalten, wer braucht sie und für welchen Zweck? Eine Berichtsanwendung kann beispielsweise Bestellzahlen benötigen, aber keine vollständigen persönlichen Kontaktdaten. Ein technisch erlaubter Zugriff auf eine Tabelle bedeutet noch nicht, dass ihr gesamter Inhalt für diesen Bericht erforderlich ist.

    Drei Schutzziele helfen bei der Einordnung. Vertraulichkeit heißt: Daten gelangen nur an berechtigte Empfänger. Integrität heißt: Daten werden nicht unzulässig verändert. Verfügbarkeit heißt: Die benötigte Funktion bleibt nutzbar. Eine einzige Einstellung erfüllt nicht automatisch alle drei Ziele.

    Auch ein Konto, das nur lesen darf, kann sensible Daten exportieren. „Read-only“ beschreibt die erlaubten Änderungen, nicht automatisch die Unbedenklichkeit der gelesenen Informationen. Für einen Bericht ist deshalb eine passend freigegebene Sicht oft besser geeignet als der pauschale Zugriff auf alle Spalten einer Basistabelle.

    5. Rechte wirken über mehrere Wege

    Bleiben wir beim Schlüsselbild: Ein Konto kann einen eigenen Schlüssel besitzen oder ein Schlüsselpaket über eine Rolle erhalten. Eine Rolle kann wiederum weitere Rollen enthalten. Zusätzlich können Rechte an PUBLIC bestehen. Um einen Zugriff zu erklären, reicht es deshalb nicht, nur die erste sichtbare Rollenzuweisung anzusehen.

    Objektrechte erlauben eine bestimmte Aktion an einem bestimmten Objekt, beispielsweise das Lesen einer freigegebenen Sicht. Systemrechte erlauben allgemeinere Aktionen. CREATE SESSION ermöglicht die Anmeldung; ein Recht mit ANY kann einen viel größeren Bereich betreffen als ein einzelnes Objekt. Das ist ein Prüfhinweis, kein pauschaler Beweis für eine Sicherheitslücke.

    Auch der Objektbesitzer besitzt besondere Befugnisse an seinen eigenen Objekten. Wenn die Anwendung direkt mit dem Besitzerkonto arbeitet, kann sie deshalb mehr dürfen, als eine kurze Liste ausdrücklich erteilter Leserechte vermuten lässt. Die Trennung von Besitzerkonto und Laufzeitkonto ist ein wichtiges Architekturthema.

    Praxisfall:

    REPORT_USER soll nur die Sicht APP_OWNER.REPORT_ORDER_COUNTS lesen. Eine direkte READ-Berechtigung darauf passt zum reinen Berichtszweck. SELECT erlaubt zusätzlich sperrende Zugriffe; die Unterscheidung steht in Kapitel 12. Ein zusätzliches breit wirkendes Leserecht könnte aber auch andere Daten zugänglich machen. Die Prüfung fragt daher zuerst nach dem benötigten Zugriff und untersucht danach alle relevanten Wege, die darüber hinausführen.

    SELECT: direkt vergebene System- und Objektrechte prüfen

    Die beiden Abfragen lesen direkte Zuweisungen an den eingegebenen Benutzer. Sie lösen keine Rollen auf und sind deshalb bewusst ein Teil der Gesamtprüfung.

    READ ONLY – Direkte Systemrechte
    SELECT grantee, privilege, admin_option
    FROM   dba_sys_privs
    WHERE  grantee = UPPER('&BENUTZER')
    ORDER BY privilege;

    Fiktive Beispielausgabe:

    GRANTEEPRIVILEGEADMIN_OPTION
    REPORT_USERCREATE SESSIONNO

    CREATE SESSION erklärt die mögliche Anmeldung. Es erklärt keinen Tabellenzugriff. ADMIN_OPTION = NO bedeutet hier, dass dieses Systemrecht nicht mit der entsprechenden Weitergabebefugnis zugewiesen ist.

    READ ONLY – Direkte Objektrechte
    SELECT grantee, owner, table_name, privilege, grantable
    FROM   dba_tab_privs
    WHERE  grantee = UPPER('&BENUTZER')
    ORDER BY owner, table_name, privilege;

    Fiktive Beispielausgabe:

    GRANTEEOWNERTABLE_NAMEPRIVILEGEGRANTABLE
    REPORT_USERAPP_OWNERREPORT_ORDER_COUNTSREADNO

    TABLE_NAME ist der Dictionary-Spaltenname; das genannte Objekt kann auch eine Sicht sein. Die Zeile erlaubt gewöhnliche SELECT-Abfragen durch das READ-Privileg auf genau diesem Objekt. GRANTABLE = NO beschreibt die fehlende Weitergabebefugnis dieser Zuweisung. Die Anwendung erhält daraus nicht automatisch Schreibrechte.

    Eine leere Ergebnismenge beweist nicht, dass kein Zugriff möglich ist: Rollen, PUBLIC und Eigentümerbefugnisse werden hier nicht vollständig erfasst. Spaltenbezogene Zuweisungen haben zusätzlich die eigene View DBA_COL_PRIVS. In Multitenant muss die Prüfung im passenden Container stattfinden.

    6. Verschachtelte Rollen: das zweite Schlüsselpaket

    REPORT_USER bekommt REPORT_READ. In REPORT_READ kann wiederum DATA_READ enthalten sein. Der Benutzer sieht dann in der direkten Zuweisung zunächst nur REPORT_READ; weitere Rechte können aus DATA_READ stammen. Eine Änderung an einer gemeinsam verwendeten Rolle kann damit mehrere Konten gleichzeitig betreffen.

    Eine Zuweisung ist nicht dasselbe wie eine aktuell aktivierte Rolle. Manche Rollen werden standardmäßig aktiviert, andere abhängig von der Anwendung oder besonderen Aktivierungsbedingungen. Für die Diagnose sind deshalb sowohl die eingerichtete Struktur als auch der konkrete Sitzungskontext wichtig.

    SELECT: die eingerichtete Rollenkette verfolgen
    READ ONLY – Rollenhierarchie eines Benutzers
    SELECT LEVEL AS role_level,
           grantee, granted_role, admin_option
    FROM   dba_role_privs
    START WITH grantee = UPPER('&BENUTZER')
    CONNECT BY NOCYCLE PRIOR granted_role = grantee
    ORDER SIBLINGS BY granted_role;

    Fiktive Beispielausgabe:

    ROLE_LEVELGRANTEEGRANTED_ROLEADMIN_OPTION
    1REPORT_USERREPORT_READNO
    2REPORT_READDATA_READNO

    Ebene 1 ist die direkte Zuweisung. Ebene 2 zeigt eine Rolle innerhalb dieser Rolle. Die Abfrage folgt diesen Beziehungen; NOCYCLE verhindert eine endlose Verfolgung eines Zyklus. Sie zeigt die eingerichteten Wege, nicht automatisch die in einer bestimmten Anwendung gerade aktiven Rollen.

    Bei mehreren Wegen kann eine Rolle mehrfach vorkommen. Das ist nicht automatisch eine doppelte fehlerhafte Vergabe. Rechte an PUBLIC und reine Objektrechte werden durch diese Rollenkette nicht aufgelistet.

    7. Wenn SQL funktioniert, ein Programmaufruf aber scheitert

    Ein Zugriff kann am SQL-Prompt funktionieren und innerhalb einer gespeicherten Prozedur trotzdem scheitern. Eine Prozedur ist ein in der Datenbank gespeichertes Programm. Ihre Berechtigungen hängen auch davon ab, unter wessen Sicherheitskontext sie läuft.

    Bei Definer’s Rights arbeitet das Programm im Rechtekontext seines Besitzers. Gewöhnliche Sitzungsrollen sind für diesen Kontext grundsätzlich nicht wie beim direkten interaktiven SQL nutzbar; benötigte direkte Rechte müssen geprüft werden. Codebezogene Rollen sind eine zusätzliche Besonderheit. Bei Invoker’s Rights ist der Aufruferkontext maßgeblich, wobei Aufrufketten und weitere Regeln mitwirken.

    Das bedeutet praktisch: Vergleiche nicht nur Benutzername und SQL-Text. Kläre, ob die Anwendung direkt eine Tabelle liest, eine Sicht verwendet oder ein Programm aufruft. EXECUTE auf ein Programm kann kontrollierten Zugriff ermöglichen, ohne dem Aufrufer dieselben direkten Tabellenrechte zu geben. Es ist keine allgemeine Garantie, dass der Programmcode sicher ist.

    SELECT: Systemrechte der eigenen aktuellen Session ansehen
    READ ONLY – Eigene Session: verfügbare Systemrechte
    SELECT privilege
    FROM   session_privs
    ORDER BY privilege;

    Fiktive Beispielausgabe:

    PRIVILEGE
    CREATE SESSION

    SESSION_PRIVS bezieht sich auf die Session, in der du die Abfrage ausführst. Wenn du als Administrator angemeldet bist, prüfst du damit deine Administrator-Session und nicht REPORT_USER. Die View nennt Systemrechte, keine vollständige Liste der lesbaren Tabellen. Aktivierte Rollen der eigenen Session lassen sich ergänzend über SESSION_ROLES ansehen.

    8. Warum DBA-Rechte nicht zum normalen Bericht gehören

    Die Rolle DBA enthält weitreichende Verwaltungsrechte. Sie ist für gewöhnliches Berichtslesen keine passende Standardausstattung. Ob sie benötigt wird, muss durch die tatsächliche Aufgabe begründet sein.

    SYSDBA ist eine besondere administrative Berechtigung und nicht einfach ein zweiter Name für die Rolle DBA. Ein Zugang mit solchen Befugnissen kann wesentlich mehr als eine normale Anwendung. Die beiden Begriffe werden deshalb nicht gleichgesetzt.

    Bei einer Prüfung wird ein auffälliges Recht zuerst mit Aufgabe und Verantwortlichem abgeglichen. Das Wiki entzieht keine Rechte automatisch: Eine unüberlegte Änderung könnte eine Anwendung unterbrechen.

    9. Kontostatus und Profile

    Ein Konto kann offen, gesperrt oder wegen eines abgelaufenen Passworts eingeschränkt sein. OPEN heißt im Kontostatus „nicht auf diese Weise gesperrt“. Es beweist nicht, dass jeder Verbindungsversuch gelingen muss; Netzwerk, Service und die Berechtigung zur Anmeldung spielen ebenfalls eine Rolle.

    Ein Profil ist ein Satz von Regeln, beispielsweise für Fehlversuche und Passwortalter. Es vergibt keine Leserechte auf Tabellen. Einige Werte können vom Profil DEFAULT geerbt sein. Deshalb ist das Wort DEFAULT kein Zahlenwert, sondern ein Verweis auf eine andere Einstellung.

    Für Anwendungskonten muss der Betrieb berücksichtigen, wie Kennwörter verwaltet werden und was bei Ablauf oder Sperre geschieht. Ein pauschales „Passwort nie ändern“ oder „Konto sofort entsperren“ ergibt sich aus einer Diagnose nicht.

    10. Technische Konten und administrative Zugänge trennen

    Ein menschlicher Administrator und eine dauerhaft laufende Anwendung haben unterschiedliche Aufgaben. Ein Anwendungskonto braucht stabile, zweckgebundene Zugriffe. Ein administrativer Zugang braucht stärkere Kontrolle, persönliche Zuordnung und begründete Verwendung. Dieselben Zugangsdaten für beides erschweren die Nachvollziehbarkeit.

    Die Rolle DBA und die besondere Berechtigung SYSDBA bleiben unterschiedliche Wege. Eine Prüfung nur auf DBA in DBA_ROLE_PRIVS erfasst daher nicht jeden administrativen Zugang. V$PWFILE_USERS beschreibt entsprechende Einträge im Passwortfile. Betriebssystembasierte administrative Anmeldung kann ein weiterer Weg sein und wird durch diese Datei allein nicht vollständig erklärt.

    Passwörter gehören nicht in kopierbare Skripte oder veröffentlichte Berichte. Für technische Konten muss der Betrieb festlegen, wie Geheimnisse bereitgestellt, gewechselt und im Störungsfall verwendet werden. Die Datenbankprüfung darf weder Kennwörter noch Passwort-Hashes als Beispielausgabe veröffentlichen.

    Eine Kontosperre verhindert nicht automatisch jede bereits bestehende Verbindung. Vor einer Maßnahme muss deshalb geklärt werden, ob es um neue Anmeldungen, laufende Sessions oder die Befugnisse einer Anwendung geht. Dieses Wiki beendet keine Sessions und sperrt keine Konten.

    11. Profile: eine Regel ist noch kein Sicherheitskonzept

    Die vier gezeigten Passwortwerte sind nur ein Ausschnitt. Weitere Regeln können Passwortwiederverwendung oder eine Passwortprüffunktion betreffen. Eine Prüffunktion bewertet ein Passwort bei dafür relevanten Passwortänderungen; ihr Name allein beweist nicht, wie alle bereits vorhandenen Passwörter beschaffen sind.

    Eine kurze Passwortlebensdauer ist ohne geregelten Wechselprozess für ein Anwendungskonto ein Betriebsrisiko. Umgekehrt beseitigt UNLIMITED die betrachtete zeitliche Grenze, ersetzt aber keine Zugangskontrolle. Die Bewertung braucht Aufgabe, Kontotyp und den vorgesehenen Ablauf bei Passwortwechsel oder Sperre.

    Profile können auch Ressourcenregeln enthalten. Passwortregeln und Ressourcenlimits sind verschiedene Bereiche; die Durchsetzung bestimmter Ressourcenlimits hängt zusätzlich von Einstellungen wie RESOURCE_LIMIT ab. Deshalb wird aus einem beliebigen Profilwert nicht automatisch auf alle wirksamen Laufzeitgrenzen geschlossen.

    12. Für Interessierte: Konto und Profil prüfen

    SELECT: Kontostatus und Anmeldeart ansehen

    Was sehe ich hier? Für einen bekannten Benutzer wird die vorhandene Kontokonfiguration gelesen. Die Beispielnamen sind fiktiv.

    READ ONLY – Bekanntes Konto prüfen
    SELECT username, account_status, profile, authentication_type
    FROM   dba_users
    WHERE  username = UPPER('&BENUTZER');

    Fiktive Beispielausgabe:

    USERNAMEACCOUNT_STATUSPROFILEAUTHENTICATION_TYPE
    REPORT_USEROPENAPP_PROFILEPASSWORD

    REPORT_USER ist nicht durch den dargestellten Kontostatus gesperrt. APP_PROFILE nennt seine Regelgruppe. PASSWORD beschreibt die eingerichtete Authentifizierungsart; die Abfrage zeigt kein Passwort. Ob dieser Benutzer eine bestimmte Tabelle lesen darf, beantwortet sie nicht.

    Der Platzhalter BENUTZER wird in SQL*Plus abgefragt. UPPER passt für gewöhnliche Benutzernamen; speziell mit Anführungszeichen angelegte Namen können eine angepasste Eingabe benötigen. DBA_-Views erfordern passende Leserechte. In einer CDB ist außerdem der richtige Container zu wählen.

    SELECT: ausgewählte Passwortregeln ansehen

    Diese Abfrage zeigt vier ausgewählte Regeln des angegebenen Profils und daneben die entsprechenden DEFAULT-Werte. Sie ist kein vollständiger Passwort- oder Sicherheitscheck.

    READ ONLY – Profilwerte und Vererbung lesen
    SELECT p.resource_name,
           p.limit AS configured_limit,
           d.limit AS default_limit
    FROM   dba_profiles p
    LEFT JOIN dba_profiles d
           ON d.profile = 'DEFAULT'
          AND d.resource_type = p.resource_type
          AND d.resource_name = p.resource_name
    WHERE  p.profile = UPPER('&PROFIL')
    AND    p.resource_type = 'PASSWORD'
    AND    p.resource_name IN ('FAILED_LOGIN_ATTEMPTS',
                              'PASSWORD_LOCK_TIME',
                              'PASSWORD_LIFE_TIME',
                              'PASSWORD_GRACE_TIME')
    ORDER BY p.resource_name;

    Fiktive Beispielausgabe:

    RESOURCE_NAMECONFIGURED_LIMITDEFAULT_LIMIT
    FAILED_LOGIN_ATTEMPTS510
    PASSWORD_GRACE_TIMEDEFAULT7
    PASSWORD_LIFE_TIME90180
    PASSWORD_LOCK_TIME11

    FAILED_LOGIN_ATTEMPTS = 5 begrenzt die aufeinanderfolgenden Fehlversuche nach dieser Regel. PASSWORD_LOCK_TIME = 1 beschreibt die entsprechende Sperrdauer in Tagen. PASSWORD_LIFE_TIME = 90 nennt hier das Passwortalter in Tagen. PASSWORD_GRACE_TIME = DEFAULT übernimmt im Beispiel den Wert 7 aus DEFAULT; es bedeutet nicht „keine Regel“.

    UNLIMITED würde bedeuten, dass diese einzelne Regel keine endliche Grenze vorgibt. Es ist kein Urteil über die gesamte Sicherheit. Die genauen Folgen hängen auch von Anmeldeart und Kontokontext ab; insbesondere sind Passwortregeln nicht pauschal auf extern verwaltete Anmeldungen übertragbar.

    13. Für Interessierte: direkt vergebene Rollen ansehen

    SELECT: Welche Rollen sind dem Konto unmittelbar zugewiesen?
    READ ONLY – Direkte Rollenzuweisungen
    SELECT grantee, granted_role, default_role, admin_option
    FROM   dba_role_privs
    WHERE  grantee = UPPER('&BENUTZER')
    ORDER BY granted_role;

    Fiktive Beispielausgabe:

    GRANTEEGRANTED_ROLEDEFAULT_ROLEADMIN_OPTION
    REPORT_USERREPORT_READYESNO

    REPORT_USER hat die Rolle REPORT_READ direkt erhalten. DEFAULT_ROLE = YES heißt, dass sie zu den standardmäßig aktivierten Rollen gehört. ADMIN_OPTION = NO bedeutet, dass diese Zuweisung nicht mit der administrativen Weitervergabemöglichkeit ausgestattet ist. Der Name REPORT_READ ist frei gewählt; aus dem Namen allein darf nicht auf ihren Inhalt geschlossen werden.

    Für die Bewertung muss anschließend der Rolleninhalt geprüft werden. Die Abfrage zeigt weder alle verschachtelten Rollen noch alle direkten Objekt- und Systemrechte. Keine Ergebniszeile bedeutet deshalb nicht „Benutzer besitzt keinerlei Rechte“. Die Vertiefung dazu bleibt in Kapitel 12.

    14. Auditing: das Protokoll verstehen

    Auditing bedeutet, ausgewählte Vorgänge aufzuzeichnen. Es ist wie ein Zutrittsprotokoll: Die eingerichteten Regeln entscheiden, was festgehalten wird. Nur weil irgendeine Protokollierung aktiv ist, wird nicht automatisch jede gelesene Zeile oder jede Aktion vollständig dokumentiert.

    Oracle 19c kennt traditionelle Audit-Verfahren und Unified Auditing. Beide können in einem gemischten Betrieb nebeneinander vorkommen. Das Wort Unified beschreibt die vereinheitlichte Audit-Infrastruktur. Es sagt nicht, dass die fachlich gewünschten Regeln bereits vollständig eingerichtet sind.

    Das Betriebssystem kann ebenfalls protokollieren, beispielsweise mit Solaris auditd. Dieses Protokoll hat einen anderen Blickwinkel als ein Datenbank-Audit. Aus einem laufenden auditd folgt nicht, dass alle benötigten Datenbankaktionen aufgezeichnet werden.

    RolleAufgabe
    AUDIT_VIEWERAuditdaten ansehen und analysieren.
    AUDIT_ADMINAudit-Regeln und Audit-Verwaltung einschließlich Bereinigung administrieren.

    Für reine Auswertung ist Audit-Administration nicht automatisch erforderlich. Die konkreten Leserechte auf weitere verwendete Dictionary-Views sind gesondert zu prüfen. Das Wiki erteilt keine dieser Rollen.

    15. Für Interessierte: Audit-Grundkonfiguration lesen

    SELECT: Pure Unified Auditing erkennen
    READ ONLY – Pure Unified Auditing
    SELECT parameter, value
    FROM   v$option
    WHERE  parameter = 'Unified Auditing';

    Fiktive Beispielausgabe:

    PARAMETERVALUE
    Unified AuditingFALSE

    Die fiktive Ausgabe FALSE bedeutet: Pure Unified Auditing ist nicht eingeschaltet. Sie bedeutet nicht, dass kein Audit vorhanden ist. Traditionelle und Unified-Audit-Funktionen können im gemischten Betrieb nebeneinander vorkommen.

    Den traditionellen Pfad und seine Grundparameter erklärt der Abschnitt zu Audit-Ablageorten. Die aktivierten Audit-Regeln und tatsächlichen Ereignisse werden davon getrennt geprüft.

    16. Audit-Regel, Audit-Ereignis und Auswertung unterscheiden

    Die folgende Abfrage enthält bewusst ENTITY_NAME und ENTITY_TYPE. Erst damit wird sichtbar, ob eine Policy alle Benutzer, bestimmte Benutzer oder erteilte Rollen betrifft. EXCEPT USER bezeichnet eine Ausnahme, keine Einschlussliste. Die Policy-Definition und ihre Aktionen werden zusätzlich in AUDIT_UNIFIED_POLICIES geprüft; aktivierte Policy und tatsächlich aufgezeichnetes Ereignis bleiben verschiedene Nachweise.

    Eine Audit-Regel legt fest, welcher Vorgang für welchen Personenkreis erfasst werden soll. Ein Audit-Ereignis ist eine tatsächlich erzeugte Aufzeichnung. Eine Auswertung liest und bewertet diese Aufzeichnungen. Eine vorhandene Regel beweist noch nicht, dass ein bestimmter gemeldeter Vorgang bereits in einer ausgewerteten Datei oder View gefunden wurde.

    Welche Aussage trägt ein einzelner Eintrag? Ein Auditdatensatz beschreibt die erfasste Aktion und ihren Kontext. Ein erfolgreicher Datenbankaufruf beweist nicht, dass ein Mensch jede gelieferte Zeile gesehen hat oder der Bericht fachlich vollständig war. Bei gemeinsam verwendeten Anwendungskonten ist der Datenbankbenutzer zudem nicht automatisch die handelnde Person. Ein von der Anwendung gepflegter CLIENT_IDENTIFIER kann die Zuordnung unterstützen; dafür muss seine Herkunft verlässlich sein. Die Prüfung folgt deshalb dem Weg Regel → erfasste Aktion → Identität und Kontext → zulässige Schlussfolgerung. Oracle 19c.

    Plane eine Prüfung von der Frage aus: Soll etwa eine fehlgeschlagene Anmeldung erkennbar sein? Dann müssen passende Ereignisart, Erfolg beziehungsweise Fehlschlag und betroffene Benutzer berücksichtigt werden. Eine Regel für erfolglose Anmeldungen beantwortet nicht automatisch, wer einen fachlichen Bericht gelesen hat.

    Bei der Zuordnung helfen Zeitpunkt, Datenbankbenutzer, Anwendungskontext, Aktion und Ergebniscodes. Ein geteilter Datenbankbenutzer identifiziert den einzelnen Menschen nicht von selbst. Clientinformationen können helfen, ihre Verlässlichkeit und Herkunft müssen aber bekannt sein. Auditdaten sind selbst sensible Informationen und brauchen passende Leserechte und Aufbewahrung.

    Keine gefundenen Zeilen haben mehrere mögliche Gründe: falsches Zeitfenster, andere Auditquelle, nicht passende Regel, Berechtigung oder noch nicht verfügbare Ausgabe. „Keine Zeile“ wird deshalb nicht ungeprüft mit „Vorgang hat nicht stattgefunden“ gleichgesetzt.

    SELECT: aktivierte Unified-Audit-Regeln ansehen
    READ ONLY – Aktivierte Unified-Audit-Policies
    SELECT policy_name, enabled_option, entity_name,
           entity_type, success, failure
    FROM audit_unified_enabled_policies
    ORDER BY policy_name, enabled_option, entity_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    POLICY_NAMEENABLED_OPTIONENTITY_NAMEENTITY_TYPESUCCESS
    ORA_LOGON_FAILURESBY USERALL USERSUSERNO
    FAILURE
    YES

    So liest du das Ergebnis: Die Aktivierung gilt hier für alle Benutzer und erfolglose Vorgänge der Policy. ALL USERS steht in ENTITY_NAME, nicht in ENABLED_OPTION. Für den protokollierten Aktionstyp zusätzlich die Policy-Definition prüfen.

    Die fiktive Zeile zeigt eine Policy, die für fehlgeschlagene Vorgänge aktiviert ist. SUCCESS = NO und FAILURE = YES unterscheiden Erfolg und Fehlschlag. ENABLED_OPTION beschreibt die Art der Aktivierung; die Beispielausgabe zeigt nur eine Aktivierung. Weitere sichtbare Benutzer-, Rollen- oder Ausnahmezuordnungen erscheinen als zusätzliche Ergebniszeilen; Sichtbarkeit und Containerkontext bleiben zu beachten.

    Welche Aktionen eine Policy enthält, wird ergänzend in AUDIT_UNIFIED_POLICIES geprüft. Welche Ereignisse tatsächlich geschrieben wurden, gehört zur passenden Audit-Trail-Auswertung. Die eingerichtete Policy ist keine vollständige Ereignisliste. Die View wird entsprechend der vorhandenen Unified-Audit-Funktion und Berechtigung gelesen; traditionelle Audit-Regeln benötigen ihre eigenen Quellen.

    SELECT: von der Policy zum aufgezeichneten Ereignis

    Die folgenden beiden Schritte vervollständigen den Fall der fehlgeschlagenen Anmeldung. Sie lesen vorhandene Daten und erzeugen keinen Test-Login.

    READ ONLY – Aktionen einer Unified-Policy
    SELECT policy_name, audit_option, audit_option_type,
           audit_condition
    FROM audit_unified_policies
    WHERE policy_name = 'ORA_LOGON_FAILURES'
    ORDER BY audit_option_type, audit_option;

    Fiktive Beispielausgabe:

    POLICY_NAMEAUDIT_OPTIONAUDIT_OPTION_TYPEAUDIT_CONDITION
    ORA_LOGON_FAILURESLOGONSTANDARD ACTIONNONE

    Fiktiver Ausschnitt: Die Definition betrifft LOGON. Erfolg/Fehlschlag und Benutzerumfang ergeben sich aus der zuvor gezeigten Aktivierung; der Policy-Name allein ersetzt diese Prüfung nicht.

    READ ONLY – Fehlgeschlagene Logons im UTC-Zeitfenster
    SELECT event_timestamp_utc, dbusername, action_name,
           return_code, unified_audit_policies
    FROM unified_audit_trail
    WHERE event_timestamp_utc >= TIMESTAMP '2026-10-13 18:00:00'
      AND event_timestamp_utc <  TIMESTAMP '2026-10-13 19:00:00'
      AND dbusername = 'REPORT_USER'
      AND audit_type = 'Standard'
      AND action_name = 'LOGON'
      AND return_code <> 0
    ORDER BY event_timestamp_utc
    FETCH FIRST 50 ROWS ONLY;

    Fiktive Beispielausgabe:

    EVENT_TIMESTAMP_UTCDBUSERNAMEACTION_NAMERETURN_CODEUNIFIED_AUDIT_POLICIES
    2026-10-13 18:15:00REPORT_USERLOGON1017ORA_LOGON_FAILURES

    Was sehe ich hier? Ein erfolgloser Logon wurde für REPORT_USER erfasst; 1017 ist der Oracle-Fehlercode ORA-01017. Das ist kein erfolgreicher Login und keine Identifikation einer konkreten Person. Der Zeitraum ist ausdrücklich UTC (hier 20–21 Uhr in Deutschland); Benutzer und Zeitfenster sind Lernwerte. Maximal 50 Zeilen werden gezeigt, keine vollständige Ereigniszählung. SQL_TEXT und Bind-Inhalte werden hier nicht ausgegeben.

    Im Mixed Mode ist für traditionelle Datenbank-Audits zusätzlich die passende Quelle wie DBA_AUDIT_SESSION beziehungsweise DBA_AUDIT_TRAIL zu prüfen; OS-/XML-Audits haben eigene Quellen. Keine Zeilen in UNIFIED_AUDIT_TRAIL beweisen nicht, dass in diesen anderen Quellen nichts vorhanden ist.

    17. Audit-Dateien: wofür sie da sind

    Auch Oracle Linux kann Betriebssystem-Auditing mit auditd verwenden. Trotz des gleichen Dienstnamens unterscheiden sich Konfiguration, Werkzeuge und Ablage von Solaris. Oracle-Datenbank-Audit und Betriebssystem-Audit sind auf beiden Plattformen getrennte Quellen; AUDIT_FILE_DEST steuert keine Linux-auditd-Rotation.

    Eine Audit-Datei ist ein Protokoll ausgewählter Sicherheitsvorgänge. Sie kann beispielsweise helfen, administrative Zugriffe oder fehlgeschlagene Anmeldungen nachzuvollziehen. Sie ist kein Datenbank-Backup und ersetzt kein Redo Log. Sie enthält nicht automatisch jede Änderung oder jeden gelesenen Datensatz.

    Für die Bedeutung einer Datei musst du ihren Erzeuger kennen: Stammt sie vom traditionellen Oracle-Auditing, vom Unified-Auditing oder vom Betriebssystem? Eine Solaris-auditd-Datei ist ein Betriebssystemprotokoll mit eigenen Regeln. Eine Oracle-.aud-Datei gehört zur entsprechenden Oracle-Protokollierung. Gleichartige Namen oder dieselbe Dateiendung allein erklären nicht den gesamten Inhalt.

    In einer Diagnose werden Zeitfenster, Quelle, Aktion und Benutzerzuordnung gemeinsam betrachtet. Audit-Protokolle können sensible Namen, Verbindungsinformationen und je nach Konfiguration weitere Inhalte enthalten. Deshalb sollen nur dafür berechtigte Personen sie auswerten können.

    18. Wo die verschiedenen Audit-Daten liegen

    QuelleMögliche AblageWelche Einstellung oder Sicht hilft?
    Traditionelles Datenbank-AuditDatensätze in Datenbank-Auditstrukturen; nicht zwingend einzelne OS-Dateien.AUDIT_TRAIL und die passenden traditionellen Audit-Views.
    Traditionelles OS- oder XML-AuditDateien im konfigurierten Audit-Verzeichnis.AUDIT_FILE_DEST; für SYS-Aktionen zusätzlich deren Audit-Konfiguration beachten.
    Unified AuditNormalerweise eigene Datenbankstrukturen unter AUDSYS.UNIFIED_AUDIT_TRAIL und Audit-Management-Konfiguration.
    Unified-SpilloverDateien als Ausweichablage, wenn entsprechende Audit-Daten nicht regulär geschrieben werden können.Üblicher Bereich $ORACLE_BASE/audit/$ORACLE_SID, gegebenenfalls Container-Unterverzeichnisse.
    Solaris auditdBetriebssystemseitig konfigurierte Ziele.Solaris-Konfiguration; AUDIT_FILE_DEST steuert diese nicht.

    Spillover bedeutet hier „Ausweichablage“. Unified-Audit-Dateien sind deshalb nicht einfach dieselben Dateien wie das traditionelle adump-Verzeichnis. In Pure Unified Auditing steuert AUDIT_FILE_DEST nicht den Unified-Audit-Trail.

    Auch AUDIT_TRAIL = DB schließt zusätzliche Oracle-Audit-Dateien nicht grundsätzlich aus. Verpflichtende Audit-Ereignisse und traditionell protokollierte SYS-Aktionen sind gesondert zu berücksichtigen. Deshalb wird die Frage „Warum gibt es trotz DB noch .aud-Dateien?“ nicht allein mit dem Parameterwert beantwortet.

    SELECT: vorhandenen traditionellen Audit-Pfad und Grundparameter lesen
    READ ONLY – Audit-Pfad und Parameter
    SELECT name, display_value
    FROM   v$parameter
    WHERE  name IN ('audit_file_dest', 'audit_trail',
                    'audit_sys_operations', 'audit_syslog_level')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEDISPLAY_VALUE
    audit_file_dest/u01/app/oracle/admin/DEMODB/adump
    audit_sys_operationsTRUE
    audit_syslog_levelNULL
    audit_trailDB

    Der Pfad ist ein erfundenes Beispiel. Für deine Datenbank ist der tatsächlich gelesene Wert maßgeblich. NULL bei AUDIT_SYSLOG_LEVEL zeigt hier einen nicht gesetzten Wert, keine Behauptung über alle Betriebssystemprotokolle. Die Abfrage belegt weder die Existenz des Verzeichnisses noch dessen freien Platz oder Dateirechte.

    Unter UNIX sind für AUDIT_FILE_DEST unter anderem ORACLE_BASE/admin/ORACLE_SID/adump und ein möglicher Fallback unter ORACLE_HOME/rdbms/audit relevant. Container können zusätzliche Unterverzeichnisse besitzen. Ein explizit konfigurierter Pfad hat seinen eigenen Kontext; deshalb ist eine pauschale feste Pfadangabe im Bericht ungeeignet.

    19. Aufbewahrung ist nicht dasselbe wie Dateirotation

    Aufbewahrung bedeutet: Wie lange sollen die Informationen verfügbar bleiben? Rotation bedeutet: Wann wird eine neue Datei begonnen? Bereinigung bedeutet: Welche alten Daten oder Dateien werden entfernt? Diese drei Fragen brauchen getrennte Antworten.

    Ein Audit-File kann beispielsweise nach einem Tag neu begonnen werden und trotzdem monatelang bestehen bleiben. Die Grenze für das Alter einer geöffneten Datei sagt deshalb nicht automatisch, dass Dateien nach einem Tag gelöscht werden. Auch eine maximale Dateigröße begrenzt einzelne Dateien, nicht notwendigerweise den gesamten Verzeichnisverbrauch.

    BegriffWas er regeltWas er nicht automatisch regelt
    OS_FILE_MAX_AGEWie lange ein geeignetes OS-/XML-Audit-File geöffnet bleibt, bevor eine neue Datei begonnen wird; Einheit Tage.Die Löschung aller Dateien älter als diese Zahl.
    OS_FILE_MAX_SIZEGröße eines geeigneten OS-/XML-Audit-Files vor einem Dateiwechselschritt; Einheit KB.Die Gesamtgröße des Audit-Verzeichnisses.
    Purge-Job-IntervallWie oft eine Audit-Bereinigung aufgerufen werden soll.Wie viele Tage Informationen aufbewahrt werden.
    Archive-ZeitmarkeEine gesetzte Grenze, die eine passend konfigurierte Bereinigung berücksichtigt.Den Beweis, dass tatsächlich ein vollständiges Archiv existiert.

    Die beiden OS_FILE_-Eigenschaften gehören zum Audit-Management für geeignete Audit-Dateien. Sie sind nicht als universelle Initialisierungsparameter für jedes Audit-Verfahren zu verstehen. Welche Eigenschaft auf welchen Trail anwendbar ist, wird in der eingesetzten Version geprüft.

    Für die Aufbewahrung gibt es nicht einfach einen einzigen allgemeinen Schalter „Audit 30 Tage“. Die vereinbarte Dauer muss in Archivierung, Bereinigungsgrenze und tatsächlichen Jobablauf übersetzt werden. Ein täglicher Job kann Daten für 30 Tage erhalten – oder ganz anders arbeiten –, abhängig von seinen Grenzen.

    SELECT: vorhandene Audit-Management-Eigenschaften lesen
    READ ONLY – Audit-Management-Konfiguration
    SELECT audit_trail, parameter_name, parameter_value
    FROM   dba_audit_mgmt_config_params
    ORDER BY audit_trail, parameter_name;

    Fiktive Beispielausgabe:

    AUDIT_TRAILPARAMETER_NAMEPARAMETER_VALUE
    OS AUDIT TRAILOS FILE MAX AGE1
    OS AUDIT TRAILOS FILE MAX SIZE10240

    Fiktiver Ausschnitt mit lesbaren Eigenschaftsbezeichnungen: MAX AGE bezeichnet Tage bis zum Dateiwechselschritt; MAX SIZE ist hier 10.240 KB. Weder 1 noch 10.240 sind eine Aufbewahrungsfrist. Die konkreten Bezeichnungen der eigenen Ausgabe mit den dokumentierten Eigenschaften abgleichen.

    Die Ausgabe nennt den betroffenen Trail, den Eigenschaftsnamen und den konfigurierten Wert. Die Bezeichnungen können von den symbolischen Konstantennamen in der Dokumentation abweichen. Werte werden deshalb mit der Bedeutung ihrer konkreten Eigenschaft gelesen, nicht als allgemeine „Tage bis Löschung“ interpretiert.

    Keine Ergebniszeile bedeutet nicht automatisch „unbegrenzt aufbewahrt“. Es kann keine passende Konfiguration in dieser Quelle sichtbar sein; andere Jobs oder OS-Verfahren müssen zusätzlich betrachtet werden. In einem read-only Datenbankzustand hat die Befüllung bestimmter Audit-Management-Views besondere Grenzen.

    20. Bereinigungsjob und Archivgrenze nachvollziehen

    Purge ist der Fachbegriff für Bereinigung. Oracle stellt dafür Funktionen in DBMS_AUDIT_MGMT bereit. Ein eingerichteter Job ist wie ein Terminplan: Er beschreibt eine geplante Aufgabe, beweist aber noch nicht, dass jeder Lauf erfolgreich war.

    Eine Archive-Zeitmarke kann festlegen, bis zu welchem Zeitpunkt Audit-Daten bei der Bereinigung berücksichtigt werden. Sie wird gesetzt; die Zeitmarke selbst kopiert keine Daten in ein Archiv. Ein Datensatz „bis 1. September archiviert“ ist deshalb zunächst eine Konfigurationsaussage, deren fachliche Richtigkeit der Archivierungsprozess belegen muss.

    SELECT: eingerichtete Audit-Bereinigungsjobs ansehen
    READ ONLY – Audit-Purge-Jobs
    SELECT job_name, job_status, audit_trail,
           job_frequency, use_last_archive_timestamp, job_container
    FROM   dba_audit_mgmt_cleanup_jobs
    ORDER BY job_name;

    Fiktive Beispielausgabe:

    JOB_NAMEJOB_STATUSAUDIT_TRAILJOB_FREQUENCYUSE_LAST_ARCHIVE_TIMESTAMPJOB_CONTAINER
    AUDIT_OS_CLEANENABLEDOS AUDIT TRAILFREQ=HOURLY;INTERVAL=24YESCURRENT

    Der erfundene Job ist aktiviert und für den OS-Audit-Trail konfiguriert. Die dargestellte Kalenderregel bedeutet einen Abstand von 24 Stunden. YES zeigt, dass der Job seine Bereinigung an der gesetzten Archive-Zeitmarke ausrichtet. JOB_CONTAINER=CURRENT beschreibt den aktuellen Container; ALL hätte einen anderen Umfang. Das bedeutet nicht „Dateien werden 24 Stunden aufbewahrt“.

    Für den tatsächlichen Erfolg gehören zusätzlich die passenden Scheduler-Laufinformationen aus Kapitel 27 und der kontrollierte Trail dazu. Diese View erfasst nicht jeden möglicherweise zusätzlich vorhandenen cron- oder Betriebssystemjob. Fehlende Zeilen belegen daher nicht, dass niemals bereinigt wird.

    SELECT: gesetzte Archive-Zeitmarke lesen
    READ ONLY – Archive-Grenzen der Audit-Trails
    SELECT audit_trail, rac_instance, last_archive_ts,
           database_id, container_guid
    FROM   dba_audit_mgmt_last_arch_ts
    ORDER BY audit_trail, rac_instance, database_id, container_guid;

    Fiktive Beispielausgabe:

    AUDIT_TRAILRAC_INSTANCELAST_ARCHIVE_TSDATABASE_IDCONTAINER_GUID
    OS AUDIT TRAIL001.09.2026 00:00:00 +02:0012345678900123456789ABCDEF0123456789ABCDEF

    Im Beispiel gilt die gesetzte Grenze für den OS-Audit-Trail. RAC_INSTANCE = 0 bedeutet hier, dass die Instanznummer für diesen Eintrag nicht anwendbar ist. Zeit und Zeitzone müssen bei einem Vergleich berücksichtigt werden. Eine passende Bereinigung mit Archive-Grenze kann davor liegende Daten beziehungsweise Dateien entfernen; bei OS-Dateien ist der letzte Änderungszeitpunkt der Datei maßgeblich, nicht pauschal Erstellungsdatum oder ältester enthaltener Eintrag. DATABASE_ID und CONTAINER_GUID ordnen die Grenze zu; die Kennungen sind fiktiv.

    Die Grenze vom 1. September verschiebt sich nicht von selbst nur deshalb, weil später erneut ein Job läuft. Für eine rollende Aufbewahrung muss der zuständige Ablauf die Grenze korrekt fortschreiben. Wenn die Grenze unverändert bleibt, kann ein täglich aktivierter Job laufen, ohne die neueren alten Dateien zu entfernen. Im read-only Datenbankzustand kann diese View gesetzte Werte nicht in jedem Fall zeigen.

    SELECT: Ergebnis traditioneller Audit-Bereinigung
    READ ONLY – Traditionelle OS-Bereinigungsereignisse
    SELECT audit_trail, rac_instance, cleanup_time,
           delete_count, was_forced
    FROM dba_audit_mgmt_clean_events
    WHERE audit_trail = 'OS AUDIT TRAIL'
    ORDER BY cleanup_time DESC
    FETCH FIRST 10 ROWS ONLY;

    Fiktive Beispielausgabe:

    AUDIT_TRAILRAC_INSTANCECLEANUP_TIMEDELETE_COUNTWAS_FORCED
    OS AUDIT TRAIL013.10.2026 03:00:00 +02:00120NO

    Der fiktive Eintrag dokumentiert 120 entfernte Audit-Dateien bei dieser traditionellen OS-Bereinigung. WAS_FORCED=NO bedeutet keine erzwungene Umgehung der Archivgrenze. Die View ist für traditionelles Auditing vorgesehen, nicht als allgemeiner Unified-Purge-Nachweis. Scheduler-Laufstatus, Ereignis und tatsächlicher Trail bleiben zusammen zu beurteilen; eine fehlende Zeile beweist keine generelle Abwesenheit anderer Bereinigungsverfahren.

    21. Was lässt sich administrativ verändern?

    ZielZuständige Einstellung oder FunktionWas vor der Änderung geklärt wird
    Anderes traditionelles Audit-VerzeichnisAUDIT_FILE_DEST; für traditionelle Wege, nicht als Unified-Zielschalter.Existenz, Schreibrechte, freien Platz und Wirkung auf neue Sessions beziehungsweise Plattformverhalten prüfen.
    Andere traditionelle Audit-AblageartAUDIT_TRAIL und passende Audit-Regeln.Betriebswirkung, Parameteränderbarkeit und gegebenenfalls erforderlichen Neustart separat planen.
    Andere DateirotationPassende DBMS_AUDIT_MGMT-Eigenschaften.Trailtyp, Einheiten und unterstützte Eigenschaft prüfen.
    Anderer Datenbank-Tablespace für geeignete Audit-DatenSET_AUDIT_TRAIL_LOCATION im unterstützten Audit-Management-Kontext.Kein OS-Pfadwechsel; Platz, Trail und Container prüfen.
    Andere Bereinigung und Archive-GrenzeAudit-Management-Job und SET_LAST_ARCHIVE_TIMESTAMP beziehungsweise passende Bereinigungsfunktionen.Aufbewahrung, gesicherte Archivierung und tatsächliche Löschwirkung festlegen.
    Andere Solaris-auditd-Ablage oder AufbewahrungSolaris-Audit-Konfiguration und zuständiger OS-Ablauf.Eigenständiges Verfahren, nicht durch Oracle-Parameter ersetzen.

    Diese Tabelle erklärt die Zuständigkeiten, ohne Änderungsbefehle auszuführen. Bei AUDIT_FILE_DEST ist die dokumentierte Änderung verzögert wirksam; bestehende Abläufe und neue Sitzungen müssen im geplanten Betriebsverfahren berücksichtigt werden. Für AUDIT_TRAIL ist die statische Parameterwirkung gesondert zu planen. Eine Konfigurationsänderung transportiert vorhandene alte Dateien nicht automatisch an einen neuen Ort.

    Die gewünschte Dauer ist eine organisatorische Festlegung, keine hier erfundene allgemeine gesetzliche Frist. Für unser Beispiel wären 30 Tage im laufenden System und ein separates längerfristiges Archiv zwei verschiedene Vorgaben. Die Archivierung und die Bereinigung müssen diese Vorgaben tatsächlich umsetzen.

    Standard Edition 2 und Unified-Audit-Tablespace: Die Zielzuordnung ist nicht beliebig oft änderbar. Oracle dokumentiert für die Standard Edition eine einmalige Zuordnung vor dem Erzeugen von Unified-Audit-Datensätzen; danach lässt sie sich dort nicht wie in der Enterprise Edition ändern. Zusätzlich müssen der unterstützte Trailtyp, gleiche Blockgröße und ASSM für das Ziel geprüft werden. Das ist kein Schalter für ein neues OS-Verzeichnis.

    Audit-Zeitgrenzen: SET_LAST_ARCHIVE_TIMESTAMP erwartet für traditionelle Datenbank-, FGA- und Unified-Trails UTC, für OS-/XML-Trails die lokale Zeitzone. Beim Vergleich gehören Zeitbasis, Datenbank-ID und Container zum Kontext. USE_LAST_ARCHIVE_TIMESTAMP = FALSE bedeutet eine Bereinigung ohne diese Archivgrenze; aus einem aktivierten Job allein folgt daher keine sichere Aufbewahrungsdauer. Die vorhandene Grenze archiviert selbst keine Daten.

    22. Praxisfall: täglich bereinigt, Verzeichnis wächst trotzdem

    Das adump-Verzeichnis wächst, obwohl ein täglicher Job eingerichtet ist. Prüfe zuerst, ob er wirklich den OS-Audit-Trail und das aktuelle Audit-Verzeichnis bearbeitet. Ein Job für Datenbank-Auditdatensätze entfernt nicht automatisch die OS-Dateien.

    Prüfe danach Jobstatus, letzte erfolgreiche Läufe und die verwendete Archive-Zeitmarke. Ist die Grenze veraltet, können viele neuere Dateien erhalten bleiben. Wenn Dateien nach einem früheren Pfadwechsel noch in einem alten Verzeichnis liegen, erfasst CLEAN_AUDIT_TRAIL diese nicht automatisch: Es bearbeitet das aktuelle AUDIT_FILE_DEST. Unter Unix betrifft der OS-Trail dort passende .aud-Dateien; Syslog-Protokolle werden dadurch nicht bereinigt.

    Vergleiche schließlich die erwartete Aufbewahrung mit dem tatsächlichen Alter und der Größe der Dateien. Ein maximal geöffnetes File-Alter von einem Tag ist dabei keine Ein-Tages-Löschregel. Dokumentiere die Ursache; dieses Skript löscht weder Dateien noch Audit-Datensätze.

    Oracle-Referenzen: AUDIT_FILE_DEST, DBMS_AUDIT_MGMT, Audit-Purge-Jobs und Archive-Zeitmarken.

    23. Datenzugriff, Netzwerk und Sicherungen schützen verschiedene Ebenen

    Leserechte begrenzen den Zugriff innerhalb der Datenbank. Sie schützen nicht automatisch eine exportierte CSV-Datei, eine Sicherung oder Daten auf dem Weg durch das Netzwerk. Nach dem Export gelten zusätzlich die Rechte und Freigaben des Zielsystems. Deshalb gehört der gesamte Datenweg zur Betrachtung.

    Verschlüsselung macht Daten ohne den passenden Schlüssel unlesbar. Schutz der Übertragung und Schutz gespeicherter Daten sind unterschiedliche Aufgaben. Verschlüsselung ersetzt keine passende Tabellenberechtigung: Ein bereits berechtigter Benutzer kann die für ihn lesbaren Daten weiterhin sehen. Die tatsächlich verfügbaren Verfahren und ihre Lizenzbedingungen werden für die eingesetzte Oracle-Version und Edition geprüft, bevor eine Umsetzung geplant wird.

    Auch Listener und Datenbank-Service beantworten eine andere Frage als Tabellenrechte: Über welchen Weg wird die Verbindung hergestellt? Ein erreichbarer Service ist keine Zugriffserlaubnis auf alle Daten. Umgekehrt beweist ein gesperrter Benutzer nicht, dass das Netzwerkziel nicht erreichbar ist.

    24. Drei Praxisfälle vollständig einordnen

    Fall 1 – Anmeldung klappt, Bericht scheitert:

    Prüfe Service und Container, das tatsächlich verwendete Konto sowie das Objekt oder Programm, das die Anwendung aufruft. Ermittle anschließend die direkte oder rollenbasierte Zugriffskette. Ein erfolgreicher Login beantwortet nur den ersten Teil. Die Befunde werden mit den benötigten Berichtsdaten abgeglichen.

    Fall 2 – Direkte Leserechte sehen korrekt aus, Zugriff ist trotzdem sehr breit:

    Prüfe verschachtelte Rollen, PUBLIC und breit wirkende Systemrechte. Berücksichtige außerdem, ob die Anwendung als Objektbesitzer arbeitet. Eine einzelne schmale SELECT-Zuweisung begrenzt andere vorhandene Wege nicht automatisch.

    Fall 3 – Ein Vorfall soll nachvollzogen werden:

    Beginne mit Ereignis, Zeitfenster und betroffenem Konto. Prüfe danach Audit-Modus, passende aktivierte Regel und richtige Protokollquelle. Unterscheide eine bekannte Datenbankidentität von einer belegten Zuordnung zu einer Person. Halte fest, was das Protokoll belegt und welche Information fehlt.

    25. Ein einfacher Prüfweg

    1. Aufgabe klären: Was soll der Benutzer oder die Anwendung tun?
    2. Zugang prüfen: richtiger Service, richtiger Benutzer, passende Anmeldeart und Kontostatus?
    3. Berechtigungen prüfen: Welche tatsächlich benötigten Zugriffe sind vorhanden?
    4. Weitreichende Rechte mit dem Verantwortlichen begründen, statt aus Rollennamen zu raten.
    5. Protokollierung prüfen: Welche gewünschten Vorgänge werden durch welche Regeln erfasst?
    6. Befunde dokumentieren. Dieses Wiki nimmt keine Änderungen vor.
    Praxisfall:

    Die Berichtsanwendung kann sich anmelden, erhält aber beim Lesen eine Berechtigungsfehlermeldung. Die Anmeldung hat also eine andere Frage beantwortet als der Tabellenzugriff. Prüfe das tatsächlich angesprochene Objekt und die verfügbaren Rechte im passenden Kontext. Eine pauschale DBA-Zuweisung ist keine Erklärung des Problems.

    Oracle 19c: Unified-Ereignisse · Policy-Definitionen · Traditionelle Bereinigung · Audit-Rollen

    26. Weiterführende Informationen

    Offizielle Oracle-Dokumentation – 19c, englisch:

    Die Erklärungen hier sind deutsch. Die technischen Quellen sind englisch; konkrete Edition, Clientversion und Patchstand zusätzlich berücksichtigen.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Wirksamer Zugriff kann aus direkten Grants, Rollen, PUBLIC und administrativen Privilegien entstehen. Eine Sicherheitsprüfung muss deshalb mehr als die direkt vergebenen Rechte ansehen.
    2. Technische Konten und administrative Zugänge benötigen einen klaren Zweck. Account-Status und Profile sind wichtige Kontrollen, ersetzen aber kein vollständiges Berechtigungskonzept.
    3. Audit-Konfiguration, tatsächlich erzeugte Audit-Ereignisse und deren Auswertung sind drei verschiedene Ebenen. Eine vorhandene Regel allein beweist noch keine vollständige Protokollierung.
    4. Ein Audit-Eintrag dokumentiert technische Ereignisse im erfassten Kontext. Er beweist nicht automatisch, welche Person einen Inhalt tatsächlich gelesen hat oder ob ein fachlicher Vorgang korrekt war.
    5. Audit-Daten benötigen geregelten Zugriff, Aufbewahrung und nachvollziehbare Bereinigung. Datenbank-Audit-Trails, Betriebssystemdateien und Archivierung müssen dabei zusammenpassen.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Darf ein angemeldeter Benutzer automatisch jede Tabelle lesen?
    Nein. Anmeldung und Zugriffserlaubnis sind getrennte Prüfungen.
    Frage 2: Vergibt ein Profil Leserechte?
    Nein. Ein Profil beschreibt Regeln wie Passwortalter oder bestimmte Grenzen, keine Tabellenrechte.
    Frage 3: Ist die Rolle DBA dasselbe wie SYSDBA?
    Nein. DBA ist eine Rolle; SYSDBA ist eine besondere administrative Berechtigung.
    Frage 4: Bedeutet Unified Auditing = FALSE, dass nichts protokolliert wird?
    Nein. Pure Unified Auditing ist nicht eingeschaltet; andere Audit-Funktionen können trotzdem aktiv sein.
    Frage 5: Beweist ein Rollenname den gesamten Zugriff?
    Nein. Inhalt, weitere Rechte und der konkrete Ausführungskontext müssen geprüft werden.
    Frage 6: Bedeutet tägliche Bereinigung einen Tag Aufbewahrung?
    Nein. Aufruffrequenz und zeitliche Löschgrenze sind verschiedene Einstellungen.
    Frage 7: Beweist eine Archivzeitmarke ein vorhandenes Archiv?
    Nein. Das Setzen der Grenze kopiert keine Daten; die Archivierung muss gesondert belegt sein.
    Frage 8: Beweist ein aktivierter Purge-Job einen erfolgreichen Lauf?
    Nein. Laufstatus, Bereinigungsereignis und Ergebnis im passenden Trail müssen zusammen geprüft werden.

    15. Verschlüsselung in Oracle

    Transport, gespeicherte Daten und Schlüsselverwaltung verständlich unterscheiden.

    Lernkompass
    Einfach gesagt Transport, gespeicherte Daten und Schlüsselverwaltung verständlich unterscheiden.
    Warum ist das wichtig? Eine Schutzmaßnahme wirkt nicht automatisch auf alle Kopien und Übertragungswege.
    Nach diesem Kapitel Du kannst NNE, TLS und TDE unterscheiden und ihren Schutzbedarf einordnen.

    Einführung: Verschlüsselung schützt die Lesbarkeit von Daten mithilfe kryptografischer Schlüssel. Für Oracle muss zuerst geklärt werden, wo dieser Schutz gebraucht wird: auf der Verbindung zwischen Client und Server oder bei gespeicherten Daten. Die Verfahren setzen an unterschiedlichen Stellen an und ersetzen keine Berechtigungsprüfung. Wer Daten berechtigt über die Anwendung liest, erhält weiterhin die vorgesehenen Inhalte.

    Wir verfolgen den vorhandenen Bericht vom Datenbestand bis zur Übertragung und ordnen die passenden Schutzmechanismen zu. Danach werden Konfiguration, Kontrolle und Grenzen erklärt. Du sollst eine Anforderung wie „Verbindung verschlüsseln“ von „gespeicherte Daten schützen“ unterscheiden können. Edition und benötigte Funktionen werden vor den jeweiligen Einrichtungsbeispielen eingeordnet.

    Oracle 19c: fachliche Grundlage

    Einordnung für Oracle 19c SE2 auf eigenen Servern: NNE, Netzwerk-Integritätsschutz und TLS sind verfügbar. TDE für Spalten und Tablespaces ist in dieser SE2-Bereitstellung nicht verfügbar. Bei Enterprise Edition erfordert TDE Oracle Advanced Security. Abweichende Berechtigungen bestimmter Oracle-Cloud-Angebote gelten nicht automatisch für eine lokale SE2-Installation. Die TDE-Beispiele dieses Kapitels beziehen sich ausschließlich auf eine entsprechend ausgestattete und lizenzierte Lernumgebung.

    1. Was bedeutet Verschlüsselung?

    Beim vorhandenen Bestellbericht liest die Datenbank gespeicherte Informationen und sendet das Ergebnis an die Anwendung. Prüfe für beide Stationen getrennt, welcher Zugriff verhindert werden soll. Die folgende Gegenüberstellung verbindet diesen Schutzbedarf mit dem jeweiligen Verfahren.

    Drei Begriffe helfen: Klartext ist der lesbare Inhalt, verschlüsselte Daten sind das Ergebnis der Verschlüsselung, und der Schlüssel ermöglicht die zugehörige kryptografische Verarbeitung. Ein Passwort kann den Zugriff auf einen Schlüsselbehälter schützen; es ist deshalb nicht automatisch selbst der Schlüssel für alle Daten. Auch eine bloße Kodierung wie Base64 ist keine Verschlüsselung.

    SchutzbedarfPassender BausteinGrenze
    Daten auf dem Weg zwischen Client und DatenbankNative Network Encryption oder TLSSchützt keine unverschlüsselte CSV-Datei auf dem Client.
    Daten in geschützten Tabellen oder Tablespaces auf SpeichermedienTransparent Data Encryption (TDE)Ein berechtigtes SELECT kann weiterhin Klartext liefern.
    Datenbankpasswort soll nicht im Skript stehenSecure External Password Store (SEPS) in einem Client-WalletAktiviert für sich allein keine Netzwerk- oder Tablespace-Verschlüsselung.
    Unnötige Zugriffsmöglichkeiten vermeidenHardening und minimale RechteErsetzt weder Verschlüsselung noch Datensicherung.

    2. Netzwerkverschlüsselung: NNE und TLS unterscheiden

    Native Network Encryption (NNE) ist Oracles Verfahren zum Schutz der Oracle-Net-Verbindung. Die beteiligten Seiten handeln anhand ihrer Konfiguration aus, ob und wie verschlüsselt wird. Ein Betrieb, der Verschlüsselung zwingend voraussetzt, muss das auch erzwingen und inkompatible Verbindungen erkennen. „Die Verbindung funktioniert“ allein ist dafür kein Nachweis. Für NNE werden keine Zertifikate und kein Passwort-Wallet benötigt.

    TLS ist ein verbreitetes Protokoll für geschützte Verbindungen. Bei Oracle Net begegnet dir dafür das Protokoll TCPS. Zertifikate, eine vertrauenswürdige Ausstellerkette und eine Prüfung der erwarteten Serveridentität gehören zum Konzept. Nur einen Port zu ändern genügt nicht. Ein Client muss erkennen können, ob das Zertifikat zum erwarteten Ziel gehört. Bei gegenseitiger Authentifizierung weist sich zusätzlich der Client mit einem Zertifikat aus.

    Für die Auswahl werden zunächst die unterstützten Clients und Treiber, die Anforderungen an den Transportweg und die Prüfung der Serveridentität betrachtet. NNE und TLS können beide Übertragungen schützen; TLS unterstützt ein zertifikatsgestütztes Vertrauensmodell. Anschließend werden Serverversion und Patchstand abgeglichen. Die laufend gepflegte Oracle-19c-Dokumentation kann Einstellungen enthalten, die nicht in jedem älteren 19c-Patchstand vorhanden sind. Übernimm deshalb keine TLS-Parameter blind aus einem Beispiel für eine andere Version.

    3. TDE und Schlüsselverwaltung verständlich einordnen

    TDE bedeutet Transparent Data Encryption. „Transparent“ beschreibt die Sicht einer berechtigten Anwendung: Sie arbeitet weiterhin mit lesbaren Daten; Oracle übernimmt die Ver- und Entschlüsselung der geschützten Speicherung. Das hilft beispielsweise, wenn jemand eine Datendatei außerhalb der vorgesehenen Datenbanknutzung in die Hände bekommt. Es verhindert nicht, dass ein bereits berechtigter Benutzer Daten per SELECT liest und anschließend unverschlüsselt exportiert.

    Ein TDE-Keystore bewahrt die dafür erforderlichen Master-Schlüssel auf. Er gehört zur Datenbankseite. Ein neu angelegter leerer Keystore verschlüsselt noch keinen Tablespace. Zum vollständigen Verfahren gehören die passende Konfiguration, der richtige CDB/PDB-Kontext, ein nutzbarer Master-Schlüssel, die eigentliche Verschlüsselung und deren Kontrolle. Rechte für Schlüsselverwaltung und Rechte auf Anwendungsdaten erfüllen unterschiedliche Aufgaben.

    Vor einem TDE-Projekt werden Edition, Bereitstellungsform und Lizenzbedingungen geprüft. Dieses Kapitel setzt keine pauschale TDE-Verfügbarkeit in jeder Installation voraus. Ein Wiederherstellungstest muss auch die benötigten Schlüssel einschließlich älterer Schlüssel berücksichtigen. Eine Sicherung der Datendateien allein ersetzt keine verlässliche Sicherung und Wiederherstellung der Schlüssel. Siehe dazu Backup und Recovery.

    4. Unser Datenweg: Wo endet der jeweilige Schutz?

    Die Anwendung REPORT_APP liest Bestellzahlen aus APP_DATA. Sie verbindet sich von app01.example.net zum Service appdb.example.net. Nach der Abfrage schreibt sie einen Bericht als CSV-Datei. Daraus ergeben sich drei getrennte Prüfstellen: die gespeicherten Daten in der Datenbank, die Verbindung und die erzeugte Datei. Der Name „verschlüsselte Datenbank“ beantwortet nicht automatisch alle drei Fragen.

    Lege deshalb zuerst fest, wogegen du schützen möchtest. Gegen das Mitlesen einer Verbindung hilft Transportschutz. Gegen das Lesen entwendeter geschützter Datenbankdateien kann TDE helfen. Gegen einen zu weit berechtigten Berichtszugang hilft die Rechteprüfung. Für eine exportierte Datei braucht es einen eigenen Schutz am Ziel, etwa einen beschränkten Ablageort und bei Bedarf eine geeignete Dateiverschlüsselung. Die Maßnahmen ergänzen sich.

    BeobachtungZulässige AussageNoch zu prüfen
    APP_DATA ist TDE-verschlüsseltDer betreffende Tablespace besitzt Speicherverschlüsselung.Transport, Exporte und Zugriffsrechte.
    Die Sitzung verwendet einen AES-AdapterFür diese Sitzung gibt es einen konkreten NNE-Befund.Andere Clients und neu aufgebaute Verbindungen.
    Der Report wird ohne Passworteingabe gestartetDer Zugang kann automatisiert bereitgestellt sein.Tatsächlich verwendetes Konto, Wallet-Zugriff und Transportschutz.

    5. NNE-Aushandlung: Erlauben ist nicht Erzwingen

    Bei NNE wirken die Client- und Servereinstellung zusammen. Der Server ist die entgegennehmende Seite, der Client die verbindungsaufbauende Seite. Ein Datenbankserver kann bei einer ausgehenden Verbindung selbst als Client auftreten. Übertrage deshalb die Begriffe nicht ungeprüft auf den Rechnernamen. Auch der von einem Prozess tatsächlich verwendete Konfigurationspfad ist entscheidend.

    WertVerständliche Bedeutung
    ACCEPTEDDie Seite ist bereit, Verschlüsselung zu nutzen, fordert sie aber nicht selbst an.
    REQUESTEDDie Seite möchte Verschlüsselung nutzen; das erzwingt sie nicht gegen jede Gegenkonfiguration.
    REQUIREDOhne passende Verschlüsselung darf die Verbindung nicht zustande kommen.
    REJECTEDDie Seite lehnt diese Verschlüsselung ab.
    Client / ServerErwartung bei sonst kompatibler Konfiguration
    ACCEPTED / ACCEPTEDNNE wird durch diese beiden Einstellungen allein nicht aktiviert.
    REQUESTED / ACCEPTEDNNE wird ausgehandelt, wenn ein gemeinsamer Algorithmus vorhanden ist.
    REQUIRED / ACCEPTEDVerbindung nur mit passender Verschlüsselung.
    REQUESTED / REJECTEDVerbindung kann ohne NNE zustande kommen.
    REQUIRED / REJECTEDVerbindung scheitert; die Anforderung darf nicht unverschlüsselt umgangen werden.

    Diese Beispiele beziehen sich auf NNE über TCP. Ein Algorithmus muss ebenfalls auf beiden Seiten unterstützt sein. TLS/TCPS und mögliche parallele Betriebsarten haben zusätzliche Regeln. Ein sinnvoller Test dokumentiert daher Clienttyp, Version, Zielservice, verwendete Konfiguration und das Ergebnis einer frisch aufgebauten Sitzung.

    Fehlt ein gemeinsamer Algorithmus, scheitert die Verbindung, sobald eine Seite REQUIRED verlangt. Ohne REQUIRED kann der Sicherheitsdienst bei der Aushandlung entfallen. REQUIRED auf einer Seite genügt gegenüber einer kompatiblen akzeptierenden Gegenseite; beide Seiten müssen es nicht setzen.

    6. Kontrolliertes NNE-Beispiel mit anschließendem Nachweis

    Voraussetzung: ein separates Testziel mit abgestimmtem SQL*Plus-/OCI-Client für Oracle 19c und bekanntem sqlnet.ora-Konfigurationspfad. Erhalte vorhandene sqlnet.ora-Einträge; ersetze die Datei nicht komplett. Sichere die Ausgangskonfiguration und halte den Rückweg fest. Die folgenden Zeilen sind manuell einzufügende Konfiguration, keine SQL-Befehle. Eine Umstellung auf REQUIRED kann unpassende Anwendungen von neuen Verbindungen ausschließen.

    Testserver – passende Einträge in sqlnet.ora ergänzen/anpassen
    SQLNET.ENCRYPTION_SERVER = REQUIRED
    SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)
    Testclient – passende Einträge in sqlnet.ora ergänzen/anpassen
    SQLNET.ENCRYPTION_CLIENT = REQUIRED
    SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256)

    Diese kleine Konfiguration behandelt die Verschlüsselung. Die Integritätsprüfung ist ein eigenes Thema: Sie soll Manipulationen der übertragenen Daten erkennen und wird bei NNE über die zugehörigen Crypto-Checksum-Parameter abgestimmt. Für reale Vorgaben müssen beide Schutzanforderungen zusammen betrachtet werden. AES256 im Beispiel ist kein Ersatz für eine vollständige Konfigurationsprüfung.

    Erweiterung im Test – Integrität zusätzlich erzwingen
    # Testserver: sqlnet.ora
    SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
    SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256)
    
    # Testclient: sqlnet.ora
    SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
    SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA256)

    Nach dieser Erweiterung sind in einer neuen Sitzung Verschlüsselung und der konkret ausgehandelte Integritätsadapter getrennt nachzuweisen. Die nachfolgende gekürzte AES256-Ausgabe zeigt ausschließlich den Verschlüsselungsbefund; sie ist kein Nachweis des Integritätsschutzes.

    Baue danach vom Testclient eine neue Verbindung auf. Ein bereits vorhandener Connection Pool kann alte Sitzungen weiterverwenden; sein bloßes Weiterlaufen prüft die geänderte Aushandlung nicht. Für die nächste Abfrage benötigt das Diagnosekonto Leserechte auf V$SESSION_CONNECT_INFO. Vergib dafür nicht pauschal die Rolle DBA. Führe den Nachweis in genau der zu prüfenden Sitzung aus, damit du nicht versehentlich eine andere Verbindung beurteilst.

    Lesende Prüfung – gezielte Berechtigung erforderlich
    SELECT sid, network_service_banner
    FROM v$session_connect_info
    WHERE sid = TO_NUMBER(SYS_CONTEXT('USERENV', 'SID'))
    ORDER BY network_service_banner;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; keine Messung einer realen Umgebung.

    SIDNETWORK_SERVICE_BANNER
    127AES256 Encryption service adapter for Linux: Version 19.0.0.0.0 - Production
    127Encryption service for Linux: Version 19.0.0.0.0 - Production

    Einordnung: Gezeigt ist ein gekürzter Ausschnitt mit zwei zur Abfrage passenden Spalten. Weitere Banner können erscheinen. Die konkrete AES256-Adapterzeile ist der relevante NNE-Befund; die allgemeine Zeile „Encryption service“ allein genügt nicht. Plattform- und Versionsanteile variieren. Diese Sitzung steht nicht stellvertretend für alle Anwendungen.

    Für die Abnahme teste außerdem einen bewusst inkompatiblen Testclient, etwa mit REJECTED bei einem auf REQUIRED gesetzten Testserver. Dieser Versuch muss scheitern. Stelle danach die Testclient-Konfiguration wieder her. Notiere den fehlgeschlagenen Negativtest zusammen mit dem erfolgreichen verschlüsselten Aufbau. Teste das nur im vorgesehenen Lernziel, nicht durch einen ungeplanten Eingriff in einen produktiven Client.

    Für JDBC Thin werden die wirksamen Connection Properties des verwendeten Treibers geprüft. Eine lokale sqlnet.ora darf nicht ungeprüft als Konfigurationsquelle jeder Anwendung angenommen werden. Dokumentiere Prozess, Treiber und wirksame Einstellungen.

    7. TLS: Zertifikat, Vertrauen und Serveridentität

    Ein Zertifikat verbindet eine Identität mit einem öffentlichen Schlüssel und wird von einem Aussteller bestätigt. Der private Schlüssel bleibt beim jeweiligen Besitzer. Eine Vertrauenskette erklärt dem Client, welcher Aussteller für diese Identität bürgen darf. Die zusätzliche Prüfung der erwarteten Serveridentität verhindert, dass ein grundsätzlich vertrauenswürdiges, aber zum falschen Ziel gehörendes Zertifikat akzeptiert wird. „Von einer bekannten Stelle ausgestellt“ und „gehört zu meinem Datenbankserver“ sind unterschiedliche Prüfungen.

    Die Einrichtungsreihenfolge lautet: Zielnamen und Zertifikatsanforderungen festlegen, Schlüssel und Zertifikatsantrag erzeugen, signiertes Zertifikat samt Kette bereitstellen, Clientvertrauen konfigurieren und erst dann Listener und Client für TCPS abstimmen. Der vollständige Weg muss zum tatsächlichen Oracle-Client und Patchstand passen. Ein abgelaufenes Zertifikat, eine fehlende Zwischenzertifizierungsstelle oder ein abweichender Zielname führen zu unterschiedlichen Befunden. Man behebt diese Ursachen gezielt, statt die Identitätsprüfung abzuschalten.

    PrüfschrittErwartetes Ergebnis
    Verbindung mit korrektem Zielnamen und gültiger KetteDer vorgesehene Client baut die TCPS-Verbindung auf.
    Abweichende erwartete Identität beim konfigurierten partiellen oder vollständigen DN-Matching im isolierten TestDie Identitätsprüfung weist die Verbindung zurück.
    Client ohne passenden VertrauensankerDer Vertrauensaufbau scheitert im Test.
    Zertifikatserneuerung vor Ablauf testenNeue Verbindungen funktionieren weiterhin mit aktivierter Identitätsprüfung.

    Lege für den Betrieb fest, wer Ablaufdaten überwacht, Zertifikate erneuert und Clients mit aktualisierten Vertrauensinformationen versorgt. Bei gegenseitigem TLS kommt die Verwaltung der Clientzertifikate hinzu. Ein TLS-Zertifikat muss nicht zugleich die Datenbankbenutzer-Anmeldung ersetzen; das gewählte Authentifizierungsmodell wird gesondert festgelegt. Die Wallet-Begriffe und der vollständig ausgeführte SEPS-Fall stehen in Kapitel 16.

    Beim vollständigen DN-Matching wird der erwartete vollständige Distinguished Name des Serverzertifikats vorgegeben. Partielles Matching folgt den Regeln des konkreten Clients. Test und Konfiguration müssen dasselbe Verfahren verwenden. Die aktuelle 19c-Dokumentation enthält auch neuere TLS_-Parameternamen; deren Verfügbarkeit ist für den tatsächlich eingesetzten Client und RU, etwa 19.22, gesondert zu prüfen.

    8. TDE prüfen: Keystore und verschlüsselte Daten getrennt ansehen

    Das folgende Beispiel gilt für eine lizenzierte TDE-Lernumgebung in der PDB APPDB mit CON_ID 3. Für diese Umgebung prüfst du zuerst den passenden Container und den Keystore-Zustand. V$ENCRYPTION_WALLET beschreibt den TDE-Keystore, nicht das Client-Wallet für den Berichtszugang. In einer PDB bezieht sich das Ergebnis auf diese PDB; in CDB$ROOT kann es mehrere Container umfassen. Die Abfrage verändert keine Anwendungsdaten, kann jedoch ein vorhandenes Auto-Login-TDE-Wallet automatisch öffnen. OPEN belegt deshalb nicht zwingend den Zustand vor der Abfrage. Bei fehlender TDE-Konfiguration können außerdem Prüfungen und Warnungen im Alertlog entstehen. Für eine strikt zustandsneutrale Diagnose ist diese Abfrage ungeeignet; der Generator zeigt sie ausschließlich als Lernreferenz und führt sie nicht aus. Siehe Oracle 19c: Auto-Login-TDE-Wallets und Statusabfragen.

    Lernreferenz – Statusabfrage kann Auto-Login-TDE-Wallet öffnen
    SELECT con_id, status, wrl_type
    FROM v$encryption_wallet
    ORDER BY con_id;

    Fiktive Beispielausgabe:

    CON_IDSTATUSWRL_TYPE
    3OPENFILE

    Einordnung: Im Beispiel wurde in der PDB mit CON_ID 3 geprüft. OPEN bedeutet, dass der Keystore zum Abfragezeitpunkt geöffnet ist; ein Auto-Login-TDE-Wallet kann durch die Abfrage selbst geöffnet worden sein. OPEN_NO_MASTER_KEY hätte eine andere Aussage: geöffnet, aber kein Master-Schlüssel gesetzt. Keine dieser Statusmeldungen beweist allein, dass APP_DATA verschlüsselt ist.

    Prüfe anschließend die vorgesehenen Tablespaces. Das Beispiel setzt voraus, dass APP_ARCHIVE und APP_DATA im aktuellen Container existieren. Ein leeres Ergebnis ist kein Beweis für Verschlüsselung; zuerst Namen, Kontext und Sichtbarkeit klären.

    Lesende Prüfung – gezielte Berechtigung erforderlich
    SELECT tablespace_name, encrypted
    FROM dba_tablespaces
    WHERE tablespace_name IN ('APP_DATA', 'APP_ARCHIVE')
    ORDER BY tablespace_name;

    Fiktive Beispielausgabe:

    TABLESPACE_NAMEENCRYPTED
    APP_ARCHIVENO
    APP_DATAYES

    Einordnung: Die alphabetische Sortierung stellt APP_ARCHIVE vor APP_DATA. APP_DATA ist hier als verschlüsselter Tablespace ausgewiesen, APP_ARCHIVE nicht. Dieser Befund erfasst Tablespace-Verschlüsselung; er ersetzt keine Prüfung eventuell separat verschlüsselter Spalten und keine Aussage zu Exportdateien.

    Die gemeinsame Aussage ist damit eng begrenzt: Der TDE-Keystore ist im betrachteten Kontext geöffnet, und einer der beiden betrachteten Tablespaces ist verschlüsselt. Weitere Container, Kopien, Standbys oder Backups werden dadurch nicht automatisch geprüft. Eine geplante Umstellung von APP_ARCHIVE braucht ihren eigenen Ablauf einschließlich Platz-, Laufzeit- und Wiederherstellungsprüfung.

    9. Schlüsselwechsel, Sicherung und Wiederanlauf

    Ein Master-Schlüsselwechsel und eine erneute Verschlüsselung aller Daten sind nicht dasselbe. Für den Betrieb zählt, welche Schlüssel für aktuelle Daten und vorhandene Sicherungen benötigt werden. Lösche ältere Schlüssel deshalb nicht allein deshalb, weil inzwischen ein neuer aktiv ist. Eine historische Sicherung kann weiterhin auf ältere Schlüssel angewiesen sein. Der Sicherungsplan muss den Zeitpunkt einer Schlüsseländerung berücksichtigen.

    Plane einen Wiederherstellungstest als zusammenhängende Aufgabe: passendes Datenbackup bereitstellen, benötigten Keystore beziehungsweise externen Schlüsselzugang wiederherstellen, Zugangsdaten nach Verfahren bereitstellen und geschützte Daten tatsächlich lesen. Dokumentiere, wer die Schlüssel verwaltet und wer den Restore durchführen kann. Ein technisch gesichertes Wallet hilft wenig, wenn im Störungsfall weder sein Passwort noch der externe Schlüsseldienst erreichbar ist.

    Auch der Wiederanlauf gehört dazu. Ein passwortgeschützter TDE-Keystore und ein Auto-Login-Keystore haben unterschiedliche Öffnungsabläufe. Teste den vorgesehenen Neustart- und Wiederanlaufprozess in einer passenden Testumgebung. Die bloße Existenz einer Wallet-Datei ist kein Verfügbarkeitsnachweis. Die vollständige Sicherungsplanung gehört in Backup und Recovery.

    10. Praxisfall: „Wir haben doch schon ein Wallet“

    Aufgabe in der lizenzierten TDE-Lernumgebung: REPORT_APP nutzt ein SEPS-Wallet. Der Betreiber behauptet deshalb, Übertragung und Speicherung seien verschlüsselt. Eine Diagnose zeigt einen konkreten AES256-Adapter für die geprüfte Sitzung; APP_DATA ist ENCRYPTED=YES, APP_ARCHIVE dagegen ENCRYPTED=NO. Der tägliche CSV-Bericht liegt in einem freigegebenen Verzeichnis.

    Vorgehen und Lösung: Trenne die vier Aussagen. Das SEPS-Wallet stellt Zugangsdaten bereit. Der Adapterbefund belegt NNE für die geprüfte Sitzung. Die Tablespace-Abfrage zeigt nur für APP_DATA einen positiven Verschlüsselungsstatus. Über den Schutz der CSV-Datei sagen diese Befunde nichts aus. Prüfe deshalb den Zugriff und die Schutzanforderung am Exportziel gesondert; überprüfe außerdem, ob der reale Anwendungsprozess dieselbe Verbindungskonfiguration nutzt wie dein Diagnoseclient.

    Abnahme: Halte pro Datenweg Client, Service, Container, Verschlüsselungsbefund und offene Schutzlücke fest. Der Ergebnistext lautet nicht pauschal „alles sicher“, sondern beispielsweise: „Der geprüfte Berichtszugang nutzt NNE, APP_DATA ist verschlüsselt; der Exportpfad muss noch abgesichert werden.“ So bleibt die Aussage fachlich belastbar und für andere nachvollziehbar.

    11. Weiterführende Informationen

    Offizielle Oracle-Dokumentation – 19c, englisch:

    Die Erklärungen hier sind deutsch. Die technischen Quellen sind englisch; konkrete Edition, Clientversion und Patchstand zusätzlich berücksichtigen.

    Weiter üben: Im zentralen Fragenkatalog findest du weitere Aufgaben zu diesem Kapitel. Wähle dort den passenden Themenfilter. Die Prüfungssimulation zieht aus dem gemeinsamen Pool.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Netzwerkverschlüsselung schützt Daten auf dem Übertragungsweg; TDE schützt bestimmte gespeicherte Daten. Keines dieser Verfahren ersetzt die Prüfung von Benutzerrechten.
    2. Bei Native Network Encryption entscheidet die Aushandlung zwischen Client und Server über die tatsächliche Verschlüsselung. Erlaubte Verschlüsselung ist nicht dasselbe wie erzwungene Verschlüsselung.
    3. TLS verbindet Transportverschlüsselung mit einer Prüfung auf Basis von Zertifikaten. Vertrauen in die Zertifikatskette und Prüfung der Serveridentität gehören zusammen.
    4. Ein vorhandenes Wallet beweist weder eine verschlüsselte Verbindung noch verschlüsselte Tablespaces. Der konkrete Verwendungszweck und der tatsächlich erreichte Schutz müssen geprüft werden.
    5. Verschlüsselte Daten bleiben nur mit den erforderlichen Schlüsseln nutzbar. Schlüsselverwaltung, Sicherung und Wiederanlauf gehören deshalb untrennbar zum Verschlüsselungskonzept.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Schützt ein Passwort-Wallet automatisch die Netzwerkverbindung?
    Nein. Das Wallet stellt Zugangsdaten bereit. NNE oder TLS muss unabhängig davon passend eingerichtet und geprüft werden.
    Frage 2: Worin unterscheiden sich NNE und TLS grundsätzlich?
    Beide können den Transport schützen. NNE ist ein Oracle-Verfahren ohne erforderliche Zertifikate. TLS nutzt ein Zertifikats- und Vertrauensmodell, bei dem die erwartete Serveridentität geprüft werden muss.
    Frage 3: Macht TDE einem berechtigten SELECT die Daten unlesbar?
    Nein. Für berechtigte Zugriffe entschlüsselt Oracle die geschützten Daten transparent. TDE ersetzt keine Zugriffsbeschränkung.
    Frage 4: Warum genügt ein leerer TDE-Keystore nicht?
    Die Konfiguration braucht unter anderem einen nutzbaren Master-Schlüssel und die Verschlüsselung des vorgesehenen Datenbereichs. Das reine Anlegen des Behälters verschlüsselt noch keinen Tablespace.
    Frage 5: Warum gehören Schlüssel in einen Wiederherstellungstest?
    Geschützte Daten müssen mit den passenden Schlüsseln wieder lesbar werden. Ein vorhandenes Datenbackup allein beweist das nicht; auch benötigte ältere Schlüssel müssen verfügbar sein.
    Frage 6: Warum garantiert REQUESTED keine Verschlüsselung?
    Eine ablehnende Gegenseite oder fehlende gemeinsame Algorithmen können ohne REQUIRED zu einer Verbindung ohne NNE führen.
    Frage 7: Belegt der AES256-Adapter auch Integritätsschutz?
    Nein. Der konkret ausgehandelte Integritätsdienst muss zusätzlich nachgewiesen werden.
    Frage 8: Welche Verfahren stehen lokal in SE2 zur Verfügung?
    NNE, Netzwerk-Integritätsschutz und TLS; TDE für Spalten oder Tablespaces gehört nicht zum lokalen SE2-Angebot.

    16. Oracle Wallet – Einrichtung und Betrieb

    Ein Datenbankzugang ohne Passwort im Skript: vom Verzeichnis bis zum geprüften Job.

    Lernkompass
    Einfach gesagt Ein Datenbankzugang ohne Passwort im Skript: vom Verzeichnis bis zum geprüften Job.
    Warum ist das wichtig? Ein sicher verwahrtes Passwort und ein zuverlässig laufender Job müssen zusammenpassen.
    Nach diesem Kapitel Du kannst ein SEPS-Wallet im Test einrichten, die Anmeldung prüfen und Fehler eingrenzen.

    Einführung: Ein Oracle Wallet ist ein geschützter Speicher für Sicherheitsinformationen. Sein Zweck ergibt sich aus dem Inhalt und der verwendeten Funktion. Dieses Kapitel behandelt vor allem den Secure External Password Store: Ein Client kann daraus die Zugangsdaten für seine Datenbankverbindung beziehen, sodass sie nicht im Skripttext stehen müssen. Das Konto und seine Berechtigungen bestehen weiterhin.

    Der Einstieg erfolgt über den vorhandenen wiederkehrenden Report. Danach folgen Einrichtung, Verbindungsprüfung, Dateischutz, Jobbetrieb und Passwortwechsel in nachvollziehbarer Reihenfolge. Du lernst auch, weshalb ein funktionierender manueller Aufruf noch keinen erfolgreichen cron-Lauf belegt. Wallets für Zertifikate und Keystores für Datenverschlüsselung werden als andere Verwendungen abgegrenzt.

    Oracle 19c: fachliche Grundlage

    Ausführung: Die gekennzeichneten Einrichtungsbefehle verändern Dateien, Wallet-Einträge, Rechte oder den optionalen Jobplan, wenn du sie selbst ausführst. Der Wiki-Generator stellt sie nur dar. Die SQL-Tests lesen Daten.

    1. Was ist ein Oracle Wallet?

    Die folgende Tabelle ordnet den Wallet-Zweck seinem Inhalt und dem passenden Werkzeug zu. Ein Dateiname allein genügt für diese Zuordnung nicht. Für das anschließende Skriptbeispiel wird ausschließlich der Client-Zugang über SEPS eingerichtet.

    ZweckTypischer InhaltVerwaltung
    Passwort-Wallet / SEPSZuordnung eines Verbindungsnamens zu Datenbankbenutzer und PasswortIm folgenden Oracle-19c-Beispiel: mkstore.
    TLS-WalletVertrauenswürdige Zertifikate und gegebenenfalls eigenes Zertifikat mit privatem SchlüsselZertifikatsverwaltung, zum Beispiel mit orapki; plus Oracle-Net-Konfiguration.
    TDE-Wallet / Software-KeystoreMaster-Schlüssel für die DatenverschlüsselungADMINISTER KEY MANAGEMENT im passenden Datenbankkontext.

    Die folgende Anleitung erstellt ausschließlich ein SEPS-Wallet auf der Clientseite. „Client“ kann auch ein Server sein, auf dem ein Job läuft. Es ist der Rechner beziehungsweise Prozess, der die Verbindung aufbaut. Ein Datenbankserver wird nicht dadurch zum richtigen Ablageort, dass dort die Datenbank installiert ist. Entscheidend ist, wo unser SQL*Plus-Prozess läuft.

    2. Vorbereitung: Ziel, Konto und Umgebung festlegen

    Unser neutrales Beispiel: Auf einem Jobrechner läuft SQL*Plus unter dem Betriebssystemkonto oracle. Das vorhandene Datenbankkonto REPORT_READER darf sich am Service appdb.example.net anmelden. Für den ersten Test benötigt es nur den vorgesehenen Zugang; wir lesen noch keine Anwendungstabelle. Später erhält es ausschließlich die fachlich benötigten Leserechte. SYS, SYSTEM oder AS SYSDBA sind für diesen Bericht kein Ersatz.

    BeispielwertBedeutung
    REPORTDBUnser frei gewählter TNS-Alias und zugleich der Schlüssel für den SEPS-Eintrag.
    db01.example.net:1521Beispieladresse des erreichbaren Listeners; durch das echte Testziel ersetzen.
    appdb.example.netDer am Listener registrierte Datenbankservice; bei Multitenant der vorgesehene PDB-Service.
    /u01/app/oracle/client-securityNeuer, separater Lernbereich auf dem Client. Der ausführende Benutzer braucht dort Schreibrechte.
    /u01/app/oracle/product/19c/client_1Beispiel für ein Oracle Home mit SQL*Plus und mkstore; vor Verwendung an die Installation anpassen.

    Die Oracle-Werkzeuge sqlplus und mkstore müssen tatsächlich installiert sein. Nicht jedes Client-Paket enthält alle Werkzeuge. Die folgenden Shell-Befehle sind in Bash auf Oracle Linux und Solaris geeignet; Installationspfade und der Startpfad von Bash können abweichen. Nutze dasselbe Betriebssystemkonto, unter dem später der Job läuft. Ein Test als root beweist nicht, dass der Job Zugriff hat.

    Lesend prüfen – Beispielpfad vorher anpassen
    export ORACLE_HOME=/u01/app/oracle/product/19c/client_1
    export PATH="$ORACLE_HOME/bin:/usr/bin:/bin"
    command -v sqlplus
    command -v mkstore
    id -un

    Fiktive Beispielausgabe:

    gekürzt.

    /u01/app/oracle/product/19c/client_1/bin/sqlplus
    /u01/app/oracle/product/19c/client_1/bin/mkstore
    oracle

    Einordnung: Die Werkzeuge werden aus dem vorgesehenen Oracle Home gefunden. Fehlt eine Zeile, zuerst die Installation beziehungsweise den Suchpfad klären. Das setzt noch keine Verbindung zur Datenbank voraus.

    3. Schritt 1: Einen getrennten Arbeitsbereich anlegen

    Ändert Dateien und Verzeichnisse: Die Einrichtung findet nur im neuen Lernbereich statt. Bestehende zentrale sqlnet.ora-Dateien werden nicht ersetzt. Prüfe vorab, dass dieser Beispielbereich noch nicht für einen anderen Dienst verwendet wird. Das übergeordnete Verzeichnis muss für das Jobkonto zugänglich sein; eine erforderliche Verzeichnisbereitstellung erfolgt durch die zuständige Administration.

    Manuell ausführen – Testumgebung
    umask 077
    mkdir -p /u01/app/oracle/client-security/network
    mkdir -p /u01/app/oracle/client-security/wallet
    mkdir -p /u01/app/oracle/client-security/bin
    mkdir -p /u01/app/oracle/client-security/log
    chmod 700 /u01/app/oracle/client-security
    chmod 700 /u01/app/oracle/client-security/network
    chmod 700 /u01/app/oracle/client-security/wallet
    chmod 700 /u01/app/oracle/client-security/bin
    chmod 700 /u01/app/oracle/client-security/log
    export TNS_ADMIN=/u01/app/oracle/client-security/network

    umask 077 sorgt bei neu angelegten Dateien und Verzeichnissen für restriktive Standardrechte. chmod 700 erlaubt den Zugriff hier nur dem Eigentümer. Die Variable TNS_ADMIN lenkt diesen Client auf unsere getrennte Netzwerkkonfiguration. Sie gilt zunächst nur in der aktuellen Shell und deren gestarteten Prozessen. Andere Terminals und cron übernehmen sie nicht automatisch.

    4. Schritt 2: Wallet anlegen und Zugang hinterlegen

    Manuell ausführen – Testumgebung
    mkstore -wrl /u01/app/oracle/client-security/wallet -create
    mkstore -wrl /u01/app/oracle/client-security/wallet -createCredential REPORTDB REPORT_READER

    Beim ersten Befehl vergibst du ein neues Wallet-Passwort und bestätigst es. Der zweite Befehl speichert die Zugangsdaten zum Alias REPORTDB. Folge dabei den Eingabeaufforderungen für Wallet-Passwort und Datenbankpasswort; ihre Beschriftung und Reihenfolge können von der Werkzeugversion abhängen. Das Datenbankpasswort gehört zu REPORT_READER, das Wallet-Passwort schützt die Verwaltung des Behälters. Beide Aufgaben sind zu unterscheiden. Passwörter werden interaktiv eingegeben und erscheinen in diesem Beispiel nicht als Befehlsargument.

    Der Befehl erzeugt keinen Datenbankbenutzer und vergibt keine Rechte. Ein Wallet-Eintrag kann deshalb vorhanden sein, obwohl das eingetragene Konto am Ziel nicht existiert oder sein Passwort falsch ist. Erst der spätere Verbindungstest prüft die Anmeldung.

    Lesend prüfen – Wallet-Passwort bei Aufforderung eingeben
    mkstore -wrl /u01/app/oracle/client-security/wallet -listCredential

    Fiktive Beispielausgabe:

    gekürzt.

    List credential (index: connect_string username)
    1: REPORTDB REPORT_READER

    Einordnung: Die gekürzte Liste zeigt Alias und Datenbankkonto, kein Passwort. Der Alias muss beim späteren CONNECT identisch verwendet werden. Für dieses Lernbeispiel bleibt genau ein Zugang im Wallet.

    5. Schritt 3: Die beiden Client-Konfigurationsdateien

    Öffne /u01/app/oracle/client-security/network/tnsnames.ora mit einem Editor und speichere den folgenden Inhalt für das Testziel. Der linke Name REPORTDB ist unser Alias; SERVICE_NAME ist dagegen der tatsächliche Service. Das sind unterschiedliche Namen mit unterschiedlichen Aufgaben.

    Dateiinhalt – tnsnames.ora im neuen Lernbereich
    REPORTDB =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.net)(PORT = 1521))
        (CONNECT_DATA = (SERVICE_NAME = appdb.example.net))
      )

    Lege daneben sqlnet.ora mit folgendem Inhalt an. Der Wallet-Pfad ist ein absoluter Pfad; eine Shell-Variable wie $HOME wird hier nicht als Ersatz eingesetzt. SQLNET.WALLET_OVERRIDE wird für diesen Client gesetzt, nicht pauschal in der serverseitigen Konfiguration.

    Dateiinhalt – sqlnet.ora im neuen Lernbereich
    NAMES.DIRECTORY_PATH = (TNSNAMES)
    
    WALLET_LOCATION =
      (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
          (DIRECTORY = /u01/app/oracle/client-security/wallet)
        )
      )
    
    SQLNET.WALLET_OVERRIDE = TRUE

    Diese Einstellungen sagen SQL*Plus: Löse den Alias aus der lokalen Namensdatei auf und verwende für die Wallet-Anmeldung die dort hinterlegten Zugangsdaten. Die Wahl TCP in diesem Lernbeispiel richtet kein TLS ein. NNE kann bei TCP zusätzlich ausgehandelt werden; diese Anleitung konfiguriert und beweist das nicht. Der erfolgreiche SEPS-Test ist daher ausdrücklich kein Verschlüsselungsnachweis.

    Dateirechte setzen, anschließend Wallet-Dateien lesend auflisten
    chmod 600 "$TNS_ADMIN/tnsnames.ora" "$TNS_ADMIN/sqlnet.ora"
    ls -l /u01/app/oracle/client-security/wallet

    Fiktive Beispielausgabe:

    gekürzt.

    -rw------- 1 oracle oinstall  ... ewallet.p12
    -rw------- 1 oracle oinstall  ... cwallet.sso

    Einordnung: Dateigröße und Datum sind hier ausgelassen. Weitere Hilfs- oder Sperrdateien sind möglich. ewallet.p12 ist die passwortgeschützte Wallet-Datei; cwallet.sso ermöglicht hier Auto-Login. Prüfe Eigentümer und Rechte der tatsächlich erzeugten Dateien, statt die Beispielausgabe als automatische Garantie zu verstehen.

    6. Schritt 4: Anmeldung und Ziel kontrollieren

    Starte den Test in derselben vorbereiteten Shell. -L begrenzt erneute Anmeldeversuche bei fehlgeschlagenem Login. Das /@REPORTDB fordert die Anmeldung über den gespeicherten Zugang an. Es bedeutet hier nicht lokale Betriebssystemanmeldung als SYSDBA. Wenn unerwartet eine interaktive Datenbankanmeldung verlangt wird, brich ab und prüfe die Konfiguration.

    Verbindung öffnen – keine Datenbankänderung
    sqlplus -L /@REPORTDB
    In SQL*Plus ausführen – lesender Identitätstest
    SELECT USER AS DB_USER,
           SYS_CONTEXT('USERENV', 'CON_NAME') AS CON_NAME,
           SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS SERVICE_NAME
    FROM dual;

    Fiktive Beispielausgabe:

    DB_USERCON_NAMESERVICE_NAME
    REPORT_READERAPPDBappdb.example.net

    Einordnung: Eine Zeile mit genau den drei ausgewählten Spalten. REPORT_READER bestätigt das angemeldete Datenbankkonto; APPDB ist hier der Beispielname des erreichten Containers. Er muss nicht wie der TNS-Alias REPORTDB heißen. SERVICE_NAME zeigt den tatsächlich verwendeten Service; Alias, Service und Container erfüllen unterschiedliche Aufgaben. Ein falscher Container ist ein Grund, das Ziel zu korrigieren, bevor ein Bericht ausgeführt wird.

    Beende SQL*Plus anschließend mit EXIT. Das Ergebnis belegt eine erfolgreiche Anmeldung in diesem Beispielkontext. Es belegt weder die Leserechte auf einer späteren Berichtstabelle noch eine verschlüsselte Netzwerkverbindung. Beides braucht eigene Prüfungen.

    7. Schritt 5: Ein nachvollziehbares Bash-Skript

    Speichere den folgenden Inhalt als /u01/app/oracle/client-security/bin/check_login.sh. Das Skript liest nur die Identität und den Container. Auf Oracle Linux ist Bash häufig unter /bin/bash, auf Solaris häufig unter /usr/bin/bash verfügbar. Die erste Zeile muss zum tatsächlich installierten Interpreter passen. Der Oracle-Home-Pfad muss wie im manuellen Test angepasst sein.

    Dateiinhalt – check_login.sh; nur diese Datei anlegen
    #!/bin/bash
    umask 077
    export ORACLE_HOME=/u01/app/oracle/product/19c/client_1
    export PATH="$ORACLE_HOME/bin:/usr/bin:/bin"
    export TNS_ADMIN=/u01/app/oracle/client-security/network
    
    # Sollwerte vor Verwendung an das freigegebene Ziel anpassen.
    EXPECTED_USER=REPORT_READER
    EXPECTED_CONTAINER=APPDB
    EXPECTED_SERVICE=appdb.example.net
    log() { printf '%s %s\n' "$(date '+%Y-%m-%dT%H:%M:%S%z')" "$*"; }
    fail() { log "ENDE: FEHLER: $*; Exit-Code=1" >&2; exit 1; }
    log 'START: Datenbankprüfung'
    [ -x "$ORACLE_HOME/bin/sqlplus" ] || fail 'SQL*Plus ist nicht ausführbar.'
    output=$("$ORACLE_HOME/bin/sqlplus" -L -s /@REPORTDB <<'SQL'
    WHENEVER OSERROR EXIT FAILURE
    WHENEVER SQLERROR EXIT FAILURE
    SET PAGESIZE 0 FEEDBACK OFF HEADING OFF VERIFY OFF ECHO OFF
    SET LINESIZE 32767 TRIMOUT ON TAB OFF
    SELECT 'DB_USER=' || USER || '; CON_NAME=' ||
           SYS_CONTEXT('USERENV', 'CON_NAME') || '; SERVICE_NAME=' ||
           SYS_CONTEXT('USERENV', 'SERVICE_NAME')
    FROM dual;
    EXIT SUCCESS
    SQL
    )
    status=$?
    [ "$status" -eq 0 ] || fail "SQL*Plus fehlgeschlagen (Status $status)."
    # Leerzeilen entfernen; weitere Meldungen/Zeilen bleiben erkennbar.
    actual=$(printf '%s\n' "$output" | sed '/^[[:space:]]*$/d; s/[[:space:]]*$//')
    expected="DB_USER=$EXPECTED_USER; CON_NAME=$EXPECTED_CONTAINER; SERVICE_NAME=$EXPECTED_SERVICE"
    [ "$actual" = "$expected" ] || fail 'Zielabweichung, fehlendes oder unerwartetes Ergebnis; Konfiguration und separaten manuellen Test prüfen.'
    log "$actual"
    log 'ENDE: OK: Erwarteter Benutzer, Container und Service bestätigt; Exit-Code=0'
    exit 0
    
    Skriptrechte setzen und den lesenden Test starten
    chmod 700 /u01/app/oracle/client-security/bin/check_login.sh
    /u01/app/oracle/client-security/bin/check_login.sh
    printf 'Exit-Code: %s\n' "$?"

    Fiktive Beispielausgabe:

    gekürzt.

    2026-10-14T06:15:00+0200 START: Datenbankprüfung
    2026-10-14T06:15:01+0200 DB_USER=REPORT_READER; CON_NAME=APPDB; SERVICE_NAME=appdb.example.net
    2026-10-14T06:15:01+0200 ENDE: OK: Erwarteter Benutzer, Container und Service bestätigt; Exit-Code=0
    Exit-Code: 0

    Einordnung: Das SELECT baut genau eine Textspalte aus Benutzer, Container und Service. Bash vergleicht die vollständige Ergebniszeile mit den Sollwerten. Die OK-Zeile stammt aus Bash und wird nur bei Übereinstimmung ausgegeben. Exit-Code 0 meldet den erfolgreich beendeten Beispieltest; bei erkanntem Fehler liefert das Skript 1.

    WHENEVER SQLERROR beendet SQL*Plus bei SQL-Fehlern; WHENEVER OSERROR behandelt erkannte Betriebssystemfehler. Das sind keine universellen Prüfungen für sämtliche SQL*Plus-Bedienfehler: Insbesondere SP2-Meldungen müssen beim Erweitern eines Skripts gesondert berücksichtigt werden. Deshalb bleibt dieses Beispiel bewusst klein. Eine Anwendung sollte zusätzlich ihr erwartetes fachliches Ergebnis prüfen, nicht allein einen Prozessstatus.

    Für einen geplanten Testlauf kann das zuständige Jobkonto mit crontab -e die folgende Zeile ergänzen. Vorhandene Einträge bleiben erhalten. Der manuelle Test muss vorher erfolgreich gewesen sein. cron hat eine reduzierte Umgebung; deshalb setzt das Skript seine benötigten Variablen selbst. Die Uhrzeit richtet sich nach der cron-Konfiguration des Hosts.

    Optionaler crontab-Eintrag – startet täglich um 06:15 Uhr
    15 6 * * * /u01/app/oracle/client-security/bin/check_login.sh >> /u01/app/oracle/client-security/log/check_login.log 2>&1

    Nach dem ersten geplanten Lauf kontrollierst du Zeit und Inhalt des Logs. Ein ausbleibender Eintrag kann auf den Scheduler, Rechte oder einen falschen Pfad hindeuten; das ist nicht automatisch ein Wallet-Fehler. Das Log darf langfristig nicht unbegrenzt wachsen. Lege für echte Jobs eine passende Rotation fest, und protokolliere keine Passwörter oder vertraulichen Berichtsresultate.

    Kontrollierter Negativtest: Ändere ausschließlich in einer Testkopie EXPECTED_CONTAINER auf einen absichtlich abweichenden Namen. Die Anmeldung kann gelingen, der Vergleich muss dennoch Exit-Code 1 liefern und darf kein OK ausgeben. Stelle den Sollwert danach wieder her. Verändere dafür weder das Datenbankpasswort noch den Wallet-Eintrag. Die Sollwerte sind bewusst fest; es gibt keine automatische Anerkennung eines abweichenden Ziels.

    8. Was Auto-Login bedeutet und wie Passwörter gewechselt werden

    Der Job kann das Wallet ohne interaktive Eingabe des Wallet-Passworts nutzen. Genau dafür ist Auto-Login gedacht. Dadurch wird der Dateizugriff sicherheitsrelevant: Wer den nutzbaren Wallet-Zugang unter passenden Bedingungen erhält, kann damit möglicherweise die hinterlegten Datenbankrechte ausüben. Ein Wallet gehört deshalb weder in ein Git-Repository noch in ein frei lesbares Austauschverzeichnis. Auch Backups müssen geschützt werden. Auto-Login bedeutet nicht, dass das Datenbankpasswort abgeschafft wurde.

    Ein Passwortwechsel ist ein abgestimmter Ablauf: Job vorübergehend anhalten, das Datenbankpasswort nach dem vorgesehenen Verfahren ändern, den gespeicherten Wallet-Zugang aktualisieren, Verbindung testen und den Job wieder freigeben. Die Aktualisierung im Wallet ändert das Passwort in der Datenbank nicht. Plane die kurze Abweichung zwischen beiden Seiten ein, damit automatische Wiederholungen keine Kontosperre auslösen.

    Wallet-Zugang nach geplantem Passwortwechsel aktualisieren und testen
    mkstore -wrl /u01/app/oracle/client-security/wallet -modifyCredential REPORTDB REPORT_READER
    /u01/app/oracle/client-security/bin/check_login.sh

    Gib das neue Datenbankpasswort und das Wallet-Passwort nur bei den passenden Aufforderungen ein. Sichere danach den aktualisierten Wallet-Bestand über das freigegebene Sicherungsverfahren. Bewahre das Wallet-Passwort getrennt auf. Eine alte Sicherung kann einen veralteten Zugang enthalten; ein Wiederherstellungstest muss deshalb die passende aktuelle Anmeldung prüfen. Für TDE gelten zusätzlich die im Kapitel Verschlüsselung erläuterten Anforderungen an historische Schlüssel.

    Das hier erzeugte gewöhnliche Auto-Login-Wallet darf nicht mit Local Auto-Login verwechselt werden. Local Auto-Login ist eine gesonderte, an den erzeugenden Rechner und Betriebssystembenutzer gebundene Variante. Modus 700/600 trennt Betriebssystemkonten, nicht verschiedene Jobs unter derselben Kennung oracle. Bei mehreren Jobs mit unterschiedlichen Schutzanforderungen muss die Konten- und Bereitstellungstrennung geplant werden.

    9. Fehler systematisch eingrenzen

    BeobachtungNächster konkreter PrüfschrittWas daraus folgt
    ORA-12154TNS_ADMIN im tatsächlichen Jobprozess und Alias in dessen tnsnames.ora prüfen.Namensauflösung scheitert; zunächst noch keine Aussage zum Passwort.
    ORA-12514SERVICE_NAME mit den am angesprochenen Listener bekannten Services vergleichen.Der Listener kennt den angefragten Service nicht; Passwortwechsel löst das nicht.
    ORA-01017Ziel, gespeicherten Benutzer und Gültigkeit des Passworts abgleichen.Die Anmeldung wird abgewiesen; Ursache nicht allein aus der Wallet-Dateiexistenz ableiten.
    ORA-28000Kontostatus und fehlgeschlagene Jobwiederholungen untersuchen.Das Konto ist gesperrt; Ursache klären, nicht automatisch in Schleife entsperren.
    Wallet lässt sich nicht öffnenPfad, Eigentümer, Dateirechte und Erreichbarkeit der Elternverzeichnisse als Jobkonto prüfen.Datei vorhanden bedeutet nicht, dass der Prozess sie verwenden kann.
    Manueller Test klappt, cron scheitertBenutzer, absolute Pfade, ORACLE_HOME, TNS_ADMIN und Log des Jobs vergleichen.Unterschiedliche Prozessumgebungen sind eine häufige Ursache.

    Gehe in dieser Reihenfolge vor: Werkzeug und Betriebssystemkonto → Konfigurationspfad → Alias und Ziel → Wallet-Dateien → Zugang → fachliche Abfrage. Notiere die tatsächliche Meldung. Ein tnsping-Erfolg prüft weder den gespeicherten Datenbankzugang noch die benötigten Tabellenrechte. Die ausführliche Netzdiagnose steht im Kapitel Oracle Net.

    10. TLS-Wallet und TDE-Keystore: anderer Zweck, anderer Ablauf

    Die fertige SEPS-Anmeldung lässt sich nicht durch Umbenennen der Wallet-Dateien in eine TLS- oder TDE-Einrichtung verwandeln. Für TLS beginnt der Ablauf mit dem erwarteten Servernamen und der Zertifikatsausstellung: privaten Schlüssel und Zertifikatsantrag verwalten, das ausgestellte Serverzertifikat samt Ausstellerkette bereitstellen, Vertrauensanker auf dem Client hinterlegen, TCPS auf den beteiligten Seiten konfigurieren und die Serveridentität prüfen. Danach werden sowohl der erfolgreiche Verbindungsaufbau als auch ein bewusst falsches Ziel beziehungsweise fehlendes Vertrauen in einer Testumgebung geprüft. Zertifikatsablauf und Erneuerung gehören zum Betrieb.

    Bei TDE beginnt der Ablauf dagegen mit Edition und Lizenz, Schlüsselverantwortung, Sicherungskonzept und Containerstruktur. Darauf folgen Keystore-Konfiguration, Bereitstellung und Öffnung, Master-Schlüssel, Verschlüsselung des gewählten Datenbereichs und kontrollierte Wiederherstellung. Das sind eigene administrative Verfahren. Dieses Praxisbeispiel endet bei einem vollständig eingerichteten SEPS-Wallet; die Quellen im Kapitel Verschlüsselung und die dort verlinkten TLS- und TDE-Handbücher beschreiben die jeweils separate Konfiguration. Es wäre fachlich falsch, die wenigen SEPS-Befehle als vollständige Anleitung für alle drei Zwecke auszugeben.

    11. Abschluss des Praxisbeispiels: Was ist jetzt nachgewiesen?

    Du hast einen Clientbereich eingerichtet, Zugangsdaten in einem SEPS-Wallet hinterlegt und eine Verbindung als REPORT_READER zum erwarteten Container geprüft. Das Bash-Skript enthält kein Datenbankpasswort. Dateirechte, Jobumgebung und Fehlerausgabe sind nachvollziehbar. Für den produktiven Bericht fehlen je nach Einsatz noch die fachliche Leserechteprüfung, der Nachweis der gewünschten Transportverschlüsselung sowie die Einbindung in Sicherung, Monitoring und Passwortwechsel. Diese Punkte sind eigene Abnahmekriterien, keine versteckten Wirkungen des Wallets.

    Für den Rückbau des Lernbeispiels entfernst du zunächst den optionalen cron-Eintrag und prüfst, ob noch ein Prozess den Lernbereich nutzt. Hebe in der Testshell die Umleitung mit unset TNS_ADMIN auf beziehungsweise stelle den vorherigen Wert wieder her. Sichere benötigte Unterlagen und entferne den eindeutig zugeordneten Lernbereich erst nach Prüfung seiner Inhalte. Das Datenbankkonto wird dadurch nicht gelöscht und sein Passwort nicht verändert.

    12. Weiterführende Informationen

    Offizielle Oracle-Dokumentation – 19c, englisch:

    Die Erklärungen hier sind deutsch. Die technischen Quellen sind englisch; konkrete Edition, Clientversion und Patchstand zusätzlich berücksichtigen.

    Weiter üben: Im zentralen Fragenkatalog findest du weitere Aufgaben zu diesem Kapitel. Wähle dort den passenden Themenfilter. Die Prüfungssimulation zieht aus dem gemeinsamen Pool.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Ein Oracle Wallet kann je nach Zweck Zugangsdaten, Zertifikate oder Schlüssel enthalten. SEPS, TLS-Wallet und TDE-Keystore erfüllen unterschiedliche Aufgaben.
    2. Beim Secure External Password Store werden Zugangsdaten für eine passende Verbindungsangabe hinterlegt. Wallet-Konfiguration und Namensauflösung müssen auf denselben vorgesehenen Zugang abgestimmt sein.
    3. Der erfolgreiche Login allein genügt nicht als Prüfung. Benutzer, Datenbank, Service und Container müssen dem vorgesehenen Ziel entsprechen.
    4. Auto-Login vereinfacht die Nutzung, erhöht aber die Bedeutung des Dateischutzes. Wallet-Dateien, Verzeichnisse und das ausführende Betriebssystemkonto müssen angemessen abgesichert sein.
    5. Ein automatisches Skript benötigt eine eindeutig gesetzte Umgebung und kontrollierte Fehlerbehandlung. Passwortwechsel und Wallet-Aktualisierung müssen gemeinsam geprüft werden, ohne Geheimnisse in Protokolle zu schreiben.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Welche Maßnahme verhindert ein Passwort im Berichtsskript?
    Ein SEPS-Wallet stellt dem Client die gespeicherten Zugangsdaten bereit. Das schaltet weder TDE noch TLS ein.
    Frage 2: REPORTDB funktioniert in tnsnames.ora. Im Wallet steht aber ein anderer Alias. Was prüfst du?
    Der bei /@REPORTDB verwendete Verbindungsname muss zum gespeicherten Eintrag passen. Namen abgleichen, anschließend -listCredential und den Verbindungstest verwenden.
    Frage 3: Warum gibt es ein Wallet-Passwort und ein Datenbankpasswort?
    Sie schützen unterschiedliche Vorgänge: Verwaltung des Wallets und Anmeldung am Datenbankkonto. Ein Wechsel des einen ändert das andere nicht.
    Frage 4: Der Test meldet REPORT_READER und APPDB. Ist damit die Verbindung nachweislich verschlüsselt?
    Nein. Die Ausgabe belegt Benutzer und Container. Die ausgehandelte Transportsicherheit muss separat geprüft werden.
    Frage 5: Warum funktioniert ein Wallet-Test im Terminal, aber nicht als cron-Job?
    Zuerst Jobkonto, ORACLE_HOME, TNS_ADMIN, Dateizugriff und absolute Pfade vergleichen. Die Terminalumgebung wird nicht automatisch übernommen.
    Frage 6: Welche Lösung gehört zu einem geplanten Datenbankpasswortwechsel?
    Jobablauf abstimmen, Passwort in der Datenbank nach Verfahren ändern, Wallet mit -modifyCredential aktualisieren, Verbindung prüfen und Job wieder freigeben. Danach die Sicherung aktualisieren.
    Frage 7: Ist eine vorhandene cwallet.sso-Datei allein ein erfolgreicher Abnahmetest?
    Nein. Eigentümer, Zugriff, richtiger Inhalt, Ziel und tatsächliche Anmeldung müssen geprüft werden. Auto-Login macht Dateischutz besonders wichtig.
    Frage 8: Beweist SQL*Plus-Exit-Code 0 allein das richtige Ziel?
    Nein. Das Skript muss tatsächlichen Benutzer, Container und Service mit dem freigegebenen Soll vergleichen. Fehlende oder abweichende Ergebnisse dürfen kein OK erzeugen.

    17. Hardening – Oracle sicher betreiben

    Unnötige Zugriffsmöglichkeiten erkennen, gezielt reduzieren und die Wirkung prüfen.

    Lernkompass
    Einfach gesagt Unnötige Zugriffsmöglichkeiten erkennen, gezielt reduzieren und die Wirkung prüfen.
    Warum ist das wichtig? Eine einzelne sichere Einstellung gleicht übermäßige Rechte an anderer Stelle nicht aus.
    Nach diesem Kapitel Du kannst einen Befund dokumentieren, eine gezielte Verbesserung ableiten und ihre Funktion prüfen.

    Einführung: Hardening bedeutet, eine Installation auf die benötigten Funktionen und Zugriffe auszurichten und vermeidbare Angriffsflächen zu verringern. Dazu gehören Datenbankkonten und Rechte ebenso wie Netzwerkdienste, Softwarestand und der Zugriff auf Dateien. Eine einzelne sichere Einstellung reicht nicht aus, wenn ein anderer Teil des Zugangswegs ungeschützt bleibt.

    Das Kapitel führt von einem begründeten Sollzustand zur Prüfung der vorhandenen Umgebung. Am bestehenden Beispiel der Skriptrechte wird sichtbar, wie Befund, gezielte Änderung und Nachkontrolle zusammengehören. Du lernst, Maßnahmen nach ihrer tatsächlichen Wirkung einzuordnen und den laufenden Betrieb mitzudenken. Hardening ist damit eine wiederkehrende Betriebsaufgabe, keine einmalig abzuhakende Eigenschaft.

    Oracle 19c: fachliche Grundlage

    1. Hardening: Angriffsfläche gezielt verringern

    Das Zusammenspiel wird am vorhandenen Report deutlich: Schmale Datenbankrechte helfen nicht gegen ein offen lesbares Passwort. Umgekehrt begrenzt ein Wallet nicht die Privilegien des darin hinterlegten Kontos. Beide Befunde müssen getrennt geprüft werden.

    Beginne mit einem dokumentierten Sollzustand: Welche Konten, Dienste, Ports, Programme und Dateizugriffe werden wirklich gebraucht? Vergleiche ihn mit dem Istzustand. Ordne Abweichungen nach Auswirkung und Dringlichkeit, teste die ausgewählte Änderung und halte den Rückweg fest. So wird aus einer allgemeinen Forderung wie „mehr Sicherheit“ eine prüfbare Verbesserung.

    PrüfbereichKonkreter NachweisSinnvolle Reaktion
    Konten und RechteBenötigte Aufgabe mit wirksamen Berechtigungen abgleichen; Zugriffe und Auditing verwenden.Überflüssige Rechte nach Abhängigkeitsprüfung gezielt entfernen, keine pauschale DBA-Vergabe.
    Dateien und GeheimnisseEigentümer und Zugriffe auf Wallet, Konfiguration und Skript dokumentieren.Zugriff auf vorgesehene Dienstkonten begrenzen; Wiederherstellung testen.
    NetzwerkErwartete Quellrechner, Zielservices und Verbindungswege inventarisieren.Firewall- und Verbindungsregeln abgestimmt einschränken; echte Anwendung testen.
    SoftwarestandInstallierten Datenbank-, Client- und OS-Patchstand mit freigegebenem Ziel vergleichen.Aktualisierung über Test, Wartungsplanung und Rückfallverfahren; siehe Patchmanagement.
    NachvollziehbarkeitAudit-Regeln und ein tatsächlich erfasstes Testereignis vergleichen.Fehlende relevante Erfassung ergänzen und Aufbewahrung abstimmen.
    BetriebsfähigkeitJob, Neustartablauf und Wiederherstellung unter vorgesehenem Konto testen.Nicht nur den interaktiven Erfolg als Abnahme betrachten.

    2. Ein konkreter Hardening-Fall mit Lösung

    Ausgangslage: Das Skript check_login.sh liegt mit Modus 777 vor. Damit besitzt die Datei unnötig weitreichende Rechte. Ein tatsächlich nutzbarer fremder Schreibzugriff hängt zusätzlich von der Erreichbarkeit des gesamten Pfads und wirksamen ACLs ab. Da es später unter dem Jobkonto ausgeführt wird, ist nicht nur sein Inhalt, sondern auch seine Änderbarkeit relevant. Ziel: Nur das zuständige Konto darf diesen privaten Lernjob lesen, ändern und ausführen.

    Schritt 1 – lesende Bestandsaufnahme als Jobkonto
    id -un
    ls -ld /u01/app/oracle/client-security/bin
    ls -l /u01/app/oracle/client-security/bin/check_login.sh

    Fiktive Beispielausgabe:

    gekürzt.

    oracle
    drwx------ 2 oracle oinstall ... /u01/app/oracle/client-security/bin
    -rwxrwxrwx 1 oracle oinstall ... /u01/app/oracle/client-security/bin/check_login.sh

    Einordnung: Das Verzeichnis ist hier bereits auf 700 beschränkt; gewöhnliche fremde Benutzer können den gezeigten Pfad ohne zusätzliche Berechtigungen nicht durchsuchen. Die Skriptdatei besitzt trotzdem unnötige Rechte. Ein nutzbarer fremder Schreibzugriff ist durch diese Ausgabe allein nicht nachgewiesen. Die ausgelassenen Metadaten sind für diesen Befund nicht erforderlich. Prüfe außerdem alternative Zugriffsmöglichkeiten wie ACLs im jeweiligen Betriebssystem.

    Schritt 2 – Dateirechte ändern und Funktion anschließend prüfen
    chmod 700 /u01/app/oracle/client-security/bin/check_login.sh
    ls -l /u01/app/oracle/client-security/bin/check_login.sh
    /u01/app/oracle/client-security/bin/check_login.sh

    Fiktive Beispielausgabe:

    gekürzt.

    -rwx------ 1 oracle oinstall ... /u01/app/oracle/client-security/bin/check_login.sh
    2026-10-14T06:15:00+0200 START: Datenbankprüfung
    2026-10-14T06:15:01+0200 DB_USER=REPORT_READER; CON_NAME=APPDB; SERVICE_NAME=appdb.example.net
    2026-10-14T06:15:01+0200 ENDE: OK: Erwarteter Benutzer, Container und Service bestätigt; Exit-Code=0

    Einordnung: Der Modus ist jetzt 700; der Job funktioniert weiterhin unter dem vorgesehenen Konto. Bei gemeinsam betriebenen Jobs ist statt dieses Einbenutzer-Modells ein abgestimmtes Gruppen- und Eigentümerkonzept nötig.

    Abnahme: Halte Ausgangsrechte, neue Rechte, Eigentümer, Testkonto und Testergebnis fest. Trenne den erfolgreichen Funktionslauf von der Schutzprüfung: Erst die Prüfung des gesamten Pfads und seiner wirksamen ACLs bewertet die unerwünschten Änderungswege im dokumentierten Umfang. Kontrolliere den nächsten geplanten Lauf. Falls er scheitert, untersuche zunächst Benutzer und Verzeichniszugriff; stelle nicht automatisch 777 wieder her. Die portable Prüfung oben gilt für Oracle Linux und Solaris. Betriebssystemspezifische ACL-, Dienst- und Firewall-Werkzeuge werden im Kapitel Betriebssystem und DBA-Werkzeuge getrennt behandelt.

    3. Ein Sollzustand, der sich tatsächlich prüfen lässt

    Eine Anforderung wie „Die Datenbank soll sicher sein“ ist zu ungenau, um sie abzunehmen. Formuliere stattdessen überprüfbare Bedingungen. Für REPORT_APP könnte der Sollzustand lauten: eigenes Datenbankkonto, Zugriff nur auf die freigegebenen Berichtsdaten, keine administrativen Rechte, geschützter Transport, ein privates Wallet und ein gegen fremde Änderungen geschütztes Skript. Für jede Bedingung wird eine zuständige Person und eine passende Nachweismethode festgelegt.

    Erfasse zuerst den tatsächlichen Umfang: Datenbank und PDBs, Anwendungsclients, Hintergrundjobs, Listener, Administrationszugänge und Ablageorte. Ein fast vergessener Exportjob kann den alten Zugang weiterverwenden. Ein ausschließlich am Hauptserver geprüfter Zustand übersieht möglicherweise einen zweiten Client. Eine kleine Inventarliste mit Zweck und Verantwortlichkeit ist deshalb oft der wichtigste erste Schritt.

    SollzustandNachweisZuständigkeit im Beispiel
    REPORT_READER ist ausschließlich REPORT_APP zugeordnetInventar, kontrollierte Bereitstellung der Zugangsdaten und beobachtete Anmeldungen gemeinsam prüfen; eine Sitzungsmomentaufnahme beweist keine ausschließliche NutzungAnwendungsbetrieb und DBA
    Kein Passwort in Skript oder RepositoryGezielte Prüfung der vorgesehenen Dateien ohne Ausgabe von GeheimnissenJobverantwortlicher
    Neue Verbindung verwendet geforderten SchutzTest aus dem echten Client und dokumentierte SitzungDBA und Anwendungsbetrieb
    Jobskript nicht durch fremde Konten änderbarEigentümer, Modus, Elternverzeichnisse und ACLs prüfenBetriebssystemadministration

    4. Konten und Berechtigungen: Nicht vom Namen auf den Zweck schließen

    Ein Konto namens OLD_BATCH ist nicht automatisch entbehrlich, und REPORT_READER ist nicht allein wegen seines Namens nur lesend. Beginne mit der Inventarliste und prüfe dann Kontostatus, Authentifizierungsart und den realen Einsatzzweck. Eine fachliche Stilllegung wird mit dem Verantwortlichen abgestimmt; die folgende Abfrage verändert kein Konto.

    Kontext: Die folgende Kontenprüfung erfolgt in der vorgesehenen PDB APPDB. PROFILE benennt das zugewiesene Profil; seine wirksamen Passwortregeln sind gesondert zu prüfen. DEFAULT bedeutet nicht automatisch, dass diese Regeln angemessen sind.

    Lesende Prüfung – gezielte Berechtigung erforderlich
    SELECT username, account_status, authentication_type, profile
    FROM dba_users
    WHERE username IN ('OLD_BATCH', 'REPORT_READER')
    ORDER BY username;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; keine Messung einer realen Umgebung.

    USERNAMEACCOUNT_STATUSAUTHENTICATION_TYPEPROFILE
    OLD_BATCHOPENPASSWORDDEFAULT
    REPORT_READEROPENPASSWORDDEFAULT

    Einordnung: Beide Konten sind im Beispiel offen und verwenden Passwortauthentifizierung. Das sagt weder, wann sie zuletzt tatsächlich gebraucht wurden, noch welche Rechte sie besitzen. Auch ein SEPS-Zugang kann serverseitig ein Passwortkonto bleiben: Das Wallet liefert dem Client lediglich dessen Zugangsdaten.

    Die nächste Entscheidung ergibt sich aus dem Zweck: Wird OLD_BATCH noch von einem geplanten Lauf oder einer Anwendung verwendet? Wo liegen die Zugangsdaten? Wer kann die fachliche Ablösung bestätigen? Erst danach wird eine gezielte Sperrung oder spätere Entfernung geplant. Ein unauffälliger Moment ohne Session ist kein Nachweis dafür, dass ein monatlicher Job das Konto nicht mehr benötigt.

    Für REPORT_READER prüfst du die vollständige Rechtekette anhand von Zugriffen und Auditing. Dazu gehören direkte Rechte, Rollen, PUBLIC und gegebenenfalls der Rechtekontext aufgerufener Programme. Vermeide eine zweite, abweichende Rechteanleitung in diesem Kapitel: Hier geht es darum, den dort erhobenen Befund mit dem genehmigten Einsatzzweck zu vergleichen und die Abweichung zu beheben.

    Für reine Berichtsabfragen wird anhand von Kapitel 12 geprüft, ob READ genügt: SELECT erlaubt zusätzlich etwa SELECT FOR UPDATE. LAST_LOGIN kann ein ergänzender Nutzungshinweis sein, ersetzt aber weder Audit-Auswertung noch Jobinventar; administrative Anmeldungen werden dort nicht erfasst.

    5. Betriebssystemrechte: Datei, Elternverzeichnis und ACL gehören zusammen

    Das frühere chmod-Beispiel prüft einen einzelnen privaten Job. In der Praxis kann eine Datei trotz restriktivem Dateimodus über andere Wege beeinflussbar sein. Wer in einem übergeordneten Verzeichnis Dateien austauschen darf, kann unter passenden Bedingungen den dort aufgerufenen Pfad verändern. ACL steht für Access Control List, auf Deutsch Zugriffskontrollliste. Eine ACL enthält zusätzliche, datei- oder verzeichnisspezifische Zugriffsregeln und kann Rechte gezielt für einzelne Benutzer oder Gruppen festlegen, die mit den klassischen Eigentümer-, Gruppen- und übrigen Rechten nicht getrennt abgebildet werden. Das ACL-Modell und seine Anzeige unterscheiden sich je nach Betriebssystem: Die folgenden Beispiele zeigen POSIX-ACLs unter Oracle Linux und NFSv4-ACLs unter Solaris. Prüfe deshalb den gesamten Pfad und das verwendete Dienstkonto. Oracle Solaris 11.4: ACL-Grundlagen · Oracle Linux 8: ACL-Grundlagen

    Abgrenzung: Hier meint ACL eine Betriebssystem-Zugriffskontrollliste für Dateien und Verzeichnisse. Oracle Database besitzt zusätzlich Network ACLs für ausgehende Verbindungen aus PL/SQL; sie werden in Abschnitt 6 erklärt und vergeben keine Dateirechte. Oracle Solaris 11.4: ACL-Grundlagen · Oracle Linux 8: ACL-Grundlagen.
    Oracle Linux und Solaris – gemeinsame lesende Grundprüfung
    id
    ls -ld /u01 /u01/app /u01/app/oracle
    ls -ld /u01/app/oracle/client-security
    ls -ld /u01/app/oracle/client-security/bin
    ls -l /u01/app/oracle/client-security/bin/check_login.sh

    Fiktive Beispielausgabe:

    gekürzt.

    uid=1001(oracle) gid=1001(oinstall) groups=1001(oinstall)
    drwxr-xr-x  ... root   root     ... /u01
    drwxr-xr-x  ... root   root     ... /u01/app
    drwxr-xr-x  ... oracle oinstall ... /u01/app/oracle
    drwx------  ... oracle oinstall ... /u01/app/oracle/client-security
    drwx------  ... oracle oinstall ... /u01/app/oracle/client-security/bin
    -rwx------  ... oracle oinstall ... /u01/app/oracle/client-security/bin/check_login.sh

    Einordnung: Die Auslassungen ersetzen hier Verknüpfungszahl, Größe und Zeitangaben. Das Beispiel zeigt einen nur für oracle zugänglichen Jobbereich und keine fremden Schreibrechte in den aufgeführten Elternverzeichnissen. Die tatsächlichen Gruppenmitglieder und mögliche ACLs sind zusätzlich zu prüfen.

    Die vollständige Ausgabe hängt von deiner Installation ab. Achte auf Eigentümer, Gruppen und Schreibrechte aller aufgeführten Verzeichnisse. Ein Gruppenrecht kann ausdrücklich gewollt sein, etwa bei gemeinsamer Administration; es wird anhand der zugehörigen Gruppenmitglieder bewertet. Verändere nicht pauschal die Rechte des gesamten Oracle Home. Für ein isoliertes Jobverzeichnis gelten andere Anforderungen als für gemeinsam genutzte Oracle-Software.

    Oracle Linux – ACL lesend prüfen, sofern das Werkzeug installiert ist
    getfacl /u01/app/oracle/client-security
    getfacl /u01/app/oracle/client-security/bin
    getfacl /u01/app/oracle/client-security/bin/check_login.sh

    Fiktive Beispielausgabe:

    gekürzt.

    # file: u01/app/oracle/client-security/bin/check_login.sh
    # owner: oracle
    # group: oinstall
    user::rwx
    group::---
    other::---

    Einordnung: In diesem einfachen Beispiel gibt es keine benannten zusätzlichen Benutzer- oder Gruppeneinträge. Nur der Eigentümer hat Lesen, Schreiben und Ausführen. Bei erweiterten ACLs erscheinen weitere Einträge und gegebenenfalls eine Maske; deren Wirkung ist getrennt zu bewerten.

    Solaris 11 / ZFS – NFSv4-ACL lesend anzeigen
    ls -dV /u01/app/oracle/client-security
    ls -dV /u01/app/oracle/client-security/bin
    ls -V /u01/app/oracle/client-security/bin/check_login.sh

    Fiktive Beispielausgabe:

    gekürzt.

    -rwx------ ... oracle oinstall ... check_login.sh
    owner@:rwxp--aARWcCos:-------:allow

    Einordnung: Gezeigt sind nur die Dateizeile und der Eigentümereintrag einer möglichen ZFS-ACL; weitere ACL-Zeilen sind in diesem Ausschnitt ausgelassen. owner@ bezeichnet den Eigentümer, allow einen erlaubenden Eintrag. Ein solcher Ausschnitt allein reicht nicht zur Bewertung aller Benutzer: Dafür muss die vollständige ACL einschließlich group@, everyone@ und möglicher zusätzlicher Einträge gelesen werden.

    Die ACL-Darstellung ist plattformspezifisch. Prüfe explizite zusätzliche Benutzer-/Gruppeneinträge und deren effektive Wirkung; bei Linux-POSIX-ACLs kann die Maske die wirksamen Rechte begrenzen. Ein scheinbar restriktiver Kurzmodus ersetzt diese Prüfung nicht. Nutze bei Unklarheiten das Berechtigungskonzept des Dateisystems und die zuständige OS-Administration.

    Die ACL-Beispielausgaben zeigen weiterhin nur die Datei; für eine Abnahme müssen auch die vollständigen Verzeichnisausgaben bewertet werden. Unter Solaris schreibt ls -v (für Verzeichnisse ls -dv) die ACL-Berechtigungen ausführlich aus. Auffällige weitere Elternverzeichnisse sind ebenfalls gezielt zu prüfen.

    6. Netzwerkzugänge auf benötigte Wege begrenzen

    Ein Listener muss für die vorgesehenen Clients erreichbar sein, aber nicht automatisch aus jedem Netz. Dokumentiere erlaubte Quellbereiche, Zieladresse, Port und Service. Trenne den Zugang der Anwendung vom administrativen Zugang, soweit das Betriebskonzept dies vorsieht. Eine Firewall-Regel ergänzt die Datenbankanmeldung; sie ersetzt sie nicht. Auch ein Client aus einem erlaubten Netz benötigt weiterhin die passende Authentifizierung und Berechtigung.

    Prüfe die Regeln an einem konkreten Beispiel: app01.example.net soll den Service appdb.example.net erreichen; ein fachlich nicht beteiligter Testclient soll diesen Weg nicht nutzen können. Teste den erlaubten und den ausgeschlossenen Weg mit den zuständigen Netzwerkverantwortlichen. Halte fest, ob eine Ablehnung von der Firewall, dem Listener oder der Datenbank stammt. Diese Fehlerstellen haben unterschiedliche Ursachen und werden nicht alle durch ein Passwortproblem erklärt.

    Die benötigten Dienste unterscheiden sich zwischen Oracle Linux und Solaris sowie zwischen Einzelserver- und Clusterbetrieb. Schalte daher nicht wahllos alles ab, was du nicht sofort erkennst. Zuerst werden Dienst, Besitzer, Abhängigkeit und Zweck identifiziert. Änderungen an Listener, Netzwerkregeln oder OS-Diensten werden in einem geeigneten Zeitfenster mit einem funktionierenden administrativen Rückweg getestet. Die reine Namensauflösung oder ein tnsping reicht nicht als vollständige Anwendungsprüfung.

    Oracle Network ACLs: ausgehende Verbindungen aus PL/SQL steuern

    Die Firewall filtert Netzwerkverkehr auf Betriebssystem- oder Netzebene. Eine Oracle Network ACL ergänzt diese Kontrolle innerhalb der Datenbank: Sie legt fest, ob ein Datenbankbenutzer oder eine Rolle aus PL/SQL auf einen externen Host zugreifen darf. Die Freigabe kann auf einen Host und bei TCP-Verbindungen auf einen Port oder Portbereich begrenzt werden. Das regelt ausgehende Aufrufe aus der Datenbank, zum Beispiel mit UTL_HTTP; es regelt weder Clientverbindungen zum Listener noch Dateizugriffe des Oracle-Betriebssystemkontos.

    Für einen Aufruf ausschließlich mit UTL_HTTP ist das Privileg http enger als das allgemeinere connect. Für eine Hostnamenauflösung mit UTL_INADDR kann zusätzlich resolve erforderlich sein; dieses Privileg wird ohne Portbereich vergeben. Verwende einen konkret benannten Zielhost statt eines pauschalen Wildcards. In einer CDB führst du die Konfiguration im Kontext der PDB aus, in der der betreffende lokale Datenbankbenutzer liegt. Die Berechtigung wird mit dem administrativen Paket DBMS_NETWORK_ACL_ADMIN gesetzt; die folgenden Befehle ändern die Datenbank und sind keine Lesediagnose.

    Beispiel: APP_API_USER darf HTTPS zu einem einzelnen API-Host aufrufen

    Ausgangslage: Der lokale Benutzer APP_API_USER in der PDB APPPDB soll mit UTL_HTTP den Host api.example.net über TCP-Port 443 erreichen. Er benötigt dafür nur das Privileg http. Ersetze PDB, Schema und Host durch die zuvor genehmigten Werte deiner Umgebung. Melde dich für die Änderung an der vorgesehenen PDB mit einem autorisierten Administrationskonto an.

    SQL*Plus – Network ACL für genau einen Host und Port konfigurieren
    BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host       => 'api.example.net',
        lower_port => 443,
        upper_port => 443,
        ace        => xs$ace_type(
          privilege_list => xs$name_list('http'),
          principal_name => 'APP_API_USER',
          principal_type => xs_acl.ptype_db
        )
      );
    END;
    /

    APPEND_HOST_ACE fügt einen Access Control Entry (ACE) für den angegebenen Host hinzu und legt die Host-ACL an, falls noch keine vorhanden ist. xs_acl.ptype_db kennzeichnet einen Datenbankbenutzer oder eine Datenbankrolle. Die ältere Prozedur CREATE_ACL ist veraltet; verwende in Oracle 19c für diesen Zweck die ACE-Prozedur. Die Konfiguration wird im Oracle-eigenen ACL-Verwaltungsmodell gespeichert, nicht als Berechtigung im Schema APP_API_USER.

    SQL*Plus – eingetragene Hostrechte read-only prüfen
    SELECT host, lower_port, upper_port, ace_order,
           principal, principal_type, privilege, grant_type
    FROM dba_host_aces
    WHERE host = 'api.example.net'
      AND principal = 'APP_API_USER'
    ORDER BY lower_port NULLS FIRST, ace_order;

    Fiktive Beispielausgabe:

    HOST             LOWER_PORT UPPER_PORT ACE_ORDER PRINCIPAL     PRINCIPAL_TYPE PRIVILEGE GRANT_TYPE
    api.example.net  443        443        1         APP_API_USER  DATABASE USER HTTP     GRANT

    Einordnung: Die Ausgabe zeigt einen HTTP-ACE für den Beispielbenutzer, Host und Port. Sie beweist nicht, dass der Host aus dem Datenbankserver erreichbar ist oder dass der HTTPS-Zertifikatsweg funktioniert. Für TLS-Vertrauen und gegebenenfalls Wallet-Zugriff gelten zusätzliche Voraussetzungen; siehe Kapitel 16 – Oracle Wallet. Firewall, Proxy und Namensauflösung bleiben ebenfalls getrennte Prüfpunkte.

    Wenn die Anwendung den Zugriff später nicht mehr benötigt, entfernst du denselben ACE gezielt. Prüfe vorher Host, Port, Privileg und Principal genau, damit nicht versehentlich weitere Freigaben betroffen sind.

    SQL*Plus – genau diesen ACE widerrufen
    BEGIN
      DBMS_NETWORK_ACL_ADMIN.REMOVE_HOST_ACE(
        host       => 'api.example.net',
        lower_port => 443,
        upper_port => 443,
        ace        => xs$ace_type(
          privilege_list => xs$name_list('http'),
          principal_name => 'APP_API_USER',
          principal_type => xs_acl.ptype_db
        )
      );
    END;
    /

    Oracle Database 19c Security Guide: externe Netzwerkdienste steuern · Oracle Database 19c PL/SQL Packages: DBMS_NETWORK_ACL_ADMIN

    Zusätzlicher Oracle-Befund: REMOTE_OS_AUTHENT sollte FALSE sein. TRUE würde das Vertrauen auf die vom entfernten Client übermittelte Betriebssystemidentität erlauben. FALSE verbietet keine regulären entfernten Datenbankanmeldungen. Der Parameter ist veraltet und nur aus Kompatibilitätsgründen vorhanden; ein abweichender Befund wird untersucht, nicht automatisch geändert.

    Lesende Parameterprüfung – gezielte Berechtigung erforderlich
    SELECT name, value
    FROM v$parameter
    WHERE name = 'remote_os_authent';

    Fiktive Beispielausgabe:

    NAME                   VALUE
    remote_os_authent      FALSE

    FALSE ist hier der erwartete Einzelbefund, kein vollständiger Sicherheitsnachweis.

    7. Geheimnisse, Protokolle und Skripte absichern

    Ein Passwort kann auch außerhalb des eigentlichen Skripts auftauchen: in einer Kommandozeile, Shell-Historie, Debug-Ausgabe, Sicherung oder kopierten Konfigurationsdatei. Prüfe deshalb den gesamten Arbeitsablauf. Eine Logdatei soll Diagnoseinformationen liefern, aber keine Geheimnisse sammeln. Aktiviere bei einem Skript mit sensiblen Parametern nicht unbedacht eine vollständige Shell-Ablaufverfolgung. Für bekannte Altbestände wird das Passwort nach dem abgestimmten Verfahren ersetzt; bloßes Löschen der sichtbaren Zeile beseitigt nicht jede vorhandene Kopie.

    Bei Auto-Login-Wallets ist der mögliche Zugriff auf die Dateien besonders wichtig. Ein geschützter Transfer in das Sicherungssystem und beschränkte Wiederherstellungsrechte gehören zum Konzept. Dokumentiere außerdem, welches Konto den Job tatsächlich ausführt. Wenn eine vertretende Person den Lauf übernehmen muss, wird ein freigegebener Betriebsweg verwendet; das Wallet wird nicht spontan in ein allgemein lesbares Verzeichnis kopiert.

    Codeverwaltung und spätere Automatisierung sollen Skripte und nachvollziehbare Konfigurationsvorlagen enthalten. Passwörter, private Schlüssel und nutzbare Wallet-Dateien gehören nicht in die Codeverwaltung. Eine Vorlage kann dagegen Pfad und Variablennamen zeigen. Die eigentliche Bereitstellung von Geheimnissen erfolgt über den dafür vorgesehenen gesicherten Prozess.

    8. Patching, Ausnahmen und Sicherheitszustand im Zeitverlauf

    Hardening endet nicht mit der Abnahme. Neue Clients, geänderte Rollen und zusätzliche Jobs können den Zustand wieder verändern. Lege regelmäßige Vergleichspunkte fest: Kontenbestand, genehmigte Privilegien, Softwarestand, Zertifikatsablauf, Wallet-Zugriff und relevante Audit-Erfassung. Der Vergleich prüft konkrete Abweichungen statt bloß eine beliebige Ampelfarbe zu erzeugen.

    Eine technische Ausnahme braucht einen benannten Grund, einen Verantwortlichen, einen Umfang und ein Datum für die erneute Bewertung. Beispiel: Ein Altclient unterstützt den vorgesehenen Verbindungsweg noch nicht. Daraus folgt nicht automatisch, dass alle anderen Clients ebenfalls ungeschützt bleiben müssen. Plane einen begrenzten Übergang mit Ersatztermin und prüfe die tatsächlich erreichbaren Alternativen. Die konkrete Patchdurchführung und Rückfallplanung steht im Kapitel Patchmanagement.

    Priorisiere nach möglicher Auswirkung und tatsächlicher Erreichbarkeit. Ein weltweit erreichbarer administrativer Zugang verlangt eine andere Behandlung als eine dokumentierte Abweichung in einem isolierten Testsystem. Die Reihenfolge entsteht aus Befund und Kontext. Ein langer Katalog von Einstellungen ohne Zuständigkeit und Termin verbessert den Betrieb noch nicht.

    9. Praxisfall: Vom Befund zur nachgewiesenen Verbesserung

    Ausgangslage: REPORT_READER ist ein offenes Passwortkonto. Das Berichtsskript nutzt bereits ein SEPS-Wallet. Ein altes Gruppenmitglied kann aber das Jobskript verändern, die Anforderungen an die Netzwerkverschlüsselung sind nicht geprüft und für OLD_BATCH kennt niemand einen Ansprechpartner. Ziel ist ein sicherer, weiterhin täglich ausführbarer Bericht.

    SchrittVorgehenErgebnis/Nachweis
    1. Zuständigkeiten klärenJobbesitzer, Dienstkonto, Client, Service und Berichtszeit dokumentieren.Eindeutiger Umfang; OLD_BATCH wird als ungeklärte Abhängigkeit geführt.
    2. Rechte bewertenGruppenmitglieder und Skriptpfad gegen das genehmigte Betriebskonzept prüfen.Nicht mehr benötigter Änderungszugriff ist als konkrete Abweichung belegt.
    3. Änderung testenPassenden Zugriff einschränken; Job unter dem echten Konto starten.Der berechtigte Job funktioniert weiterhin; unberechtigter Änderungsweg entfällt.
    4. Transport nachweisenNeue Verbindung aus dem realen Client prüfen.Versions- und sitzungsbezogener Verschlüsselungsbefund statt Vermutung.
    5. Betrieb kontrollierenNächsten geplanten Lauf, Logzugriff und Sicherung kontrollieren.Abnahme umfasst auch den automatisierten Ablauf.

    Lösung: Es werden drei getrennte Befunde bearbeitet. Das Wallet muss nicht neu angelegt werden, wenn dessen Zugang bereits korrekt funktioniert. Die Dateirechte werden anhand der tatsächlichen Zuständigkeiten korrigiert. Die Verbindung erhält einen eigenen Nachweis. OLD_BATCH wird nicht aufgrund seines Namens gelöscht; zuerst werden Nutzung und Verantwortlichkeit geklärt. Dadurch löst du das konkrete Problem, ohne eine ungeprüfte Sammeländerung vorzunehmen.

    Dokumentation: Notiere Vorherzustand, Entscheidung, verantwortliche Person, Durchführung, Testergebnis und offene Punkte. Ein offener Punkt ist sichtbar als solcher gekennzeichnet. Die Aussage „Hardening erledigt“ ist erst sinnvoll, wenn klar ist, auf welchen Umfang und welchen geprüften Sollzustand sie sich bezieht.

    10. Weiterführende Informationen

    Offizielle Oracle-Dokumentation – 19c, englisch:

    Die Erklärungen hier sind deutsch. Die technischen Quellen sind englisch; konkrete Edition, Clientversion und Patchstand zusätzlich berücksichtigen.

    Weiter üben: Im zentralen Fragenkatalog findest du weitere Aufgaben zu diesem Kapitel. Wähle dort den passenden Themenfilter. Die Prüfungssimulation zieht aus dem gemeinsamen Pool.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Hardening verringert unnötige Angriffsflächen. Grundlage ist ein konkreter, prüfbarer Sollzustand für Konten, Rechte, Dateien, Netzwerkzugänge und Softwarestand.
    2. Kontonamen allein verraten weder Zweck noch Risiko. Entscheidend sind tatsächliche Nutzung, wirksame Rechte und der Bedarf der Anwendung.
    3. Datei- und Verzeichnisrechte hängen auch von Elternverzeichnissen und Betriebssystem-ACLs ab. Oracle Network ACLs steuern dagegen bestimmte ausgehende Verbindungen aus der Datenbank.
    4. Passwörter, Wallets, Konfigurationsdateien und Diagnoseprotokolle können schützenswerte Informationen enthalten. Zugriff und Weitergabe müssen ihrem Inhalt entsprechen.
    5. Eine Hardening-Maßnahme ist erst nach einer erneuten Prüfung belegt. Änderungen, Ausnahmen und Patchstand müssen über die Zeit nachvollziehbar bleiben.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Was ist das Ziel von Hardening?
    Unnötige Zugänge, Rechte und vermeidbare Schwachstellen verringern. Dazu braucht es einen bekannten Sollzustand und prüfbare Verbesserungen.
    Frage 2: Was ist am Modus 777 für ein Jobskript problematisch?
    Andere Benutzer können die Datei verändern, sofern sie sie erreichen. Ein späterer Job könnte geänderten Code ausführen. Rechte und Elternverzeichnisse passend begrenzen und den echten Job testen.
    Frage 3: Warum braucht Hardening einen Funktionstest?
    Eine Einschränkung kann notwendige Verbindungen oder Jobs unterbrechen. Der Nachweis muss den gewünschten Schutz und den weiterhin funktionierenden vorgesehenen Ablauf umfassen.
    Frage 4: Warum macht ein Wallet eine DBA-Rolle für einen Bericht nicht angemessen?
    Das Wallet schützt die Bereitstellung des Zugangs. Es verringert keine Datenbankrechte. Der Bericht soll nur die tatsächlich benötigten Rechte erhalten.
    Frage 5: Welche Nachweise gehören zur Änderung von Skriptrechten?
    Ausgangsrechte, neue Rechte, Eigentümer, ausführendes Konto und Funktionstest dokumentieren. Den nächsten geplanten Lauf kontrollieren und mögliche Betriebssystem-ACLs beziehungsweise Verzeichnisrechte berücksichtigen.
    Frage 6: Beweist Modus 777 bei einem Elternverzeichnis 700 einen fremden Schreibzugriff?
    Nein. Ohne Pfaddurchsuchbarkeit oder zusätzliche Berechtigungen ist der gezeigte Zugriff für gewöhnliche fremde Benutzer blockiert. Die unnötigen Dateirechte bleiben ein zu korrigierender Befund.
    Frage 7: Warum genügt ein erfolgreicher Joblauf nicht als Schutzprüfung?
    Er bestätigt die Funktion für das Jobkonto. Unerwünschte Änderungswege werden separat über Eigentümer, vollständigen Pfad und wirksame Betriebssystem-ACLs geprüft.
    Frage 8: Darf ein Konto wegen einer leeren Sitzungsübersicht stillgelegt werden?
    Nein. Seltene Jobs können das Konto benötigen. Nutzung, Abhängigkeiten und Verantwortlichkeit müssen über einen passenden Zeitraum geklärt werden.

    18. Redo Logs – Transaktionsschutz, Log Switch, Checkpoint und Recovery

    Vom Redo Record im Speicher bis zum Archived Log: Aufbau, Lebenszyklus, Performance und read-only Diagnose.

    Lernkompass
    Einfach gesagt Du lernst, wie Oracle Änderungen über Redo absichert und wie Redo Buffer, LGWR, Online Redo Logs, Log Switch und Checkpoint zusammenhängen.
    Warum ist das wichtig? Redo ist zentral für Transaktionsschutz und Recovery. Bei Auffälligkeiten müssen Commit-Verhalten, Redo-Schreibvorgang, Log-Gruppen, Archivierung und Checkpoints getrennt betrachtet werden.
    Nach diesem Kapitel Du kannst Redo-Gruppen und Member read-only untersuchen, CURRENT/ACTIVE/INACTIVE einordnen und Log-Switch- sowie Archivierungsauffälligkeiten systematisch analysieren.

    Einführung: Redo (englisch: „erneut ausführen“) ist Oracles internes Änderungsprotokoll für die Wiederherstellung. Es hält nicht die SQL-Anweisung als lesbaren Text fest, sondern die nötigen Informationen, um Änderungen an Datenbankblöcken erneut anzuwenden. Ein Redo Record besteht aus mehreren Change Vectors; jeder beschreibt eine Änderung an einem einzelnen Block.

    Oracle sammelt Redo zunächst im Redo Log Buffer der SGA. LGWR schreibt es in die Online Redo Logs. So kann Oracle bestätigte Änderungen nach einem Instanzfehler wiederherstellen, auch wenn DBWn die geänderten Datenblöcke noch nicht in die Datafiles geschrieben hat. Im ARCHIVELOG-Modus können abgeschlossene Online-Logs archiviert und zusammen mit Backups für die Wiederherstellung nach Medienfehlern verwendet werden.

    Das Kapitel baut diese Zusammenhänge Schritt für Schritt auf: Redo und Undo, COMMIT und LGWR, Gruppen und Statuswerte, Log Switches, Checkpoints, Archivierung, Recovery sowie Diagnose und Performance. Dabei werden die drei häufig verwechselten Vorgänge COMMIT, Log Switch und Checkpoint ausdrücklich voneinander abgegrenzt.

    Oracle 19c: fachliche Grundlage

    1. Warum Oracle Redo benötigt

    Oracle arbeitet mit geänderten Datenblöcken im Buffer Cache. Diese Blöcke werden nicht zwingend bei jedem Commit sofort in ihre Datafiles geschrieben. Damit bestätigte Änderungen trotzdem nach einem Instance-Ausfall rekonstruiert werden können, protokolliert Oracle die relevanten Änderungsinformationen als Redo.

    Redo ist damit weder ein zweites Exemplar einer Tabelle noch ein lesbares SQL-Protokoll. Die Change Vectors eines Redo Records beschreiben Blockänderungen. Bei einer DML-Änderung kann Oracle daher Redo für den betroffenen Datenblock und für die dabei geänderten Undo-Blöcke erzeugen. So lassen sich die Datenänderung und die zugehörigen Wiederherstellungsinformationen konsistent rekonstruieren.

    Merksatz:

    Commit bedeutet nicht: „Alle geänderten Tabellenblöcke liegen bereits im Datafile.“
    Entscheidend für den Commit ist unter anderem, dass das erforderliche Redo persistent geschrieben wurde.

    2. Redo und Undo: zwei verschiedene Schutzmechanismen

    Redo beschreibt Änderungen so, dass Oracle sie bei Recovery erneut anwenden kann. Undo enthält dagegen die Informationen, mit denen Oracle eine noch nicht dauerhaft gewollte Änderung logisch zurücknehmen beziehungsweise einen früheren konsistenten Datenstand rekonstruieren kann.

    Beide entstehen bei vielen DML-Vorgängen gemeinsam, haben aber unterschiedliche Aufgaben. Redo ist deshalb nicht einfach eine Kopie von Undo und Undo ist kein Ersatz für Redo. Auch Änderungen an Undo-Blöcken selbst erzeugen Redo, weil diese Blöcke Teil der recoverbaren Datenbankstruktur sind.

    Merksatz: Redo = Änderung wiederholen. Undo = Änderung logisch zurücknehmen beziehungsweise einen früheren konsistenten Zustand bereitstellen.

    Eine SCN ordnet Datenbankzustände und Änderungen logisch in der Zeit. Sie ist keine eindeutige Transaktionsnummer. Recovery verwendet SCN-Grenzen, um den erforderlichen Redo-Bereich einzuordnen.

    3. COMMIT im Detail

    Beim üblichen synchronen COMMIT erhält der Client die Erfolgsmeldung, nachdem die erforderlichen Redo-Informationen dauerhaft in das Online-Redo-Log geschrieben wurden. Die geänderten Datenblöcke müssen zu diesem Zeitpunkt noch nicht in den Datafiles stehen. Die Session wartet dabei typischerweise auf log file sync, während LGWR die Schreibarbeit ausführt. COMMIT WRITE NOWAIT kann dagegen vor Abschluss des Redo-Schreibens zurückmelden; eine solche Rückmeldung hat nicht dieselbe Dauerhaftigkeitszusage.

    Auf LGWR-Seite ist besonders log file parallel write relevant. Sind sowohl log file sync als auch log file parallel write auffällig, kann erhöhte Redo-I/O-Latenz ein wichtiger Hinweis sein. Ist dagegen nur log file sync stark, kann auch eine sehr hohe Commit-Frequenz oder ein Anwendungsdesign mit vielen kleinen Transaktionen beteiligt sein.

    COMMIT → Session wartet: log file sync → LGWR schreibt Redo → Online Redo Log → COMMIT bestätigt
    Wichtige Fehlinterpretation: COMMIT bedeutet nicht, dass DBWn unmittelbar alle geänderten Datenblöcke in die Datafiles schreibt. Redo wird zuerst dauerhaft gesichert; die Datafile-Schreibung kann später erfolgen.

    4. Redo Log Buffer und LGWR: wann wird geschrieben?

    Redo entsteht zunächst im Speicher im Redo Log Buffer der SGA. Der Log Writer LGWR schreibt diese Redo-Einträge sequentiell in das aktuelle Online Redo Log. Der Commit ist dabei nur einer der Auslöser für einen LGWR-Schreibvorgang; Oracle schreibt Redo auch unabhängig davon, damit der Puffer kontinuierlich geleert wird.

    Für die Commit-Latenz ist entscheidend, dass das zum Commit gehörende Redo dauerhaft geschrieben wird. Der Benutzer wartet nicht darauf, dass DBWn alle geänderten Datenblöcke in die Datafiles schreibt. Genau deshalb muss bei langsamen Commits zwischen Redo-Erzeugung, LGWR-I/O und Anwendungs-Commit-Häufigkeit unterschieden werden.

    5. Online Redo Logs: Group, Member, Thread und Sequence

    Redo Log Group Die Group ist die logische Redo-Einheit. LGWR schreibt immer in die aktuelle Group. Oracle benötigt mehrere Groups, damit zyklisch zwischen ihnen gewechselt werden kann.
    Redo Log Member Eine Group kann mehrere physische Member besitzen. Alle Member derselben Group enthalten denselben Redo-Inhalt. Das dient dem Multiplexing gegen den Verlust einer einzelnen Redo-Datei.
    Sequence Number Jede beschriebene Redo-Generation erhält eine fortlaufende Sequence Number. Diese Nummer ist für Log History, Archivierung und Recovery besonders wichtig.
    Thread Ein Redo Thread ist die geordnete Folge von Redo-Log-Gruppen, die von einer Oracle-Instanz verwendet wird. In diesem Wiki reicht für die Single-Instance-Grundlage: Die Online Redo Logs gehören zu einem Thread; die Thread-Nummer ist Teil der Redo-Metadaten und erscheint unter anderem in V$LOG.

    Eine Redo-Group ist die logische Einheit, zwischen der Oracle beim Log Switch wechselt. Eine Group kann mehrere physische Member enthalten. Im fehlerfreien multiplexierten Betrieb schreibt LGWR dieselben Redo-Informationen in die Member der aktuellen Gruppe. Ein nicht beschreibbares Member wird als Fehler gemeldet; kann mindestens ein Member erfolgreich beschrieben werden, muss dieser einzelne Ausfall den Betrieb nicht stoppen.

    Mehrere Member erhöhen damit die Verfügbarkeit gegen den Verlust einer einzelnen Redo-Datei. Sie erhöhen aber nicht die nutzbare Redo-Kapazität einer Group: Zwei Member mit jeweils 1 GB ergeben weiterhin eine 1-GB-Redo-Group und keine 2-GB-Group.

    Was sehe ich hier?

    V$LOG beschreibt die logische Group; V$LOGFILE beschreibt deren physische Member. Beide Views müssen deshalb gemeinsam gelesen werden.

    6. Statuswerte von V$LOG richtig lesen

    Status Bedeutung DBA-Einordnung
    CURRENT Aktuell von LGWR beschriebene Group. Normalerweise eine CURRENT Group je aktivem Thread.
    ACTIVE Enthält Redo, das noch für Instance Recovery benötigt wird. Die Group darf noch nicht wiederverwendet werden.
    INACTIVE Redo wird nicht mehr für Instance Recovery benötigt. Für Instance Recovery nicht mehr benötigt; im ARCHIVELOG-Modus ist zusätzlich erfolgreiche Archivierung erforderlich. Für Media Recovery kann die Sequenz weiterhin benötigt werden.
    UNUSED Die Group wurde seit ihrer Erstellung oder seit RESETLOGS noch nicht beschrieben. Bei neuen Groups und nach RESETLOGS möglich.
    CLEARING Oracle initialisiert eine Group nach einem Clear-Vorgang neu. Nur nach gezielter administrativer Aktion zu erwarten.
    CLEARING_CURRENT Eine aktuelle Gruppe eines geschlossenen Threads wird geleert; bei einem Fehler kann dieser Status bestehen bleiben. Ungewöhnlicher Zustand; Ursache genau analysieren.
    ACTIVE bedeutet nicht CURRENT. Eine ACTIVE Group wird nicht zwingend gerade beschrieben. Sie wird lediglich noch für Instance Recovery benötigt.

    7. Wann darf Oracle eine Redo Group wiederverwenden?

    Online Redo wird zyklisch verwendet. Nach einem Switch kann LGWR eine ältere Group aber nicht beliebig sofort überschreiben. Im NOARCHIVELOG -Modus müssen die für Recovery relevanten Änderungen ausreichend checkpointed sein. Im ARCHIVELOG -Modus muss die Group zusätzlich erfolgreich archiviert worden sein, bevor sie wiederverwendet werden kann.

    Das erklärt zwei unterschiedliche Engpassklassen: Checkpoint-Fortschritt kann eine Group noch ACTIVE halten, während ein Archivierungsproblem die Wiederverwendung trotz abgeschlossener Schreibarbeit verhindern kann.

    8. Log Switch: Was passiert intern?

    Wenn die aktuelle Redo-Gruppe voll ist oder ein Wechsel angefordert wird, wechselt LGWR zur nächsten geeigneten Group. Ein Wechsel kann außerdem durch die konfigurierte Wechselzeit ausgelöst werden. Dieser Vorgang heißt Log Switch. Die neue Group erhält eine neue Sequence Number und wird CURRENT.

    Ein Log Switch ist nicht dasselbe wie ein Checkpoint. Beide Vorgänge hängen zusammen, haben aber unterschiedliche Aufgaben. Der Log Switch betrifft den Wechsel der Redo-Gruppe. Ein Checkpoint betrifft den Fortschritt zwischen Buffer Cache, Datafiles und Recovery-Grenzen.

    Gruppe voll / Wechsel angefordert → Log Switch → nächste Group CURRENT → neue Sequence#

    9. Checkpoint: CKPT, DBWn und Recovery-Grenzen

    Ein Checkpoint markiert den Fortschritt, bis zu dem geänderte Datenblöcke für die Konsistenz der Datenbankdateien berücksichtigt werden. CKPT schreibt die geänderten Datenblöcke dabei nicht selbst; diese Schreibarbeit erledigt DBWn. CKPT aktualisiert unter anderem Checkpoint-Informationen in Controlfile- und Datafile-Headern.

    Ein Checkpoint ist deshalb weder ein Commit noch ein Log Switch, auch wenn diese Mechanismen miteinander zusammenhängen. Ein Log Switch kann einen Checkpoint anstoßen, aber die Begriffe beschreiben unterschiedliche Vorgänge.

    Dirty Buffers → DBWn → Datafiles + CKPT aktualisiert Checkpoint-Informationen

    10. Log Switch, Checkpoint und Archiving: drei Ereignisse sauber trennen

    EreignisWas passiert?Wofür ist es wichtig?
    Log SwitchLGWR beendet die aktuelle Redo-Sequenz und wechselt zur nächsten verfügbaren Group.Fortsetzung des zyklischen Redo-Stroms.
    CheckpointOracle treibt den Stand der Datafiles/Checkpoint-Position voran; DBWn schreibt Dirty Buffers nach Bedarf.Begrenzt die bei Instance Recovery erneut anzuwendende Redo-Strecke.
    ArchivingEine abgeschlossene Redo-Sequenz wird im ARCHIVELOG-Modus als Archived Redo Log gesichert.Media Recovery und Wiederverwendbarkeit der Online-Redo-Group.
    Wichtig: Ein Log Switch kann einen Checkpoint anstoßen, ist aber nicht selbst der Checkpoint. Und ein Checkpoint ersetzt keine Archivierung.

    11. ARCHIVELOG-Modus und ARCn

    Im ARCHIVELOG-Modus können abgeschlossene Online-Redo-Sequenzen archiviert werden; vor der Wiederverwendung muss die Gruppe erfolgreich archiviert sein. Bei aktivierter automatischer Archivierung übernehmen die ARCn-Prozesse das Kopieren in ein konfiguriertes Archive-Ziel. Oracle unterstützt auch manuelle Archivierung; ARCn beschreibt hier den automatischen Ablauf.

    Archived Redo Logs sind entscheidend für Media Recovery. Ein Datafile-Backup allein enthält nur den Zustand zum Backupzeitpunkt. Die nachfolgenden Änderungen werden durch Archived Logs und gegebenenfalls noch vorhandenes Online Redo bis zum gewünschten Recovery-Ziel nachgezogen.

    Log Switch (bei voller Gruppe oder angefordert) → Log Switch → ARCn bei automatischer Archivierung → Archived Redo Log → Media Recovery
    ARCHIVELOG Volle Redo-Gruppen werden archiviert. Dadurch sind Recovery über den Backupzeitpunkt hinaus und Online-Backups möglich.
    NOARCHIVELOG Volle Redo-Gruppen werden nicht dauerhaft archiviert. Dadurch sind Recovery-Möglichkeiten deutlich eingeschränkt.

    12. Redo und Recovery

    Bei Instance Recovery wendet Oracle zunächst die benötigten Redo-Änderungen erneut an (Rollforward). Dabei können auch Änderungen noch nicht bestätigter Transaktionen rekonstruiert werden. Anschließend macht Oracle die nicht bestätigten Änderungen mithilfe von Undo rückgängig (Rollback). Bestätigte Änderungen bleiben erhalten.

    Grenze bei NOLOGGING: Bestimmte dafür geeignete Operationen können Nutzdatenänderungen ohne vollständiges Redo erzeugen. Das bedeutet weder „jede Änderung ohne Redo“ noch „ARCHIVELOG ausgeschaltet“. Beispielsweise kann eine entsprechend ausgeführte Direct-Path-Ladeoperation betroffen sein; übergeordnete FORCE-LOGGING-Einstellungen können das Verhalten übersteuern. Fehlen die Nutzdatenänderungen im Redo, lassen sie sich aus einer älteren Sicherung nicht allein durch die vorhandenen Archivelogs rekonstruieren. Deshalb muss nach tatsächlich nicht protokollierten Änderungen die Sicherungsstrategie den neuen Datenstand abdecken. Das Recovery-Kapitel behandelt die benötigte Sicherungskette. Oracle 19c.

    Bei Media Recovery werden zunächst wiederhergestellte Datafiles mit Archived Logs und Online Redo auf einen konsistenten beziehungsweise gewünschten Stand gebracht. Die ausführliche RMAN- und PITR-Logik bleibt im Kapitel Backup & Recovery.

    Redo verbindet den laufenden Datenbankbetrieb direkt mit Recovery: Was LGWR heute schreibt, kann bei einem späteren Recovery zur Wiederherstellung des konsistenten Datenstandes benötigt werden.

    13. Dimensionierung der Online Redo Logs

    Zu kleine Redo Logs führen bei hoher Redo-Erzeugungsrate zu sehr häufigen Log Switches. Dadurch steigen Checkpoint- und Archivierungsaktivität. In ungünstigen Situationen kann Oracle die nächste Group nicht rechtzeitig wiederverwenden.

    Sehr große Redo Logs sind aber nicht automatisch besser. Die sinnvolle Größe hängt von Redo-Rate, Recovery-Zielen, Checkpoint-Verhalten, Backupstrategie und Lastprofil ab. Deshalb sollten Redo-Größe und Switch-Häufigkeit gemeinsam beurteilt werden.

    Keine starre Minutenregel: Eine Empfehlung wie „alle 15 Minuten ein Log Switch“ kann als grobe Orientierung dienen, ist aber kein universeller Oracle-Grenzwert. Entscheidend ist die eigene Lastkurve und das Recovery-Konzept.

    14. Redo-Größe nicht nur nach Switches beurteilen: Redo-Rate messen

    Durchgerechnetes Beispiel: Der Zähler steigt in 60 Sekunden um 314572800 Bytes. Das sind 300 MiB / 60 s = 5 MiB/s. Beide Messungen müssen zur selben laufenden Instanz gehören; nach einem Neustart ist die Differenz nicht verwendbar. Eine 1024-MiB-Gruppe wäre bei dauerhaft gleicher Rate nach ungefähr 205 Sekunden gefüllt. Das ist eine Rechenhilfe, kein Dimensionierungsziel.

    Die Anzahl der Log Switches allein sagt noch nicht, wie viel Redo erzeugt wurde. Eine Stunde mit zehn Switches bei kleinen Groups ist etwas anderes als zehn Switches bei sehr großen Groups. Für eine belastbare Bewertung gehören deshalb Group-Größe, Switch-Zeitpunkte und Redo-Volumen zusammen.

    redo size in V$SYSSTAT ist ein kumulativer Zähler seit Instance-Start. Für eine Redo-Rate müssen zwei Messpunkte gebildet und die Differenz durch das Zeitintervall geteilt werden. Ein einzelner Snapshot ist keine Rate.

    READ ONLY – kumulativ erzeugtes Redo
    SELECT name,
           value,
           ROUND(value / 1024 / 1024, 2) AS mb_since_start
    FROM v$sysstat
    WHERE name = 'redo size';

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    NAMEVALUEMB_SINCE_START
    redo size1073741824010240

    So liest du das Ergebnis: Der Zähler enthält 10240 MiB seit Instanzstart. Erst die Differenz zu einer späteren Messung liefert eine Rate.

    15. Typische Redo- und Checkpoint-Probleme

    Symptom / Event Bedeutung Erste DBA-Prüfung
    log file sync Foreground-Session wartet auf das notwendige Schreiben von Redo für COMMIT. log file parallel write, Commit-Frequenz, Redo-Rate und betroffene Sessions.
    log file parallel write LGWR wartet auf Abschluss der Redo-I/O-Operation. Redo-Storage-Latenz und I/O-Verhalten.
    checkpoint not complete Eine Redo-Gruppe soll wiederverwendet werden, der notwendige Checkpoint ist aber noch nicht weit genug. Switchrate, Loggröße, DBWn-/Checkpoint-I/O.
    private strand flush not complete Beim Log Switch sind Redo-Stränge noch nicht vollständig in den notwendigen Zustand überführt. Switchrate, Redo-Rate, Loggröße, LGWR-/DBWn-I/O.
    cannot allocate new log Oracle kann nicht rechtzeitig auf eine wiederverwendbare nächste Group wechseln. ACTIVE Groups, Checkpoint, Archivierung, Zahl und Größe der Groups.
    ORA-00257 Archiver kann Redo nicht erfolgreich archivieren. V$ARCHIVE_DEST, Fehlertext, Archive-Ziel und Storage-Kapazität.

    16. Private strand flush not complete richtig einordnen

    Oracle kann Redo-Erzeugung intern über private Redo-Strands organisieren. Beim Log Switch müssen relevante Redo-Informationen in den Redo-Strom integriert beziehungsweise geflusht sein. Die Alert-Log-Meldung Private strand flush not complete bedeutet deshalb nicht automatisch, dass die Datenbank beschädigt ist.

    Als Diagnosehinweis ist sie vor allem zusammen mit cannot allocate new log, sehr kurzen Switch-Abständen, Checkpoint-Verzögerungen und Redo-I/O-Latenzen interessant. Eine einzelne Meldung ohne Zeit- und Lastkontext reicht nicht für eine Konfigurationsänderung.

    Zum Alert-Text „Private strand flush not complete“ gehört als Diagnosekontext das Wait Event log file switch (private strand flush incomplete). Eine fehlende Zeile in V$SYSTEM_EVENT beweist nicht, dass das Alert-Ereignis nie auftrat; Zeitraum und Instanzstart müssen übereinstimmen.

    17. log file sync und log file parallel write unterscheiden

    Diese beiden Events werden häufig gemeinsam genannt, beschreiben aber unterschiedliche Perspektiven. log file sync gehört zur wartenden Foreground-Session. Sie wartet auf den Commit-Abschluss. log file parallel write beschreibt dagegen die I/O-Wartezeit von LGWR beim Schreiben in die Redo Log Member.

    Event Prozesssicht Typische Interpretation
    log file sync Foreground / Session Commit wartet auf Redo-Durability.
    log file parallel write LGWR Redo-I/O benötigt Zeit.

    18. RESETLOGS und Incarnation kurz eingeordnet

    Nach bestimmten unvollständigen Recovery-Szenarien wird die Datenbank mit OPEN RESETLOGS geöffnet. Dabei beginnt eine neue Redo-Lebenslinie. RMAN behandelt diesen Zustand als neue Database Incarnation.

    RESETLOGS ist deshalb kein normaler Redo-Wartungsbefehl, sondern Teil bestimmter Recovery-Abläufe. Die ausführliche Behandlung von Incarnations, PITR und Recovery Catalog bleibt im Backup-&-Recovery-Kapitel.

    Ziel der folgenden Abfrage:

    V$LOG zeigt Online-Redo-Log-Gruppen mit Status, Sequence und Größe. Ein einzelner Status ist eine Momentaufnahme und muss im Zusammenhang mit Log-Switches und Checkpoints interpretiert werden.

    19. Read-only Diagnose: Redo Groups und Member

    Redo Groups und Status
    SELECT
        group#,
        thread#,
        sequence#,
        ROUND(bytes / 1024 / 1024, 2) AS size_mb,
        members,
        archived,
        status,
        first_time
    FROM v$log
    ORDER BY group#;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    GROUP#THREAD#SEQUENCE#SIZE_MBMEMBERS
    1110110242
    2110210242
    3110310242
    ARCHIVEDSTATUSFIRST_TIME
    YESINACTIVE2026-10-08 09:00:00
    YESACTIVE2026-10-08 09:20:00
    NOCURRENT2026-10-08 09:40:00

    So liest du das Ergebnis: Gruppe 2 ist bereits archiviert, wird aber noch für Instance Recovery benötigt. ARCHIVED=YES bedeutet deshalb nicht automatisch wiederverwendbar. Zwei Member verdoppeln nicht die nutzbare Gruppengröße.

    Redo Member
    SELECT
        group#,
        member,
        type,
        status,
        is_recovery_dest_file
    FROM v$logfile
    ORDER BY group#, member;

    Fiktive Beispielausgabe:

    GROUP#MEMBERTYPESTATUSIS_RECOVERY_DEST_FILE
    1/redo_a/redo01.logONLINENULLNO
    1/redo_b/redo01.logONLINENULLNO

    So liest du das Ergebnis: Ausschnitt für Gruppe 1: zwei Member. NULL bei STATUS ist hier der normale belegte Zustand, kein fehlgeschlagener Prüfwert. Verschiedene Pfadnamen beweisen noch keine unabhängigen Datenträger.

    Was sehe ich hier?

    Die Member-Zeilen gehören zur logischen Group. Unterschiedliche Pfade allein belegen keine unabhängigen Ausfallbereiche.

    Die beiden Views sollten gemeinsam gelesen werden: V$LOG beschreibt die logische Group, V$LOGFILE die physischen Member.

    20. Read-only Diagnose: Log Switches

    Zeitachse: FIRST_TIME in V$LOG_HISTORY ist der Zeitpunkt des ersten Eintrags der Sequenz, nicht ihr Archivierungsabschluss. Die Stundenverteilung ordnet bekannte Sequenzen ihrem Beginn zu. Die aktuelle Sequenz und ältere, bereits aus dem Controlfile verdrängte Historie können fehlen. Stunden ohne Treffer erscheinen nicht als Nullzeile. Für genaue Switch-Zeitpunkte zusätzlich das Alert Log heranziehen.
    Log Switches je Stunde – letzte 24 Stunden
    SELECT
        TO_CHAR(TRUNC(first_time, 'HH24'), 'YYYY-MM-DD HH24') AS stunde,
        COUNT(*) AS sequenzanfaenge
    FROM v$log_history
    WHERE first_time >= SYSDATE - 1
    GROUP BY TRUNC(first_time, 'HH24')
    ORDER BY TRUNC(first_time, 'HH24') DESC;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    STUNDESEQUENZANFAENGE
    2026-10-08 102
    2026-10-08 094

    Was sehe ich hier? Angenommener Abfragezeitpunkt: 08.10.2026 um 10:30 Uhr. Gezählt wird je Stunde des Sequenzbeginns FIRST_TIME, nicht der exakte Abschlusszeitpunkt eines Logwechsels. Ausschnitt der letzten 24 Stunden. Die Häufigkeit allein erklärt noch nicht die Ursache einer hohen Redo-Erzeugung.

    Letzte Log Switches
    SELECT
        thread#,
        sequence#,
        first_time
    FROM v$log_history
    ORDER BY first_time DESC
    FETCH FIRST 50 ROWS ONLY;

    Fiktive Beispielausgabe:

    THREAD#SEQUENCE#FIRST_TIME
    110808.10.2026 10:00:00
    110708.10.2026 09:45:00

    Was sehe ich hier? Die zuletzt erfassten Sequenzen stehen zuerst. FIRST_TIME bezeichnet ihren Beginn; die Liste ist keine vollständige Archivdateiliste.

    Besonders interessant sind wiederkehrende Peaks. Treten hohe Switchraten immer zu denselben Uhrzeiten auf, kann dies auf Batchverarbeitung, Schnittstellen, hohe DML-Last oder andere regelmäßige Workloads hinweisen.

    21. Read-only Diagnose: Archived Logs und Archive-Ziele

    Letzte Archived Logs
    SELECT
        thread#,
        sequence#,
        first_time,
        completion_time,
        dest_id,
        resetlogs_change#,
        status,
        archived,
        deleted,
        name
    FROM v$archived_log
    ORDER BY completion_time DESC
    FETCH FIRST 50 ROWS ONLY;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileTHREAD#SEQUENCE#FIRST_TIMECOMPLETION_TIMEARCHIVED
    1110808.10.2026 10:00:0008.10.2026 10:15:00YES
    ZeileDELETEDNAMEDEST_IDRESETLOGS_CHANGE#STATUS
    1NO/u04/arch/1_108.arc1123456A

    Was sehe ich hier? Die Sequenz wurde archiviert und ist im Repository nicht als gelöscht markiert. Eine vorhandene Metadatenzeile allein bestätigt weder die aktuelle Dateiverfügbarkeit noch ihre Wiederherstellbarkeit.

    Archive Destinations
    SELECT
        dest_id,
        status,
        destination,
        target,
        error
    FROM v$archive_dest
    WHERE status <> 'INACTIVE'
    ORDER BY dest_id;

    Fiktive Beispielausgabe:

    DEST_IDSTATUSDESTINATIONTARGETERROR
    1VALID/u04/archPRIMARYNULL

    Was sehe ich hier? Das lokale Ziel ist hier gültig und meldet keinen Fehlertext. Dies ist eine Momentaufnahme; Speicherplatz und tatsächlicher Archivfortschritt müssen separat geprüft werden.

    Die letzten 50 Datensätze sind nicht zwingend 50 verschiedene Sequenzen: mehrere Archive-Ziele, Kopien oder Restores können mehrere Einträge erzeugen. THREAD#, SEQUENCE# und RESETLOGS_CHANGE# ordnen die Sequenz ein; DEST_ID und NAME helfen bei der Kopienzuordnung. STATUS=A beschreibt den Repository-Status AVAILABLE.

    22. Read-only Diagnose: Redo- und Commit-Waits

    log file sync und log file parallel write
    SELECT
        event,
        total_waits,
        time_waited_micro,
        average_wait
    FROM v$system_event
    WHERE event IN
          ('log file sync',
           'log file parallel write',
           'log file switch (checkpoint incomplete)',
           'log file switch (archiving needed)',
           'log file switch (private strand flush incomplete)');

    Fiktive Beispielausgabe:

    EVENTTOTAL_WAITSTIME_WAITED_MICROAVERAGE_WAIT
    log file sync10000500000000.5
    log file parallel write8000160000000.2

    Was sehe ich hier? TIME_WAITED_MICRO wird in Mikrosekunden, AVERAGE_WAIT in Hundertstelsekunden ausgegeben. 50.000.000 µs / 10.000 Waits ergeben 5 ms beziehungsweise 0,5 Hundertstelsekunden. Die Zähler sind kumuliert. Für eine aktuelle Problemanalyse Differenzen innerhalb eines dokumentierten Zeitfensters bilden.

    Commit- und Redo-Zähler
    SELECT
        name,
        value
    FROM v$sysstat
    WHERE name IN
          ('user commits',
           'user rollbacks',
           'redo size',
           'redo writes',
           'redo blocks written')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUE
    redo blocks written640000
    redo size300000000
    redo writes8000
    user commits10000
    user rollbacks50

    Was sehe ich hier? Die Kennzahlen haben unterschiedliche Einheiten: redo size zählt Bytes, redo blocks written Blöcke und die übrigen Werte Ereignisse. Für Raten benötigst du Differenzen zweier Messungen.

    Kumulierte Werte: V$SYSTEM_EVENT und V$SYSSTAT enthalten viele Werte seit Instanzstart. Für echte Raten oder eine konkrete Störungsanalyse sind zwei Messpunkte oder zeitbezogene Daten notwendig.

    Die Wait-Ausgabe zeigt einen Zeilenausschnitt; weitere abgefragte Switch-Waits können fehlen. Group Commit erlaubt, mehrere Commits durch einen LGWR-Schreibvorgang zu bedienen. 10.000 Commits und 8.000 Redo Writes sind deshalb kein Widerspruch. log file sync umfasst auch die Benachrichtigung der wartenden Session. Durchschnittswerte beider Events dürfen nicht voneinander abgezogen werden, um vermeintlich exakte CPU- oder Scheduler-Zeit zu berechnen.

    23. Read-only Diagnose: Checkpoint-Kontext

    Einordnung für SE2: Das folgende MTTR-Beispiel beschreibt eine entsprechend lizenzierte Umgebung. Fast-start fault recovery ist in Oracle 19c SE2 nicht verfügbar. Die Lesbarkeit von V$INSTANCE_RECOVERY ist davon zu unterscheiden. TARGET_MTTR und ESTIMATED_MTTR sind Sekunden; OPTIMAL_LOGFILE_SIZE ist die von FAST_START_MTTR_TARGET abhängige empfohlene Mindestgröße in MB, kein allgemeines Größenoptimum. WRITES_MTTR und WRITES_AUTOTUNE sind Schreibzähler.
    Instance Recovery / Checkpoint-Kontext
    SELECT
        target_mttr,
        estimated_mttr,
        optimal_logfile_size
    FROM v$instance_recovery;

    Fiktive Beispielausgabe:

    TARGET_MTTRESTIMATED_MTTROPTIMAL_LOGFILE_SIZE
    6018512

    Was sehe ich hier? TARGET_MTTR=60 und ESTIMATED_MTTR=18 sind Sekunden. OPTIMAL_LOGFILE_SIZE ist eine von Oracle ermittelte Größe in MB für das Recovery-Ziel; sie ist kein universeller Auftrag zur Redo-Verkleinerung.

    24. DBA-Denkmodell bei Redo-Problemen

    1. Symptom exakt benennen Ist das Problem langsamer COMMIT, hohe Switchrate, ORA-00257, checkpoint not complete oder cannot allocate new log?
    2. Zeitraum sichern Alertlog, Switch-Historie und Waits müssen denselben Störungszeitraum betreffen.
    3. Groups und Member prüfen Anzahl, Größe, Status und Multiplexing kontrollieren.
    4. Redo-Rate und Commit-Last bewerten Hohe Switchrate kann durch hohe Redo-Menge oder kleine Logs entstehen. Viele Commits sind ein eigener Einflussfaktor.
    5. LGWR und Checkpoint trennen log file parallel write deutet auf LGWR-I/O, checkpoint not complete eher auf Wiederverwendung/Checkpoint-Fortschritt.
    6. Archivierung prüfen Im ARCHIVELOG-Modus kann langsame oder blockierte Archivierung die Wiederverwendung von Redo-Gruppen beeinflussen.
    7. Keine Schnellmaßnahme Nicht allein wegen einer Warnmeldung Redo Logs vergrößern oder Gruppen ändern. Ursache zuerst belegen.
    8. Vorher / Nachher vergleichen Jede geplante Änderung benötigt messbare Vergleichswerte: Switchrate, Waits, Commit-Latenz und Alertlog.

    25. Typische DBA-Fehlannahmen

    Aussage Bewertung Korrekte Einordnung
    COMMIT schreibt alle geänderten Blöcke sofort ins Datafile. Falsch Bei synchroner Bestätigung wartet COMMIT auf das dauerhafte Schreiben von Redo durch LGWR. COMMIT WRITE NOWAIT kann vorher zurückmelden und bietet deshalb nicht dieselbe Bestätigungsgarantie.
    ACTIVE bei V$LOG bedeutet, dass LGWR gerade dort schreibt. Falsch CURRENT ist die aktuell beschriebene Group; ACTIVE wird noch für Instance Recovery benötigt.
    Mehr Redo Log Groups lösen jedes Redo-Problem. Falsch Ursache kann auch Storage-Latenz, Checkpoint, Archivierung oder Anwendungs-Commitrate sein.
    Große Redo Logs sind immer besser. Falsch Dimensionierung muss zu Redo-Rate und Recovery-Zielen passen.
    Ein Log Switch ist dasselbe wie ein Checkpoint. Falsch Beide hängen zusammen, haben aber unterschiedliche Aufgaben.
    Archived Logs sind nur für RMAN relevant. Falsch Sie sind allgemeine Grundlage für Media Recovery und weitere Recovery-Szenarien.
    Was du nach diesem Kapitel erklären können solltest:
    Den Weg von DML und COMMIT bis LGWR und Online Redo, den Unterschied zwischen CURRENT / ACTIVE / INACTIVE, Log Switch und Checkpoint, die Rolle von ARCn und Archived Logs sowie die Diagnose von log file sync, checkpoint not complete und ORA-00257.

    26. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Concepts – Online Redo Log / Instance Recovery
    Redo Thread, LGWR, Log Switch, Checkpoint und Instance Recovery
    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/physical-storage-structures.html

    Oracle Database 19c Reference – V$LOG
    GROUP#, THREAD#, SEQUENCE#, ARCHIVED und STATUS
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-LOG.html
    Praxisbeispiel: Viele COMMITs und log file sync

    Die Anwendung meldet langsame Transaktionen, gleichzeitig steigt log file sync.

    Was prüfst du?
    Commit-Häufigkeit, Redo-I/O-Latenz und LGWR-bezogene Waits gemeinsam betrachten. Nicht reflexartig Redo Logs vergrößern.
    Lerneffekt: Wait, Commit-Verhalten und Redo-I/O zusammen bewerten.
    Vertiefende Oracle-19c-Quellen: Redo-Verwaltung · V$LOG · Log-Historie

    27. DBA-Praxis: Redo-Struktur und Messintervalle gemeinsam bewerten

    Verwende die Strukturabfragen aus Abschnitt 19 und die Zählerabfragen aus Abschnitt 22. Dokumentiere Instanz, STARTUP_TIME und beide Messzeitpunkte. Die folgenden Lernwerte gehören zu einer Instanz ohne Neustart zwischen 10:00 und 10:01 Uhr. Drei Gruppen mit je 1024 MiB und je zwei Membern ergeben 3072 MiB logische Online-Redo-Kapazität. Die Member verdoppeln diese Kapazität nicht.

    Fiktive Beispielausgabe:

    Zähler10:00:0010:01:00Differenz
    redo size (Bytes)300000000614572800314572800
    user commits10000112001200
    log file sync: TOTAL_WAITS10000112001200
    log file sync: TIME_WAITED_MICRO50000000560000006000000
    log file parallel write: TOTAL_WAITS80008800800
    log file parallel write: TIME_WAITED_MICRO16000000176000001600000

    Was sehe ich hier? Das Intervall beträgt 60 Sekunden. Die Werte sind kumulierte Zähler; erst ihre Differenzen beschreiben dieses Intervall.

    Rechnung: 314572800 / 1024² / 60 = 5 MiB/s; 1200 / 60 = 20 Commits/s. log file sync: 6000000 / 1200 / 1000 = 5 ms je Wait. log file parallel write: 1600000 / 800 / 1000 = 2 ms je Wait. Allgemein gilt ΔTIME_WAITED_MICRO / ΔTOTAL_WAITS / 1000. Bei ΔTOTAL_WAITS=0 gibt es keinen berechenbaren Mittelwert; bei Neustart oder zurückgesetzten Zählern wird das Intervall verworfen.

    Die 5 ms sind ein Mittelwert und enthalten keine Aussage über einzelne Spitzen. Die Differenz 5−2 ms ist keine isolierte CPU-Zeit. Eine Stunde mit vier Sequenzanfängen beweist auch nicht 4 × 1024 MiB erzeugtes Redo, denn vorzeitige Switches sind möglich. Prüfe im selben Zeitraum Alert Log, Switch-Waits und Archive-Ziele. Erst diese Kombination erlaubt eine begründete Hypothese zu Commit-Verhalten, I/O oder Wiederverwendungsproblemen; aus diesen Lernwerten folgt keine automatische Größenänderung.

    Oracle-19c-Referenzen zu den Präzisierungen: Archive-Metadaten · MTTR-Felder · Editionen und Lizenzen

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Redo beschreibt Änderungen für die Wiederherstellung, Undo unterstützt unter anderem Rücknahme und konsistentes Lesen. Beide Mechanismen erfüllen unterschiedliche Aufgaben.
    2. Beim üblichen synchronen COMMIT wird die Bestätigung an das Schreiben des erforderlichen Redo gekoppelt. Nicht alle geänderten Datenblöcke müssen dafür bereits in den Datafiles stehen.
    3. Eine Redo-Gruppe enthält einen oder mehrere Member. Ihre Wiederverwendung hängt unter anderem vom Recovery-Bedarf und im ARCHIVELOG-Modus von der erforderlichen Archivierung ab.
    4. Log Switch, Checkpoint und Archiving sind verschiedene Vorgänge. LGWR, DBWn, CKPT und ARCn übernehmen dabei unterschiedliche Aufgaben.
    5. Redo-Probleme werden anhand von Redo-Menge, Switches, Gruppenstatus, Archivfortschritt und Waits bewertet. NOLOGGING kann die Wiederherstellbarkeit betroffener Operationen einschränken und muss in der Backup-Planung berücksichtigt werden.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Die Antworten sind bewusst eingeklappt.
    Frage 1: Warum ist Redo für Oracle so wichtig?
    Redo beschreibt Änderungen so, dass Oracle sie bei Recovery erneut anwenden kann.
    Frage 2: Was unterscheidet CURRENT und ACTIVE bei V$LOG?
    CURRENT wird aktuell beschrieben; ACTIVE wird noch für Instance Recovery benötigt.
    Frage 3: Warum ist ein Log Switch nicht dasselbe wie ein Checkpoint?
    Der Log Switch wechselt die Redo-Gruppe; ein Checkpoint betrifft den Fortschritt der Datenblockschreibung und Recovery-Grenzen.
    Frage 4: Ist eine SCN eine eindeutige Transaktionsnummer?
    Nein. Eine SCN ist Oracles logische Zeitmarke für die Ordnung von Datenbankzuständen und Konsistenz. Ein COMMIT erhält eine Commit-SCN, aber die SCN ist nicht einfach eine Transaktions-ID.
    Frage 5: Bedeutet eine hohe Log-Switch-Rate automatisch, dass die Redo Logs zu klein sind?
    Nein. Zu kleine Logs sind eine mögliche Ursache. Zusätzlich müssen Redo-Rate, Lastprofil, erzwungene Switches, Checkpoint-Fortschritt und Archivierung betrachtet werden.
    Frage 6: Ist INACTIVE im ARCHIVELOG-Modus allein ausreichend für Wiederverwendung?
    Nein. Die erforderliche Archivierung muss ebenfalls abgeschlossen sein.
    Frage 7: Wie berechnest du die mittlere Wait-Zeit eines Intervalls?
    Differenz TIME_WAITED_MICRO geteilt durch Differenz TOTAL_WAITS und durch 1000 ergibt Millisekunden. Bei null zusätzlichen Waits kein Mittelwert; bei Neustart kein gültiger Vergleich.
    Frage 8: Sind 50 Zeilen aus V$ARCHIVED_LOG immer 50 verschiedene Sequenzen?
    Nein. Archive-Ziele, Kopien und Restores können mehrere Datensätze derselben Sequenz erzeugen.

    19. Sessions und Prozesse – Verbindung, Laufzeitstatus und Diagnose

    Vom Client über Listener und Serverprozess bis zur Oracle-Session, SQL-Ausführung, Waits und offenen Transaktionen.

    Lernkompass
    Einfach gesagt Du lernst, wie Oracle eine angemeldete Session beschreibt und wie du Session, Client, Server Process, SQL und Wait-Zustand auseinanderhältst.
    Warum ist das wichtig? Eine Session mit STATUS='ACTIVE' ist nicht automatisch ein Problem und eine INACTIVE-Session ist nicht automatisch überflüssig. Für eine belastbare Diagnose müssen Status, SQL, Wait, Client und Prozess gemeinsam betrachtet werden.
    Nach diesem Kapitel Du kannst Sessions read-only identifizieren, einer Oracle-SPID zuordnen, aktive und inaktive Zustände korrekt einordnen und einen ersten Diagnosepfad ableiten.

    Einführung: Eine Session ist Oracles logischer Anmeldekontext im Speicher der Instanz. Sie entsteht bei der Anmeldung und enthält den Zustand der Datenbanksitzung, etwa den angemeldeten Benutzer, den aktuellen Arbeitszustand und gegebenenfalls eine offene Transaktion. Eine Session ist weder ein Betriebssystemprozess noch einfach dasselbe wie eine Netzwerkverbindung. Daher sagt eine vorhandene Session allein nicht, ob gerade SQL läuft, auf ein Ereignis gewartet wird oder eine Transaktion offen ist.

    Dieses Kapitel erklärt zuerst, wie Verbindung, Session, Clientprozess, Serverprozess und Hintergrundprozesse zusammenhängen. Danach folgen Session-Kennungen, Status, SQL, Waits, Transaktionen und Ressourcenlimits. Die gezeigten V$-Abfragen betrachten die lokale Instanz; in Oracle RAC sind für instanzübergreifende Sichtweisen die passenden GV$-Views und die Kennung INST_ID heranzuziehen. In einer CDB hilft CON_ID, den Containerkontext zu erkennen. Die Grundlagen der Prozessarchitektur stehen in Kapitel 6, die vertiefte Analyse von Sperrketten in Kapitel 20.

    Oracle 19c: V$SESSION und Prozessarchitektur

    Die wichtigste read-only Quelle ist V$SESSION. Oracle dokumentiert dort unter anderem SID, SERIAL#, STATUS, SERVER, PROCESS, MACHINE, PROGRAM, SQL_ID und Wait-Informationen. Erst die Kombination dieser Werte ergibt ein belastbares Bild.

    Merksatz: Session = logischer Datenbankkontext. Oracle-Serverprozess = Ausführungskontext für Session-Arbeit; je nach Konfiguration als OS-Prozess oder OS-Thread realisiert. ACTIVE bedeutet nicht automatisch CPU-Verbrauch.

    1. Session, Connection und Prozess unterscheiden

    Eine Connection ist der physische Kommunikationsweg zwischen einem Clientprozess und der Oracle-Instanz. Der Clientprozess führt die Anwendung oder das Datenbankwerkzeug aus. Eine Session ist der dazugehörige logische Anmelde- und Arbeitskontext im Instanzspeicher. Eine Verbindung kann keine, eine oder mehrere Sessions tragen; mehrere Sessions desselben Benutzers sind voneinander unabhängig. Bei konfiguriertem Connection Pooling kann der physische Verbindungsweg wechseln oder enden, während der logische Sessionzustand bestehen bleibt.

    Ein Serverprozess führt Oracle-Datenbankcode im Auftrag eines Clientrequests aus, etwa SQL zu parsen und auszuführen oder Daten aus dem Buffer Cache beziehungsweise von den Datenträgern zu lesen. Im Dedicated-Server-Modell gehört ein Serverprozess exklusiv zu einem Clientprozess. Beim Shared Server nimmt ein Dispatcher Clientrequests entgegen und verteilt sie an verfügbare Serverprozesse; daher ist eine Session dort nicht dauerhaft an genau einen Serverprozess gebunden. Hintergrundprozesse wie LGWR und DBWn erledigen interne Instanzaufgaben und sind keine eigenen Anwendungssessions. Je nach Plattform und Threaded-Execution-Konfiguration kann ein Oracle-Prozess als Betriebssystemprozess oder als Thread innerhalb eines Betriebssystemprozesses laufen.

    Merksatz:

    Connection = physischer Kommunikationsweg
    Clientprozess = Anwendung oder Werkzeug
    Session = logischer Anmelde- und Arbeitskontext
    Serverprozess = bearbeitet Clientrequests
    Hintergrundprozess = erledigt interne Oracle-Aufgaben

    2. SID und SERIAL#: eine Session eindeutig identifizieren

    SID ist die Session-ID innerhalb der Instance. Sie kann nach dem Ende einer Session später wiederverwendet werden. SERIAL# unterscheidet deshalb verschiedene Session-Lebenszyklen, die dieselbe SID verwenden können.

    Für Diagnoseprotokolle sollte eine Session daher mindestens mit SID + SERIAL# dokumentiert werden. Nur eine SID aufzuschreiben ist bei zeitversetzten Analysen nicht eindeutig genug.

    3. STATUS: ACTIVE und INACTIVE richtig interpretieren

    STATUS='ACTIVE' bedeutet, dass die Session aktuell SQL ausführt. Das ist zunächst ein Laufzeitzustand und keine Performancebewertung. Eine aktive Session kann produktiv arbeiten, CPU verbrauchen oder auf ein Ereignis warten.

    STATUS='INACTIVE' bedeutet, dass die Session aktuell keine SQL-Anweisung ausführt. Sie kann trotzdem eine vollkommen normale, von einer Anwendung gehaltene Verbindung sein. Die reine Anzahl inaktiver Sessions ist deshalb kein ausreichender Grund für eine administrative Aktion.

    ACTIVE + WAIT_CLASS = User I/O Nur bei STATE=WAITING beschreibt diese Kombination einen aktuellen Wait auf I/O.
    ACTIVE + enq: TX Nur bei STATE=WAITING beschreibt enq: TX einen aktuellen Transaktions-Wait innerhalb des aktiven Calls.
    INACTIVE ohne Transaktion Typisch für Connection Pools oder Benutzer, die gerade keine Anfrage ausführen.
    INACTIVE mit offener Transaktion Potenziell kritisch, weil Locks und Undo trotz inaktivem Sessionstatus bestehen bleiben können.

    4. Von V$SESSION zu V$PROCESS: PADDR, ADDR und SPID

    V$SESSION.PADDR ist die Adresse des Oracle-Prozesses, der die Session besitzt. Sie wird mit V$PROCESS.ADDR verbunden. V$PROCESS.SPID liefert die Betriebssystemkennung des Oracle-Prozesses.

    Damit entsteht die zentrale Diagnosekette SID/SERIAL# → PADDR → V$PROCESS → SPID. Auf Systemen mit Oracle Threaded Execution kann ein Oracle-Prozess als Thread innerhalb eines OS-Prozesses laufen; dann muss die OS-Zuordnung entsprechend vorsichtig interpretiert werden.

    READ ONLY – Session und Oracle-Prozess
    SELECT s.sid,
           s.serial#,
           s.username,
           s.server,
           s.paddr,
           p.pid,
           p.spid,
           p.stid,
           p.program
    FROM v$session s
    LEFT JOIN v$process p
      ON p.addr = s.paddr
    WHERE s.type = 'USER'
    ORDER BY s.sid;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMEPADDRPIDSERVER
    11423817APP_USER00000000ABC0123042DEDICATED
    ZeileSPIDSTIDPROGRAM
    118420NULLoracle@db01 (TNS V1-V3)

    Was sehe ich hier? SID und SERIAL# kennzeichnen die Session; PADDR verbindet sie mit dem Oracle-Prozess. SPID ist hier dessen Betriebssystem-PID. STID ist in dieser angenommenen Prozesskonfiguration nicht belegt. PROGRAM stammt in dieser Abfrage aus V$PROCESS.

    Auf Solaris ist STID allein nicht eindeutig. SPID und STID gemeinsam beziehungsweise SOSID ordnen den Ausführungskontext zu; bei Shared Server ist keine dauerhafte 1:1-Zuordnung von Session und Serverprozess anzunehmen.

    5. Weitere Sessionstatus: KILLED, CACHED und SNIPED

    Status Bedeutung DBA-Einordnung
    ACTIVE Session hat einen aktiven Call. CPU und Wait Event zusammen betrachten.
    INACTIVE Aktuell kein aktiver Call. Nicht automatisch harmlos; offene Transaktion prüfen.
    KILLED Session wurde zum Beenden markiert. Kann bis zur Bereinigung sichtbar bleiben; Oracle kann dazu SERVER=PSEUDO anzeigen.
    CACHED Session ist vorübergehend zur Wiederverwendung durch Oracle*XA zwischengespeichert. Kein gewöhnlicher ACTIVE- oder INACTIVE-Anwendungszustand.
    SNIPED Inaktive Session hat ein konfiguriertes Limit überschritten, zum Beispiel IDLE_TIME oder ein Resource-Manager-Limit. Sie darf nicht wieder ACTIVE werden; der Zustand ist nicht mit einer normalen Pool-Session gleichzusetzen.

    6. SERVER-Spalte: DEDICATED, SHARED und weitere Servermodelle

    V$SESSION.SERVER nennt den Servertyp. DEDICATED bedeutet, dass ein dedizierter Serverprozess für den Clientprozess arbeitet. Bei SHARED nimmt ein Dispatcher Requests entgegen und ein freier Shared-Server-Prozess bearbeitet sie; verschiedene Requests derselben Session können dadurch von verschiedenen Serverprozessen bearbeitet werden.

    Oracle dokumentiert außerdem die Werte PSEUDO, POOLED und NONE. PSEUDO kann etwa bei einer zum Beenden markierten Session auftreten; POOLED gehört zu gepoolten Serververbindungen wie DRCP. Diese Werte sind kein Beleg für eine gewöhnliche, dauerhaft dedizierte Zuordnung. Prüfe den Servertyp daher zusammen mit Status und Verbindungsmodell.

    7. USER- und BACKGROUND-Sessions

    V$SESSION.TYPE hilft, Benutzersessions von Hintergrundsessions zu unterscheiden. USER-Sessions repräsentieren normale Client-/Anwendungskontexte. BACKGROUND-Sessions gehören Oracle-internen Prozessen.

    Für Auswertungen wie „Wie viele Benutzer sind gerade aktiv?“ sollte deshalb meist TYPE='USER' verwendet werden. Andernfalls würden Oracle-Hintergrundprozesse die Zahl verfälschen.

    8. SQL_ID und PREV_SQL_ID

    SQL_ID identifiziert die aktuell ausgeführte SQL-Anweisung einer Session. PREV_SQL_ID bezeichnet die zuletzt ausgeführte Anweisung und kann Hinweise auf eine offene Transaktion liefern. Wurden nach der ursprünglichen sperrenden DML-Anweisung weitere Anweisungen ausgeführt, zeigt PREV_SQL_ID jedoch möglicherweise nicht mehr diese DML-Anweisung. Die Spalte ist keine vollständige Transaktionshistorie und beweist allein nicht, welche Anweisung eine noch bestehende Sperre verursacht hat.

    Aktuelles und vorheriges SQL einer Session
    SELECT
        sid,
        serial#,
        username,
        status,
        sql_id,
        prev_sql_id,
        module,
        action,
        state,
        event
    FROM v$session
    WHERE sid = &SID AND serial# = &SERIAL;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSSQL_ID
    11423817APP_USERACTIVE8u3k2m9p4q7r1
    ZeilePREV_SQL_IDMODULEACTIONEVENTSTATE
    16c2n7v8b3m4s9BestellportalBestellung speichernenq: TX - row lock contentionWAITING

    Was sehe ich hier? Für &SID wurde 142 und für &SERIAL 3817 eingegeben. Die Session wartet hier aktuell auf eine Zeilensperre; erst STATE zusammen mit EVENT erlaubt diese Aussage.

    PREV_SQL_ID zeigt das zuvor ausgeführte SQL, keine Transaktionshistorie: Nach einer Änderung an BESTELLUNGEN kann dieselbe Session noch eine Abfrage ausführen. PREV_SQL_ID kann dann auf diese Abfrage zeigen, obwohl die frühere Änderung weiterhin einen Lock hält.

    9. Anwendungskontext: MODULE, ACTION und CLIENT_IDENTIFIER

    Technische Sessions werden erst dann wirklich verständlich, wenn sie einer Anwendung oder einem fachlichen Prozess zugeordnet werden können. Dafür sind unter anderem MODULE, ACTION, CLIENT_IDENTIFIER, MACHINE, PROGRAM und OSUSER hilfreich.

    Gute Anwendungen setzen MODULE und ACTION gezielt. Dadurch lassen sich Sessions nach Masken, Batchprozessen oder Schnittstellen gruppieren. Sind diese Felder leer, wird die Diagnose deutlich schwieriger.

    Anwendungskontext aller Benutzersessions
    SELECT
        sid,
        serial#,
        username,
        status,
        osuser,
        machine,
        program,
        module,
        action,
        client_identifier,
        service_name,
        sql_id,
        event
    FROM v$session
    WHERE type = 'USER'
    ORDER BY username,
             module,
             sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMEOSUSERMACHINESTATUS
    11423817APP_USERappsvcapp01ACTIVE
    ZeilePROGRAMMODULEACTIONCLIENT_IDENTIFIERSERVICE_NAME
    1JDBC Thin ClientBestellportalBestellung speicherndemo-4711app_service
    ZeileSQL_IDEVENT
    18u3k2m9p4q7r1enq: TX - row lock contention

    Was sehe ich hier? MODULE und ACTION ordnen die Session dem Bestellportal zu. Diese Angaben und CLIENT_IDENTIFIER muss die Anwendung setzen; sie können sonst NULL sein.

    10. Service und Container: fachlichen Sessionkontext erkennen

    Neben Benutzer und Client ist der Service wichtig. SERVICE_NAME zeigt, über welchen Datenbankservice die Session arbeitet. In einer Multitenant-Datenbank macht CON_ID zusätzlich sichtbar, zu welchem Container die Session gehört.

    Das ist insbesondere dann hilfreich, wenn derselbe Datenbankbenutzer von mehreren Anwendungskomponenten verwendet wird. Benutzername allein identifiziert dann nicht den fachlichen Workload.

    READ ONLY – Service- und Containerkontext
    SELECT sid,
           serial#,
           username,
           service_name,
           con_id,
           module,
           action,
           client_identifier
    FROM v$session
    WHERE type = 'USER'
    ORDER BY service_name, username, sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESERVICE_NAMECON_ID
    11423817APP_USERapp_service3
    ZeileMODULEACTIONCLIENT_IDENTIFIER
    1BestellportalBestellung speicherndemo-4711

    Was sehe ich hier? Der Service app_service führt hier in den Container 3. CON_ID identifiziert den Container, nicht eine weitere Session.

    11. LOGON_TIME und LAST_CALL_ET

    Keine SQL-Stoppuhr: LAST_CALL_ET misst den Zeitraum im jeweiligen Sessionstatus. Ein aktiver Aufruf kann mehrere SQL-Anweisungen enthalten. Für den Beginn der aktuellen SQL-Ausführung ist SQL_EXEC_START hilfreicher; auch dieser Wert kann NULL sein. LOGON_TIME, Session-Aktivitätsdauer und SQL-Laufzeit sind drei verschiedene Angaben.

    LOGON_TIME zeigt, seit wann die Session verbunden ist. Das ist bei Connection Pools völlig normal und sagt noch nichts über die Dauer einer einzelnen SQL aus.

    LAST_CALL_ET wird in Sekunden angegeben. Bei ACTIVE Sessions zeigt der Wert die Zeit seit dem Wechsel zu ACTIVE, bei INACTIVE Sessions die Zeit seit dem Wechsel zu INACTIVE. Genau deshalb muss STATUS bei der Interpretation immer mitgelesen werden.

    Eine Session mit LOGON_TIME von mehreren Tagen ist nicht automatisch problematisch. Connection Pools halten Datenbankverbindungen oft absichtlich lange offen.

    12. Aktive Benutzersessions analysieren

    Aktive User Sessions
    SELECT
        sid,
        serial#,
        username,
        status,
        osuser,
        machine,
        program,
        module,
        action,
        sql_id,
        event,
        wait_class,
        state,
        CASE WHEN state = 'WAITING' THEN ROUND(wait_time_micro / 1000000, 3)
             END AS current_wait_seconds,
        last_call_et
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    ORDER BY last_call_et DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSOSUSER
    11423817APP_USERACTIVEappsvc
    ZeileMACHINEPROGRAMMODULEACTIONSQL_ID
    1app01JDBC Thin ClientBestellportalBestellung speichern8u3k2m9p4q7r1
    ZeileEVENTWAIT_CLASSSTATECURRENT_WAIT_SECONDSLAST_CALL_ET
    1enq: TX - row lock contentionApplicationWAITING1230

    Was sehe ich hier? ACTIVE bedeutet nicht automatisch CPU-Arbeit: Diese Session wartet auf eine Sperre. LAST_CALL_ET=30 ist die Zeit seit dem Wechsel zu ACTIVE und nicht zwingend die SQL-Laufzeit.

    Eine sinnvolle Top-Liste aktiver Sessions sollte nicht nur SID und Benutzer zeigen. SQL_ID, MODULE, EVENT, WAIT_CLASS und LAST_CALL_ET liefern den eigentlichen Diagnosekontext.

    13. Lange aktive Sessions

    Eine lange ACTIVE Session kann eine langlaufende SQL, einen lang anhaltenden Wait oder einen blockierten Call darstellen. LAST_CALL_ET allein zeigt nicht, welche dieser Ursachen vorliegt. Deshalb müssen SQL_ID und EVENT gemeinsam betrachtet werden.

    Lange aktive Sessions
    SELECT
        sid,
        serial#,
        username,
        module,
        sql_id,
        state,
        sql_exec_start,
        event,
        wait_class,
        last_call_et
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    ORDER BY last_call_et DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMEMODULESQL_ID
    11423817APP_USERBestellportal8u3k2m9p4q7r1
    ZeileEVENTWAIT_CLASSLAST_CALL_ETSTATESQL_EXEC_START
    1enq: TX - row lock contentionApplication30WAITING08.10.2026 10:00:05

    Was sehe ich hier? Die 30 Sekunden beschreiben die Dauer im Status ACTIVE. STATE=WAITING belegt den aktuellen Wait. SQL_EXEC_START zeigt den Beginn dieser SQL-Ausführung; der Wert kann fehlen. LAST_CALL_ET misst weiterhin die Statusdauer.

    14. Lange inaktive Sessions

    Viele INACTIVE Sessions sind in modernen Anwendungen normal. Connection Pools halten Verbindungen bereit, um den Aufwand ständiger Neuverbindungen zu vermeiden. Problematisch wird dies erst, wenn Sessionzahlen unkontrolliert wachsen, Limits erreichen oder inaktive Sessions offene Transaktionen halten.

    Lange inaktive User Sessions
    SELECT
        sid,
        serial#,
        username,
        module,
        machine,
        program,
        logon_time,
        last_call_et
    FROM v$session
    WHERE type = 'USER'
      AND status = 'INACTIVE'
    ORDER BY last_call_et DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMEMODULEMACHINE
    1879201APP_USERBestellportalapp01
    ZeilePROGRAMLOGON_TIMELAST_CALL_ET
    1JDBC Thin Client08.10.2026 09:00:00120

    Was sehe ich hier? Die Session ist seit 120 Sekunden INACTIVE, aber seit 09:00 Uhr angemeldet. Eine inaktive Pool-Verbindung ist für sich genommen kein Fehler; offene Transaktionen prüft die nächste Abfrage.

    15. Inaktive Sessions mit offener Transaktion

    Dieser Fall ist für DBAs besonders wichtig. Eine Session kann INACTIVE sein, obwohl ihre Transaktion noch offen ist. Dadurch können Locks und Undo weiterhin bestehen.

    Inaktive Sessions mit offener Transaktion
    SELECT
        s.sid,
        s.serial#,
        s.username,
        s.status,
        s.module,
        s.machine,
        s.sql_id,
        s.prev_sql_id,
        TO_CHAR(t.start_date, 'YYYY-MM-DD HH24:MI:SS') AS start_date,
        t.used_ublk,
        t.used_urec
    FROM v$session s
    JOIN v$transaction t
      ON s.taddr = t.addr
    WHERE s.type = 'USER'
      AND s.status = 'INACTIVE'
    ORDER BY t.start_date, s.sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSMODULE
    1879201APP_USERINACTIVEBestellportal
    ZeileMACHINESQL_IDPREV_SQL_IDSTART_DATEUSED_UBLK
    1app01NULL8u3k2m9p4q7r12026-10-08 09:58:008
    ZeileUSED_UREC
    1120

    Was sehe ich hier? Die inaktive Session 87 hat weiterhin eine Transaktion: 8 Undo-Blöcke und 120 Undo-Einträge. INACTIVE bedeutet deshalb nicht, dass alle Änderungen abgeschlossen sind. SQL_ID kann dabei NULL sein; PREV_SQL_ID verweist auf ein zuvor ausgeführtes SQL.

    START_DATE ist ein DATE und wird chronologisch sortiert. Die Ausgabe verwendet ein festes ISO-Datumsformat. START_TIME ist dagegen eine Zeichenkette und eignet sich nicht für eine zuverlässige chronologische Sortierung.

    16. CPU oder Wait? Eine aktive Session richtig einordnen

    STATUS allein kann nicht unterscheiden, ob eine Session gerade CPU verbraucht oder wartet. Dazu werden EVENT, WAIT_CLASS und STATE verwendet. Wenn eine Session nicht auf ein relevantes Wait Event wartet, kann sie gerade auf CPU laufen; eine exakte CPU-Messung erfordert jedoch zusätzliche Statistikquellen.

    Session ACTIVE → EVENT / WAIT_CLASS prüfen → Wait? → SQL und Ursache analysieren

    17. STATE, EVENT und WAIT_CLASS gemeinsam lesen

    STATE zuerst lesen: Nur STATE=WAITING bedeutet, dass EVENT gerade den aktuellen Wait beschreibt. Andernfalls kann EVENT einen vorherigen Wait anzeigen. „Nicht wartend“ beweist weder ununterbrochene CPU-Arbeit noch fehlende CPU-Wartezeit auf Betriebssystemebene.

    Eine ACTIVE Session kann gerade CPU verwenden oder innerhalb ihres Calls warten. STATE hilft bei der Unterscheidung. Ist die Session aktuell am Warten, liefern EVENT und WAIT_CLASS den momentanen Wartekontext.

    Ein einzelner Blick auf EVENT ist nur eine Momentaufnahme. Bei sehr kurzen Zuständen kann sich der Wert zwischen zwei Abfragen bereits geändert haben. Kapitel 19 nutzt diese Informationen deshalb zur Session-Einordnung; die tiefere Wait-Analyse bleibt im Wait-Kapitel.

    READ ONLY – aktueller Arbeitszustand
    SELECT sid,
           serial#,
           username,
           status,
           state,
           event,
           wait_class,
           wait_time_micro,
           time_since_last_wait_micro
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    ORDER BY sid;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    SIDSERIAL#USERNAMESTATUSSTATE
    1423817APP_USERACTIVEWAITING
    EVENTWAIT_CLASSWAIT_TIME_MICROTIME_SINCE_LAST_WAIT_MICRO
    enq: TX - row lock contentionApplication300000000

    So liest du das Ergebnis: Die Session wartet im Messmoment seit ungefähr 30 Sekunden. Das beschreibt diesen Wait, nicht die gesamte SQL-Laufzeit. Für die Blocker-Prüfung folgt Kapitel 20.

    18. Sessions und offene Transaktionen

    Alle Sessions mit offener Transaktion
    SELECT
        s.sid,
        s.serial#,
        s.username,
        s.status,
        s.module,
        s.machine,
        TO_CHAR(t.start_date, 'YYYY-MM-DD HH24:MI:SS') AS start_date,
        t.used_ublk,
        t.used_urec
    FROM v$session s
    JOIN v$transaction t
      ON s.taddr = t.addr
    ORDER BY t.start_date, s.sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSMODULE
    1879201APP_USERINACTIVEBestellportal
    ZeileMACHINESTART_DATEUSED_UBLKUSED_UREC
    1app012026-10-08 09:58:008120

    Was sehe ich hier? Seit 09:58 Uhr besteht hier eine offene Transaktion. USED_UBLK und USED_UREC beschreiben belegtes Undo, nicht eine verlässliche Anzahl geänderter Tabellenzeilen. Keine Treffer bedeuten, dass der Join zum Abfragezeitpunkt keine Transaktion gefunden hat.

    Das Alter einer Transaktion ist oft wichtiger als das Alter der Session selbst. Eine seit Tagen verbundene Session kann unproblematisch sein, während eine erst seit wenigen Minuten verbundene Session bereits eine große offene Transaktion aufgebaut haben kann.

    V$SESSION.TADDR verweist auf die Adresse einer zugehörigen Transaktion. Über V$TRANSACTION.ADDR kann die Session mit Transaktionsinformationen verbunden werden. So lässt sich unterscheiden, ob eine INACTIVE Session lediglich verbunden ist oder tatsächlich noch eine offene Transaktion besitzt.

    Eine offene Transaktion ist nicht automatisch fehlerhaft. Sie wird aber diagnostisch relevant, wenn sie lange besteht, Undo bindet oder andere Sessions blockiert.

    19. PROCESSES und SESSIONS als Ressourcenlimits

    Oracle begrenzt Prozess- und Sessionressourcen über die Initialisierungsparameter PROCESSES und SESSIONS. Eine Session ist dabei nicht dasselbe wie ein Oracle-Prozess: Neben Serverprozessen gibt es Hintergrundprozesse; Shared Server kann zudem Requests mehrerer Sessions bearbeiten. Die Zahlen sind deshalb nicht pauschal 1:1 gleichzusetzen.

    V$RESOURCE_LIMIT zeigt aktuelle und bisherige Höchstnutzung seit Instanzstart sowie die zugehörigen Grenzen. Für die Diagnose zählt neben dem Peak, ob die Ressource aktuell nahe am Limit liegt und ob Anmeldungen oder Prozesse tatsächlich abgewiesen werden.

    Ressourcenlimits für Sessions und Processes
    SELECT
        resource_name,
        current_utilization,
        max_utilization,
        initial_allocation,
        limit_value
    FROM v$resource_limit
    WHERE resource_name IN ('processes','sessions')
    ORDER BY resource_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    RESOURCE_NAMECURRENT_UTILIZATIONMAX_UTILIZATIONINITIAL_ALLOCATIONLIMIT_VALUE
    processes84121300300
    sessions102146472472

    So liest du das Ergebnis: Aktuell sind 84 Prozessplätze belegt; 121 ist der bisherige Höchstwert. Das Limit ist keine Zahl gleichzeitig aktiver CPU-Threads.

    Was sehe ich hier?

    V$RESOURCE_LIMIT zeigt aktuelle und bisher maximale Nutzung sowie konfigurierte Grenzwerte ausgewählter Ressourcen wie PROCESSES oder SESSIONS.

    MAX_UTILIZATION ist ein Peak seit Instanzstart. Ein hoher Peak bedeutet nicht automatisch, dass die Datenbank aktuell am Limit arbeitet.

    20. Blocking-Informationen in V$SESSION: erkennen, aber hier nicht vertiefen

    V$SESSION besitzt unter anderem BLOCKING_SESSION_STATUS, BLOCKING_SESSION und FINAL_BLOCKING_SESSION. Diese Spalten sind für den ersten Hinweis nützlich, dass eine aktive Session durch eine andere Session blockiert wird.

    Kapitel 19 endet an dieser Stelle bewusst bei der Identifikation. TX-/TM-Enqueues, Blocking Chains und Deadlocks werden in Kapitel 20 – Locks und Blockierungen systematisch behandelt.

    21. Connection Pools und Session-Leaks

    Den gesamten Weg vom Klick bis zur Anzeige untersucht Praxisfall 17: Wo bleiben die 20 Sekunden? Dort werden Pool-Wartezeit, Datenbankaufrufe und Ergebnisverarbeitung an einer gemeinsamen Anfrage eingeordnet.

    Applikationsserver verwenden häufig Connection Pools. Dabei werden Datenbankverbindungen langfristig gehalten und für viele fachliche Requests wiederverwendet. Viele INACTIVE Sessions können daher vollständig normal sein.

    Von einem Session-Leak spricht man, wenn eine Anwendung Verbindungen erzeugt, aber nicht korrekt an den Pool zurückgibt beziehungsweise nicht wiederverwendet. Typische Hinweise sind stetig wachsende Sessionzahlen, viele sehr ähnliche Sessions desselben Programms oder Moduls und ein Ressourcenverbrauch, der sich nach Lastende nicht normalisiert.

    Normaler Connection Pool Relativ stabile Zahl von Sessions, viele davon INACTIVE, wiederkehrende MODULE/PROGRAM-Werte und kontrolliertes Wachstum.
    Möglicher Session-Leak Sessionzahl steigt über Zeit immer weiter, ohne nach Lastende zurückzugehen. PROCESSES/SESSIONS-Limits werden zunehmend ausgeschöpft.

    22. Sessions nach Anwendung und Modul gruppieren

    Sessionanzahl nach Benutzer und Modul
    SELECT
        username,
        module,
        status,
        COUNT(*) AS sessions
    FROM v$session
    WHERE type = 'USER'
    GROUP BY username,
             module,
             status
    ORDER BY sessions DESC;

    Fiktive Beispielausgabe:

    USERNAMEMODULESTATUSSESSIONS
    APP_USERWebshopINACTIVE40
    APP_USERWebshopACTIVE5

    So liest du das Ergebnis: 40 inaktive Pool-Verbindungen können vorgesehen sein. Ein Leak wird erst durch Verlauf und Pool-Konfiguration plausibel, nicht durch diese Momentaufnahme allein.

    Diese Gruppierung ist besonders nützlich, wenn ein Applikationsserver viele Verbindungen aufbaut. Sie zeigt, welches Modul wie viele aktive und inaktive Sessions besitzt.

    23. Hintergrundprozesse richtig abgrenzen

    Hintergrundprozesse erledigen interne Aufgaben für die Instanz. LGWR schreibt Redo in die Online-Redo-Logs; DBWn schreibt geänderte Datenblöcke in Datafiles. Sie sind von Serverprozessen zu unterscheiden, die Clientrequests bearbeiten. Hintergrundsessions können in V$SESSION als TYPE='BACKGROUND' erscheinen.

    Wenn du Anwendungssessions zählst oder analysierst, filtere deshalb meist mit TYPE='USER'. Die detaillierten Aufgaben der einzelnen Hintergrundprozesse erklärt Kapitel 6.

    24. Typische Praxisfälle

    Fall 1: Viele ACTIVE Sessions Nicht sofort CPU-Problem annehmen. EVENT, WAIT_CLASS und SQL_ID zeigen, ob die Sessions tatsächlich rechnen oder warten.
    Fall 2: Viele INACTIVE Sessions Connection Pool möglich. Sessionanzahl, Modul und Ressourcenlimits über Zeit beobachten.
    Fall 3: INACTIVE mit Transaktion Session führt aktuell keinen Call aus, hält aber eine offene Transaktion und eventuell Locks.
    Fall 4: Eine Session seit Stunden ACTIVE LAST_CALL_ET, SQL_ID und Wait Event gemeinsam analysieren.
    Fall 5: PROCESSES fast erreicht Aktuelle Nutzung, Peak und Sessions pro Anwendung vergleichen.
    Fall 6: OS-Prozess verursacht Last SPID über V$PROCESS einer Oracle-Session zuordnen und dann SQL_ID, Modul und Waits untersuchen.

    25. DBA-Denkmodell bei Session-Problemen

    1. Fragestellung klären Geht es um zu viele Sessions, eine langsame Session, einen OS-Prozess oder eine bestimmte Anwendung?
    2. USER/BACKGROUND trennen Nur die für die Fragestellung relevanten Sessions betrachten.
    3. Status interpretieren ACTIVE oder INACTIVE nie isoliert bewerten.
    4. SQL und Wait prüfen SQL_ID, EVENT, WAIT_CLASS und LAST_CALL_ET liefern den Laufzeitkontext.
    5. Prozess zuordnen Bei OS-Last SID/SERIAL# mit SPID verbinden.
    6. Transaktion prüfen Offene Transaktionen können Locks und Undo halten.
    7. Anwendungskontext herstellen MODULE, ACTION, MACHINE und PROGRAM helfen bei der fachlichen Zuordnung.
    8. Trend statt Einzelwert Sessionzahlen und Ressourcenlimits über Zeit bewerten.

    26. Typische DBA-Fehlannahmen

    Aussage Bewertung Korrekte Einordnung
    ACTIVE bedeutet CPU-Verbrauch. Falsch ACTIVE Sessions können auf I/O, Locks, Redo oder andere Events warten.
    INACTIVE Sessions sind immer harmlos. Falsch Sie können offene Transaktionen und Locks besitzen.
    Viele Sessions bedeuten automatisch hohe Last. Falsch Connection Pools können viele inaktive Sessions absichtlich offenhalten.
    SID identifiziert eine Session dauerhaft eindeutig. Falsch SID kann wiederverwendet werden; SID und SERIAL# gehören zusammen.
    LOGON_TIME zeigt die Laufzeit des aktuellen SQL. Falsch LOGON_TIME zeigt die Verbindungsdauer der Session.
    Ein hoher MAX_UTILIZATION-Wert bedeutet aktuelle Grenzwertüberschreitung. Falsch MAX_UTILIZATION ist der Peak seit Instanzstart.
    Was du nach diesem Kapitel erklären können solltest:
    Den Unterschied zwischen Session und Prozess, SID/SERIAL#/SPID, ACTIVE und INACTIVE, die Verbindung von V$SESSION zu V$PROCESS, SQL_ID und PREV_SQL_ID, offene Transaktionen, Connection Pools, Ressourcenlimits sowie einen systematischen read-only Diagnoseablauf für Sessionprobleme.

    27. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Reference – V$SESSION
    SID, SERIAL#, PADDR, STATUS, SERVER, SQL_ID, Wait- und Clientinformationen
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-SESSION.html

    Oracle Database 19c Concepts – Process Architecture
    Connection, Session, Client Process, Server Process, Background Process und Threaded Execution
    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/process-architecture.html

    Oracle Database 19c Reference – V$PROCESS
    Oracle PID, SPID, STID und SOSID einordnen
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-PROCESS.html
    Praxisbeispiel: Viele ACTIVE Sessions

    Das Monitoring zeigt deutlich mehr ACTIVE Sessions als normalerweise.

    Was prüfst du?
    ACTIVE bedeutet nicht automatisch hohe CPU. SQL_ID, Wait Event, Modul/Client und Laufzeitkontext dazunehmen.
    Lerneffekt: Sessionstatus immer mit dem tatsächlichen Arbeitszustand verbinden.
    Vertiefende Oracle-19c-Quellen: Sessionstatus, Zeiten und Waits · Ressourcengrenzen

    28. DBA-Praxis: Sessions read-only analysieren

    Ziel der folgenden Abfrage:
    Die Abfrage zeigt Benutzer-Sessions mit Status, Servermodell, Client, aktuellem SQL und Wait-Zustand. LAST_CALL_ET ist kontextabhängig: Bei ACTIVE beschreibt der Wert die Zeit seit dem Wechsel zu ACTIVE, bei INACTIVE die Zeit seit dem Ende des letzten Calls.
    READ ONLY – Session-Übersicht
    SELECT sid,
           serial#,
           username,
           status,
           server,
           machine,
           program,
           module,
           service_name,
           sql_id,
           event,
           wait_class,
           state,
           last_call_et
    FROM v$session
    WHERE type = 'USER'
    ORDER BY status, username, sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSSERVER
    11423817APP_USERACTIVEDEDICATED
    ZeileMACHINEPROGRAMMODULESERVICE_NAMESQL_ID
    1app01JDBC Thin ClientBestellportalapp_service8u3k2m9p4q7r1
    ZeileEVENTWAIT_CLASSSTATELAST_CALL_ET
    1enq: TX - row lock contentionApplicationWAITING30

    Was sehe ich hier? SERVER=DEDICATED bezeichnet das Servermodell. Trotz ACTIVE ist die Session gerade wartend; die Status- und Wait-Spalten beantworten unterschiedliche Fragen.

    Ziel der folgenden Abfrage:
    Diese Abfrage verbindet die logische Session mit dem Oracle-Prozess. s.process beschreibt die Client-Prozessinformation. p.spid ist die Betriebssystem-Prozesskennung des Oracle-Prozesses; auf UNIX-Systemen mit aktiviertem Multithreaded Oracle kann SPID besondere Zuordnungseigenschaften besitzen.
    READ ONLY – Session zu Oracle-Prozess
    SELECT s.sid,
           s.serial#,
           s.username,
           s.status,
           s.server,
           s.machine,
           s.program,
           s.process AS client_process,
           p.pid     AS oracle_pid,
           p.spid    AS os_pid,
           p.program AS oracle_process
    FROM v$session s
    JOIN v$process p
      ON p.addr = s.paddr
    WHERE s.type = 'USER'
    ORDER BY s.sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSSERVER
    11423817APP_USERACTIVEDEDICATED
    ZeileMACHINEPROGRAMCLIENT_PROCESSORACLE_PIDOS_PID
    1app01JDBC Thin Client22014218420
    ZeileORACLE_PROCESS
    1oracle@db01 (TNS V1-V3)

    Was sehe ich hier? CLIENT_PROCESS bezeichnet den vom Client gemeldeten Prozess. ORACLE_PID ist die interne Oracle-Prozessnummer, OS_PID die serverseitige Betriebssystem-PID; diese Nummern sind nicht austauschbar.

    Ziel der folgenden Abfrage:
    Für aktive Benutzer-Sessions zeigt die Abfrage aktuelle SQL-ID und SQL-Text. Eine fehlende SQL_ID ist nicht automatisch ein Fehler; der Sessionzustand muss im Kontext betrachtet werden.
    READ ONLY – aktuell ausgeführte SQL
    SELECT s.sid,
           s.serial#,
           s.username,
           s.sql_id,
           q.sql_text
    FROM v$session s
    LEFT JOIN v$sql q
      ON q.sql_id = s.sql_id
     AND q.child_number = s.sql_child_number
     AND q.address = s.sql_address
    WHERE s.type = 'USER'
      AND s.status = 'ACTIVE'
    ORDER BY s.sid;

    Fiktive Beispielausgabe:

    SIDSERIAL#USERNAMESQL_IDSQL_TEXT
    1423817APP_USER8u3k2m9p4q7r1UPDATE bestellungen SET status = :1 WHERE bestellung_id = :2

    Was sehe ich hier? Der Join berücksichtigt SQL_ID, Child-Nummer und Adresse. Der SQL-Text enthält Bind-Platzhalter; deren aktuelle Werte sind daraus nicht ablesbar. Ein NULL-Text ist bei fehlendem passenden Cursor möglich.

    Ziel der folgenden Abfrage:
    V$SESSION_LONGOPS kann Fortschrittsinformationen für bestimmte länger laufende Operationen liefern. Nicht jede lange SQL-Anweisung erscheint dort; eine leere Ergebnismenge beweist deshalb nicht, dass keine lange Operation läuft.
    READ ONLY – Long Operations
    SELECT sid,
           serial#,
           opname,
           sofar,
           totalwork,
           units,
           ROUND(sofar / NULLIF(totalwork, 0) * 100, 2) AS percent_done,
           last_update_time,
           elapsed_seconds,
           time_remaining
    FROM v$session_longops
    WHERE totalwork > 0
      AND sofar < totalwork
    ORDER BY start_time;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#OPNAMESOFARTOTALWORK
    11423817Table Scan600010000
    ZeileUNITSPERCENT_DONEELAPSED_SECONDSTIME_REMAININGLAST_UPDATE_TIME
    1Blocks60302008.10.2026 10:00:00

    Was sehe ich hier? 6.000 von 10.000 Blöcken ergeben 60 %. TIME_REMAINING=20 ist eine Schätzung in Sekunden. Die Sicht erfasst nur instrumentierte Langzeitoperationen; eine leere Ausgabe beweist nicht, dass keine lange SQL-Ausführung läuft.

    ACTIVE bedeutet nicht automatisch „CPU-Verbrauch“:

    Eine aktive Session kann gerade auf CPU laufen oder innerhalb eines Datenbankaufrufs warten. Für die nächste Diagnoseebene müssen deshalb EVENT, WAIT_CLASS und STATE zusammen mit SQL und Sessionkontext betrachtet werden.
    DBA-Diagnosekette bei Sessionauffälligkeiten:

    1. Betroffene Session mit SID und SERIAL# eindeutig identifizieren.
    2. Benutzer, Service, Machine, Program und Module prüfen.
    3. ACTIVE oder INACTIVE nur als Zustand einordnen, nicht als Bewertung.
    4. Bei ACTIVE aktuelle SQL-ID und Wait-Zustand prüfen.
    5. Session über PADDR mit V$PROCESS verbinden und bei Bedarf die OS-PID zuordnen.
    6. Bei langer Operation V$SESSION_LONGOPS als zusätzliche Quelle prüfen.
    7. Locks, Wait Events oder SQL-Performance anschließend in den spezialisierten Kapiteln vertiefen.
    8. Erst nach belastbarer Ursachenanalyse über eine administrative Session-Aktion entscheiden.

    SOFAR < TOTALWORK bedeutet unvollständig erfasst, nicht zwingend aktuell laufend. Vergleiche SOFAR und LAST_UPDATE_TIME an zwei Messpunkten und ordne SID/SERIAL# der aktuellen Session zu. 60 % eines Scans sind nicht 60 % des gesamten SQL. TIME_REMAINING ist eine Schätzung, keine zugesicherte Restlaufzeit.

    Oracle-19c-Referenzen zu den Präzisierungen: Transaktionszeiten · Fortschritt und Aktualität · Prozesse und Threads
    Geführte Praxisübung: Warum wartet eine Session?

    So arbeitest du mit der Übung: Lies zuerst die Situation, betrachte die Abfrage und beantworte die Fragen anhand der Beispielausgabe. Öffne anschließend die Musterlösung. Alle Werte sind erfundene Lernbeispiele. Die SELECT-Abfragen lesen Informationen; der Wiki-Generator führt sie nicht aus. Voraussetzung sind passende Leserechte und die Verbindung zur betroffenen Datenbank beziehungsweise PDB.

    Situation: Eine Anwenderin meldet, dass das Speichern eines Datensatzes nicht fertig wird. Die betroffene Verbindung wurde bereits anhand von Anwendung, Benutzer und Client ermittelt. Ihre SID lautet im Beispiel 142 und ihre bereits ermittelte SERIAL# 3817. Du möchtest zuerst feststellen, ob diese Session gerade wartet und ob Oracle einen blockierenden Vorgang erkennt.

    Prüfung: Die folgende Abfrage zeigt bewusst nur die Werte für diese eine Session. Ersetze SID und SERIAL# bei einer eigenen Prüfung durch die zuvor ermittelte Identität.

    SELECT sid, serial#, state, event,
           CASE WHEN blocking_session_status = 'VALID'
                THEN blocking_session END AS blocker_sid
    FROM v$session
    WHERE sid = 142 AND serial# = 3817 AND type = 'USER';

    Was sehe ich hier? Eine Zeile beschreibt einen Zeitpunkt. STATE sagt, ob gerade gewartet wird; EVENT benennt dann den Wartegrund. BLOCKER_SID wird nur angezeigt, wenn Oracle die blockierende Session als gültig erkannt hat. Ein Gedankenstrich in der Lern-Tabelle steht für NULL.

    SIDSERIAL#STATEEVENTBLOCKER_SID
    1423817WAITINGenq: TX - row lock contention87

    Deine Aufgabe: Wartet Session 142 auf eine andere Transaktion? Welche Session prüfst du als Nächstes? Beweist diese Zeile bereits einen Deadlock?

    Musterlösung und nächster Prüfschritt

    Session 142 wartet im Beispiel auf eine Transaktionssperre. Zusammen mit der gültigen Blocker-Angabe führt die erste Spur zu Session 87. Sie kann beispielsweise einen Datensatz geändert haben, ohne die Transaktion bereits abzuschließen. Die wartende Session kann ihre eigene Änderung dann noch nicht fortsetzen. Das ist eine plausible Erklärung der Meldung, aber noch kein Nachweis für einen Programmfehler oder einen Deadlock.

    SELECT sid, serial#, username, status, module,
           CASE WHEN taddr IS NOT NULL THEN 'JA'
                ELSE 'NEIN' END AS transaktion
    FROM v$session
    WHERE sid = 87 AND type = 'USER';
    SIDSERIAL#USERNAMESTATUSMODULETRANSAKTION
    879201APP_USERINACTIVEKundenverwaltungJA

    Der zweite Ausschnitt zeigt eine momentan inaktive Verbindung mit Transaktionszustand. INACTIVE bedeutet hier, dass gerade kein SQL ausgeführt wird; die offene Transaktion kann trotzdem Sperren halten. MODULE ist eine von der Anwendung gesetzte Angabe und kann auch fehlen. Prüfe Identität und SERIAL# erneut, bevor du weitere Aussagen über diese Verbindung triffst: Sessions können enden und SIDs wiederverwendet werden. Die zwei Abfragen sind keine gemeinsame, eingefrorene Momentaufnahme.

    Als Nächstes ordnest du die Verbindung dem betroffenen Arbeitsablauf zu und untersuchst die Sperrkette im Locks-Kapitel. Wiederholte Stichproben zeigen, ob das Warten anhält. Die Lösung der Anwendungstransaktion gehört zur weiteren Abstimmung; aus der Ausgabe folgt keine automatische Aktion.

    Grenze der Aussage: Steht STATE nicht auf WAITING, kann EVENT den letzten Wait beschreiben. Keine Ergebniszeile bedeutet auch nicht automatisch „alles in Ordnung“: Die Verbindung kann beendet worden sein oder du prüfst den falschen Container. Weitere Wartegründe findest du unter Waits.

    Oracle 19c: V$SESSION

    Geführte Praxisübung: zwei Session-Messungen vergleichen

    Situation: Eine Anwenderin meldet langsames Speichern. Du verwendest die Abfrage aus der Session-Übung zweimal, im Beispiel mit 30 Sekunden Abstand. Notiere den Zeitpunkt jeder Abfrage außerhalb der Ausgabe. Das Wiki führt keine Messung aus; die Werte unten sind erfundene Lernbeispiele.

    Was sehe ich hier? Für einen übersichtlichen Vergleich sind die Ausgaben in einer Tabelle zusammengeführt. SID und SERIAL# stimmen überein. Damit vergleichst du innerhalb dieser Instanz und desselben Containers dieselbe Session. Bei gewechselter SERIAL# darfst du die Zeilen nicht als Fortsetzung derselben Verbindung behandeln.

    ZeitSID / SERIAL#STATEEVENTBLOCKER_SID
    10:00:00142 / 3817WAITINGenq: TX - row lock contention87
    10:00:30142 / 3817WAITINGenq: TX - row lock contention87

    Deine Aufgabe: Ist das Blockieren an beiden Messpunkten sichtbar? Beweisen die zwei Zeilen eine durchgehende Wartezeit von 30 Sekunden? Was würdest du als Nächstes prüfen?

    Musterlösung: wiederholt sichtbar ist nicht durchgehend gemessen

    An beiden Messpunkten wartet dieselbe Session mit derselben Blocker-SID. Das rechtfertigt, die Sperrkette und den zugehörigen Anwendungsvorgang genauer zu betrachten. Die Tabelle beweist aber kein ununterbrochenes Warten zwischen den Zeitpunkten. Die Session kann zwischenzeitlich weitergearbeitet und anschließend erneut gewartet haben. Für diese Unterscheidung sind weitere Informationen erforderlich; die zwei Stichproben allein reichen nicht.

    Prüfe den aktuell gemeldeten Blocker erneut und ordne ihn anhand seiner eigenen SERIAL# und Clientinformationen zu. Die Blocker-SID allein könnte inzwischen wiederverwendet sein. Der nächste Schritt ist die vorhandene Sperrdiagnose, keine automatische Beendigung einer Verbindung.

    Anderer zweiter Befund: Steht STATE bei der zweiten Messung nicht mehr auf WAITING, belegt das einen anderen Zustand genau zu diesem Zeitpunkt. EVENT kann dann den letzten Wait zeigen. Damit ist nicht bewiesen, dass das Speichern erfolgreich abgeschlossen wurde; dafür braucht es die Rückmeldung der Anwendung. Fehlt die Session, prüfe, ob die Verbindung beendet wurde und ob du weiterhin die richtige Datenbank beziehungsweise PDB abfragst.

    Merksatz für den Vergleich: Halte Identität, Zeitpunkt und Zustand fest. Beschreibe zuerst, was beide Messpunkte tatsächlich zeigen, und erst danach, welche Ursache du vermutest. Wiederholte Stichproben helfen bei der Eingrenzung, ersetzen aber keine lückenlose Verlaufsmessung.

    Oracle 19c: V$SESSION – Identität und Wartezustand

    Bei zeitlich versetzten Folgeabfragen SID und SERIAL# erneut prüfen und den Beobachtungszeitpunkt festhalten. Dieselbe SID mit anderer SERIAL# beschreibt nicht denselben Sessionlebenszyklus.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Connection, Session und Prozess sind unterschiedliche Ebenen. SID und SERIAL# identifizieren eine Session innerhalb der Instanz genauer als die SID allein.
    2. ACTIVE bedeutet, dass eine Session einen Datenbankaufruf bearbeitet; sie kann dabei rechnen oder warten. INACTIVE beweist nicht, dass keine offene Transaktion existiert.
    3. SQL_ID und PREV_SQL_ID beschreiben unterschiedliche Zeitbezüge. MODULE, ACTION, Service und Container helfen, die Session einer Anwendung zuzuordnen.
    4. V$SESSION und V$PROCESS verknüpfen Session- und Prozesssicht. Für die Bewertung zählen zusätzlich Transaktionszustand, Wait-Zustand und Beobachtungszeitpunkt.
    5. Viele offene Sessions können zu einem normalen Connection Pool gehören. Ein Problem ergibt sich erst aus dem Zusammenhang mit Nutzung, Limits, Wartezeiten oder nicht zurückgegebenen Verbindungen.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Die Antworten sind bewusst eingeklappt.
    Frage 1: Was unterscheidet Session und Prozess?
    Eine Session ist ein logischer Datenbankkontext; ein Oracle-Prozess führt Arbeit aus und kann als OS-Prozess oder OS-Thread realisiert sein.
    Frage 2: Warum bedeutet ACTIVE nicht automatisch CPU-Verbrauch?
    Eine ACTIVE Session kann innerhalb eines aktiven Calls auf I/O, Locks, Redo oder andere Events warten.
    Frage 3: Warum gehören SID und SERIAL# zusammen?
    Weil eine SID nach Sessionende wiederverwendet werden kann; SERIAL# unterscheidet die jeweilige Sessioninstanz.
    Frage 4: Eine Session ist seit 20 Minuten ACTIVE. Läuft ihre aktuelle SQL ebenfalls seit 20 Minuten?
    Das folgt nicht aus LAST_CALL_ET. Es misst die Zeit seit dem Wechsel zu ACTIVE. Die aktuelle SQL kann später begonnen haben; SQL_EXEC_START und der Anwendungskontext helfen bei der Zuordnung.
    Frage 5: Beweisen 40 INACTIVE-Verbindungen ein Session-Leak?
    Nein. Ein Pool kann Verbindungen bereithalten. Poolgrenzen, erwartete Auslastung und die Entwicklung über mehrere Messpunkte prüfen.
    Frage 6: Wann beschreibt EVENT den aktuellen Wait?
    Nur bei STATE=WAITING; sonst kann es den letzten Wait beschreiben.
    Frage 7: Identifiziert PREV_SQL_ID sicher die sperrende Anweisung?
    Nein. Zwischen der sperrenden Änderung und dem Messzeitpunkt können weitere SQL-Anweisungen ausgeführt worden sein.
    Frage 8: Bedeutet 60 % in V$SESSION_LONGOPS, dass das ganze SQL zu 60 % fertig ist?
    Nein. Der Wert betrifft die erfasste Operation. Aktualität und Fortschritt prüfen; die Restzeit ist nur geschätzt.

    20. Locks und Blockierungen – Transaktionen, TX/TM-Enqueues und Deadlocks

    Vom normalen Row Lock bis zur Blocking Chain: Entstehung, Interpretation und systematische read-only Diagnose.

    Lernkompass
    Einfach gesagt Du lernst, warum Oracle Locks benötigt und wie aus einer normalen Sperre eine Blockierung, eine Blocking Chain oder ein Deadlock werden kann.
    Warum ist das wichtig? Der sichtbare Waiter ist meist nur das Symptom. Für die Ursache müssen Blocker, offene Transaktion, Lock-Ressource, SQL und Anwendungskontext zusammen betrachtet werden.
    Nach diesem Kapitel Du kannst TX-/TM-Locks, Blocker und Waiter read-only untersuchen, Blocking Chains einordnen und ORA-00060 von einem normalen Lock Wait unterscheiden.

    Einführung: Eine Sperre (Lock) ist ein Schutzmechanismus, mit dem Oracle gleichzeitige Änderungen an gemeinsamen Daten koordiniert. Die Sperre selbst ist normal und meist für Anwender unsichtbar. Erst wenn eine Session eine Ressource benötigt, die eine andere Transaktion noch mit einer unvereinbaren Sperre hält, muss sie warten. Dieses Warten heißt Blockierung. Ein Deadlock ist ein Sonderfall: Mehrere Sessions warten dann zyklisch aufeinander.

    Das Kapitel führt vom Zweck und der Dauer einer Sperre über TX- und TM-Enqueues zu Blocker, Waiter und Blocking Chains. Anschließend zeigen die Abfragen, wie sich eine aktuelle Wartebeziehung mit Session, Transaktion und Ressource einordnen lässt und wie sie sich von einem Deadlock unterscheidet. Ein einzelner Wait-Wert beschreibt dabei nur den beobachteten Moment; für eine Maßnahme müssen auch die offene Transaktion und der Anwendungsvorgang verstanden werden.

    Die gezeigten V$-Abfragen beziehen sich auf die lokale Instanz und den jeweiligen Containerkontext. In Oracle RAC müssen Blocker und Waiter zusätzlich über INST_ID zugeordnet werden; eine SID allein ist instanzübergreifend nicht eindeutig. Fehlende Zeilen können außerdem an Sichtbarkeit oder Berechtigungen liegen.

    Oracle 19c: fachliche Grundlage

    Gültige Momentaufnahme: BLOCKING_SESSION ist nur dann als erkannter Blocker belastbar, wenn BLOCKING_SESSION_STATUS = 'VALID' gilt; im RAC-Kontext gehört dazu auch die in BLOCKING_INSTANCE angegebene Instanz. Die ROW_WAIT_*-Angaben sind nur gültig, wenn die Session aktuell auf eine andere Transaktion wartet und ROW_WAIT_OBJ# ungleich -1 ist. Bei STATE = 'WAITING' beschreibt WAIT_TIME_MICRO die Dauer des aktuellen Waits; außerhalb eines Waits enthält es die Dauer des letzten Waits. Keiner der beiden Werte ist automatisch die Gesamtdauer der Blockierung.

    Den Zusammenhang zwischen Transaktionsgrenzen, Sichtbarkeit und Abfrage-Snapshots erklärt Kapitel 11 – Transaktionen und Read Consistency verstehen.

    So liest du Lock-Abfragen

    Beginne nicht mit allen Spalten gleichzeitig. Suche zuerst die wartende Session, dann die blockierende Session und erst danach Objekt, SQL_ID und Transaktion. SID ist die Session-Nummer, SERIAL# unterscheidet wiederverwendete Sessions. BLOCKING_SESSION zeigt – wenn Oracle den Blocker kennt – die Session, auf die gewartet wird.

    Für die Praxis hilft eine klare Trennung: Lock = gehaltene oder angeforderte Sperre, Wait = eine Session kann wegen einer inkompatiblen Anforderung nicht fortfahren, Blocking Chain = mehrere abhängige Waiter, Deadlock = zyklische Abhängigkeit.

    Die wichtigste Diagnosefrage lautet deshalb nicht „Welche Session blockiert?“, sondern: Welche Ressource wird benötigt, wer hält sie, seit wann ist die zugehörige Transaktion offen und welcher fachliche Vorgang steckt dahinter?

    Merksatz: Lock = normaler Schutzmechanismus. Blockierung = eine Session wartet auf einen inkompatiblen Lock. Deadlock = zyklische gegenseitige Abhängigkeit.

    1. Warum Oracle Locks braucht

    Oracle arbeitet mit vielen gleichzeitig aktiven Sessions. Ohne Sperrmechanismen könnten zwei Sessions dieselbe Zeile gleichzeitig widersprüchlich verändern. Ein Lock sorgt dafür, dass konkurrierende Operationen in einer definierten Reihenfolge abgearbeitet werden.

    Oracle verwendet bei normaler DML sehr feingranulare Sperrmechanismen. Eine Zeilenänderung führt grundsätzlich nicht dazu, dass die gesamte Tabelle exklusiv für andere Benutzer gesperrt wird. Andere Sessions können weiterhin andere Zeilen verarbeiten und dank Read Consistency auch eine konsistente ältere Version einer geänderten Zeile lesen.

    Session A: UPDATE Zeile 100 → Transaktion hält Row Lock → Session B: UPDATE gleiche Zeile → Session B wartet

    2. Transaktion und Lock-Lebensdauer

    Ein DML-Lock ist eng mit der Transaktion verbunden. Führt eine Session INSERT, UPDATE oder DELETE aus, beginnt beziehungsweise erweitert sie eine Transaktion. Die dabei benötigten Locks bleiben normalerweise bis zum Ende dieser Transaktion bestehen.

    Ein COMMIT oder ein vollständiges ROLLBACK beendet die Transaktion und gibt ihre transaktionalen Sperren frei. Ein Rollback zu einem Savepoint ist davon zu unterscheiden und beendet nicht die gesamte Transaktion. Genau deshalb sind lange offene Transaktionen eine typische Ursache für Blockierungen: Das eigentliche DML kann längst abgeschlossen sein, während die Transaktion weiter offen bleibt.

    Eine Session kann im Moment der Analyse scheinbar ein harmloses SQL ausführen oder sogar inaktiv wirken und trotzdem eine offene Transaktion mit Locks besitzen. Deshalb immer auch PREV_SQL_ID, V$TRANSACTION und den Anwendungskontext prüfen.

    3. Row Locks: nicht für jede Zeile ein eigener zentraler Lock-Eintrag

    Oracle speichert Row-Lock-Informationen in Datenblöcken und verknüpft sie mit der Transaktion. Deshalb benötigt eine Transaktion, die sehr viele Zeilen ändert, nicht für jede einzelne Zeile einen separaten zentralen Eintrag in V$LOCK.

    In V$LOCK sieht man bei DML deshalb vor allem Transaktions- und Objektressourcen wie TX und TM. Die konkret betroffene Zeile wird bei Bedarf über den Session- und Row-Wait-Kontext eingegrenzt.

    4. TX und TM – die wichtigsten DML-Enqueues

    TX – Transaction Enqueue TX steht für eine Transaktionsressource. Typische Wartezustände sind konkurrierende Zeilenänderungen, bestimmte Unique-/Primary-Key-Konflikte oder die Anforderung eines weiteren ITL-Eintrags in einem Block.
    TM – DML Enqueue TM ist objektbezogen und wird bei DML auf Tabellen verwendet. Der konkrete Lockmodus entscheidet, welche parallelen Operationen kompatibel sind. TM-Locks sind insbesondere bei DDL-/DML-Konflikten und bestimmten Foreign-Key-Szenarien relevant.
    UL – User Lock Anwendungsseitig erzeugte Locks, beispielsweise über DBMS_LOCK. Ihre Bedeutung hängt von der jeweiligen Anwendungslogik ab.
    AE und weitere Enqueues Oracle besitzt zahlreiche interne Enqueue-Typen. Nicht jeder in V$LOCK sichtbare Lock ist ein Benutzerproblem oder eine klassische Row-Lock-Blockierung.

    5. Lockmodi in V$LOCK

    Wert Lock Mode Kurzbeschreibung
    0NoneKein Lockmodus angefordert beziehungsweise gehalten.
    1NullSehr schwacher Lock zur internen Koordination.
    2Row-S / SSRow Share / Sub Share.
    3Row-X / SXRow Exclusive / Sub Exclusive; bei normaler DML häufig.
    4ShareShare-Lock.
    5S/Row-X / SSXShare Row Exclusive.
    6ExclusiveExklusiver Lockmodus.
    In V$LOCK zeigt LMODE den aktuell gehaltenen Modus und REQUEST den angeforderten Modus. Ein REQUEST > 0 ist daher ein wichtiger Hinweis auf eine wartende Lock-Anforderung.

    6. Lock-Kompatibilität: ein Lock blockiert nicht automatisch

    Oracle kennt mehrere Lockmodi. Kompatible Modi können gleichzeitig auf derselben Ressource bestehen. Erst eine inkompatible Anforderung erzeugt einen Wait.

    In V$LOCK ist deshalb die Trennung wichtig: LMODE ist der gehaltene Modus, REQUEST der angeforderte Modus. Eine Session mit REQUEST=0 kann trotzdem selbst ein Blocker sein.

    7. enq: TX - row lock contention

    Dieses Wait Event ist eines der bekanntesten Lock-Events. Es bedeutet nicht automatisch nur „zwei Sessions ändern dieselbe Zeile“. Der konkrete TX-Konflikt muss genauer eingeordnet werden.

    Gleiche Zeile wird geändert Session A hat eine Zeile geändert und die Transaktion noch nicht beendet. Session B möchte dieselbe Zeile ebenfalls ändern und muss auf A warten.
    Unique-/Primary-Key-Konflikt Eine noch nicht abgeschlossene Transaktion hat einen eindeutigen Schlüsselwert eingefügt oder verändert. Eine zweite Session versucht einen konkurrierenden Wert und muss den Ausgang der ersten Transaktion abwarten.
    ITL-Kontext getrennt betrachten Muss eine Session auf einen freien Interested Transaction List Eintrag in einem Datenblock warten, verwendet Oracle dafür typischerweise das eigene Wait Event enq: TX - allocate ITL entry. Das ist ein TX-Enqueue, aber nicht dasselbe wie enq: TX - row lock contention.

    8. ITL-Konflikte: TX-Wait ohne klassische gleiche Zeile

    Ein TX-Wait bedeutet nicht zwingend, dass zwei Sessions exakt dieselbe Zeile ändern. Oracle verwendet in Datenblöcken Interested Transaction List (ITL) -Einträge, um aktive Transaktionen mit dem Block zu verbinden. Bei hoher konkurrierender DML auf demselben Block kann die Verfügbarkeit solcher Einträge relevant werden.

    Darum wird ein TX-Wait zuerst anhand des konkreten Wait Events und Ressourcenkontexts klassifiziert und nicht reflexartig als „Row Lock“ bezeichnet.

    9. TM-Locks, DDL und Foreign Keys

    TM-Enqueues sind DML-Enqueues auf Objektebene, typischerweise auf Tabellen. Sie koordinieren konkurrierende DML-, DDL- und Integritätsoperationen. Der Lockmodus entscheidet, welche weiteren Operationen gleichzeitig zulässig sind.

    Foreign Keys sind ein wichtiger Diagnosekontext, dürfen aber nicht pauschal bewertet werden. Oracle legt für einen Foreign Key nicht automatisch einen Index an. Ein geeigneter Index auf den Foreign-Key-Spalten kann bei bestimmten Parent-Key-Änderungen, Löschungen und konkurrierender DML Locking- und Zugriffsverhalten verbessern. Ob er sinnvoll ist, hängt vom realen DML- und Abfragemuster ab.

    DDL benötigt zusätzlich DDL-/Metadata-Locks. Deshalb kann beispielsweise eine Strukturänderung auf eine laufende Transaktion warten, obwohl das sichtbare Symptom nicht wie ein klassischer Row Lock aussieht.

    Keine Pauschalregel: „Jeder Foreign Key braucht einen Index“ ist ebenso ungenau wie „ein unindexierter Foreign Key ist immer die Ursache einer Blockierung“. Zuerst Parent-/Child-Operation, Lockmodus und tatsächliches Zugriffsmuster untersuchen.

    10. Foreign-Key-Verdacht gezielt überprüfen

    Halte zuerst fest, welche Parent- oder Child-Operation tatsächlich läuft. Vergleiche danach die Foreign-Key-Spalten mit den führenden Spalten eines vorhandenen geeigneten Index und korreliere den Befund mit der wartenden Session und dem Lockmodus. Die Definition von Constraints und Indizes steht in Kapitel 7; ein fehlender Index allein beweist noch keine Ursache des aktuellen Waits.

    11. SELECT FOR UPDATE

    SELECT ... FOR UPDATE liest Zeilen nicht nur, sondern sperrt die ausgewählten Zeilen für eine anschließende Änderung innerhalb derselben Transaktion. Andere Sessions können diese Zeilen weiterhin konsistent lesen, konkurrierende Änderungen müssen aber warten.

    In Anwendungen wird SELECT FOR UPDATE beispielsweise verwendet, wenn ein Datensatz gelesen und danach kontrolliert geändert werden soll. Problematisch wird dies, wenn die Anwendung nach dem SELECT lange Benutzereingaben abwartet und die Transaktion währenddessen offen bleibt.

    12. Blocker, Waiter und Final Blocker

    Eine einfache Blockierung besteht aus einem Blocker und einem Waiter. In realen Systemen entstehen aber oft Blocking Chains. Session A blockiert B, B blockiert C und C blockiert weitere Sessions.

    BLOCKING_SESSION zeigt den direkten Blocker einer Session. FINAL_BLOCKING_SESSION kann bei der Einordnung des Blockers am Ende einer Kette helfen. Gerade bei langen Chains sollte nicht nur die unmittelbar vorherige Session betrachtet werden.

    Session A: Final Blocker → Session B wartet auf A → Session C wartet auf B → Session D wartet auf C

    In einer Kette A → B → C kann C unmittelbar auf B warten, obwohl A die Wurzel der Kette ist. BLOCKING_SESSION beschreibt den unmittelbaren Blocker; FINAL_BLOCKING_SESSION kann das letzte Element der von Oracle ermittelten Wait Chain anzeigen.

    So wird vermieden, nur den direkten Nachbarn des Waiters zu untersuchen und den eigentlichen Root Blocker zu übersehen.

    13. Deadlock und ORA-00060

    Bei einem normalen Lock Wait existiert eine lineare Abhängigkeit: B wartet beispielsweise auf A. Ein Deadlock entsteht dagegen, wenn sich die Abhängigkeiten zu einem Zyklus schließen. Beispiel: A hält Ressource 1 und wartet auf Ressource 2, während B Ressource 2 hält und auf Ressource 1 wartet.

    Oracle erkennt den Zyklus und meldet einer beteiligten Session ORA-00060. Zur Auflösung wird ein beteiligtes Statement zurückgerollt, nicht automatisch die gesamte Transaktion. Die Anwendung muss die verbleibende Transaktion anschließend fachlich korrekt abschließen.

    Für die Ursachenanalyse ist der von Oracle erzeugte Deadlock-Trace besonders wichtig. Er zeigt den Deadlock-Graphen und liefert Hinweise auf beteiligte Sessions, Ressourcen und SQL. Die nachhaltige Korrektur liegt häufig in einer konsistenten Reihenfolge konkurrierender Ressourcenzugriffe oder in der Transaktionslogik.

    A hält Ressource 1 → A wartet auf Ressource 2 ↔ B wartet auf Ressource 1 ← B hält Ressource 2
    Wichtig: ORA-00060 ist kein Beweis für ein generelles Oracle-Lockproblem. Der Deadlock-Graph und die Reihenfolge der konkurrierenden DML sind für die Ursachenanalyse entscheidend.

    Gedanklicher Deadlock-Verlauf: A ändert Zeile 1, B ändert Zeile 2. Danach wartet A auf Zeile 2 und B fordert Zeile 1 an. Oracle erkennt den Zyklus und rollt eine beteiligte Anweisung zurück. Erhält B ORA-00060 für die letzte Anweisung, ist damit die frühere Änderung an Zeile 2 nicht automatisch zurückgerollt. Die Transaktion kann offen bleiben. Der weitere Transaktionsabschluss gehört zur Fehlerbehandlung der Anwendung; die Diagnose führt keine Änderungen aus.

    Die Diagnosebeispiele verwenden dieselben Session- und Ressourcenkennungen, sind aber getrennte Momentaufnahmen. Wartezeiten können zwischen den Abfragen wachsen; sie bilden keinen atomaren gemeinsamen Snapshot.

    14. Read-only Diagnose: aktuelle Blockierungen

    Waiter mit direktem und finalem Blocker
    SELECT
        sid,
        serial#,
        username,
        status,
        blocking_session_status,
        blocking_instance,
        blocking_session,
        final_blocking_session_status,
        final_blocking_instance,
        final_blocking_session,
        sql_id,
        event,
        wait_class,
        state,
        CASE WHEN state = 'WAITING' THEN ROUND(wait_time_micro / 1000000, 3)
             END AS current_wait_seconds,
        module,
        machine
    FROM v$session
    WHERE blocking_session_status = 'VALID'
      AND state = 'WAITING'
    ORDER BY current_wait_seconds DESC;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSBLOCKING_SESSION_STATUS
    11423817APP_USERACTIVEVALID
    ZeileBLOCKING_INSTANCEBLOCKING_SESSIONFINAL_BLOCKING_SESSION_STATUSFINAL_BLOCKING_INSTANCEFINAL_BLOCKING_SESSION
    1187VALID187
    ZeileSQL_IDEVENTWAIT_CLASSCURRENT_WAIT_SECONDSMODULESTATE
    18u3k2m9p4q7r1enq: TX - row lock contentionApplication12BestellportalWAITING
    ZeileMACHINE
    1app01

    Was sehe ich hier? Session 142 meldet Session 87 auf Instanz 1 als Blocker. Die Angabe wird über BLOCKING_SESSION_STATUS=VALID abgesichert. Eine aktuelle Sperrsituation kann sich zwischen zwei Abfragen bereits verändern.

    Diese Abfrage ist ein guter erster Einstieg, weil sie direkt aus Sicht des Waiters zeigt, auf welche SID gewartet wird. Danach muss die Blocker-Session separat mit SQL, Transaktion und Anwendungskontext untersucht werden.

    15. Read-only Diagnose: Blocker detailliert analysieren

    Blocker-Session
    SELECT
        sid,
        serial#,
        username,
        osuser,
        status,
        sql_id,
        prev_sql_id,
        module,
        action,
        machine,
        program,
        logon_time,
        last_call_et,
        taddr
    FROM v$session
    WHERE sid = &BLOCKER_SID;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMEOSUSERSTATUS
    1879201APP_USERappsvcINACTIVE
    ZeileSQL_IDPREV_SQL_IDMODULEACTIONMACHINE
    1NULL8u3k2m9p4q7r1BestellportalBestellung bearbeitenapp01
    ZeilePROGRAMLOGON_TIMELAST_CALL_ETTADDR
    1JDBC Thin Client08.10.2026 09:00:0012000000000DEF01230

    Was sehe ich hier? Für &BLOCKER_SID=87: Der Blocker ist INACTIVE, hält aber möglicherweise noch eine offene Transaktion. PREV_SQL_ID und der Anwendungskontext helfen bei der Ursachenklärung; nicht allein aufgrund dieser Zeile eine Session beenden.

    SQL_ID zeigt das aktuelle SQL. Bei einer Session, die nach einer DML inzwischen etwas anderes tut oder inaktiv ist, kann PREV_SQL_ID zusätzlichen Kontext liefern. Beides ersetzt aber keine Betrachtung der offenen Transaktion.

    16. Read-only Diagnose: offene Transaktion

    Transaktionsalter und Undo-Verbrauch
    SELECT
        s.sid,
        s.serial#,
        s.username,
        TO_CHAR(t.start_date, 'YYYY-MM-DD HH24:MI:SS') AS start_date,
        ROUND((SYSDATE - t.start_date) * 86400) AS transaction_age_seconds,
        t.used_ublk,
        t.used_urec,
        t.status
    FROM v$session s
    JOIN v$transaction t
      ON s.taddr = t.addr
    WHERE s.sid = &BLOCKER_SID
      AND s.serial# = &BLOCKER_SERIAL;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTART_DATEUSED_UBLKTRANSACTION_AGE_SECONDS
    1879201APP_USER2026-10-08 09:58:008120
    ZeileUSED_URECSTATUS
    1120ACTIVE

    Was sehe ich hier? Für &BLOCKER_SID=87: STATUS stammt hier aus V$TRANSACTION. Eine Transaktion kann ACTIVE sein, obwohl die zugehörige Session INACTIVE ist. Das sind unterschiedliche Statusangaben.

    START_DATE zeigt den Startzeitpunkt der Transaktion. USED_UBLK und USED_UREC liefern Kontext zur aktuell von der Transaktion verwendeten Undo-Menge. Daraus darf keine exakte Rollback-Dauer berechnet werden. Eine alte oder umfangreiche Transaktion ist vielmehr ein Hinweis, Auswirkungen eines administrativen Eingriffs besonders sorgfältig zu bewerten.

    Beispiel-Messzeitpunkt: 08.10.2026 10:00:00; Transaktionsbeginn 09:58:00 ergibt 120 Sekunden. Verwende die im vorherigen Schritt festgestellte SERIAL# (hier 9201) zusätzlich zur SID 87. Keine Zeile kann bedeuten, dass die Session oder Transaktion inzwischen endete.

    Die folgenden Objektabfragen mit DBA_OBJECTS werden in der betroffenen PDB ausgeführt. Im CDB-Root ist für eine containerübergreifende Zuordnung CDB_OBJECTS mit passendem CON_ID erforderlich; OBJECT_ID allein ist dort kein sicherer Join-Schlüssel.

    17. Read-only Diagnose: gesperrte Objekte

    Gesperrte Objekte und Lockmodus
    SELECT
        lo.session_id,
        o.owner,
        o.object_name,
        o.object_type,
        lo.locked_mode
    FROM v$locked_object lo
    JOIN dba_objects o
      ON o.object_id = lo.object_id
    WHERE lo.con_id = TO_NUMBER(SYS_CONTEXT('USERENV', 'CON_ID'))
    ORDER BY lo.session_id,
             o.owner,
             o.object_name;

    Diese Fassung untersucht den aktuellen Container beziehungsweise die Non-CDB. Im Root ist dies keine Gesamtliste aller PDB-Objekte. Eine CDB-weite Variante benötigt CDB_OBJECTS und einen Join über CON_ID und OBJECT_ID. Ein Objekt-Lock allein beweist noch keine problematische Blockierung.

    Fiktive Beispielausgabe:

    SESSION_IDOWNEROBJECT_NAMEOBJECT_TYPELOCKED_MODE
    87APPBESTELLUNGENTABLE3

    Was sehe ich hier? LOCKED_MODE=3 steht für einen Row-Exclusive- beziehungsweise SX-Tabellenlock, wie er bei DML normal ist. Diese Zeile allein beweist noch nicht, dass eine andere Session blockiert wird.

    V$LOCKED_OBJECT hilft bei TM-/Objektkontext, zeigt aber nicht einfach „die exakt gesperrte Zeile“. Bei Row-Lock-Problemen muss die Analyse über Session, Transaktion, SQL und gegebenenfalls Row-Wait-Informationen fortgesetzt werden.

    18. Read-only Diagnose: TX- und TM-Locks

    TX/TM-Locks aus V$LOCK
    SELECT
        sid,
        type,
        id1,
        id2,
        lmode,
        request,
        ctime,
        block
    FROM v$lock
    WHERE type IN ('TX','TM')
    ORDER BY type,
             id1,
             id2,
             sid;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    SIDTYPEID1ID2LMODE
    87TM8100103
    87TX6554019186
    142TX6554019180
    REQUESTCTIMEBLOCK
    01200
    01201
    6300

    So liest du das Ergebnis: Die TX-Zeilen betreffen dieselbe Ressource. Session 87 hält Modus 6, Session 142 fordert ihn an. Die TM-Zeile ist nicht automatisch eine Blockierung der ganzen Tabelle. CTIME ist die Zeit im aktuellen Lockmodus.

    CTIME gibt an, wie viele Sekunden der aktuelle Lockmodus bereits besteht. BLOCK liefert Blockierungsinformation für den Lock. Die Kombination aus TYPE, ID1 und ID2 beschreibt die jeweilige Lock-Ressource innerhalb des Locktyps. Für eine vollständige Diagnose sollte diese technische Ressource immer mit Session-, Transaktions- und Objektkontext verbunden werden.

    CTIME misst die Zeit seit Gewährung des aktuellen Lockmodus. Daraus folgt nicht, wie lange eine andere Session bereits blockiert ist. Eine gehaltene Sperre kann lange bestehen, bevor ein Waiter hinzukommt.

    19. ID1 und ID2 in V$LOCK: Bedeutung hängt vom Lock-Typ ab

    ID1 und ID2 identifizieren die Lock-Ressource. Bei TM kann ID1 zur Objekt-ID passen; bei TX beschreiben die Werte dagegen eine Transaktionsressource. Eine pauschale Verknüpfung jedes ID1 mit DBA_OBJECTS.OBJECT_ID ist daher falsch.

    20. Read-only Diagnose: Blocker und Waiter über V$LOCK

    Grenze dieses Joins: Die Abfrage liefert Kandidaten auf derselben Enqueue-Ressource innerhalb der lokalen Instanz. Bei mehreren gehaltenen Modi beweist der Ressourcen-Join allein nicht, dass jeder ausgegebene Halter genau diesen Waiter blockiert. Gegenprobe mit V$SESSION_BLOCKERS und gültigen BLOCKING_SESSION-Angaben. WAIT_SECONDS ist der Wartezeitwert der Session, nicht das Alter der gesamten Sperrkette.
    Gemeinsame Lock-Ressource zuordnen
    SELECT
        s1.sid              AS blocker_sid,
        s1.serial#          AS blocker_serial,
        s1.username         AS blocker_user,
        s2.sid              AS waiter_sid,
        s2.serial#          AS waiter_serial,
        s2.username         AS waiter_user,
        l1.type             AS lock_type,
        l1.id1,
        l1.id2,
        l1.lmode            AS blocker_lmode,
        l2.request          AS waiter_request,
        s2.event            AS wait_event,
        s2.state            AS waiter_state,
        CASE WHEN s2.state = 'WAITING' THEN ROUND(s2.wait_time_micro / 1000000, 3)
             END AS current_wait_seconds
    FROM v$lock l1
    JOIN v$session s1
      ON s1.sid = l1.sid
    JOIN v$lock l2
      ON l2.type = l1.type
     AND l2.id1  = l1.id1
     AND l2.id2  = l1.id2
    JOIN v$session s2
      ON s2.sid = l2.sid
    WHERE l1.block = 1
      AND l2.request > 0
      AND s1.sid <> s2.sid
      AND s2.state = 'WAITING'
    ORDER BY current_wait_seconds DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileBLOCKER_SIDBLOCKER_SERIALBLOCKER_USERWAITER_SIDWAITER_SERIAL
    1879201APP_USER1423817
    ZeileWAITER_USERLOCK_TYPEID1ID2BLOCKER_LMODE
    1APP_USERTX6554019186
    ZeileWAITER_REQUESTWAIT_EVENTCURRENT_WAIT_SECONDSWAITER_STATE
    16enq: TX - row lock contention12WAITING

    Was sehe ich hier? Der Ressourcen-Join findet einen Halter und einen Anforderer derselben TX-Ressource. ID1 und ID2 sind Lock-Kennungen, keine Objekt-IDs. Die tatsächliche Blockerbeziehung zusätzlich mit den Sessionangaben prüfen.

    21. V$SESSION_BLOCKERS: Blocker-/Waiter-Paare direkt lesen

    Oracle zeigt in V$SESSION_BLOCKERS höchstens 30 Blocker je wartender Session. Mehrere Zeilen für eine SID sind möglich. Bei einem Zyklus ist FINAL_BLOCKING_SESSION kein Beweis für einen eindeutigen fachlichen Verursacher; maßgeblich für den Deadlock ist der Trace-Graph.

    V$SESSION_BLOCKERS zeigt in Oracle 19c Blocker für blockierte Sessions. Jede Zeile bildet ein Blocked-/Blocker-Paar ab; bei mehreren Blockern können mehrere Zeilen für denselben Waiter erscheinen.

    READ ONLY – V$SESSION_BLOCKERS
    SELECT sid,
           sess_serial#,
           wait_event_text,
           blocker_instance_id,
           blocker_sid,
           blocker_sess_serial#,
           con_id
    FROM v$session_blockers
    ORDER BY sid, blocker_sid;

    Fiktive Beispielausgabe:

    Zusammengehörige Teilansichten derselben Ergebniszeilen.

    SIDSESS_SERIAL#WAIT_EVENT_TEXTBLOCKER_INSTANCE_IDBLOCKER_SID
    1423817enq: TX - row lock contention187
    BLOCKER_SESS_SERIAL#CON_ID
    92013

    So liest du das Ergebnis: Session 142 wird in Container 3 von Session 87 derselben Instanz blockiert. Beide Seriennummern festhalten und bei späteren Messungen erneut prüfen.

    DBA_BLOCKERS zeigt Halter, die selbst nicht auf einen gesperrten Gegenstand warten. In der Kette A blockiert B und B blockiert C kann B deshalb fehlen. Für direkte Paare verwende V$SESSION_BLOCKERS beziehungsweise DBA_WAITERS und sichere die Session-Seriennummern; DBA_BLOCKERS ist keine vollständige Liste aller Kettenglieder.

    22. Read-only Diagnose: DBA_BLOCKERS und DBA_WAITERS

    Blocker
    SELECT
        holding_session
    FROM dba_blockers
    ORDER BY holding_session;

    Fiktive Beispielausgabe:

    HOLDING_SESSION
    87

    Was sehe ich hier? Session 87 wird im lokalen Kontext als Halter einer blockierenden Sperre geführt. Für die Ursache fehlen hier noch Benutzer, SQL und Transaktionsdetails.

    Waiter und Blocker
    SELECT
        waiting_session,
        holding_session,
        lock_type,
        mode_held,
        mode_requested,
        lock_id1,
        lock_id2
    FROM dba_waiters
    ORDER BY waiting_session;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileWAITING_SESSIONHOLDING_SESSIONLOCK_TYPEMODE_HELDMODE_REQUESTED
    114287TransactionExclusiveExclusive
    ZeileLOCK_ID1LOCK_ID2
    1655401918

    Was sehe ich hier? Session 142 wartet auf eine von Session 87 gehaltene Transaktionssperre. Die Namen beschreiben die Lock-Modi; daraus folgt keine pauschale Empfehlung, den Halter zu beenden.

    DBA_BLOCKERS und DBA_WAITERS sind praktische Dictionary-Views für eine schnelle Übersicht. Für eine tiefe Analyse werden sie mit V$SESSION, V$TRANSACTION und SQL-Informationen kombiniert.

    23. Read-only Diagnose: Row-Wait-Kontext

    Row-Wait-Informationen wartender Sessions
    SELECT
        sid,
        serial#,
        username,
        event,
        row_wait_obj#,
        row_wait_file#,
        row_wait_block#,
        row_wait_row#
    FROM v$session
    WHERE state = 'WAITING'
      AND row_wait_obj# <> -1
      AND event = 'enq: TX - row lock contention'
    ORDER BY wait_time_micro DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMEEVENTROW_WAIT_OBJ#
    11423817APP_USERenq: TX - row lock contention81001
    ZeileROW_WAIT_FILE#ROW_WAIT_BLOCK#ROW_WAIT_ROW#
    1712043

    Was sehe ich hier? Die Session wartet hier auf eine Zeilensperre. ROW_WAIT_OBJ# ist die Objektkennung für die folgende Zuordnung; Datei-, Block- und Zeilennummer sind keine fachliche Bestellnummer.

    Die ROW_WAIT_-Spalten können bei bestimmten Row-Lock-Waits Hinweise auf Objekt, Datei, Block und Row Slot liefern. Diese Werte sollten aber nur im passenden aktuellen Wait-Kontext interpretiert werden.

    READ ONLY – ROW_WAIT_OBJ# einem Objekt zuordnen
    SELECT
        owner,
        object_name,
        subobject_name,
        object_type
    FROM dba_objects
    WHERE object_id = &ROW_WAIT_OBJ;

    Fiktive Beispielausgabe:

    OWNEROBJECT_NAMESUBOBJECT_NAMEOBJECT_TYPE
    APPBESTELLUNGENNULLTABLE

    Was sehe ich hier? Für &ROW_WAIT_OBJ=81001 wird APP.BESTELLUNGEN gefunden. SUBOBJECT_NAME ist ohne betroffenes Unterobjekt NULL. Die Abfrage zeigt die Objektzuordnung, nicht die gesperrten Spaltenwerte.

    Die Row-Wait-Werte sind Diagnosehinweise aus dem aktuellen Sessionzustand. Sie sollten nicht als dauerhafte Identifikation einer bestimmten Tabellenzeile behandelt werden.

    24. Welche SQL verursacht die Blockierung?

    Eine der schwierigsten Fragen lautet: „Welche SQL hat den Lock verursacht?“ Die aktuell sichtbare SQL des Blockers muss nicht die ursprüngliche DML sein. Eine Anwendung kann nach dem UPDATE bereits ein SELECT ausgeführt haben oder gerade auf Benutzereingabe warten, während die Transaktion weiterhin offen ist.

    Deshalb sollte der DBA mindestens aktuelle SQL_ID, PREV_SQL_ID, Transaktionsstart, Modul, Aktion, Machine und Anwendungslogik gemeinsam betrachten. Historische SQL-Quellen können je nach Lizenzierung und Betriebsstandard weitere Hinweise liefern, werden hier aber bewusst nicht vorausgesetzt.

    25. Typische Praxisfälle

    Fall 1: Nicht abgeschlossene DML A ändert eine Zeile und committet nicht. B möchte dieselbe Zeile ändern und wartet auf enq: TX - row lock contention.
    Fall 2: Benutzer hält Maske offen Eine Anwendung verwendet SELECT FOR UPDATE oder DML und wartet anschließend lange auf Benutzereingabe. Die Transaktion bleibt währenddessen offen.
    Fall 3: Blocking Chain A blockiert B, B blockiert C. C sieht B als direkten Blocker, die eigentliche Wurzel der Kette ist aber A.
    Fall 4: Unique-Key-Konflikt Zwei Sessions konkurrieren um denselben eindeutigen Schlüsselwert. Die zweite Session muss zunächst den Ausgang der ersten Transaktion abwarten.
    Fall 5: Deadlock A und B greifen in unterschiedlicher Reihenfolge auf mehrere Ressourcen zu und erzeugen einen Zyklus. Oracle meldet ORA-00060.
    Fall 6: DDL gegen laufende DML Eine Strukturänderung benötigt Locks, die mit laufender DML nicht kompatibel sind. Die Operation muss warten oder kann nicht sofort ausgeführt werden.

    26. Kompakte Blocker-/Waiter-Sicht für den Erstcheck

    Für den ersten Incident-Überblick ist eine kompakte Sicht hilfreich, die Waiter und direkten Blocker nebeneinanderstellt. Sie ersetzt nicht die anschließende Transaktions- und SQL-Analyse.

    READ ONLY – Waiter und direkter Blocker
    SELECT
        w.sid              AS waiter_sid,
        w.serial#          AS waiter_serial,
        w.username         AS waiter_user,
        w.event            AS waiter_event,
        w.state AS waiter_state,
        CASE WHEN w.state = 'WAITING' THEN ROUND(w.wait_time_micro / 1000000, 3)
             END AS current_wait_seconds,
        w.sql_id           AS waiter_sql_id,
        b.sid              AS blocker_sid,
        b.serial#          AS blocker_serial,
        b.username         AS blocker_user,
        b.status           AS blocker_status,
        b.sql_id           AS blocker_sql_id,
        b.prev_sql_id      AS blocker_prev_sql_id,
        b.module           AS blocker_module,
        b.machine          AS blocker_machine
    FROM v$session w
    JOIN v$session b
      ON b.sid = w.blocking_session
    WHERE w.blocking_session_status = 'VALID'
      AND w.state = 'WAITING'
    ORDER BY current_wait_seconds DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileWAITER_SIDWAITER_SERIALWAITER_USERWAITER_EVENTCURRENT_WAIT_SECONDSWAITER_STATE
    11423817APP_USERenq: TX - row lock contention12WAITING
    ZeileWAITER_SQL_IDBLOCKER_SIDBLOCKER_SERIALBLOCKER_USERBLOCKER_STATUS
    18u3k2m9p4q7r1879201APP_USERINACTIVE
    ZeileBLOCKER_SQL_IDBLOCKER_PREV_SQL_IDBLOCKER_MODULEBLOCKER_MACHINE
    1NULL8u3k2m9p4q7r1Bestellportalapp01

    Was sehe ich hier? Der Wartende und der gemeldete Blocker stehen in einer Ergebniszeile. Beim inaktiven Blocker kann SQL_ID leer sein; ein vorheriges SQL und die offene Transaktion sind dann gesondert zu prüfen.

    27. DBA-Denkmodell bei Blockierungen

    1. Symptom sichern Welche Anwendung ist betroffen? Seit wann? Wie viele Sessions warten? Welches Event wird angezeigt?
    2. Waiter erfassen SID, SERIAL#, SQL_ID, MODULE, EVENT und Wartezeit des Waiters dokumentieren.
    3. Direkten Blocker finden BLOCKING_SESSION und passende V$LOCK-Ressource bestimmen.
    4. Final Blocker betrachten Bei Chains den Blocker am Ende der Abhängigkeitskette identifizieren.
    5. Transaktion analysieren START_DATE, Undo-Verbrauch und aktuelle beziehungsweise vorherige SQL des Blockers prüfen.
    6. Objekt und Anwendung zuordnen Welches Objekt, welcher Benutzer, welches Modul und welcher Host gehören zum Vorgang?
    7. Fachliche Ursache klären Ist der Blocker ein legitimer Batch, eine hängende Maske, eine fehlerhafte Transaktionslogik oder ein DDL-Konflikt?
    8. Erst dann Maßnahmen planen Fachprozess, Transaktionsumfang und mögliche Rollback- beziehungsweise Anwendungsfolgen berücksichtigen. Diagnose und Eingriff strikt trennen.

    28. Typische DBA-Fehlannahmen

    Aussage Bewertung Korrekte Einordnung
    Jeder Lock ist ein Fehler. Falsch Locks sind normal. Erst inkompatible Konkurrenz erzeugt einen Wait.
    Der Blocker ist automatisch die fehlerhafte Session. Falsch Der Blocker kann eine legitime fachliche Transaktion ausführen.
    ACTIVE bedeutet, dass die Session auf CPU läuft. Falsch Eine ACTIVE Session kann innerhalb ihres Calls auf einen Lock warten.
    V$LOCKED_OBJECT zeigt die exakt gesperrte Zeile. Falsch Die View liefert Objekt-/Lockkontext, nicht einfach die konkrete Row.
    Ein normaler Lock Wait ist ein Deadlock. Falsch Ein Deadlock benötigt einen zyklischen Wartegraphen.
    Session killen ist die schnellste Diagnose. Falsch Ein Kill ist eine Maßnahme und kann Rollback sowie fachliche Folgen erzeugen.
    Read-only Grundsatz: Dieses Kapitel analysiert Locks und Blockierungen, verändert aber nichts. Es enthält bewusst keinen KILL SESSION-, COMMIT-, ROLLBACK- oder ALTER-SYSTEM- Befehl.
    Was du nach diesem Kapitel erklären können solltest:
    Warum Oracle Locks benötigt, wie TX und TM einzuordnen sind, wie sich Lock, Blockierung und Deadlock unterscheiden, wie eine Blocking Chain entsteht und wie du mit V$SESSION, V$LOCK, V$TRANSACTION, V$LOCKED_OBJECT, DBA_BLOCKERS und DBA_WAITERS eine Blockierung systematisch read-only untersuchst.

    29. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Concepts – Data Concurrency and Consistency
    Locks, DML Locks und Deadlocks
    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/data-concurrency-and-consistency.html

    Oracle Database 19c Reference – V$SESSION / V$SESSION_BLOCKERS
    Blocking Session, Final Blocker und Blocker-/Waiter-Paare
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-SESSION.html
    Praxisbeispiel: UPDATE wartet

    Beobachtung: Die gezeigte Blocker-Abfrage verbindet SID 142 / SERIAL# 3817 mit SID 87 / SERIAL# 9201. In V$LOCK fordert 142 den TX-Modus 6 an; 87 hält ihn auf derselben Ressource.

    1. Prüfe zuerst die Identitäten und STATE=WAITING erneut. Ein inzwischen beendeter Vorgang kann das Bild verändern.
    2. Untersuche mit der vorhandenen Transaktionsabfrage Session 87. Auch STATUS=INACTIVE kann mit einer offenen Transaktion zusammenfallen.
    3. Ordne MODULE, MACHINE und Clientinformationen dem Arbeitsablauf zu. Die aktuelle SQL muss nicht die frühere Änderung sein, die die Sperre erzeugte.
    4. Halte den Befund fest und kläre mit der Anwendung, weshalb die Transaktion offen bleibt. Die Session darf nicht allein aufgrund ihrer SID beendet werden.

    Musterlösung: Nachgewiesen ist eine aktuelle Blockierung durch eine andere Transaktion. Ein Deadlock oder eine generell zu langsame Datenbank ist damit nicht nachgewiesen. Die fachliche Lösung besteht im korrekt gesteuerten Abschluss der verursachenden Transaktion; ob Commit oder Rollback richtig ist, entscheidet ihr Geschäftsinhalt.

    Vertiefende Oracle-19c-Quellen: Bestätigte Blocker · Enqueue-Ressourcen
    Oracle-19c-Referenzen zu den Präzisierungen: Grenzen von DBA_BLOCKERS · Lockmodi und CTIME · Session-Paare

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Locks schützen konkurrierende Änderungen. Eine vorhandene Sperre ist normal; problematisch wird sie, wenn eine andere benötigte Operation auf sie warten muss.
    2. TX- und TM-Enqueues haben unterschiedliche Bedeutungen. Lock-Typ, Modus und Ressourcenkennungen müssen gemeinsam interpretiert werden.
    3. Eine inaktive Session kann mit einer offenen Transaktion andere Sessions blockieren. Das zuletzt sichtbare SQL muss nicht die Anweisung sein, welche die Sperre ursprünglich erzeugt hat.
    4. Ein Deadlock ist ein zyklischer Wartezustand und nicht bloß eine lange Blockierung. ORA-00060 verlangt die Auswertung der zugehörigen Diagnoseinformationen und des Transaktionsablaufs.
    5. Eine belastbare Analyse verbindet Waiter, Blocker, Transaktion und betroffene Ressource. Aus einer Blockierung folgt nicht automatisch, dass eine Session beendet werden sollte.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Die Antworten sind bewusst eingeklappt.
    Frage 1: Was ist der Unterschied zwischen Lock, Blockierung und Deadlock?
    Ein Lock ist ein normaler Schutzmechanismus; eine Blockierung entsteht bei inkompatibler Konkurrenz; ein Deadlock ist eine zyklische Warteabhängigkeit.
    Frage 2: Warum ist der Blocker nicht automatisch die fehlerhafte Session?
    Er kann eine fachlich legitime offene Transaktion ausführen. Ursache und Anwendungskontext müssen zuerst geklärt werden.
    Frage 3: Warum kann eine INACTIVE Session trotzdem blockieren?
    Weil der aktuelle Call beendet sein kann, während die Transaktion noch offen ist und Locks hält.
    Frage 4: Was folgt aus SID 142 als Waiter und SID 87 als Blocker?
    Session 87 mit ihrer aktuellen SERIAL# und Transaktion prüfen. Die Blocker-SID allein erklärt weder den Geschäftsablauf noch rechtfertigt sie das Beenden einer Verbindung.
    Frage 5: Ist ein TX-Wait bereits ein Deadlock?
    Nein. Eine normale wartende Transaktion kann nach Abschluss des Blockers fortfahren. Ein Deadlock ist eine zyklische Abhängigkeit; ORA-00060 und der zugehörige Trace liefern den maßgeblichen Befund.
    Frage 6: Zeigt DBA_BLOCKERS jedes blockierende Kettenglied?
    Nein. Ein Halter, der selbst auf einen gesperrten Gegenstand wartet, wird dort nicht aufgeführt. Direkte Paare und die gesamte Kette getrennt prüfen.
    Frage 7: Ist CTIME die Dauer der Blockierung des Waiters?
    Nein. CTIME ist die Zeit seit Gewährung des aktuellen Lockmodus; der Waiter kann später hinzugekommen sein.
    Frage 8: Ist nach ORA-00060 automatisch die gesamte Transaktion zurückgerollt?
    Nein. Der Statement-Rollback kann frühere Änderungen der Transaktion bestehen lassen.

    21. Oracle Hintergrundprozesse – interne Aufgaben, Zusammenspiel und Diagnose

    Ausführliches Nachschlagewerk zu den wichtigsten Background Processes der Oracle-Instanz mit Ablaufgrafiken und read-only SQL.

    Lernkompass
    Einfach gesagt Du lernst die wichtigsten Oracle-Hintergrundprozesse und ihre Aufgaben im laufenden Datenbankbetrieb kennen.
    Warum ist das wichtig? DBWn, LGWR, CKPT, SMON, PMON und weitere Prozesse erfüllen unterschiedliche Aufgaben. Bei Störungen muss zuerst klar sein, welcher Prozess zu welchem Teil der Oracle-Architektur gehört.
    Nach diesem Kapitel Du kannst zentrale Hintergrundprozesse fachlich unterscheiden, ihren Status read-only prüfen und Prozessauffälligkeiten mit Alert Log, Waits und Betriebssysteminformationen verbinden.

    Einführung: Hintergrundprozesse sind Oracle-Prozesse, die interne Aufgaben für die gesamte Instanz erledigen. Sie laufen neben den Serverprozessen, die Anfragen von Anwendungen bearbeiten. „Hintergrund“ bedeutet dabei interne Aufgabe – nicht, dass ein Prozess unwichtig ist oder nur im Leerlauf arbeitet. LGWR schreibt Redo, DBWn schreibt geänderte Datenblöcke, CKPT koordiniert Checkpoints; weitere Prozesse übernehmen unter anderem Archivierung, Wiederanlauf und Bereinigung.

    Das Kapitel ordnet zuerst die wichtigsten Rollen und ihr Zusammenspiel ein. Danach erklären die Prozess-Steckbriefe typische Auslöser, Warnzeichen und passende Diagnosequellen. Einige Prozesse gehören zu einer typischen Instanz, andere erscheinen erst mit bestimmten Funktionen oder Betriebsarten. Eine Prozessliste ist daher immer im Kontext der konkreten Konfiguration zu lesen. Die Abfragen beziehen sich auf die jeweilige Instanz; bei Oracle RAC müssen Prozess und Instanz gemeinsam betrachtet und bei Bedarf die passenden GV$-Views mit INST_ID verwendet werden.

    Oracle 19c: fachliche Grundlage

    Die Prozessübersicht und die Steckbriefe beschreiben typische Rollen, keine Soll-Liste für jede Datenbank. Ein laufender Prozess belegt zunächst nur seine Präsenz; ob seine Aufgabe erfolgreich ist, ergibt sich erst aus den passenden Statuswerten, Zeiträumen und Meldungen.

    1. Die zentralen Hintergrundprozesse im Überblick

    Die Prozesse erledigen unterschiedliche Aufgaben und arbeiten bei Bedarf zusammen; sie bilden keine feste Schrittfolge, die bei jeder SQL-Anweisung vollständig durchlaufen wird. Die folgende Übersicht zeigt die Grundrollen. Die späteren Abschnitte erklären Aufgaben, Auslöser und Abhängigkeiten im Detail.

    DBWn – schreibt geänderte Datenblöcke aus dem Buffer Cache in Datafiles.

    LGWR – schreibt Redo aus dem Redo Log Buffer in die Online Redo Logs.

    CKPT – koordiniert Checkpoints und aktualisiert Checkpoint-Informationen; CKPT schreibt die Datenblöcke nicht selbst.

    SMON – übernimmt unter anderem Instance-Recovery-Aufgaben und verschiedene Instance-bezogene Bereinigungsarbeiten.

    PMON-Gruppe – erkennt Prozessabbrüche und gibt mit CLMN/CLnn Ressourcen fehlgeschlagener Prozesse und Sessions frei.

    ARCn – archiviert abgeschlossene Online-Redo-Log-Sequenzen im ARCHIVELOG-Modus, wenn die Archivierung entsprechend konfiguriert ist.

    2. Zusammenspiel mit anderen Fachthemen

    Dieses Kapitel erklärt nur, welcher Hintergrundprozess welche Aufgabe hat. Die vollständigen Abläufe bleiben in ihren Fachkapiteln.

    Abgrenzung: COMMIT, Online Redo Logs und Checkpoints stehen in Redo Logs. Restore/Recovery steht in Backup & Recovery.

    3. Mandatory, Optional und Slave Processes unterscheiden

    Mandatory und optional beschreiben, ob ein Prozess in einer typischen Konfiguration erforderlich ist oder nur für bestimmte Features beziehungsweise Betriebsarten gebraucht wird. Slave- oder Worker-Prozess beschreibt dagegen seine Rolle: Er erledigt Arbeit im Auftrag eines anderen Prozesses. Das sind unterschiedliche Einordnungen; ein Worker ist nicht automatisch eine dritte, gleichrangige Startkategorie.

    Oracle 19c startet einige Hintergrundprozesse beim Instanzstart und weitere abhängig von Konfiguration und Bedarf. Deshalb müssen zwei Instanzen nicht dieselbe Prozessliste besitzen. Die Prozessübersicht bezieht sich auf den normalen Read/Write-Betrieb; Read-only- und Feature-spezifische Konfigurationen können abweichen.

    PMAN – Process Manager

    PMAN überwacht, startet und stoppt bestimmte Prozessgruppen, darunter je nach Konfiguration Dispatcher/Shared Server, pooled Server, Job-Queue-Prozesse und restartfähige Background Processes.

    MMAN – Memory Manager

    MMAN koordiniert dynamische Speicheranpassungen der Instance. Die konkrete SGA-/PGA-Dimensionierung bleibt in Kapitel 22; hier ist die Zuordnung wichtig: MMAN gehört zur Speicherverwaltung und nicht zu Redo, Datafile-I/O oder Cleanup.

    Die Angabe „Immer“ bezieht sich hier auf eine normal geöffnete Read-write-Instanz mit typischer Konfiguration. Prozesspräsenz und aktuell ausgeführte Arbeit sind getrennte Aussagen. RECO ist in diesem Betrieb obligatorisch; seine Auflösungsarbeit wird bei In-doubt-Transaktionen benötigt.

    4. Prozessübersicht

    Die Startangaben beziehen sich auf den normalen Read/Write-Betrieb. Andere Betriebsmodi, insbesondere Read-only-Instanzen, können abweichen. Ein vorhandener Prozess führt nicht ständig seine Hauptaufgabe aus.

    Prozess Aufgabe Start Wichtigkeit
    PMONErkennt unter anderem abnormal beendete Prozesse; Cleanup-Aufgaben werden in Oracle 19c innerhalb der PMON-Gruppe an CLMN/CLnn delegiert.Beim InstanzstartSehr hoch
    SMONFührt Instance Recovery und interne Bereinigungen aus.Beim InstanzstartSehr hoch
    LGWRSchreibt Redo aus dem Redo Log Buffer in die Online Redo Logs.Beim InstanzstartSehr hoch
    DBWnSchreibt Dirty Buffers aus dem Buffer Cache in die Datafiles.Beim InstanzstartSehr hoch
    CKPTKoordiniert Checkpoints und aktualisiert Controlfile- und Datafile-Header.Beim InstanzstartSehr hoch
    ARCnArchiviert abgeschlossene Online-Redo-Sequenzen bei aktivierter automatischer Archivierung.ARCHIVELOG mit automatischer ArchivierungHoch
    MMONÜbernimmt Aufgaben der Manageability, darunter AWR-Snapshots, ADDM- und Metrikverarbeitung.Beim InstanzstartHoch
    MMNLUnterstützt MMON und schreibt bestimmte Manageability-Daten.Beim InstanzstartMittel
    CJQ0Koordiniert Job-Queue-Slave-Prozesse für Scheduler und DBMS_JOB.Bei aktivierter Job-Queue und fälligen AufgabenHoch
    RECOLöst in-doubt Distributed Transactions auf.Beim Instanzstart; Arbeit bei verteilten TransaktionenMittel
    LREGRegistriert Instanz und Services dynamisch beim Listener.Beim InstanzstartHoch
    PMON – Process Monitor Erkennt unter anderem abnormal beendete Prozesse; Cleanup-Aufgaben werden in Oracle 19c innerhalb der PMON-Gruppe an CLMN/CLnn delegiert. Basisprozess Beim Instanzstart Sehr hoch

    PMON-Gruppe in Oracle 19c: PMON, CLMN und CLnn

    Die Kurzform „PMON räumt abgebrochene Sessions auf“ ist für Oracle 19c zu grob. PMON erkennt unter anderem Prozessabbrüche. Cleanup-Arbeit wird an CLMN delegiert; CLMN kann CLnn -Helfer einsetzen.

    Mehrere Cleanup-Helfer ermöglichen parallele Arbeit, wenn viele Ressourcen zu bereinigen sind oder einzelne Cleanup-Vorgänge blockieren.

    1. Was ist PMON?

    Die PMON-Gruppe überwacht Prozesse und sorgt dafür, dass Ressourcen abgebrochener Prozesse wieder nutzbar werden. Dazu gehören nicht mehr benötigte Locks sowie Prozess- und Speicherzuordnungen.

    2. Wann wird der Prozess aktiv?

    • Wenn ein Client oder Serverprozess ohne sauberes Logout endet.
    • Wenn Locks und Ressourcen einer abgebrochenen Session freigegeben werden müssen.
    • Wenn Prozess- und Sessionbereinigung nach einem Fehler erforderlich ist.

    3. Typische Probleme und Hinweise

    • Hängende oder nicht vollständig bereinigte Sessions.
    • Auffällige Prozessabbrüche im Alertlog oder Trace.
    • Viele Dead Connections oder Netzwerkabbrüche.
    Prozess:
    PMON – Process Monitor
    Start:
    Beim Instanzstart
    Wichtigkeit:
    Sehr hoch
    Verwandte Views:
    V$PROCESS, V$SESSION, V$RESOURCE_LIMIT, V$DIAG_ALERT_EXT

    4. Typischer Ablauf

    Auslöser Wenn ein Client oder Serverprozess ohne sauberes Logout endet.
    →
    PMON Erkennt unter anderem abnormal beendete Prozesse; Cleanup-Aufgaben werden in Oracle 19c innerhalb der PMON-Gruppe an CLMN/CLnn delegiert.
    →
    Ergebnis PMON erkennt den Ausfall; CLMN und gegebenenfalls CLnn führen die Bereinigung durch.

    5. Diagnoseabfrage

    PMON – read-only Diagnose
    SELECT pname, pid, spid, stid, program
    FROM v$process
    WHERE pname IN ('PMON', 'CLMN')
       OR pname LIKE 'CL__'
    ORDER BY pname, pid;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    PNAMEPIDSPIDSTIDPROGRAM
    CLMN1832103210oracle@dbhost (CLMN)
    PMON231803180oracle@dbhost (PMON)

    So liest du das Ergebnis: Die Prozesse sind vorhanden; das beweist keine gerade laufende Bereinigung. CLnn-Helfer können bedarfsabhängig erscheinen. Die Kennungen sind erfunden.

    PMON erkennt den Ausfall; CLMN und gegebenenfalls CLnn führen die Bereinigung durch.
    SMON – System Monitor Führt Instance Recovery und interne Bereinigungen aus. Recovery Beim Instanzstart Sehr hoch

    Die unten gezeigten Zustandsabfragen liefern Kontext. OPEN beziehungsweise READ WRITE belegt weder den historischen Ablauf noch den Fortschritt einer Instance Recovery. Dazu den passenden Startup-/Recovery-Zeitraum im Alert Log nachvollziehen.

    1. Was ist SMON?

    SMON führt nach einem ungeplanten Instanzabbruch die Instance Recovery durch. Dabei werden Redo-Informationen angewendet und nicht abgeschlossene Transaktionen mit Hilfe von Undo zurückgerollt.

    2. Wann wird der Prozess aktiv?

    • Beim Start nach SHUTDOWN ABORT oder Instanzcrash.
    • Bei internen Recovery- und Bereinigungsaufgaben.
    • Wenn Oracle Transaktionen nach einem Crash konsistent machen muss.

    3. Typische Probleme und Hinweise

    • Lange Instance Recovery nach großer Redo-Menge.
    • Langwierige Rollbacks großer Transaktionen.
    • Wiederholte Instanzabbrüche oder Storage-Probleme.
    Prozess:
    SMON – System Monitor
    Start:
    Beim Instanzstart
    Wichtigkeit:
    Sehr hoch
    Verwandte Views:
    V$INSTANCE, V$DATABASE, V$TRANSACTION, V$RECOVER_FILE, V$DIAG_ALERT_EXT

    4. Typischer Ablauf

    Auslöser Beim Start nach SHUTDOWN ABORT oder Instanzcrash.
    →
    SMON Führt Instance Recovery und interne Bereinigungen aus.
    →
    Ergebnis SMON stellt nach einem Instanzabbruch die logische Konsistenz wieder her.

    5. Diagnoseabfrage

    SMON – read-only Diagnose
    SELECT
        instance_name,
        status,
        startup_time,
        database_status
    FROM v$instance;
    
    SELECT
        name,
        open_mode,
        database_role,
        log_mode
    FROM v$database;

    Fiktive Beispielausgabe:

    SELECT 1. Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    INSTANCE_NAMESTATUSSTARTUP_TIMEDATABASE_STATUS
    ORCLOPEN08.10.2026 08:00:00ACTIVE

    Einordnung zu SELECT 1: Die erste Abfrage beschreibt Instanzzustand und Startzeit.

    Fiktive Beispielausgabe:

    SELECT 2.

    NAMEOPEN_MODEDATABASE_ROLELOG_MODE
    ORCLREAD WRITEPRIMARYARCHIVELOG

    Einordnung zu SELECT 2: Die zweite Abfrage beschreibt die Datenbankrolle und Betriebsmodi. Eine geöffnete Primärdatenbank ist damit noch nicht umfassend auf Gesundheit geprüft.

    SMON stellt nach einem Instanzabbruch die logische Konsistenz wieder her.
    LGWR – Log Writer Schreibt Redo aus dem Redo Log Buffer in die Online Redo Logs. Redo Beim Instanzstart Sehr hoch

    Die folgende V$SYSTEM_EVENT-Abfrage ist eine instanzweite Sicht auf den Redo-Pfad. Sie misst nicht ausschließlich LGWR: log file sync beschreibt das Warten der Vordergrundsession auf Commit-Bestätigung. Prozesspräsenz und kumulierte Waits allein beweisen keine konkrete Fehlerursache.

    1. Was ist LGWR?

    Bei einem synchron bestätigten Commit muss das erforderliche Redo dauerhaft geschrieben sein. LGWR schreibt im fehlerfreien multiplexierten Betrieb in die Member der aktuellen Online-Redo-Group. Der Ausfall eines einzelnen Members verhindert den Betrieb nicht zwingend, solange mindestens ein Member erfolgreich beschrieben werden kann; der Fehler muss dennoch untersucht werden. Die Commit-Varianten werden im Redo-Kapitel abgegrenzt.

    2. Wann wird der Prozess aktiv?

    • Bei COMMIT.
    • Wenn der Redo Log Buffer ausreichend gefüllt ist.
    • Vor bestimmten DBWR-Schreibvorgaengen.
    • Bei Log Switches und internen Flush-Anforderungen.

    3. Typische Probleme und Hinweise

    • log file sync.
    • log file parallel write.
    • cannot allocate new log.
    • private strand flush not complete.
    • Langsame Redo-Storage-Latenz oder zu viele kleine Commits.
    Prozess:
    LGWR – Log Writer
    Start:
    Beim Instanzstart
    Wichtigkeit:
    Sehr hoch
    Verwandte Views:
    V$LOG, V$LOGFILE, V$LOG_HISTORY, V$SYSTEM_EVENT, V$SESSION_EVENT

    4. Typischer Ablauf

    Auslöser Bei COMMIT.
    →
    LGWR Schreibt Redo aus dem Redo Log Buffer in die Online Redo Logs.
    →
    Ergebnis Ohne LGWR gibt es kein dauerhaft bestaetigtes COMMIT.

    5. Diagnoseabfrage

    LGWR – read-only Diagnose
    SELECT
        event,
        total_waits,
        ROUND(time_waited_micro / 1000000, 2) AS waited_seconds,
        ROUND(time_waited_micro / NULLIF(total_waits,0) / 1000, 3) AS avg_wait_ms
    FROM v$system_event
    WHERE event LIKE 'log file%'
    ORDER BY time_waited_micro DESC;

    Fiktive Beispielausgabe:

    EVENTTOTAL_WAITSWAITED_SECONDSAVG_WAIT_MS
    log file sync10000505
    log file parallel write8000162

    Was sehe ich hier? 50 kumulierte Sekunden auf 10.000 Waits ergeben im Mittel 5 ms. AVG_WAIT_MS ist hier bereits umgerechnet. Für eine aktuelle Bewertung sind Zeitintervall und Last entscheidend. Die Instanzzähler gelten seit dem Start; für den aktuellen Zeitraum passende Differenzen verwenden.

    Ohne LGWR gibt es kein dauerhaft bestaetigtes COMMIT.
    DBWn – Database Writer Schreibt Dirty Buffers aus dem Buffer Cache in die Datafiles. Storage Beim Instanzstart Sehr hoch

    1. Was ist DBWn?

    DBWn schreibt veränderte Datenblöcke aus dem Buffer Cache in die Datafiles. Ein COMMIT wartet normalerweise nicht auf DBWn, sondern auf LGWR. DBWn arbeitet asynchron und wird unter anderem durch Checkpoints und freien Bufferbedarf aktiviert.

    2. Wann wird der Prozess aktiv?

    • Wenn freie Buffer im Cache benötigt werden.
    • Im Rahmen von Checkpoints.
    • Bei hoher Write-Last.
    • Bei Tablespace- oder Datafile-bezogenen Synchronisationsanforderungen.

    3. Typische Probleme und Hinweise

    • free buffer waits.
    • write complete waits.
    • DB file parallel write.
    • Langsame Datafile-I/O.
    • Checkpoint not complete.
    Prozess:
    DBWn – Database Writer
    Start:
    Beim Instanzstart
    Wichtigkeit:
    Sehr hoch
    Verwandte Views:
    V$BGPROCESS, V$SYSTEM_EVENT, V$FILESTAT, V$DATAFILE, V$SYSMETRIC

    4. Typischer Ablauf

    Auslöser Wenn freie Buffer im Cache benötigt werden.
    →
    DBWn Schreibt Dirty Buffers aus dem Buffer Cache in die Datafiles.
    →
    Ergebnis DBWn schreibt Datenblöcke später; COMMIT wird durch LGWR abgesichert.

    5. Diagnoseabfrage

    DBWn – read-only Diagnose
    SELECT
        event,
        total_waits,
        ROUND(time_waited_micro / 1000000, 2) AS waited_seconds
    FROM v$system_event
    WHERE event IN
    (
        'free buffer waits',
        'write complete waits',
        'db file parallel write'
    )
    ORDER BY time_waited_micro DESC;

    Fiktive Beispielausgabe:

    EVENTTOTAL_WAITSWAITED_SECONDS
    db file parallel write400012
    free buffer waits201
    write complete waits50.25

    Was sehe ich hier? Die Reihenfolge folgt der kumulierten Wartezeit. Ein großer Zähler seit Instanzstart beweist keine aktuelle Störung; für den DBWn-Pfad zusätzlich I/O und Änderungsraten betrachten.

    DBWn schreibt Datenblöcke später; COMMIT wird durch LGWR abgesichert.
    CKPT – Checkpoint Process Koordiniert Checkpoints und aktualisiert Controlfile- und Datafile-Header. Checkpoint Beim Instanzstart Sehr hoch
    Einordnung für SE2: Das folgende MTTR-Beispiel beschreibt eine entsprechend lizenzierte Umgebung. Fast-start fault recovery ist in Oracle 19c SE2 nicht verfügbar. Die Lesbarkeit von V$INSTANCE_RECOVERY ist davon zu unterscheiden. TARGET_MTTR und ESTIMATED_MTTR sind Sekunden; OPTIMAL_LOGFILE_SIZE ist die von FAST_START_MTTR_TARGET abhängige empfohlene Mindestgröße in MB, kein allgemeines Größenoptimum. WRITES_MTTR und WRITES_AUTOTUNE sind Schreibzähler.

    1. Was ist CKPT?

    CKPT schreibt keine Dirty Buffers. Der Prozess signalisiert DBWn, dass Dirty Buffers fortgeschrieben werden sollen, und aktualisiert Checkpoint-Informationen in Controlfile und Datafile-Headern.

    2. Wann wird der Prozess aktiv?

    • Bei Log Switches.
    • Bei FAST_START_MTTR_TARGET-bezogenen Checkpoints.
    • Bei sauberen Shutdowns.
    • Bei bestimmten Datei- und Tablespace-Operationen.

    3. Typische Probleme und Hinweise

    • checkpoint not complete.
    • cannot allocate new log.
    • Private strand flush not complete.
    • Zu langsame DBWR-Schreibleistung.
    Prozess:
    CKPT – Checkpoint Process
    Start:
    Beim Instanzstart
    Wichtigkeit:
    Sehr hoch
    Verwandte Views:
    V$INSTANCE_RECOVERY, V$DATAFILE_HEADER, V$LOG, V$SYSTEM_EVENT

    4. Typischer Ablauf

    Auslöser Bei Log Switches.
    →
    CKPT Koordiniert Checkpoints und aktualisiert Controlfile- und Datafile-Header.
    →
    Ergebnis CKPT koordiniert, DBWn schreibt und die Datei-Header dokumentieren den Checkpoint.

    5. Diagnoseabfrage

    CKPT – read-only Diagnose
    SELECT
        target_mttr,
        estimated_mttr,
        writes_mttr,
        writes_autotune,
        optimal_logfile_size
    FROM v$instance_recovery;

    Fiktive Beispielausgabe:

    TARGET_MTTRESTIMATED_MTTRWRITES_MTTRWRITES_AUTOTUNEOPTIMAL_LOGFILE_SIZE
    6018100002500512

    Was sehe ich hier? Die ersten beiden Werte beschreiben das Recovery-Ziel und dessen Schätzung. WRITES_MTTR und WRITES_AUTOTUNE sind Schreibzähler unterschiedlicher Ursachen, keine Zeitwerte.

    CKPT koordiniert, DBWn schreibt und die Datei-Header dokumentieren den Checkpoint.
    ARCn – Archiver Process Archiviert abgeschlossene Online-Redo-Sequenzen. Archivierung ARCHIVELOG Hoch

    Ein Log Switch kann vor Erreichen der Gruppengröße stattfinden. Erfolgreiche Archivierung belegt die Erstellung am Ziel; Aufbewahrung, Sicherung und spätere Lesbarkeit sind gesondert zu prüfen.

    1. Was ist ARCn?

    ARCn kopiert abgeschlossene Online-Redo-Log-Sequenzen in Archive-Ziele. Damit werden Media Recovery, Point-in-Time Recovery und viele Backupstrategien möglich.

    2. Wann wird der Prozess aktiv?

    • Nach einem Log Switch im ARCHIVELOG-Modus.
    • Wenn mehrere Archive-Ziele konfiguriert sind.
    • Wenn Redo für Standby- oder Recovery-Zwecke bereitgestellt werden muss.

    3. Typische Probleme und Hinweise

    • ORA-00257.
    • Archive destination full.
    • ARCn unable to archive.
    • Log Switch blockiert, weil eine Group noch nicht archiviert wurde.
    Prozess:
    ARCn – Archiver Process
    Start:
    ARCHIVELOG
    Wichtigkeit:
    Hoch
    Verwandte Views:
    V$ARCHIVE_DEST, V$ARCHIVE_DEST_STATUS, V$ARCHIVED_LOG, V$LOG

    4. Typischer Ablauf

    Auslöser Nach einem Log Switch im ARCHIVELOG-Modus.
    →
    ARCn Archiviert abgeschlossene Online-Redo-Sequenzen.
    →
    Ergebnis ARCn macht Online Redo für Recovery und Backup dauerhaft verfügbar.

    5. Diagnoseabfrage

    ARCn – read-only Diagnose
    SELECT
        dest_id,
        status,
        destination,
        target,
        archiver,
        error
    FROM v$archive_dest
    WHERE status <> 'INACTIVE'
    ORDER BY dest_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    DEST_IDSTATUSDESTINATIONTARGETARCHIVER
    1VALID/archivePRIMARYARCH
    ERROR
    NULL

    So liest du das Ergebnis: Das Archivziel ist in dieser Momentaufnahme gültig. Für einen früheren Ausfall werden zusätzlich Alert Log und Verlauf geprüft; NULL bei ERROR ist hier erwartbar.

    ARCn macht Online Redo für Recovery und Backup dauerhaft verfügbar.
    MMON – Manageability Monitor Koordiniert AWR-Snapshots, Advisors und Manageability-Aufgaben. Manageability Oracle-intern Hoch
    AWR-/ADDM-bezogene Aufgaben und Fehlerbilder gelten für eine entsprechend lizenzierte Umgebung. Das Diagnostics Pack ist für lokale Oracle-19c-SE2-Installationen nicht verfügbar. Fehlende AWR-Snapshots sind dort kein Nachweis eines MMON-Fehlers. Die folgenden Prozessabfragen verwenden keine AWR-/ASH-Daten.

    1. Was ist MMON?

    MMON führt zentrale Verwaltungs- und Überwachungsaufgaben aus oder plant sie ein. Oracle nennt insbesondere AWR-Snapshots und ADDM-Analysen. Das darf nicht mit der automatischen Sammlung von Tabellen- und Indexstatistiken gleichgesetzt werden; diese gehört zum eigenen Optimizer-Statistikverfahren.

    2. Wann wird der Prozess aktiv?

    • Bei geplanten AWR-Snapshots.
    • Bei automatischen Advisor- und Manageability-Aufgaben.
    • Bei Schwellenwert- und Metrikverarbeitung.

    3. Typische Probleme und Hinweise

    • Fehlende oder verspätete AWR-Snapshots.
    • SYSAUX-Wachstum.
    • Fehler in automatischen Manageability-Jobs.
    Prozess:
    MMON – Manageability Monitor
    Einordnung:
    Oracle-interner Manageability-Prozess
    Wichtigkeit:
    Hoch
    SE2-Diagnose:
    V$PROCESS, V$BGPROCESS, V$DIAG_ALERT_EXT

    4. Typischer Ablauf

    Auslöser Bei geplanten AWR-Snapshots.
    →
    MMON Koordiniert AWR-Snapshots, Advisors und Manageability-Aufgaben.
    →
    Ergebnis MMON sammelt und koordiniert Manageability-Daten; Lizenzierung ist zu beachten.

    5. Diagnoseabfrage

    MMON – read-only Diagnose
    SELECT
        p.spid,
        p.program,
        p.background,
        p.pga_used_mem
    FROM v$process p
    WHERE p.pname = 'MMON'
    ORDER BY p.spid;

    Fiktive Beispielausgabe:

    SPIDPROGRAMBACKGROUNDPGA_USED_MEM
    18100oracle@db01 (MMON)18388608

    Was sehe ich hier? Der Prozess MMON ist hier vorhanden. PGA_USED_MEM wird unverändert in Bytes angezeigt: 8.388.608 Bytes entsprechen 8 MiB. Das Vorhandensein allein beweist nicht, dass jede seiner Aufgaben fehlerfrei läuft.

    MMON sammelt und koordiniert Manageability-Daten; Lizenzierung ist zu beachten.
    MMNL – Manageability Monitor Lite Unterstützt MMON und schreibt bestimmte Manageability-Daten. Manageability Oracle-intern Mittel

    MMON/MMNL und AWR: Prozess vorhanden ist keine Lizenzfreigabe

    MMON und MMNL erfüllen Manageability-Aufgaben; MMON ist unter anderem an AWR-bezogenen Aufgaben beteiligt. Die Existenz dieser Prozesse bedeutet jedoch nicht, dass AWR/ASH/ADDM ohne die jeweils erforderliche Lizenz als normale Diagnosequelle verwendet werden darf.

    Dieses Wiki beschreibt deshalb die Prozesse, verwendet lizenzpflichtige Diagnostics-Pack-Funktionen aber nicht als Standarddiagnose für die SE2-Umgebung.

    1. Was ist MMNL?

    MMNL ergänzt MMON bei Manageability-Aufgaben. Oracle dokumentiert insbesondere, dass MMNL Daten aus dem ASH-Puffer in der SGA auf Datenträger schreibt, wenn dieser Puffer gefüllt wird. ASH gehört zum Diagnostics Pack; in diesem auf Standard Edition 2 ausgerichteten Wiki wird ASH deshalb nur begrifflich erklärt und nicht als Diagnosequelle abgefragt.

    2. Wann wird der Prozess aktiv?

    • Bei internen Flush-Vorgängen von Manageability-Daten.
    • Im Umfeld von ASH- und Metrikdaten.
    • Zur Entlastung von MMON.

    3. Typische Probleme und Hinweise

    • Fehlende historische Manageability-Daten.
    • SYSAUX- oder interner Flush-Rückstand.
    • Begleitfehler im Alertlog.
    Prozess:
    MMNL – Manageability Monitor Lite
    Einordnung:
    Oracle-interner Manageability-Prozess
    Wichtigkeit:
    Mittel
    SE2-Diagnose:
    V$PROCESS, V$BGPROCESS, V$DIAG_ALERT_EXT

    4. Typischer Ablauf

    Auslöser Bei internen Flush-Vorgängen von Manageability-Daten.
    →
    MMNL Unterstützt MMON und schreibt bestimmte Manageability-Daten.
    →
    Ergebnis MMNL unterstuetzt das Wegschreiben kurzfristiger Manageability-Daten.

    5. Diagnoseabfrage

    MMNL – read-only Diagnose
    SELECT
        p.spid,
        p.program,
        p.background,
        p.pga_used_mem
    FROM v$process p
    WHERE p.pname = 'MMNL'
    ORDER BY p.spid;

    Fiktive Beispielausgabe:

    SPIDPROGRAMBACKGROUNDPGA_USED_MEM
    18101oracle@db01 (MMNL)18388608

    Was sehe ich hier? Der Prozess MMNL ist hier vorhanden. PGA_USED_MEM wird unverändert in Bytes angezeigt: 8.388.608 Bytes entsprechen 8 MiB. Das Vorhandensein allein beweist nicht, dass jede seiner Aufgaben fehlerfrei läuft.

    MMNL unterstuetzt das Wegschreiben kurzfristiger Manageability-Daten.
    CJQ0 – Job Queue Coordinator Koordiniert Scheduler- und Job-Queue-Slave-Prozesse. Scheduler Scheduler Hoch

    CJQ0 wird automatisch nach Bedarf gestartet und gestoppt. Seine momentane Abwesenheit ist allein kein Fehler. JOB_QUEUE_PROCESSES begrenzt die Worker; der Wert 0 im CDB-Root verhindert Ausführungen auch in den PDBs, der Wert 0 in einer PDB verhindert sie dort. Prüfe Parameter und Job im richtigen Container.

    1. Was ist CJQ0?

    CJQ0 ist der zentrale Koordinator für Oracle Scheduler und DBMS_JOB. Er startet Job-Slaves, verteilt fällige Jobs und überwacht deren Ausführung.

    2. Wann wird der Prozess aktiv?

    • Wenn Scheduler-Jobs fällig werden.
    • Wenn Job-Slave-Prozesse benötigt werden.
    • Bei wiederkehrenden Wartungs- und Anwendungsjobs.

    3. Typische Probleme und Hinweise

    • Ein geplanter Termin wird überschritten oder ein Lauf dauert ungewöhnlich lange; SCHEDULED und RUNNING allein sind normale Zustände.
    • JOB_QUEUE_PROCESSES zu niedrig oder 0.
    • Wiederholte Jobfehler.
    • Lange oder überlappende Joblaeufe.
    Prozess:
    CJQ0 – Job Queue Coordinator
    Start:
    Scheduler
    Wichtigkeit:
    Hoch
    Verwandte Views:
    DBA_SCHEDULER_JOBS, DBA_SCHEDULER_JOB_RUN_DETAILS, V$BGPROCESS

    4. Typischer Ablauf

    Auslöser Wenn Scheduler-Jobs fällig werden.
    →
    CJQ0 Koordiniert Scheduler- und Job-Queue-Slave-Prozesse.
    →
    Ergebnis CJQ0 koordiniert, die Job-Slaves führen die eigentliche Arbeit aus.

    5. Diagnoseabfrage

    CJQ0 – read-only Diagnose
    SELECT
        owner,
        job_name,
        enabled,
        state,
        last_start_date,
        last_run_duration,
        next_run_date,
        failure_count
    FROM dba_scheduler_jobs
    ORDER BY owner, job_name;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileOWNERJOB_NAMEENABLEDSTATELAST_START_DATE
    1APPNACHTLAUFTRUESCHEDULED08.10.2026 02:00:00 +02:00
    ZeileLAST_RUN_DURATIONNEXT_RUN_DATEFAILURE_COUNT
    1+000 00:02:0009.10.2026 02:00:00 +02:000

    Was sehe ich hier? Ausschnitt: Der aktivierte Job ist für den nächsten Lauf eingeplant. LAST_RUN_DURATION ist ein Intervall, kein Zeitpunkt. SCHEDULED bedeutet nicht, dass der Job gerade läuft.

    Was sehe ich hier?

    Read-only: Worker-Grenze im aktuellen Container

    Read-only: Worker-Grenze im aktuellen Container
    SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS con_name,
           name, value
    FROM v$parameter
    WHERE name = 'job_queue_processes';

    Fiktive Beispielausgabe:

    CON_NAMENAMEVALUE
    APPDBjob_queue_processes20

    Was sehe ich hier? Das lokale Limit ist 20; für eine PDB ist zusätzlich die Root-Konfiguration zu berücksichtigen. Der Wert ist keine Zusage von 20 gleichzeitig laufenden Jobs.

    Was sehe ich hier?

    Read-only: letzte fünf Ausführungen des ausgewählten Jobs

    Read-only: letzte fünf Ausführungen des ausgewählten Jobs
    SELECT log_date, status, error#, actual_start_date, run_duration
    FROM dba_scheduler_job_run_details
    WHERE owner = 'APP' AND job_name = 'NACHTLAUF'
    ORDER BY log_date DESC
    FETCH FIRST 5 ROWS ONLY;

    Fiktive Beispielausgabe:

    LOG_DATESTATUSERROR#ACTUAL_START_DATERUN_DURATION
    08.10.2026 02:02:00 +02:00SUCCEEDED008.10.2026 02:00:00 +02:00+000 00:02:00

    Was sehe ich hier? Zeilenausschnitt: Der letzte dokumentierte Lauf war erfolgreich. Fehlende Historie allein beweist keine ausgebliebenen Läufe; Logging und Aufbewahrung prüfen. OWNER und JOB_NAME vor der Abfrage anpassen.

    CJQ0 koordiniert, die Job-Slaves führen die eigentliche Arbeit aus.
    RECO – Recoverer Process Löst in-doubt Distributed Transactions auf. Distributed Im Read-write-Betrieb vorhanden Mittel

    1. Was ist RECO?

    RECO bearbeitet verteilte Transaktionen, deren Abschluss wegen Netzwerk- oder Systemfehlern nicht eindeutig bestätigt werden konnte. Der Prozess versucht, die beteiligten Datenbanken erneut zu kontaktieren und den Zwei-Phasen-Commit abzuschließen.

    2. Wann wird der Prozess aktiv?

    • Bei In-Doubt Distributed Transactions.
    • Nach Netzwerkunterbrechungen während eines Two-Phase Commit.
    • Bei verteilten Anwendungen mit Database Links.

    3. Typische Probleme und Hinweise

    • ORA-01591.
    • Hängende verteilte Transaktionen.
    • Nicht erreichbare Remote-Datenbanken.
    • Fehlerhafte oder veraltete Database Links.
    Prozess:
    RECO – Recoverer Process
    Start:
    Im normalen Read-write-Betrieb vorhanden
    Wichtigkeit:
    Mittel
    Verwandte Views:
    DBA_2PC_PENDING, DBA_2PC_NEIGHBORS, DBA_DB_LINKS

    4. Typischer Ablauf

    Auslöser Bei In-Doubt Distributed Transactions.
    →
    RECO Löst in-doubt Distributed Transactions auf.
    →
    Ergebnis RECO bringt verteilte Transaktionen nach Kommunikationsfehlern zu einem eindeutigen Abschluss.

    5. Diagnoseabfrage

    RECO – read-only Diagnose
    SELECT
        local_tran_id,
        global_tran_id,
        state,
        mixed,
        host,
        commit#
    FROM dba_2pc_pending
    ORDER BY local_tran_id;

    Fiktive Beispielausgabe:

    Zusammengehörige Teilansichten derselben Ergebniszeilen.

    LOCAL_TRAN_IDGLOBAL_TRAN_IDSTATEMIXEDHOST
    8.12.450DBLINK_TX_01preparedNOapphost
    COMMIT#
    NULL

    So liest du das Ergebnis: Ein vorbereiteter verteilter Vorgang wartet noch auf Klärung. Die Zeile rechtfertigt Netzwerk-/Partnerprüfung; sie ist keine Aufforderung, COMMIT oder ROLLBACK zu erzwingen.

    RECO bringt verteilte Transaktionen nach Kommunikationsfehlern zu einem eindeutigen Abschluss.
    LREG – Listener Registration Process Registriert Instanz und Services dynamisch beim Listener. Netzwerk Beim Instanzstart Hoch

    1. Was ist LREG?

    LREG meldet Instanzinformationen, Services, Handler und Lastdaten an den Listener. Dadurch kann der Listener Verbindungen zu den richtigen Datenbankservices weiterleiten.

    2. Wann wird der Prozess aktiv?

    • Beim Instanzstart.
    • Wenn Services gestartet, gestoppt oder geändert werden.
    • Bei regelmäßiger dynamischer Listener-Registrierung.
    • Bei LOCAL_LISTENER- oder REMOTE_LISTENER-Konfiguration.

    3. Typische Probleme und Hinweise

    • ORA-12514.
    • Service fehlt in lsnrctl services.
    • Falscher LOCAL_LISTENER.
    • Namensauflösungs- oder Netzwerkprobleme.
    Prozess:
    LREG – Listener Registration Process
    Start:
    Beim Instanzstart
    Wichtigkeit:
    Hoch
    Verwandte Views:
    V$SERVICES, V$INSTANCE, V$PARAMETER, V$DIAG_ALERT_EXT

    4. Typischer Ablauf

    Auslöser Beim Instanzstart.
    →
    LREG Registriert Instanz und Services dynamisch beim Listener.
    →
    Ergebnis LREG sorgt dafür, dass der Listener die aktuellen Datenbankservices kennt.

    5. Diagnoseabfrage

    LREG – read-only Diagnose
    SELECT
        name,
        network_name,
        creation_date,
        goal,
        clb_goal
    FROM v$services
    ORDER BY name;
    
    SELECT
        name,
        value
    FROM v$parameter
    WHERE name IN ('local_listener','remote_listener','service_names')
    ORDER BY name;

    Fiktive Beispielausgabe:

    SELECT 1.

    NAMENETWORK_NAMECREATION_DATEGOALCLB_GOAL
    app_serviceapp_service01.10.2026 08:00:00NONELONG

    Einordnung zu SELECT 1: Ausschnitt der Servicekonfiguration. GOAL und CLB_GOAL beschreiben Ziele für die Lastverteilung, keine gemessene Antwortzeit.

    Fiktive Beispielausgabe:

    SELECT 2.

    NAMEVALUE
    local_listenerLISTENER_ORCL
    remote_listenerNULL
    service_namesORCL

    Einordnung zu SELECT 2: Parameterbeispiel einer Einzelinstanz. Diese Werte bestätigen für sich genommen keine erfolgreiche Registrierung beim Listener.

    LREG sorgt dafür, dass der Listener die aktuellen Datenbankservices kennt.

    LREG und Listener-Registrierung: klare Abgrenzung zu PMON

    LREG registriert Informationen über Instance und Dispatcher beim Listener. Ist der Listener beim Instance-Start nicht erreichbar, versucht LREG die Registrierung periodisch erneut.

    Vor Oracle 12c wurde diese Aufgabe PMON zugeschrieben. In Oracle 19c gehört die dynamische Registrierung zu LREG; die Oracle-Net-Diagnose selbst bleibt in Kapitel 4.

    V$PROCESS und V$BGPROCESS: zwei Sichten mit unterschiedlichem Zweck

    V$PROCESS verbindet Oracle-Prozesse mit PID/SPID/STID und Programminformationen. V$BGPROCESS beschreibt speziell Background Processes mit Name, Beschreibung, Typ und Fehlerstatus.

    READ ONLY – laufende Background Processes
    SELECT pid,
           spid,
           stid,
           pname,
           program
    FROM v$process
    WHERE pname IS NOT NULL
    ORDER BY pname, pid;

    Fiktive Beispielausgabe:

    PIDSPIDSTIDPNAMEPROGRAM
    1018010NULLLGWRoracle@db01 (LGWR)
    218002NULLPMONoracle@db01 (PMON)

    Was sehe ich hier? Ausschnitt, alphabetisch nach PNAME. PID ist die interne Prozesskennung, SPID die Betriebssystem-PID. STID hängt von Plattform und Prozessmodell ab.

    READ ONLY – V$BGPROCESS

    TYPE=SLAVE bezeichnet Worker; bei anderen Hintergrundprozessen ist TYPE=NULL erwartbar. Es ist kein Hinweis auf fehlende Prozessinformationen.

    SELECT name,
           description,
           type,
           error,
           con_id
    FROM v$bgprocess
    WHERE REGEXP_LIKE(RAWTOHEX(paddr), '[1-9A-F]')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEDESCRIPTIONTYPEERRORCON_ID
    LGWRRedo etc.NULL00
    PMONprocess cleanupNULL00

    Was sehe ich hier? Ausschnitt tatsächlich zugeordneter Hintergrundprozesse. CON_ID=0 steht hier für instanzweite Daten. Beschreibungen können je nach Version abweichen; ERROR=0 ist kein umfassender Funktionsnachweis.

    DBA-Praxis: Hintergrundprozesse read-only untersuchen

    Für einen ersten Check sollte zuerst festgestellt werden, welche Hintergrundprozesse Oracle selbst kennt. Danach kann die Datenbanksicht mit dem Betriebssystem und dem Alert Log korreliert werden.

    Ziel der folgenden Abfrage:
    V$BGPROCESS beschreibt Oracle-Hintergrundprozesse. PADDR kann mit V$PROCESS.ADDR verbunden werden, um die Oracle-Prozessinformationen und die Betriebssystem-PID zuzuordnen.
    READ ONLY – Hintergrundprozesse und OS-PID
    SELECT b.name,
           b.description,
           p.pid     AS oracle_pid,
           p.spid    AS os_pid,
           p.program
    FROM v$bgprocess b
    LEFT JOIN v$process p
      ON p.addr = b.paddr
    WHERE REGEXP_LIKE(RAWTOHEX(b.paddr), '[1-9A-F]')
    ORDER BY b.name;

    Fiktive Beispielausgabe:

    NAMEDESCRIPTIONORACLE_PIDOS_PIDPROGRAM
    LGWRRedo etc.1018010oracle@db01 (LGWR)
    PMONprocess cleanup218002oracle@db01 (PMON)

    Was sehe ich hier? Der Join verbindet den Hintergrundprozessnamen mit interner und Betriebssystem-Prozesskennung. Durch den LEFT JOIN können Prozessdetails fehlen, obwohl die linke Seite eine Zuordnung enthält.

    Ziel der folgenden Abfrage:
    Diese Abfrage zeigt die von Oracle erkannten Hintergrundprozesse kompakt. Je nach Konfiguration und aktivierten Funktionen kann die Liste deutlich mehr Prozesse enthalten als nur DBWn, LGWR, CKPT, SMON, PMON und ARCn.
    READ ONLY – Oracle Background Processes
    SELECT name,
           description
    FROM v$bgprocess
    WHERE REGEXP_LIKE(RAWTOHEX(paddr), '[1-9A-F]')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEDESCRIPTION
    LGWRRedo etc.
    PMONprocess cleanup

    Was sehe ich hier? Ausschnitt der registrierten Hintergrundprozesse mit gesetzter Prozessadresse. Die kurze Beschreibung ersetzt keine Zustands- oder Fehleranalyse.

    Ergänzende Betriebssystemprüfung:
    Auf Solaris und Oracle Linux ergänzt die Prozessliste die Datenbanksicht. Die OS-Ausgabe allein ersetzt jedoch nicht die Zuordnung über Oracle-Views.
    OS-DIAGNOSE – Oracle-Prozesse auf Solaris und Oracle Linux
    ps -eo pid,args | grep '[o]ra_'
    Wichtig:

    Das Fehlen eines erwarteten Prozesses im Betriebssystem sollte nicht isoliert bewertet werden. Zuerst Oracle-Sicht, Instance-Status und Alert Log prüfen. Einige Funktionen verwenden mehrere oder dynamisch erzeugte Prozesse; Prozessnamen können zudem Nummern beziehungsweise Suffixe enthalten.
    DBA-Diagnosekette bei Prozessauffälligkeiten:

    1. Instance-Status und betroffene Funktion bestimmen.
    2. Erwarteten Hintergrundprozess und seine Aufgabe fachlich zuordnen.
    3. V$BGPROCESS und V$PROCESS read-only prüfen.
    4. Oracle-Prozess bei Bedarf über SPID mit dem Betriebssystem korrelieren.
    5. Alert Log und relevante Trace-Dateien auf zeitgleiche Meldungen prüfen.
    6. Passende Wait Events beziehungsweise I/O-Kette der betroffenen Funktion untersuchen.
    7. Erst danach entscheiden, ob tatsächlich ein Prozessproblem oder ein nachgelagertes Storage-, Redo-, Memory- oder Workloadproblem vorliegt.

    Prozessketten statt Einzelprozesse denken

    Viele Abläufe gehören zu mehreren Prozessen: Beim Checkpoint koordiniert CKPT, während DBWn Dirty Buffers schreibt; beim Redo schreibt LGWR und beim anschließenden Archiving kommt ARCn hinzu. Cleanup betrifft die PMON-Gruppe mit CLMN/CLnn, Listener-Registrierung dagegen LREG.

    Die bessere DBA-Frage lautet deshalb: Welche Prozesskette gehört zu diesem Symptom?

    FunktionProzessbezugKontext
    Commit/RedoLGWRRedo Buffer, Online Redo, I/O
    Dirty BuffersDBWnBuffer Cache, Datafiles
    CheckpointCKPT + DBWnCheckpoint-Position, Datafile-/Controlfile-Header
    ArchivingARCnArchive Destination, ARCHIVELOG
    CleanupPMON-Gruppe, CLMN/CLnnabnormal beendete Prozesse/Sessions
    Listener-RegistrierungLREGListener und Services

    Die ps-Liste ist nur eine grobe Hostübersicht und kann mehrere Instanzen enthalten. Für eine konkrete Zuordnung zunächst PNAME, SPID und STID aus V$PROCESS der Zielinstanz festhalten und die passende Betriebssystemkennung vergleichen. Bei Thread-Konfigurationen ist die Namensliste nicht vollständig. Auf Solaris ist STID allein nicht eindeutig; SPID plus STID beziehungsweise SOSID verwenden. Ein belegter Prozessstart beweist noch keine erfolgreich erledigte Aufgabe.

    5. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Concepts – Process Architecture
    Mandatory/Optional/Slave Processes, PMON-Gruppe, PMAN, LREG, SMON, DBWn, LGWR, CKPT, MMON/MMNL und RECO
    https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/process-architecture.html

    Oracle Database 19c Reference – V$BGPROCESS
    Name, Beschreibung, Typ und Prozessstatus
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-BGPROCESS.html
    Vertiefende Oracle-19c-Quellen: Prozessarchitektur · Hintergrundprozesse
    Oracle-19c-Referenzen zu den Präzisierungen: Prozesstypen · Job-Worker und Container · Job-Laufhistorie · SE2-Funktionsumfang

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Hintergrundprozesse verteilen interne Aufgaben auf spezialisierte Komponenten. Welche Prozesse vorhanden sind, hängt auch von Konfiguration und verwendeten Funktionen ab.
    2. LGWR schreibt Redo, DBWn schreibt geänderte Datenblöcke. CKPT unterstützt Checkpoints, übernimmt aber nicht selbst das Schreiben dieser Datenblöcke.
    3. ARCn archiviert gefüllte Redo Logs im entsprechenden Betriebsmodus. LREG registriert Services und Instanzinformationen beim Listener.
    4. Prozesse wie SMON, PMON und die zugehörigen Bereinigungsprozesse unterstützen Wiederherstellung beziehungsweise Aufräumarbeiten. Ihre Aufgaben sind von denen normaler Client- und Serverprozesse zu unterscheiden.
    5. Ein auffälliger Prozessname ist ein Einstieg in die Diagnose, noch keine Ursache. Prozesszustand, Waits, Logs und die betroffene interne Aufgabe müssen zusammenpassen.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Die Antworten sind bewusst eingeklappt.
    Frage 1: Warum sollte ein DBA Background Processes nach Aufgabe gruppieren?
    Weil sich Fehler besser den Bereichen Redo, Datenblock-I/O, Recovery, Archivierung oder Management zuordnen lassen.
    Frage 2: Warum ist LGWR für COMMIT besonders wichtig?
    Bei einem COMMIT muss das für die Transaktion erforderliche Redo bis einschließlich des Commit Records in das Online Redo Log geschrieben werden. Die Foreground-Session wartet bei synchronem Commit normalerweise auf dieses erforderliche Schreiben durch LGWR; die geänderten Datenblöcke selbst müssen zu diesem Zeitpunkt noch nicht in den Datafiles stehen.
    Frage 3: Warum schreibt CKPT normalerweise nicht selbst die Datenblöcke?
    Das eigentliche Schreiben von Dirty Buffers aus dem Database Buffer Cache in die Datafiles ist Aufgabe der DBWn-Prozesse. CKPT signalisiert Checkpoints und aktualisiert Checkpoint-Informationen unter anderem in Controlfile und Datafile-Headern.
    Frage 4: Gehört MMAN zur Beschreibung von MMON?
    Es sind verschiedene Prozesse. MMAN koordiniert Speicheranpassungen; MMON gehört zur Überwachungs- und Verwaltungsinfrastruktur. Ähnliche Namen bedeuten keine gleiche Aufgabe.
    Frage 5: Zeigt eine vorhandene PMON-Zeile, dass gerade Ressourcen bereinigt werden?
    Nein. Die Prozessliste belegt seine Existenz im Messmoment. Für konkrete Bereinigungsvorgänge sind weitere Beobachtungen nötig; in Oracle 19c gehören CLMN und gegebenenfalls CLnn zum Cleanup.
    Frage 6: Beweist ein vorhandener RECO eine aktuell ungeklärte Transaktion?
    Nein. RECO gehört zum normalen Read-write-Betrieb; aktuelle In-doubt-Transaktionen werden getrennt geprüft.
    Frage 7: Beweisen SCHEDULED oder ein momentan fehlender CJQ0 einen Scheduler-Fehler?
    Nein. Termin, Laufhistorie, Worker-Grenzen und Containerkontext müssen den Verdacht stützen.
    Frage 8: Zeigt eine instanzweite log-file-Abfrage nur LGWR-Wartezeiten?
    Nein. log file sync betrifft beispielsweise Vordergrundsessions. Die Ereignisse beschreiben verschiedene Teile des Redo-Pfads.

    22. SGA und PGA – Oracles Speicherarchitektur im Detail

    Gemeinsamer Instanzspeicher, privater Prozessspeicher, dynamische Verwaltung, Diagnose und typische Engpässe.

    Lernkompass
    Einfach gesagt Du lernst, wie SGA und PGA aufgebaut sind, welche Speicherbereiche Oracle automatisch verwaltet und wie Workload, TEMP und Host-RAM zusammenhängen.
    Warum ist das wichtig? Ein großer Speicherwert ist weder automatisch gut noch schlecht. Entscheidend ist, ob Buffer Cache, Shared Pool und PGA zur tatsächlichen Workload passen und dem Betriebssystem genügend Speicher bleibt.
    Nach diesem Kapitel Du kannst SGA-/PGA-Werte read-only analysieren, Workarea-Druck erkennen und Oracle-Advisor-Schätzungen als Entscheidungshilfe einordnen, ohne daraus automatisch eine Speicheränderung abzuleiten.

    Einführung: Oracle braucht Arbeitsspeicher sowohl für Informationen, die mehrere Prozesse gemeinsam nutzen, als auch für die private Arbeit einzelner Prozesse. Die SGA ist der gemeinsame Speicherbereich einer Instanz. Eine PGA gehört jeweils einem Oracle-Prozess und enthält private Arbeitsdaten, zum Beispiel für Sortier- und Hash-Operationen. So kann Oracle gemeinsame Daten und SQL-Informationen bereitstellen und zugleich prozessbezogene Arbeit erledigen.

    SGA und PGA beeinflussen gemeinsam den Speicherbedarf der Datenbank auf dem Host. Ein eingestellter Zielwert sagt dabei noch nicht allein, wie viel Speicher aktuell genutzt wird oder ob ein Engpass vorliegt. Das Kapitel führt von den Speicherbereichen über die Verwaltungsmodelle AMM und ASMM zur read-only Diagnose. Danach zeigt es, wie verschiedene Oracle Memory Advisor Schätzungen modellieren und wie ein Memory Report daraus nachvollziehbare Prüfvorschläge ableiten kann. Ein Advisor ändert die Speicherparameter nicht selbst und seine Schätzung ist keine Garantie für eine spätere Verbesserung.

    Oracle 19c: fachliche Grundlage

    Für die Speicheranalyse ist eine zweite Unterscheidung ebenso wichtig: konfigurierter Speicher, aktuell allokierter Speicher und tatsächlicher Bedarf sind nicht dasselbe. Ein Parameter wie SGA_TARGET oder PGA_AGGREGATE_TARGET beschreibt einen Verwaltungsrahmen beziehungsweise Zielwert. Views wie V$SGAINFO, V$SGASTAT, V$PGASTAT und V$PROCESS zeigen dagegen, was Oracle aktuell beziehungsweise seit Instance-Start beobachtet hat.

    Oracle 19c unterscheidet außerdem zwischen manueller Speicherverwaltung, ASMM und AMM. Welche Advisor-View sinnvoll ist und wie einzelne Parameter interpretiert werden, hängt davon ab, welches Modell tatsächlich aktiv ist. Deshalb beginnt eine saubere Memory-Diagnose immer mit der Frage: Wie wird diese Instance gerade verwaltet?

    Dieses Kapitel folgt konsequent einer read-only Diagnose: Konfiguration feststellen → Nutzung messen → Druck nachweisen → Verursacher eingrenzen → Advisor als Modell lesen → Host-RAM gegenprüfen. Erst außerhalb dieses Wikis kann daraus eine kontrollierte Change-Entscheidung entstehen.

    Die zentrale Denkregel lautet: SGA und PGA konkurrieren gemeinsam mit Betriebssystem und weiteren Prozessen um den physischen Host-RAM. Eine Speichererhöhung an einer Stelle kann deshalb an anderer Stelle Druck erzeugen.

    Die Diagnose sollte nie mit „Wie viel kann ich erhöhen?“ beginnen, sondern mit vier Fragen: Was ist konfiguriert? Was wird tatsächlich genutzt? Wo entsteht messbarer Druck? Welche Verbesserung prognostiziert Oracle für die beobachtete Workload?

    Merksatz: Die SGA ist gemeinsamer Speicher der Instanz. Die PGA ist privater Speicher eines Oracle-Prozesses. Performance entsteht nicht durch einen einzelnen großen Wert, sondern durch eine sinnvolle Balance zwischen SGA, PGA, Anzahl gleichzeitiger Prozesse und verfügbarem Host-RAM.

    1. Das Grundmodell: Instanz, Prozesse und Speicher

    Beim Start einer Oracle-Instanz werden Speicherstrukturen angelegt und Hintergrundprozesse gestartet. Die SGA steht danach allen relevanten Oracle-Prozessen zur gemeinsamen Nutzung zur Verfügung. Meldet sich ein Client an, arbeitet ein Serverprozess für diese Session. Dieser Serverprozess besitzt eigenen privaten Speicher in Form einer PGA.

    Bei einem Dedicated-Server-Modell ist die Zuordnung besonders anschaulich: Eine Benutzersession arbeitet mit einem eigenen Serverprozess, dieser besitzt eine eigene PGA, greift aber gemeinsam mit anderen Prozessen auf dieselbe SGA zu.

    Wichtige Nuance: Im Dedicated-Server-Modell liegt die UGA typischerweise in der PGA. Bei Shared Server liegt die UGA dagegen in der SGA. Deshalb darf „Session Memory = immer PGA“ nicht als allgemeine Regel verwendet werden.
    Client → Serverprozess → eigene PGA ↔ gemeinsame SGA ↔ Datafiles / Redo / Controlfiles

    SGA – gemeinsamer Instanzspeicher

    Shared Pool
    Enthält unter anderem Library Cache und Data Dictionary Cache. Hier liegen gemeinsam genutzte Cursor-, PL/SQL- und Metadatenstrukturen.
    Buffer Cache
    Hält Kopien von Datenblöcken. Ein Cache-Treffer vermeidet einen erneuten physischen Read für diesen Block; eine hohe Hit Ratio allein beweist jedoch keine gute SQL-Performance.
    Redo Log Buffer
    Sammelt Redo Records, bevor LGWR sie in die Online Redo Logs schreibt.
    Large Pool
    Speicher unter anderem für RMAN, Shared Server und bestimmte große Speicheranforderungen.
    Java Pool
    Speicher für Oracle JVM und Java-Ausführung innerhalb der Datenbank.
    Streams Pool
    Speicher für bestimmte Queueing-, Capture-, Streams- und verwandte Funktionen.

    PGA – privater Prozessspeicher

    Sort Area
    Speicher für ORDER BY, GROUP BY, DISTINCT, Window-Funktionen und weitere Sortieroperationen.
    Hash Area
    Arbeitsbereich für Hash Joins und Hash Aggregationen.
    Private SQL Area
    Private Cursorinformationen, Bind-Werte und Laufzeitzustand eines Cursors.
    Session Memory
    Sitzungs- und prozessbezogene Informationen.
    PL/SQL Area
    Private Laufzeitinformationen für PL/SQL-Aufrufe und lokale Datenstrukturen.
    Workareas
    Dynamisch verwendeter Speicher für Sort-, Hash-, Bitmap- und andere speicherintensive Operatoren.

    2. SGA im Detail

    Die SGA ist kein einzelner großer Cache, sondern besteht aus mehreren Speicherbereichen mit unterschiedlichen Aufgaben. Oracle kann Teile davon je nach Konfiguration dynamisch vergrößern oder verkleinern. Deshalb sollte ein DBA nicht nur SGA_TARGET betrachten, sondern auch die tatsächliche Verteilung innerhalb der SGA.

    Eine wichtige Unterscheidung ist die zwischen allokiertem Speicher und tatsächlicher Arbeit. Ein großer Buffer Cache ist zunächst nur eine Speicherzuteilung. Ob er sinnvoll dimensioniert ist, zeigt sich erst zusammen mit I/O, SQL, Cache-Verhalten, Working Set und Antwortzeiten.

    Shared Pool Der Shared Pool enthält vor allem gemeinsam genutzte Informationen zur SQL- und PL/SQL-Ausführung. Im Library Cache liegen unter anderem geparste SQL-Cursor und PL/SQL-Objekte. Der Data Dictionary Cache hält häufig benötigte Metadaten. Ist der Shared Pool ungünstig dimensioniert oder besteht sehr hohe Parse-Last, können Reloads, viele Child Cursor oder ORA-04031 auftreten.
    Database Buffer Cache Datenblöcke werden nach dem Lesen vom Storage im Buffer Cache gehalten. Ein späterer Zugriff kann dadurch als Logical Read aus dem Speicher erfolgen. Geänderte Blöcke werden zu Dirty Buffers und später von DBWn in die Datafiles geschrieben. Ein Cache Hit Ratio allein ist kein ausreichendes Tuning-Kriterium.
    Redo Log Buffer Jede relevante Änderung erzeugt Redo. Dieses wird zunächst im Redo Log Buffer gesammelt. LGWR schreibt es in die Online Redo Logs. Beim COMMIT wartet die Benutzersession auf das notwendige Schreiben von Redo. Deshalb besteht ein direkter Zusammenhang zwischen Redo Log Buffer, LGWR, log file sync und Redo-I/O.
    Large Pool Der Large Pool ist für bestimmte größere Speicheranforderungen gedacht und entlastet den Shared Pool. Typische Nutzer sind RMAN und Shared Server. Ist kein ausreichender Large Pool vorhanden, können bestimmte Funktionen auf andere Speicherbereiche ausweichen.
    Java Pool und Streams Pool Diese Bereiche sind workloadabhängig. Der Java Pool ist nur relevant, wenn Java innerhalb der Datenbank genutzt wird. Der Streams Pool wird von bestimmten Queueing-, Capture- und vergleichbaren Funktionen verwendet. Nicht jede Datenbank benötigt diese Bereiche in gleicher Größe.
    Fixed SGA Ein kleiner, intern von Oracle verwendeter Teil der SGA enthält Steuerungsinformationen und Zeiger auf weitere Strukturen. Dieser Bereich wird weitgehend intern bestimmt und ist normalerweise kein direkter Tuning-Hebel für den DBA.

    3. PGA im Detail

    Die PGA wird nicht von allen Sessions gemeinsam genutzt. Jeder Oracle-Prozess kann eigenen PGA-Speicher besitzen. Das bedeutet: Selbst wenn die PGA eines einzelnen Prozesses klein erscheint, kann der instanzweite Gesamtverbrauch bei vielen gleichzeitig aktiven Prozessen sehr groß werden.

    Besonders wichtig sind sogenannte Workareas. Sortierungen, Hash Joins, Bitmap-Verarbeitung und bestimmte Aggregationen benötigen Arbeitsspeicher. Oracle versucht, solche Operationen möglichst im Speicher auszuführen. Reicht der Speicher nicht aus, werden Teile der Verarbeitung auf TEMP ausgelagert.

    Bei einer Sortier- oder Hash-Operation bezeichnet optimal eine Ausführung mit ausreichend Workarea-Speicher, sodass keine zusätzlichen Auslagerungsdurchläufe über TEMP erforderlich sind. Onepass benötigt einen zusätzlichen Durchlauf über einen Teil der Daten, multipass mehrere. Diese Begriffe beschreiben die Workarea-Verarbeitung, nicht die Güte des gesamten SQL-Plans. Auch bei optimaler Workarea-Verarbeitung können physische Lesezugriffe auf die Eingabedaten erforderlich sein. Viele Onepass- oder Multipass-Ausführungen sind deshalb im Zusammenhang mit Datenmenge, Workarea-Zuteilung und Zeitfenster zu bewerten.

    UGA beachten: Die User Global Area gehört logisch zur Session. Bei Dedicated Server befindet sie sich typischerweise im privaten Prozessspeicher. Bei Shared Server kann sie dagegen in gemeinsam genutzten SGA-Bereichen liegen. Deshalb darf UGA nicht pauschal immer mit PGA gleichgesetzt werden.

    4. Wo Speicher im SQL-Ablauf eine Rolle spielt

    SQL verwendet gemeinsame SGA-Strukturen und privaten PGA-Speicher. Für dieses Kapitel reicht diese Speicherperspektive.

    Abläufe nicht doppelt: Parsing/Execute/Fetch stehen in Ablauf einer SQL-Anweisung. COMMIT und Redo stehen in Redo Logs. Hier geht es ausschließlich um Speicherbereiche, Workareas und deren Diagnose.

    5. SGA-Komponenten

    Komponente Aufgabe Typische Auffälligkeit
    Shared Pool SQL-Cursor, PL/SQL, Library Cache und Dictionary Cache. ORA-04031, viele Reloads, Hard Parses oder Child Cursor.
    Buffer Cache Zwischenspeicher für Datenblöcke. Hohe physische Reads, free buffer waits oder Hot Blocks.
    Redo Log Buffer Zwischenspeicher für Redo vor LGWR. Redo Allocation-/Copy-Waits und starke Commit-Last.
    Large Pool RMAN, Shared Server und spezielle Speicheranforderungen. RMAN oder Shared Server greifen bei Engpässen auf andere Speicherbereiche aus.
    Java Pool Oracle-Java-Ausführung. Vor allem relevant, wenn Java in der Datenbank genutzt wird.
    Streams Pool Speicher für bestimmte Queueing-/Capture-Funktionen. Workloadabhängig; nicht in jeder Umgebung gleich relevant.

    6. PGA und Workareas

    Limit ist nicht Zielwert: Bei Überschreitung von PGA_AGGREGATE_LIMIT beendet Oracle zunächst Aufrufe großer Verbraucher nicht automatisch regelbaren Speichers und nötigenfalls Sessions. SYS-Prozesse und Hintergrundprozesse außer Job-Queue-Prozessen sind davon ausgenommen. Der Parameter ist deshalb keine einfache Betriebssystem-RAM-Garantie; der Wert 0 deaktiviert dieses Limit.

    PGA_AGGREGATE_TARGET ist ein Zielwert für die automatische Workarea-Steuerung. Oracle verteilt den verfügbaren Workarea-Speicher dynamisch auf die aktuelle Last. Das ist kein harter Maximalwert.

    PGA_AGGREGATE_LIMIT begrenzt den aggregierten PGA-Verbrauch. Bei einer Überschreitung beendet Oracle zunächst Aufrufe und gegebenenfalls anschließend Sessions mit besonders viel nicht automatisch reduzierbarem PGA-Speicher. Für bestimmte Prozesse, unter anderem SYS und die meisten Hintergrundprozesse, gelten Ausnahmen. Der Parameter ist deshalb keine Zusage, dass die Speicherbelegung niemals kurzzeitig darüber liegt. In einer CDB kann zusätzlich ein PDB-bezogenes Limit gelten; prüfe den Containerkontext. ORA-04036 ist daher anders zu bewerten als das normale Auslagern einer Sortierung nach TEMP.

    7. Automatische Speicherverwaltung: ASMM und AMM

    Oracle Linux: AMM mit MEMORY_TARGET/MEMORY_MAX_TARGET ist nicht mit klassisch reservierten HugePages für die SGA kombinierbar. Die Wahl der Speicherverwaltung hängt deshalb auch von der Plattform ab. Die Linux-HugePages-Regeln dürfen nicht unverändert auf Solaris übertragen werden.

    Bei ASMM beschreibt SGA_TARGET den SGA-Gesamtrahmen. Daraus werden auch nicht automatisch verteilte Anteile wie Log Buffer, Fixed SGA und gesonderte Buffer Caches bedient; den verbleibenden Platz verteilt Oracle auf die automatisch verwalteten Komponenten. Die PGA wird separat über PGA_AGGREGATE_TARGET gesteuert. Das ist konzeptionell eine Trennung zwischen gemeinsamem Instance-Speicher und PGA-Zielwert.

    Bei AMM ist MEMORY_TARGET der gemeinsame Zielwert, innerhalb dessen Oracle Speicher zwischen SGA und Instance-PGA umverteilen kann. MEMORY_MAX_TARGET definiert den maximal einstellbaren Rahmen für MEMORY_TARGET.

    Auch bei automatischer Verwaltung bleibt die DBA-Aufgabe bestehen: Host-RAM, Oracle-Gesamtverbrauch, Workload und Resize-Verhalten müssen beobachtet werden. Automatische Verwaltung bedeutet nicht, dass jede Speichergröße unter jeder Last automatisch optimal ist.

    Merksatz:

    ASMM: SGA_TARGET verwaltet SGA-Komponenten, PGA separat.
    AMM: MEMORY_TARGET bildet einen gemeinsamen Zielrahmen für SGA und PGA.
    PGA_AGGREGATE_TARGET ist ein Zielwert und nicht dasselbe wie PGA_AGGREGATE_LIMIT.
    ParameterBedeutungDBA-Hinweis
    SGA_TARGETGesamter SGA-Zielrahmen bei ASMM; feste und separat konfigurierte Anteile beanspruchen ebenfalls Platz daraus.Zentraler ASMM-Parameter.
    SGA_MAX_SIZEMaximaler SGA-Rahmen für die Instance.Kann für eine Vergrößerung Neustartrelevanz besitzen.
    PGA_AGGREGATE_TARGETZielwert für automatische PGA-/Workarea-Steuerung.Kein harter Maximalwert.
    PGA_AGGREGATE_LIMITBegrenzt den aggregierten PGA-Verbrauch.Relevant bei ORA-04036.
    MEMORY_TARGETGemeinsamer Zielwert für AMM.Oracle kann Speicher zwischen SGA und Instance-PGA umverteilen.
    MEMORY_MAX_TARGETMaximaler Rahmen für MEMORY_TARGET.Nicht dynamisch änderbar.
    Bei AMM wirken ausdrücklich gesetzte SGA_TARGET und PGA_AGGREGATE_TARGET als Mindestwerte für die automatische Aufteilung. Beispiel: MEMORY_TARGET=12G und SGA_TARGET=8G erlauben keine beliebige SGA-Verkleinerung unter 8G zugunsten der PGA. Bei ASMM wirken explizite Größen automatisch verwalteter Komponenten, etwa SHARED_POOL_SIZE, als Untergrenzen. Diese Vorgaben begrenzen die Flexibilität der Umverteilung.

    8. Welches Memory-Management ist aktiv?

    Bevor SGA- oder PGA-Werte bewertet werden, muss klar sein, welches Verwaltungsmodell aktiv ist. Bei AMM ist MEMORY_TARGET größer als 0. Bei ASMM ist typischerweise SGA_TARGET aktiv, während MEMORY_TARGET 0 ist; die PGA wird dann separat über PGA_AGGREGATE_TARGET gesteuert. Sind die automatischen Zielwerte nicht aktiv, können SGA-Komponenten stärker manuell vorgegeben sein.

    Diese Unterscheidung ist praktisch wichtig. Ein SGA Advisor beantwortet eine andere Frage als ein Memory Target Advisor. Ebenso ist ein einzelner Komponentenparameter bei ASMM nicht automatisch die tatsächlich dauerhaft belegte Größe dieser Komponente.

    READ ONLY – aktives Memory-Management erkennen
    SELECT
        name,
        display_value,
        issys_modifiable
    FROM v$parameter
    WHERE name IN (
            'memory_target',
            'memory_max_target',
            'sga_target',
            'sga_max_size',
            'pga_aggregate_target',
            'pga_aggregate_limit',
            'workarea_size_policy'
          )
    ORDER BY name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    NAMEDISPLAY_VALUEISSYS_MODIFIABLE
    memory_max_target0FALSE
    memory_target0IMMEDIATE
    pga_aggregate_limit4GIMMEDIATE
    pga_aggregate_target2GIMMEDIATE
    sga_max_size2GFALSE
    sga_target2GIMMEDIATE
    workarea_size_policyAUTOIMMEDIATE

    So liest du das Ergebnis: MEMORY_TARGET=0 und SGA_TARGET=2G zeigen hier ASMM mit separat gesteuertem PGA-Ziel. Die Konfiguration ist eine Lernumgebung, keine Größenempfehlung.

    Was sehe ich hier?

    Die Abfrage zeigt den Verwaltungsrahmen der Instance. WORKAREA_SIZE_POLICY=AUTO ist für die automatische Workarea-Steuerung relevant. Die Parameterwerte sind Konfiguration; sie sind nicht mit der aktuell von jedem Prozess belegten PGA oder der Detailbelegung einzelner SGA-Pools gleichzusetzen.

    Die folgenden ASMM-Lernwerte beziehen sich auf SGA_TARGET=SGA_MAX_SIZE=2G und PGA_AGGREGATE_TARGET=2G. Ausgaben sind Momentaufnahmen beziehungsweise gekennzeichnete Ausschnitte. Das AMM-Advisor-Beispiel in Abschnitt 18 ist eine separate Umgebung.

    9. SGA_TARGET, SGA_MAX_SIZE und dynamische Komponenten auseinanderhalten

    Aufbauend auf dem Verwaltungsmodell aus Abschnitt 7 geht es jetzt um die tatsächlichen Komponentengrößen und ihre Veränderungen. SGA_MAX_SIZE begrenzt die SGA-Größe der laufenden Instanz; der Wert zeigt nicht den aktuellen Verbrauch. Vergleiche deshalb die Konfiguration mit den beobachteten Größen und Resize-Vorgängen.

    Darum sollte ein DBA bei der Frage „Wie groß ist meine SGA?“ nicht nur einen Parameter lesen. V$SGAINFO zeigt die SGA-Strukturen, während V$SGA_DYNAMIC_COMPONENTS sichtbar macht, wie dynamisch verwaltete Komponenten aktuell dimensioniert sind und ob Resize-Vorgänge stattgefunden haben.

    Dynamische SGA-Komponenten
    SELECT
        component,
        ROUND(current_size / 1024 / 1024, 2) AS current_mb,
        ROUND(min_size     / 1024 / 1024, 2) AS min_mb,
        ROUND(max_size     / 1024 / 1024, 2) AS max_mb,
        user_specified_size,
        oper_count,
        last_oper_type,
        last_oper_mode,
        last_oper_time
    FROM v$sga_dynamic_components
    WHERE current_size > 0
       OR max_size > 0
    ORDER BY current_size DESC;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileCOMPONENTCURRENT_MBMIN_MBMAX_MBUSER_SPECIFIED_SIZE
    1DEFAULT buffer cache102476812800
    2shared pool5125127680
    ZeileOPER_COUNTLAST_OPER_TYPELAST_OPER_MODELAST_OPER_TIME
    14GROWIMMEDIATE08.10.2026 10:00:00
    22SHRINKDEFERRED08.10.2026 10:00:00

    Was sehe ich hier? Ausschnitt dynamischer SGA-Komponenten. CURRENT, MIN und MAX sind durch 1024² umgerechnet; USER_SPECIFIED_SIZE bleibt dagegen in Bytes. Ein Wert 0 dort bedeutet hier keine explizite Mindestgröße, nicht einen leeren Pool. MIN_SIZE und MAX_SIZE beziehen sich auf die seit Instanzstart beobachteten Grenzen. OPER_COUNT und LAST_OPER-Spalten beschreiben die Umverteilung.

    10. Granules – warum SGA-Resizes nicht bytegenau erfolgen

    Oracle verwaltet viele dynamische SGA-Komponenten in sogenannten Granules. Ein Granule ist eine zusammenhängende Speichereinheit. Dynamische Vergrößerungen oder Verkleinerungen erfolgen deshalb nicht beliebig bytegenau, sondern in solchen Einheiten.

    Das erklärt, warum ein angeforderter oder berechneter Zielwert nicht zwingend exakt als Komponentengröße erscheint. Für die Praxis ist das vor allem beim Lesen von Resize-Historien und Komponentenwerten wichtig.

    SGA Granule Size
    SELECT
        name,
        ROUND(bytes / 1024 / 1024, 2) AS mb
    FROM v$sgainfo
    WHERE name = 'Granule Size';

    Fiktive Beispielausgabe:

    NAMEMB
    Granule Size16

    Was sehe ich hier? Die SGA wird hier in Granulen von 16 MiB verwaltet. Daraus folgt nicht, dass jede Speicherkomponente beliebig auf jedes Megabyte genau eingestellt werden kann.

    11. Read-only Diagnose: SGA

    SGA-Komponenten
    SELECT
        name,
        ROUND(bytes / 1024 / 1024, 2) AS mb,
        resizeable
    FROM v$sgainfo
    WHERE bytes > 0
    ORDER BY bytes DESC;

    Fiktive Beispielausgabe:

    NAMEMBRESIZEABLE
    Maximum SGA Size2048No
    Buffer Cache Size1024Yes
    Granule Size16No

    Was sehe ich hier? Ausschnitt, absteigend nach Bytes. Die Zeilen enthalten sowohl Teilgrößen als auch übergeordnete Angaben; deshalb nicht alle Werte addieren. RESIZEABLE beschreibt die jeweilige Größenangabe.

    V$SGAINFO liefert einen guten Überblick über die großen SGA-Bereiche. Für eine detailliertere Aufteilung innerhalb einzelner Pools ist V$SGASTAT geeigneter.

    Shared-Pool-/SGA-Details
    SELECT
        pool,
        name,
        ROUND(bytes / 1024 / 1024, 2) AS mb
    FROM v$sgastat
    ORDER BY bytes DESC;

    Fiktive Beispielausgabe:

    POOLNAMEMB
    NULLbuffer_cache1024
    shared poolfree memory128

    Was sehe ich hier? Ausschnitt der Speicherzuordnung. NULL bei POOL ist bei manchen SGA-Bereichen normal. Freier Speicher im Shared Pool ist nicht gleich freier Arbeitsspeicher des Betriebssystems. Große Werte allein belegen weder Speicherknappheit noch Fragmentierung.

    12. Read-only Diagnose: PGA

    PGA-Kennzahlen
    SELECT
        name,
        CASE
            WHEN LOWER(unit) = 'bytes'
            THEN ROUND(value / 1024 / 1024, 2)
            ELSE value
        END AS value,
        CASE WHEN LOWER(unit) = 'bytes' THEN 'MB' ELSE unit END AS unit
    FROM v$pgastat
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUEUNIT
    cache hit percentage99percent
    maximum PGA allocated768MB
    over allocation count0NULL
    total PGA allocated512MB
    total PGA inuse400MB
    total freeable PGA memory64MB

    Was sehe ich hier? Die Byte-Werte wurden durch 1024² umgerechnet und im SQL als MB beschriftet; Prozente und Zähler bleiben unverändert. MAXIMUM ist ein bisheriger Höchststand. OVER ALLOCATION COUNT=0 schließt nicht jedes Speicherproblem aus. Gezeigt sind ausgewählte Zeilen in der Sortierreihenfolge. V$PGASTAT beschreibt instanzweite Werte. Für die Zuordnung zu einzelnen Prozessen oder Sessions sind zusätzliche Abfragen nötig.

    Oracle-19c-Referenz: V$PGASTAT.

    Besonders interessant sind unter anderem total PGA allocated, maximum PGA allocated, total PGA inuse, cache hit percentage und over allocation count. Diese Kennzahlen sind instanzweite Beobachtungswerte. maximum PGA allocated beschreibt einen Peak seit Instanzstart; die cache hit percentage ist eine kumulative Oracle- Kennzahl für Workarea-Verhalten und darf nicht wie eine klassische Buffer-Cache-Hit-Ratio interpretiert werden.

    Top-Prozesse nach PGA-Allokation
    SELECT
        pid,
        spid,
        stid,
        sosid,
        pname,
        ROUND(pga_used_mem  / 1024 / 1024, 2) AS used_mb,
        ROUND(pga_alloc_mem / 1024 / 1024, 2) AS alloc_mb,
        ROUND(pga_max_mem   / 1024 / 1024, 2) AS max_mb
    FROM v$process
    ORDER BY pga_alloc_mem DESC;

    Fiktive Beispielausgabe:

    SPIDPNAMEUSED_MBALLOC_MBMAX_MBPIDSTIDSOSID
    18420NULL128160192301842018420
    18421NULL486480311842118421

    Was sehe ich hier? Die Prozesse sind nach aktueller PGA-Zuteilung absteigend sortiert. Das historische Maximum darf größer als die aktuelle Zuteilung sein. Dies sind Prozesswerte, keine vollständige Sessionabrechnung.

    13. PGA: Target, aktuelle Allokation und Peak auseinanderhalten

    Die Gesamtkennzahlen stehen in Abschnitt 12. Ergänze für dieselbe Instanz und denselben Container die folgenden Werte: Der gesamte PGA-Zielwert steht nicht ausschließlich für Sortierungen und Hash Joins zur Verfügung. PL/SQL, Java und weitere Verbraucher beanspruchen ebenfalls private Speicherbereiche.

    Was sehe ich hier?

    Read-only: Spielraum und Verbrauch automatischer Workareas

    Read-only: Spielraum und Verbrauch automatischer Workareas
    SELECT name, value, unit
    FROM v$pgastat
    WHERE name IN ('aggregate PGA auto target', 'global memory bound',
                   'total PGA used for auto workareas',
                   'bytes processed', 'extra bytes read/written')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUEUNIT
    aggregate PGA auto target1610612736bytes
    bytes processed10737418240bytes
    extra bytes read/written108458770bytes
    global memory bound67108864bytes
    total PGA used for auto workareas209715200bytes

    Was sehe ich hier? Der aktuelle Auto-Workarea-Spielraum beträgt 1,5 GiB, die globale Grenze einer automatischen Workarea 64 MiB und die aktuelle Auto-Workarea-Nutzung 200 MiB. BYTES PROCESSED und EXTRA BYTES READ/WRITTEN sind kumulierte Verarbeitungsmengen, keine aktuell allokierten Speichergrößen. Sie ergeben hier ungefähr 99 % PGA Cache Hit. Unterschiedliche Kennzahlarten nicht addieren.

    14. Over Allocation Count richtig verstehen

    over allocation count zählt seit Instanzstart Situationen, in denen Oracle den aggregierten PGA-Bedarf nicht innerhalb des Zielwerts halten konnte. Für ein aktuelles Problem ist die Zunahme im untersuchten Zeitraum entscheidend. Auch nicht automatisch regelbarer Speicher, etwa für PL/SQL, muss berücksichtigt werden.

    Er ist aber keine automatische Handlungsanweisung. Entscheidend sind Zeitpunkt, Workload, Host-RAM, TEMP-I/O und die Frage, welche Prozesse beziehungsweise Operationen den Bedarf erzeugt haben. Ein alter Zählerstand nach einer einmaligen Sonderlast darf nicht ohne Kontext auf den Normalbetrieb übertragen werden.

    15. Workarea-Ausführungen richtig interpretieren

    Viele optimal executions sind grundsätzlich positiv, weil die Operationen im verfügbaren Workarea-Speicher abgeschlossen werden konnten. Onepass bedeutet bereits zusätzlichen temporären I/O. Multipass bedeutet mehrere zusätzliche Durchläufe und kann besonders bei großen Sort- oder Hash-Operationen teuer werden.

    Trotzdem darf auch hier kein einzelner Zähler isoliert bewertet werden. Entscheidend ist, welche SQL-Statements diese Workareas erzeugen, wie oft sie laufen und ob TEMP-I/O tatsächlich einen relevanten Anteil an der DB Time verursacht.

    Oracle klassifiziert Workarea-Ausführungen danach, wie viel temporärer I/O erforderlich war. Optimal bedeutet, dass die Workarea ohne zusätzliche Passes über TEMP auskam. Onepass bedeutet, dass die Eingabedaten einmal zusätzlich über Disk verarbeitet werden mussten. Multipass bedeutet mehrere solcher Durchläufe und ist deshalb besonders interessant, wenn gleichzeitig relevante TEMP-I/O- oder Antwortzeitprobleme auftreten.

    Die Histogramm-View gruppiert Workareas nach Größenklassen. Dadurch kann ein DBA erkennen, ob vor allem kleine oder große Workareas aus dem Speicher herausfallen. Für die Root-Cause-Analyse muss danach der verursachende Workload betrachtet werden.

    Workarea-Histogramm mit Spill-Anteil
    SELECT
        low_optimal_size,
        high_optimal_size,
        optimal_executions,
        onepass_executions,
        multipasses_executions,
        total_executions,
        ROUND(
            (onepass_executions + multipasses_executions)
            / NULLIF(total_executions, 0) * 100,
            2
        ) AS spill_pct
    FROM v$sql_workarea_histogram
    WHERE total_executions > 0
    ORDER BY low_optimal_size;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    LOW_OPTIMAL_SIZEHIGH_OPTIMAL_SIZEOPTIMAL_EXECUTIONSONEPASS_EXECUTIONSMULTIPASSES_EXECUTIONS
    104857620971519009010
    TOTAL_EXECUTIONSSPILL_PCT
    100010

    So liest du das Ergebnis: 100 von 1000 Workarea-Ausführungen dieser Größenklasse liefen nicht optimal: (90+10)/1000 × 100 = 10 %. Das ist ein kumulierter Anteil dieser Größenklasse, keine Aussage über alle SQLs oder die aktuelle Minute.

    Fiktive Beispielausgabe:

    Ausführungen derselben Größenklasse10:0010:05Differenz
    Optimal90099090
    Onepass90988
    Multipass10122
    Gesamt10001100100

    Was sehe ich hier? Für dieselbe Größenklasse von 1048576 bis 2097151 Bytes beträgt der Spill-Anteil im Intervall (8+2)/100 × 100 = 10 %. Es ist ein Anteil der Workarea-Ausführungen, kein Anteil am Datenvolumen oder an der Antwortzeit.

    Notiere Instanzidentität, Container, Messzeiten und STARTUP_TIME. Nur passende Größenklassen derselben Instanz ohne Neustart vergleichen. Bei ΔTOTAL_EXECUTIONS=0 ist kein Anteil berechenbar. Die Größenklasse beschreibt den optimalen Speicherbedarf, nicht zwingend die tatsächlich gewährte Workarea-Größe.

    16. Aktive Workareas statt nur Historie betrachten

    Das Histogramm ist kumulativ. Wenn gerade jetzt eine große Sortierung oder ein Hash Join viel Speicher beziehungsweise TEMP verwendet, ist V$SQL_WORKAREA_ACTIVE die passendere Momentaufnahme. Damit lässt sich eine aktive Workarea einer Session und SQL_ID zuordnen, ohne das SQL selbst zu verändern.

    Aktive Workareas
    SELECT
        sid,
        con_id,
        sql_exec_start,
        sql_exec_id,
        operation_id,
        workarea_address,
        sql_id,
        operation_type,
        ROUND(actual_mem_used / 1024 / 1024, 2) AS actual_mem_mb,
        ROUND(max_mem_used    / 1024 / 1024, 2) AS max_mem_mb,
        number_passes,
        ROUND(tempseg_size / 1024 / 1024, 2) AS temp_mb
    FROM v$sql_workarea_active
    ORDER BY actual_mem_used DESC;

    Fiktive Beispielausgabe:

    Zusammengehörige Teilansichten derselben Ergebniszeilen.

    SIDSQL_IDOPERATION_TYPEACTUAL_MEM_MBMAX_MEM_MBCON_IDSQL_EXEC_STARTSQL_EXEC_ID
    2127abc12def3456SORT6464308.10.2026 10:04:3016777216
    NUMBER_PASSESTEMP_MBOPERATION_IDWORKAREA_ADDRESS
    125610000000123456780

    So liest du das Ergebnis: Eine Sortier-Workarea nutzt 64 MiB und hat einen TEMP-Bereich von 256 MiB. Das ist weder die gesamte PGA dieser Session noch automatisch die gesamte TEMP-Nutzung der SQL.

    Was sehe ich hier?

    Diese View zeigt aktuell aktive Workareas. NUMBER_PASSES und TEMPSEG_SIZE helfen zu erkennen, ob eine laufende Operation auf TEMP ausweicht. Eine SQL_ID dient hier der Zuordnung des Verbrauchers; die SQL-Optimierung selbst gehört in das SQL-Tuning-Kapitel.

    SQL_ID kann mehrere gleichzeitige Ausführungen und mehrere Workareas betreffen. SQL_EXEC_START/SQL_EXEC_ID, OPERATION_ID und WORKAREA_ADDRESS helfen bei der Zuordnung; bei Session-Folgeabfragen zusätzlich SERIAL# aus V$SESSION sichern. TEMPSEG_SIZE=NULL bedeutet noch keinen Spill-Bereich für diese Workarea. 256 MiB TEMPSEG_SIZE bezeichnet Segmentgröße, nicht bereits übertragenes I/O-Volumen.

    17. Prozess-PGA einer Session zuordnen

    V$PROCESS zeigt PGA auf Prozessebene. Für einen DBA ist häufig entscheidend, welcher Benutzer beziehungsweise welche Session hinter einem großen Serverprozess steht. Im Dedicated-Server-Modell kann dafür V$SESSION.PADDR mit V$PROCESS.ADDR verbunden werden.

    Top-PGA-Prozesse mit Sessionkontext
    SELECT
        s.sid,
        s.serial#,
        s.username,
        s.service_name,
        s.module,
        s.sql_id,
        p.pid,
        p.spid,
        p.stid,
        p.sosid,
        s.server,
        ROUND(p.pga_used_mem  / 1024 / 1024, 2) AS used_mb,
        ROUND(p.pga_alloc_mem / 1024 / 1024, 2) AS alloc_mb,
        ROUND(p.pga_max_mem   / 1024 / 1024, 2) AS max_mb
    FROM v$process p
    LEFT JOIN v$session s
      ON s.paddr = p.addr
    ORDER BY p.pga_alloc_mem DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESERVICE_NAMEMODULESERVER
    11423817APP_USERapp_serviceBestellportalDEDICATED
    ZeileSQL_IDSPIDUSED_MBALLOC_MBMAX_MBPIDSTIDSOSID
    18u3k2m9p4q7r118420128160192301842018420

    Was sehe ich hier? Die Session hilft, einen Prozess mit hoher PGA einem Anwendungskontext zuzuordnen. Bei mehreren Sessionzuordnungen können Prozesswerte wiederholt erscheinen; dann nicht einfach pro Ergebniszeile addieren.

    Wichtig: Background-Prozesse besitzen ebenfalls PGA und haben nicht zwingend eine normale User-Session-Zuordnung. Deshalb ist ein LEFT JOIN sinnvoll und eine leere USERNAME-Spalte nicht automatisch ein Fehler.

    PGA gehört zum privaten Oracle-Ausführungskontext, auch bei Umsetzung als OS-Thread. Auf Solaris ist STID allein nicht eindeutig; SPID plus STID beziehungsweise SOSID verwenden.

    18. Oracle Memory Advisor read-only nutzen

    Oracle kann für verschiedene Speicherzielwerte abschätzen, wie sich die bereits beobachtete Workload unter alternativen Größen verhalten hätte. Diese Advisor-Views verändern keine Parameter. Sie liefern ein Modell für die DBA-Bewertung.

    Wichtig ist die Richtung der Interpretation: Ein Advisor beantwortet nicht „Wie viel RAM braucht diese Datenbank für immer?“, sondern modelliert Varianten auf Basis der verfügbaren Beobachtungsdaten. Nach Workload-Änderungen, Neustarts oder Parameteränderungen kann sich die Aussage deshalb verändern.

    Was macht ein Memory Advisor eigentlich?

    Stell dir vor, du möchtest den Cache vergrößern, weißt aber noch nicht, ob zusätzlicher RAM wirklich hilft. Der Advisor liefert dafür Vergleichsgrößen mit geschätzter Wirkung. Die Alternative wird nicht tatsächlich als neue Speichergröße eingestellt. Insbesondere der PGA-Advisor simuliert die aufgezeichnete Workload für verschiedene Zielwerte; der Cache-Advisor nutzt zusätzliche, teilweise stichprobenbasierte Buchführung. Diese Beobachtung kostet etwas CPU und Speicher.

    Es gibt daher nicht einen einzigen Advisor, der den gesamten Host optimal aufteilt. Die einzelnen Views betrachten verschiedene Ausschnitte. Automatische Speicherverwaltung und Advisor sind ebenfalls verschieden: ASMM beziehungsweise AMM können Speicher verteilen; das Lesen einer Advisor-View verändert nichts.

    FragestellungAdvisor-ViewEntscheidende Modellgröße
    Wie verändert ein anderer Buffer Cache die Lesezugriffe?V$DB_CACHE_ADVICEGeschätzte Physical Reads und ihr Faktor
    Hilft mehr Shared Pool bei der Wiederverwendung im Library Cache?V$SHARED_POOL_ADVICEGeschätzte Parse-/Ladezeit und eingesparte Parse-Zeit
    Welcher PGA-Zielwert trägt die beobachtete Workarea-Last?V$PGA_TARGET_ADVICEGeschätzte Over Allocations und zusätzlicher Workarea-I/O
    Wie wirkt ein anderer SGA_TARGET bei ASMM?V$SGA_TARGET_ADVICEGeschätzte DB Time und Physical Reads
    Wie wirkt ein anderer MEMORY_TARGET bei AMM?V$MEMORY_TARGET_ADVICEGeschätzte DB Time für den gemeinsamen Zielrahmen

    Ein Größenfaktor von 1 kennzeichnet die jeweilige Bezugsgröße. 1,5 bedeutet 50 % mehr Speicher für diesen Bereich. Ein Wirkungsfaktor von 0,95 bedeutet dagegen 95 % des Bezugswertes der betreffenden Kennzahl. Größenfaktor und Wirkungsfaktor dürfen nicht verwechselt werden. DB Time ist dabei Datenbankarbeit, nicht unmittelbar die Antwortzeit eines einzelnen Benutzers.

    Oracle-19c-Referenz: PGA-Modell · Cache-Beobachtung · SGA-Advice · AMM-Advice.

    Ziel der folgenden Abfrage:
    V$SGA_TARGET_ADVICE vergleicht alternative SGA-Größen. Besonders interessant sind der Faktor zur aktuellen SGA, die geschätzte DB Time und die geschätzten physischen Reads.
    READ ONLY – SGA Target Advisor
    SELECT
        sga_size,
        sga_size_factor,
        estd_db_time,
        estd_db_time_factor,
        estd_physical_reads,
        estd_buffer_cache_size,
        estd_shared_pool_size
    FROM v$sga_target_advice
    ORDER BY sga_size;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSGA_SIZESGA_SIZE_FACTORESTD_DB_TIMEESTD_DB_TIME_FACTORESTD_PHYSICAL_READS
    115360.7512001.2150000
    22048110001100000
    325601.259500.9585000
    ZeileESTD_BUFFER_CACHE_SIZEESTD_SHARED_POOL_SIZE
    1768512
    21024768
    31536768

    Was sehe ich hier? Das Modell schätzt für die größere SGA eine DB-Time von 95 % des Ausgangswerts. Das ist keine zugesicherte Beschleunigung. Die Größen sind die von der Advisory-Sicht gelieferten MB-Werte; die Sicht benötigt passende Voraussetzungen und Messdaten.

    Ziel der folgenden Abfrage:
    V$PGA_TARGET_ADVICE modelliert alternative Werte für PGA_AGGREGATE_TARGET. Oracle schätzt unter anderem Workarea-Cache-Hit und Over Allocations. Die View kann leer sein, wenn die Voraussetzungen für die Advice-Daten nicht erfüllt sind.
    READ ONLY – PGA Target Advisor
    SELECT
        ROUND(pga_target_for_estimate / 1024 / 1024) AS pga_target_mb,
        pga_target_factor,
        advice_status,
        estd_pga_cache_hit_percentage,
        estd_overalloc_count
    FROM v$pga_target_advice
    ORDER BY pga_target_for_estimate;

    Fiktive Beispielausgabe:

    PGA_TARGET_MBPGA_TARGET_FACTORESTD_PGA_CACHE_HIT_PERCENTAGEESTD_OVERALLOC_COUNTADVICE_STATUS
    10240.58512ON
    20481970ON
    30721.5990ON

    So liest du das Ergebnis: Oracle modelliert in diesem Beispiel für 3 GiB eine höhere Kennzahl. Ob sich die zusätzliche Zuteilung lohnt, hängt von TEMP-I/O, Antwortzeit und Hostreserve ab; es ist keine Vorhersagegarantie.

    Ziel der folgenden Abfrage:
    Wenn AMM aktiv ist, kann V$MEMORY_TARGET_ADVICE alternative Werte für MEMORY_TARGET modellieren. Bei einer Konfiguration ohne AMM ist diese Sicht für die praktische Bewertung entsprechend nicht der zentrale Advisor.
    READ ONLY – Memory Target Advisor bei AMM
    SELECT
        memory_size,
        memory_size_factor,
        estd_db_time,
        estd_db_time_factor
    FROM v$memory_target_advice
    ORDER BY memory_size;

    Fiktive Beispielausgabe:

    MEMORY_SIZEMEMORY_SIZE_FACTORESTD_DB_TIMEESTD_DB_TIME_FACTOR
    30720.7512001.2
    4096110001
    51201.259600.96

    Was sehe ich hier? Eigenständiges Beispiel bei aktiver automatischer Speicherverwaltung: Faktor 1 ist der Ausgangspunkt. Mehr Speicher verspricht hier nur eine geringe modellierte Verbesserung. Bei anderer Speicherverwaltung kann die Sicht leer sein.

    Advisor-Regel: Ein kleinerer geschätzter Wert für DB Time oder Over Allocations ist ein Diagnosehinweis, aber noch keine Änderungsfreigabe. Vor einer Anpassung müssen Host-RAM, andere Oracle-Instances, Workload-Zeitraum, TEMP-I/O, aktuelle Peaks und betriebliche Reserven gemeinsam bewertet werden.

    PGA-Advice: Zielüberschreitungen und TEMP-I/O getrennt lesen

    PGA_TARGET_FOR_ESTIMATE wird in Bytes geliefert; die Abfrage rechnet in MiB um. ESTD_OVERALLOC_COUNT größer als 0 kennzeichnet einen modellierten Zielwert, den Oracle für diese Last nicht einhalten könnte. Die erste untersuchte Größe mit 0 ist ein möglicher Ausgangspunkt für die Bewertung, aber noch nicht zwingend das wirtschaftlich beste Ziel.

    Auch bei 0 geschätzten Over Allocations können Workareas weiterhin Onepass oder Multipass benötigen. ESTD_EXTRA_BYTES_RW beschreibt den geschätzten zusätzlichen Workarea-I/O; ESTD_TIME ergänzt die modellierte Verarbeitungszeit. Diese Spalten helfen zu entscheiden, ob ein weiterer Schritt nach oben noch relevanten Nutzen bringt. Eine hohe ESTD_PGA_CACHE_HIT_PERCENTAGE allein beantwortet diese Frage nicht.

    Die folgende PGA-Abfrage bleibt bewusst kompakt. Für eine vertiefte Auswertung können die genannten Zusatzspalten aus derselben View herangezogen werden. Das Target ist weiterhin kein hartes Verbrauchslimit; das davon getrennte PGA_AGGREGATE_LIMIT muss ebenfalls zum Betrieb passen.

    Oracle-19c-Referenz: Bedeutung der PGA-Schätzwerte.

    19. Vom Memory Advisor zur Empfehlung im Memory Report

    Advisor-Views modellieren Alternativen anhand der beobachteten Workload. Das ist ein entscheidender Unterschied zu einer Garantie. Wenn sich Benutzerzahl, SQL-Mix, Datenmenge oder Parallelität ändern, kann die reale Wirkung anders ausfallen.

    Ein Advisor ist besonders nützlich, um den abnehmenden Grenznutzen zu erkennen: Zusätzlicher Speicher kann zunächst deutliche Verbesserungen modellieren, während weitere Erhöhungen kaum noch Effekt zeigen. Umgekehrt kann ein kleinerer Zielwert zeigen, wie stark DB Time, Physical Reads oder Over Allocations voraussichtlich zunehmen würden.

    Drei Ebenen: Messwert, Schätzung und Reportentscheidung

    Dein Memory Report führt diese Ebenen zusammen: Aktuell zeigt Messwerte oder Parameter, Oracle-Advisor zeigt modellierte Varianten und Entscheidung bewertet diese anhand einer Auswahlregel des Reports. Begriffe wie „ZU KLEIN“, „AUSREICHEND“ oder „BEIBEHALTEN“ sind keine Spaltenwerte, die Oracle als fertiges Gesamturteil liefert.

    Auch „21 Vergleichsgrößen ausgewertet“ bezeichnet die Zahl der berücksichtigten Varianten. Das sind weder 21 unabhängige Lasttests noch ein Nachweis einer langen Messdauer. Für eine nachvollziehbare Empfehlung sollten Bezugsgröße, gewählte Advisor-Zeile, geschätzter Nutzen, Zeitraum und Auswahlregel zusammen erkennbar sein.

    Im gezeigten Memory ReportWie du die Aussage liestWas daraus noch nicht folgt
    Buffer Cache: 2.000 → 2.304 MB; +304 MB; mindestens rund 5 % weniger Physical Reads erwartetDer Report wählt eine größere Cache-Variante wegen ihres modellierten Lesevorteils. Eine 5-%-Schwelle ist eine Bewertungsregel des Reports, keine allgemeine Oracle-Vorgabe.Weder 5 % kürzere SQL-Laufzeit noch 5 % schnellere Anwendung sind damit nachgewiesen.
    Shared Pool: 1.008 → 1.008 MB; keine Verbesserung durch mehr Speicher erwartetFür die ausgewerteten Varianten ist keine relevante zusätzliche Wirkung ausgewiesen. Die passende Formulierung ist: „Kein relevanter modellierter Zusatznutzen erkennbar; vorerst beibehalten.“Das ist kein Beweis, dass alle Parse-Probleme behoben sind oder dass eine Verkleinerung risikolos wäre.
    PGA: Target 500 MB; aktuell 825,15 MB; Peak 1.086,76 MB; Hit 99,97 %; Over Allocations 586.944; Vorschlag 900 MBDer Target-Wert wurde überschritten. Der hohe Hit-Wert hebt die separat gezählten Over Allocations nicht auf. Für das vorgeschlagene Ziel zeigt der Report 0 geschätzte Over Allocations.Der kumulierte Zähler zeigt nicht, wann die Ereignisse auftraten. Aus 0 modellierten Over Allocations folgt weder garantierte Zieltreue in Zukunft noch vollständig entfallender TEMP-I/O.
    Gesamt-SGA: MANUAL; 0 SGA-Target-VergleichsgrößenDer Report begründet den zusätzlichen SGA-Bedarf über einzelne Komponenten. Ohne geeignete SGA-Target-Advice-Daten liegt keine Gesamt-SGA-Prognose vor.Eine leere View beweist nicht, dass die SGA optimal dimensioniert ist.
    Large Pool und Java Pool: beibehalten; kein separater Sizing-Advisor ausgewertetFür diese Komponenten ist in der gezeigten Auswertung keine eigene Advisor-Begründung vorhanden.„Beibehalten“ ist hier keine Bestätigung einer optimalen Größe.

    Einordnung der Zahlen: Die Größen und Bezeichnungen stammen aus dem gezeigten Report. Seine vollständigen Advisor-Zeilen und die interne Auswahllogik sind im Ausschnitt nicht sichtbar. Deshalb lässt sich daraus insbesondere nicht prüfen, ob 900 MB die kleinste passende PGA-Variante oder 2.304 MB die erste Cache-Variante oberhalb der Schwelle ist. Hier wird die Aussage erklärt, nicht eine unabhängig neu berechnete Dimensionierung behauptet.

    Die angezeigten Differenzen ergeben zusammen 304 + 400 = 704 MB zusätzlichen Zielrahmen. Die Summe „SGA + PGA“ ist jedoch kein harter Gesamtverbrauchsdeckel: PGA kann ihren Target-Wert überschreiten; Host, weitere Instanzen und betriebliche Reserve bleiben zu berücksichtigen. Reale Belegung und gerundete Zielgrößen sollten im Report klar getrennt bleiben.

    Welche Empfehlungen kann ein Report sinnvoll ableiten?

    BewertungBegründung und passende Folgerung
    Vergrößerung prüfenEine größere Variante zeigt relevanten Nutzen oder vermeidet modellierte PGA-Over-Allocations. Speichermehrbedarf, tatsächliche Lastprobleme und Hostreserve werden gegengeprüft.
    BeibehaltenDie aktuellen Daten zeigen keinen relevanten Zusatznutzen. Das gilt für die untersuchte Last, nicht unbegrenzt für jede künftige Nutzung.
    Verkleinerung prüfenKleinere Varianten zeigen nur einen akzeptierten Nachteil. Auch Spitzenlast und Reserven müssen berücksichtigt werden; freie Bytes allein reichen nicht.
    Nicht beurteilbarAdvice fehlt, ist deaktiviert, veraltet oder deckt die relevante Last noch nicht ab. Das ist keine grüne Speicherbewertung.

    Eine nachvollziehbare Reportregel kann die kleinste untersuchte Variante auswählen, die ein definiertes Ziel erreicht. Beim Cache könnte dieses Ziel eine ausreichend große Reduktion geschätzter Reads sein. Bei der PGA wird zunächst die Zone mit erwarteten Over Allocations ausgeschlossen; anschließend zählt der zusätzliche Nutzen weiterer Größen. Eine solche Regel muss dokumentiert sein. Zwischen zwei Advisor-Zeilen wird ohne zusätzliche Begründung keine vermeintlich exakt optimale Größe erfunden.

    Für die Nutzenabwägung hilft der abnehmende Zusatznutzen: Wenn eine weitere Speicherstufe kaum noch Reads oder Parse-Zeit spart, ist mehr RAM nicht automatisch sinnvoll. Eine übergroße Zuteilung an eine Instanz kann anderen Datenbanken auf demselben Host fehlen. Die sinnvollste Variante verbindet daher Nutzen und Speicherbedarf.

    Saubere Empfehlungsformulierung für den gezeigten Cache: „2.304 MB als Kandidat prüfen: Der Report weist gegenüber 2.000 MB rund 5 % weniger modellierte Physical Reads aus. Vor einer Entscheidung Hostreserve und Lastabdeckung prüfen; danach reale Reads und Laufzeit bei vergleichbarer Last messen.“ Damit bleiben Modell, Empfehlung und späterer Erfolgsnachweis unterscheidbar.

    Dynamisch möglich bedeutet noch nicht geprüft umsetzbar

    Der gezeigte Wert SGA_MAX_SIZE = 8.000 MB liegt über dem vorgeschlagenen SGA-Rahmen von 3.519 MB. Das klärt eine Größenbegrenzung, beweist aber noch keine ausreichende freie Hostreserve. SGA_MAX_SIZE selbst ist während der Laufzeit der Instanz nicht änderbar.

    Die Cache-Größe und PGA_AGGREGATE_TARGET können grundsätzlich dynamisch angepasst werden. Der tatsächliche Weg hängt vom Memory-Modus ab: Bei manueller SGA-Verwaltung werden Komponenten dimensioniert; bei ASMM können ausdrücklich gesetzte Komponentengrößen Mindestwerte sein. Bei AMM wirken ausdrücklich gesetzte SGA-/PGA-Targets als Mindestgrößen innerhalb der automatischen Verteilung. Mehr Mindestgröße kann die Freiheit der Automatik einschränken.

    Die Aussage „kein Neustart erforderlich“ benötigt daher eine Prüfung der wirksamen Grenzen, Speicherverfügbarkeit und Parameteränderbarkeit. SCOPE=BOTH bedeutet aktuelle und dauerhafte Einstellung im SPFILE und setzt dessen Verwendung voraus. Bei Start mit einer Text-PFILE steht diese Speicherart nicht in gleicher Weise zur Verfügung. Ein im Report angezeigter Änderungsbefehl ist eine manuelle Referenz; der Report führt ihn nicht aus.

    Oracle-19c-Referenz: SGA-Grenze · Memory-Modi und dynamische Größen · SCOPE und SPFILE.

    20. Advisor-Voraussetzungen und leere Views

    Eine leere Advisor-View bedeutet nicht automatisch einen Fehler. Ob Daten verfügbar sind, hängt unter anderem von der aktiven Speicherverwaltung, Statistik-/Advisor-Einstellungen und davon ab, ob Oracle genügend Beobachtungsdaten besitzt. Deshalb darf ein Skript eine leere Advisor-View nicht mit „Speicher ist optimal“ übersetzen.

    Die korrekte Aussage lautet: Für diese Advisor-Sicht stehen aktuell keine auswertbaren Zeilen zur Verfügung. Danach wird mit den normalen V$-Kennzahlen weiterdiagnostiziert.

    Was sehe ich hier?

    Read-only: Statistik- und Cache-Advisor-Konfiguration

    Read-only: Statistik- und Cache-Advisor-Konfiguration
    SELECT name, value
    FROM v$parameter
    WHERE name IN ('statistics_level','db_cache_advice')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUE
    db_cache_adviceON
    statistics_levelTYPICAL

    Was sehe ich hier? Die Statistikstufe ist TYPICAL und Cache Advice eingeschaltet. ASMM setzt STATISTICS_LEVEL=TYPICAL oder ALL voraus.

    Vorhandene Advisor-Zeilen sind nicht automatisch aktuell: Bei ADVICE_STATUS=OFF kann V$DB_CACHE_ADVICE historische Schätzungen enthalten. V$PGA_TARGET_ADVICE wird bei STATISTICS_LEVEL=BASIC nicht aktualisiert. Seine Basisstatistiken werden bei Instanzstart und Änderung von PGA_AGGREGATE_TARGET zurückgesetzt. Zeitpunkt der Zieländerung dokumentieren und nur passende Beobachtungszeiträume vergleichen.

    Wann ist die Datenbasis aussagekräftig?

    Der Beobachtungszeitraum sollte die relevante Last enthalten, etwa Morgenbetrieb, große Berichte und Sicherungsläufe. Eine ruhige Phase direkt nach dem Start trägt keine belastbare Aussage über die nächste Lastspitze. Nach einer Parameteränderung ist die neue Beobachtungsbasis zu dokumentieren; beim PGA-Advisor wird sie zurückgesetzt.

    Bei DB_CACHE_ADVICE bedeutet ON aktive Sammlung, READY reservierten Advisor-Speicher ohne aktive Sammlung und OFF ausgeschaltete Sammlung ohne deren Speicherreservierung. Aktivieren erfordert Ressourcen. Es ist daher eine administrative Entscheidung und kein versteckter Schritt eines lesenden Reports.

    Verglichen werden nur passende Instanz-/Containerdaten und beim Cache derselbe Pool mit derselben Blockgröße. Fehlende Faktoren, deaktivierte Advice-Zeilen oder ein Bezugswert von 0 erlauben keine normale Prozentrechnung. Statt eines erfundenen Vorteils muss der Report dann die fehlende Bewertungsbasis ausweisen.

    Oracle-19c-Referenz: Aktivierungszustände · Reset der PGA-Basis.

    21. SGA Resize-Historie lesen

    Wenn ASMM oder AMM aktiv ist, kann Oracle SGA-Speicher zwischen dynamischen Komponenten verschieben. V$SGA_RESIZE_OPS zeigt die letzten 800 abgeschlossenen Resize-Vorgänge. Laufende Vorgänge stehen dagegen in V$SGA_CURRENT_RESIZE_OPS. Diese Historie ist nützlich, wenn beispielsweise untersucht werden soll, ob Shared Pool und Buffer Cache unter wechselnder Last wiederholt Speicher voneinander erhalten.

    Oracle-19c-Referenz: V$SGA_RESIZE_OPS.

    Viele Resize-Vorgänge sind nicht automatisch ein Problem. Sie zeigen zunächst, dass die automatische Speicherverwaltung auf Workloadänderungen reagiert. Relevant wird das Verhalten erst zusammen mit Performanceproblemen, ORA-04031, starkem Parse-Druck oder anderen passenden Symptomen.

    SGA Resize Operations
    SELECT
        component,
        oper_type,
        oper_mode,
        ROUND(initial_size / 1024 / 1024, 2) AS initial_mb,
        ROUND(target_size  / 1024 / 1024, 2) AS target_mb,
        start_time,
        end_time,
        status
    FROM v$sga_resize_ops
    ORDER BY start_time DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileCOMPONENTOPER_TYPEOPER_MODEINITIAL_MBTARGET_MB
    1DEFAULT buffer cacheGROWIMMEDIATE7681024
    ZeileSTART_TIMEEND_TIMESTATUS
    108.10.2026 10:00:0008.10.2026 10:00:01COMPLETE

    Was sehe ich hier? Eine Vergrößerung von 768 auf 1.024 MiB wurde abgeschlossen. COMPLETE bewertet diese Speicheroperation, nicht den Gesundheitszustand der gesamten Datenbank. Ein Resize wird für die Störungsanalyse erst durch den Zusammenhang mit Zeitpunkt und Symptom aussagekräftig.

    22. Shared Pool: freie Bytes sind nicht die ganze Diagnose

    Beim Shared Pool ist die Frage „Wie viel ist frei?“ allein zu einfach. Der Pool enthält unterschiedliche gemeinsam genutzte Strukturen und arbeitet mit interner Speicherverwaltung. Ein ORA-04031 bedeutet, dass eine angeforderte Shared-Memory-Allokation nicht erfüllt werden konnte; daraus folgt nicht automatisch, dass die Summe aller freien Bytes exakt null war.

    Für die Diagnose werden deshalb Fehlertext, betroffener Pool beziehungsweise Subpool, Parse-/Cursor-Verhalten und Speicherverteilung gemeinsam betrachtet. Eine pauschale Shared-Pool-Erhöhung ohne Ursachenanalyse ist kein belastbarer Diagnoseweg.

    Shared Pool nach Speicherarten zusammenfassen
    SELECT
        pool,
        name,
        ROUND(SUM(bytes) / 1024 / 1024, 2) AS mb
    FROM v$sgastat
    WHERE pool = 'shared pool'
    GROUP BY pool, name
    ORDER BY SUM(bytes) DESC;

    Fiktive Beispielausgabe:

    POOLNAMEMB
    shared poolsql area256
    shared poolfree memory128

    Was sehe ich hier? Ausschnitt nach zusammengefasster Größe sortiert. Die Kategorie sql area beansprucht hier mehr Speicher als die gezeigte freie Reserve; daraus allein folgt noch kein Tuningbedarf.

    Shared Pool Advisor: welche Zeit wird geschätzt?

    V$SHARED_POOL_ADVICE ergänzt die Belegungsabfrage. SHARED_POOL_SIZE_FOR_ESTIMATE ist eine untersuchte Größe in MB; der Größenfaktor bezieht sie auf die aktuelle Größe. ESTD_LC_LOAD_TIME schätzt Parse-Zeit in Sekunden. ESTD_LC_TIME_SAVED schätzt durch Wiederfinden von Library-Cache-Objekten eingesparte Parse-Zeit. Weniger Ladezeit und mehr eingesparte Zeit sind günstige Richtungen; sie dürfen nicht gegeneinander vertauscht werden.

    Bleibt die Kurve für größere Pools praktisch flach, stützt das die Reportentscheidung „vorerst beibehalten“. Absolute Zeitdifferenz und Bedeutung für die Anwendung zählen zusätzlich zum Faktor. Der Advisor liefert weder einen universellen Beweis für ausreichenden gesamten Shared Pool noch eine Garantie gegen ORA-04031.

    Hohe Parse-Last kann auch aus nicht gemeinsam genutztem SQL, vielen Child Cursorn oder häufigen Invalidierungen entstehen. Mehr Shared Pool korrigiert solche Ursachen nicht automatisch. Deshalb werden die Schätzwerte mit Parse-, Reload- und Cursorbefunden verbunden.

    Oracle-19c-Referenz: Shared-Pool-Schätzwerte · Shared-Pool-Diagnose.

    Was zeigt die folgende Abfrage? Sie liefert die Vergleichsgrößen und beide Zeitrichtungen. Die Zielauswahl im Report erfolgt erst nach ihrer Bewertung.
    Shared Pool Advisor – read-only
    SELECT shared_pool_size_for_estimate AS pool_mb,
           shared_pool_size_factor AS size_factor,
           estd_lc_load_time AS parse_load_seconds,
           estd_lc_time_saved AS parse_saved_seconds
    FROM v$shared_pool_advice
    ORDER BY shared_pool_size_for_estimate;

    So liest du die Ausgabe: Zuerst die Zeile mit Größenfaktor 1 als Bezug suchen. Anschließend die absoluten Zeitwerte kleinerer und größerer Varianten vergleichen. Ohne geeignete Bezugszeile oder verwertbare Lastdaten wird keine Zielgröße abgeleitet. Die View-Ausgabe ist keine bereits umgesetzte Speicheränderung.

    23. Buffer Cache: Größe, Reads und Working Set gemeinsam bewerten

    Der Database Buffer Cache speichert Kopien von Datenblöcken. Ein Logical Read bedeutet, dass Oracle einen Block im Buffer-Cache-Kontext verarbeitet; ein Physical Read bedeutet, dass Daten vom persistenten Speicher gelesen werden mussten. Daraus folgt aber nicht, dass jeder Physical Read schlecht oder jeder Cache-Treffer gut ist.

    Ein großer Scan kann absichtlich viele Blöcke lesen. Gleichzeitig kann ineffiziente SQL trotz sehr hoher Cache Hit Ratio enorme Mengen logischer Reads erzeugen. Deshalb bewertet Oracle Speicher nicht sinnvoll über einen einzelnen Hit-Ratio-Grenzwert, sondern im Zusammenhang mit Workload, DB Time, I/O und den geschätzten Auswirkungen alternativer Cache-Größen.

    Buffer Cache Advisor – read-only
    SELECT
        name,
        block_size,
        advice_status,
        size_for_estimate,
        size_factor,
        estd_physical_read_factor,
        estd_physical_reads
    FROM v$db_cache_advice
    WHERE name = 'DEFAULT'
    ORDER BY size_for_estimate;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileNAMEBLOCK_SIZESIZE_FOR_ESTIMATESIZE_FACTORESTD_PHYSICAL_READ_FACTORADVICE_STATUS
    1DEFAULT81925120.51.5ON
    2DEFAULT8192102411ON
    3DEFAULT819215361.50.85ON
    ZeileESTD_PHYSICAL_READS
    1150000
    2100000
    385000

    Was sehe ich hier? Bei 1.024 MB liegt der Bezugswert des Modells. Für 1.536 MB werden 85 % der physischen Lesezugriffe geschätzt. Das ist eine workloadabhängige Prognose, keine tatsächliche Messung nach einer Änderung. Der geschätzte Nutzen ersetzt keine Prüfung der Host-Reserve oder möglicher SQL-Verbesserungen.

    Vom Read-Faktor zur Cache-Empfehlung

    SIZE_FOR_ESTIMATE ist die untersuchte Cache-Größe; ESTD_PHYSICAL_READ_FACTOR setzt die geschätzten Reads ins Verhältnis zu den tatsächlichen Reads des Bezugs-Caches. Bei 0,95 beträgt die modellierte Reduktion (1 − 0,95) × 100 = 5 %. Im bereits gezeigten Tabellenbeispiel entspricht 0,85 entsprechend 15 %. Das sind Aussagen über Lesezugriffe, nicht über die gesamte Antwortzeit.

    Der Memory Report nennt daneben „Physical / Logical Reads: 17,32 %“. Das ist eine andere Kennzahl als der Advisor-Faktor. Sie sagt nicht, wie viele dieser Reads sich durch zusätzliche 304 MB vermeiden lassen. Dafür werden die Advisor-Zeilen und der Cache-Kontext benötigt.

    Unterschiedliche Blockgrößen oder Pools dürfen nicht in einer Vergleichskurve vermischt werden. Die vorhandene Abfrage filtert auf DEFAULT, zeigt aber bewusst zusätzlich BLOCK_SIZE. Bei mehreren Blockgrößen ist die Auswertung entsprechend zu trennen. Gibt es keine tatsächlichen Reads im Bezugs-Cache, kann der Read-Faktor NULL sein; daraus darf keine prozentuale Verbesserung berechnet werden.

    Oracle-19c-Referenz: Faktoren und Poolzuordnung.

    24. Host-RAM und mehrere Instances gemeinsam bewerten

    Oracle-Speicher muss zusammen mit dem Betriebssystem betrachtet werden – auf Solaris ebenso wie auf Oracle Linux. Je Instanz werden SGA einmal und aggregierte PGA einmal berücksichtigt. Die aggregierte PGA enthält bereits die PGAs der Hintergrundprozesse; diese dürfen nicht nochmals addiert werden. Weitere Speicheranteile, Betriebssystem und Anwendungen werden anschließend auf Hostebene geprüft. Auch Prozess-RSS-Werte dürfen nicht blind summiert werden, wenn gemeinsam eingeblendete SGA-Seiten mehrfach enthalten sind. Eine einzelne Datenbank kann deshalb innerhalb ihrer eigenen Advisor-Sicht von mehr Speicher profitieren, obwohl der Host insgesamt keine sichere Reserve dafür besitzt.

    Die richtige Reihenfolge lautet daher: Datenbankbedarf feststellen → alle Instances zusammenrechnen → Host-Auslastung und Reserve prüfen → erst dann eine mögliche Zielgröße bewerten.

    OS-DIAGNOSE – Solaris Memory
    prtconf | grep 'Memory size'
    vmstat 1 5
    swap -s
    OS-DIAGNOSE – Oracle Linux
    free -m
    vmstat 1 5
    swapon --show

    Solaris: prtconf zeigt den installierten Speicher, swap -s den Swap-Kontext. Oracle Linux: free -m zeigt Speicherwerte in MiB; insbesondere „available“ ist aussagekräftiger als nur „free“. Die erste vmstat-Zeile enthält bei vielen Feldern Werte seit dem Start; die Folgezeilen beschreiben die Intervalle. Belegter Swap allein beweist kein aktuelles Paging.

    25. Keine Universalformel für SGA/PGA

    Regeln wie „80 % SGA und 20 % PGA“ sind keine Oracle-Dimensionierungsmethode. Ein OLTP-System mit kleinem Working Set und vielen Sessions hat andere Anforderungen als eine Reporting-Datenbank mit großen Hash Joins und Sortierungen. Auch Anzahl paralleler Prozesse, weitere Instances und Host-RAM verändern die sinnvolle Balance.

    Die belastbare Dimensionierung entsteht deshalb aus Messwerten: Working Set und Physical Reads für Cache-Fragen, Parse-/Shared-Pool-Verhalten, Workarea-Spills und Over Allocations für PGA sowie Host-Memory-Druck als übergeordnete Grenze.

    26. Typische Fehlerbilder und was sie wirklich bedeuten

    Fehler / Symptom Bedeutung Erste Prüfung
    ORA-04031 Benötigter zusammenhängender Shared-Memory-Bereich konnte nicht bereitgestellt werden. Fehlertext, betroffener Pool/Subpool, Parse-Verhalten, Cursor und Shared-Pool-Nutzung.
    ORA-04030 Ein Prozess konnte weiteren Prozessspeicher nicht allozieren. PGA des Prozesses, OS-Grenzen, Operation, Prozessanzahl und Fehlertext.
    ORA-04036 Der von Oracle überwachte aggregierte PGA-Verbrauch hat den durch PGA_AGGREGATE_LIMIT vorgegebenen Grenzbereich überschritten. PGA_AGGREGATE_LIMIT, V$PGASTAT, V$PROCESS und Top-Verbraucher.
    Over Allocation Count Oracle musste PGA-Speicher oberhalb des Zielwerts bereitstellen. V$PGASTAT, Workload-Spitzen und parallele Workareas.
    Onepass / Multipass Workarea konnte nicht vollständig im Speicher bleiben und benötigte TEMP-I/O. V$SQL_WORKAREA_HISTOGRAM und betroffene SQL-Statements.
    Viele Hard Parses Cursor werden häufig neu geparst statt wiederverwendet. Shared Pool, Bind-Nutzung, Cursor Sharing und Child Cursor.
    Viele physische Reads Benötigte Blöcke werden oft vom Storage gelesen. SQL-Arbeitsmenge, Working Set und Buffer-Cache-Verhalten.

    27. DBA-Denkmodell bei Speicherproblemen

    DBA-Diagnosekette bei Speicherauffälligkeiten:

    1. Exaktes Symptom bestimmen: ORA-Fehler, TEMP-I/O, Parse-Druck, physische Reads oder Host-Memory-Druck.
    2. Konfiguration prüfen: SGA_TARGET, SGA_MAX_SIZE, PGA_AGGREGATE_TARGET, PGA_AGGREGATE_LIMIT und gegebenenfalls MEMORY_TARGET.
    3. Aktuelle Nutzung und Peaks über V$SGAINFO, V$SGASTAT, V$PGASTAT und V$PROCESS erfassen.
    4. Workarea-Verhalten über V$SQL_WORKAREA_HISTOGRAM bewerten.
    5. Advisor-Werte nur als Modell der beobachteten Workload lesen.
    6. Host-RAM, weitere Instances und betriebliche Reserve einbeziehen.
    7. Erst dann Verbesserungspotenzial formulieren und eine mögliche Zielgröße fachlich begründen.
    8. Nach einer administrativ freigegebenen Änderung dieselbe Workload erneut messen und vergleichen.
    1. Fehlerbild bestimmen ORA-04031, ORA-04030 und ORA-04036 sind unterschiedliche Fehlerbilder. Erst den genauen Fehlertext und den betroffenen Speicherbereich bestimmen.
    2. Zeitraum festhalten Aktuelle Werte und Peaks seit Instanzstart unterscheiden. Maximum-Werte ohne STARTUP_TIME können falsch interpretiert werden.
    3. Verbraucher identifizieren Nicht nur Gesamtwerte betrachten. Prozesse, Sessions, SQL, Workareas und Parse-Verhalten zum Fehlerzeitpunkt korrelieren.
    4. SGA und PGA gemeinsam denken Beide Speicherarten konkurrieren letztlich mit Oracle-Prozessen, Betriebssystem und anderen Anwendungen um denselben physischen Host-RAM.
    5. Keine automatische Vergrößerung Ein Parameterwert sollte erst geändert werden, wenn die Ursache nachvollziehbar belegt und die Auswirkung auf den Host bewertet wurde.
    6. Nachher messen Nach jeder geplanten Änderung müssen dieselben Kennzahlen erneut verglichen werden. Ohne Vorher-/Nachher-Werte ist kein belastbarer Tuning-Nachweis möglich.
    Wichtig für die Praxis: SGA und PGA dürfen nicht einfach auf feste Prozentwerte des Host-RAM verteilt werden. Die passende Dimensionierung hängt von Datenbankgröße, Working Set, SQL-Charakteristik, Zahl paralleler Prozesse, Betriebssystem, weiteren Instanzen und dem tatsächlichen Lastprofil ab.
    Ein hoher Cache-Hit-Wert allein beweist keine gute Performance. Entscheidend ist, ob die Anwendungen ihre Arbeit mit vertretbarer DB Time, I/O-Menge, Speicherverbrauch und Antwortzeit ausführen.

    28. Diagnosekette: PGA-Druck

    Fortsetzung des Intervallbeispiels: 10 % der zusätzlichen Workarea-Ausführungen liefen nicht optimal. Das beweist noch keinen Engpass. Die aktuelle Workarea aus Abschnitt 16 zeigt einen konkreten SORT mit TEMP-Segment. Ordne seine Ausführung und Session zu und prüfe, ob TEMP-I/O und Antwortzeit im selben Zeitraum auffällig sind. Ein alter Over-Allocation-Zählerstand ohne Zunahme wäre kein Nachweis neuen Drucks.

    29. Diagnosekette: Shared-Pool-Auffälligkeit

    Abzweig bei ORA-04031: Der Workarea-Spill aus Abschnitt 28 erklärt diesen Fehler nicht. Prüfe den im Fehler genannten Shared-Memory-Pool, Zeitpunkt, Allokationsgröße und passende Parse-/Cursor-Befunde. Verwende dazu die Speicherverteilung aus Abschnitt 22 und die Diagnose im SQL-/Cursor-Kapitel.

    30. Diagnosekette: Buffer Cache wirkt zu klein

    Abzweig bei vielen Physical Reads: Der Cache Advisor aus Abschnitt 23 modelliert für 1536 statt 1024 MB 15 % weniger Reads. Das ist keine Zusage von 15 % kürzerer Antwortzeit. Prüfe zunächst den I/O-Anteil am Problem und die SQL-Arbeitsmenge. Danach folgt die Hostbilanz aus Abschnitt 24; zusätzlicher Cache darf keine andere Instanz oder die PGA verdrängen.

    31. Vorher-/Nachher-Messung bei Memory-Änderungen

    BereichVorher/Nachher vergleichenWarum?
    Buffer CachePhysical Reads, relevante User-I/O-Zeit, DB TimeZeigt, ob zusätzlicher Cache tatsächlich Arbeit/I/O reduziert.
    Shared PoolParse-/Reload-Symptome, ORA-04031, SGA-VerteilungPrüft, ob das ursprüngliche Shared-Pool-Problem kleiner wurde.
    PGAOver Allocation Count, Onepass/Multipass, TEMP-I/O, Peak-PGAZeigt, ob Workareas besser im Speicher bleiben.
    Hostfreier RAM, Paging/Swap, andere InstancesVerhindert eine lokale Verbesserung auf Kosten des Gesamtsystems.
    AnwendungAntwortzeit / DurchsatzEine Speicheränderung ist nur sinnvoll, wenn der relevante Workload profitiert.

    32. Typische Memory-Fehlannahmen

    AussageBewertungKorrekte Einordnung
    SGA_TARGET ist die Summe des gesamten Oracle-RAM-Verbrauchs.FalschPGA, Prozessoverhead und weitere Speicherbereiche müssen separat betrachtet werden.
    PGA_AGGREGATE_TARGET ist ein hartes Limit.FalschEs ist ein Zielwert für automatische PGA-/Workarea-Steuerung.
    Maximum PGA Allocated ist die aktuelle PGA.FalschEs ist ein Peak seit Instance-Start.
    99 % PGA Cache Hit bedeutet automatisch optimale PGA.Zu pauschalOver Allocations, Workarea-Spills, TEMP-I/O und Workload müssen mitbewertet werden.
    TEMP-Nutzung bedeutet immer zu wenig PGA.FalschGroße Operationen können TEMP auch bei sinnvoller Dimensionierung benötigen.
    Hohe Buffer Cache Hit Ratio beweist gute SQL-Performance.FalschAuch sehr viele Logical Reads können teuer sein.
    ORA-04031 und ORA-04030 sind dasselbe Problem.FalschORA-04031 betrifft Shared Memory; ORA-04030 Prozessspeicher.
    Advisor-Empfehlung bedeutet, dass der Parameter geändert werden soll.FalschAdvisor-Werte sind Modellrechnungen für beobachtete Workload.
    Mehr RAM für eine Instance ist immer positiv.FalschHost-RAM, weitere Instances und Betriebssystemreserve setzen Grenzen.

    33. Oracle-19c-Dokumentation als fachliche Grundlage

    Die Speichererklärungen und Diagnosewege dieses Kapitels orientieren sich an der Oracle Database 19c Performance Tuning Guide, der Oracle Database Reference und den dort dokumentierten Dynamic Performance Views. Die praktischen Abfragen bleiben bewusst read-only.

    Oracle Database 19c Performance Tuning Guide
    Tuning the System Global Area / Tuning the Shared Pool and the Large Pool / PGA- und Workarea-Tuning
    https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/

    Oracle Database 19c Reference
    V$SGAINFO, V$SGASTAT, V$SGA_DYNAMIC_COMPONENTS, V$SGA_RESIZE_OPS, V$PGASTAT, V$PROCESS, V$SQL_WORKAREA_HISTOGRAM, V$SQL_WORKAREA_ACTIVE und Advisor-Views
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/
    Praxisbeispiel: TEMP wächst bei großer Sortierung

    Eine Abfrage erzeugt viel TEMP-I/O.

    Was prüfst du?
    Möglicherweise passt eine Workarea nicht vollständig in die PGA und weicht auf TEMP aus. SQL, Workarea-Verhalten und PGA-Kontext prüfen.
    Lerneffekt: TEMP-Nutzung kann Symptom eines Workarea-/PGA-Themas sein.
    Vertiefende Oracle-19c-Quellen: PGA-Limit · PGA-Statistik · Speicher unter Linux
    Oracle-19c-Referenzen zu den Präzisierungen: AMM und ASMM · PGA-Advisor-Aktualität · Cache-Advisor-Status · Workarea-Identität

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Die SGA ist gemeinsam genutzter Instanzspeicher; die PGA ist prozessbezogener Speicher. Buffer Cache, Shared Pool und Workareas erfüllen unterschiedliche Aufgaben.
    2. ASMM und AMM steuern Speicher auf unterschiedlichen Ebenen. Vor einer Bewertung muss geklärt werden, welches Verfahren und welche Ziel- und Grenzwerte tatsächlich aktiv sind.
    3. Ein konfigurierter Target-Wert ist nicht automatisch die aktuelle Belegung oder eine harte Obergrenze. Aktuelle Allokation, Spitzenwerte und Limits werden getrennt gelesen.
    4. Workareas können optimal im Speicher, mit einem Durchlauf oder mit mehreren Durchläufen über TEMP arbeiten. Diese Unterschiede helfen, möglichen Speicherdruck zu beurteilen.
    5. Memory Advisor modellieren alternative Größen; der Report leitet daraus nach eigenen Regeln Empfehlungen ab. Cache-Reads, Shared-Pool-Parse-Zeit und PGA-Over-Allocations sind unterschiedliche Ziele. Hostreserve und eine vergleichbare Nachmessung entscheiden mit.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Die Antworten sind bewusst eingeklappt.
    Frage 1: Was ist der Grundunterschied zwischen SGA und PGA?
    Die SGA ist gemeinsam genutzter Instanzspeicher. PGA ist privater Prozessspeicher; die aggregierte PGA ergibt sich aus dem Speicher vieler Oracle-Prozesse.
    Frage 2: Was unterscheidet ASMM und AMM?
    Bei ASMM verwaltet SGA_TARGET dynamische SGA-Komponenten, während die PGA separat gesteuert wird. Bei AMM bildet MEMORY_TARGET einen gemeinsamen Zielrahmen für SGA und Instance-PGA.
    Frage 3: Warum ist PGA_AGGREGATE_TARGET kein hartes Limit?
    Es ist ein Zielwert für die automatische PGA-/Workarea-Steuerung. Der tatsächliche aggregierte PGA-Verbrauch kann darüber liegen. PGA_AGGREGATE_LIMIT erfüllt eine andere, begrenzende Funktion.
    Frage 4: Was bedeutet maximum PGA allocated?
    Es ist der seit Instance-Start beobachtete Peak der aggregierten PGA-Allokation und nicht die aktuelle PGA-Nutzung.
    Frage 5: Was bedeuten optimal, onepass und multipass?
    Sie beschreiben, ob eine Workarea ohne zusätzliche Disk-Passes auskam oder TEMP-I/O in einem beziehungsweise mehreren zusätzlichen Durchläufen benötigte.
    Frage 6: Warum beweist TEMP-Nutzung nicht automatisch eine zu kleine PGA?
    Große Sort-/Hash-Operationen können TEMP auch bei sinnvoller Dimensionierung verwenden. Workload, Workarea-Spills, TEMP-I/O-Zeit und Host-RAM müssen gemeinsam betrachtet werden.
    Frage 7: Was zeigt over allocation count?
    Wie oft Oracle zusätzliche PGA oberhalb des Zielwerts bereitstellen musste. Workarea-Bedarf und andere PGA-Verbraucher, etwa PL/SQL, gehören gemeinsam zur Analyse. Der Wert ist ein Diagnosehinweis und keine automatische Change-Anweisung.
    Frage 8: Warum ist eine Buffer Cache Hit Ratio allein kein ausreichendes Tuning-Kriterium?
    Sie zeigt nicht, ob SQL unnötig viele Logical Reads erzeugt, wie relevant physische I/O für DB Time ist oder ob die Benutzerantwortzeit gut ist.
    Frage 9: Worin unterscheiden sich ORA-04031 und ORA-04030?
    ORA-04031 betrifft eine nicht erfüllte Shared-Memory-Allokation in der SGA. ORA-04030 betrifft Prozessspeicher/PGA.
    Frage 10: Beweist eine gefüllte Advisor-View eine aktuelle Empfehlung?
    Nein. Aktivierungszustand, Statistikstufe und Beobachtungszeitraum prüfen; historische Zeilen können bestehen bleiben. Außerdem sind Oracle-Schätzung und Reportregel zu trennen: „ZU KLEIN“ oder eine 5-%-Schwelle sind Bewertungen des Reports. 0 geschätzte PGA-Over-Allocations garantiert keinen TEMP-freien Betrieb. Erst geeignete Lastdaten, Hostprüfung und Nachmessung machen daraus eine belastbare Entscheidung.
    Frage 11: Warum muss Host-RAM immer mitbetrachtet werden?
    SGA, PGA, weitere Oracle-Instances, Betriebssystem und andere Prozesse konkurrieren um denselben physischen Speicher. Eine lokale Datenbankverbesserung darf kein Paging oder Speicherdruck auf Hostebene erzeugen.
    Frage 12: Wann ist eine Memory-Änderung technisch nachgewiesen?
    Wenn bei vergleichbarem Workload dieselben Kennzahlen vorher und nachher erhoben wurden, das ursprüngliche Problem messbar besser ist und auf Host- oder anderen Instance-Ebenen keine relevante Nebenwirkung entstanden ist.

    23. UNDO und Flashback – alte Datenversionen, Read Consistency und Recovery verstehen

    Warum Oracle alte Blockzustände benötigt und wie daraus Rollback, konsistente Abfragen und Flashback-Funktionen entstehen.

    Lernkompass
    Einfach gesagt Du lernst, warum Oracle UNDO benötigt und wie Rollback, Read Consistency, Instance Recovery und Flashback-Funktionen damit zusammenhängen.
    Warum ist das wichtig? UNDO-Probleme zeigen sich nicht nur beim Rollback. Lange Abfragen, konkurrierende Transaktionen, ORA-01555, Retention und Tablespace-Auslastung müssen gemeinsam betrachtet werden.
    Nach diesem Kapitel Du kannst UNDO-Konfiguration und Nutzung untersuchen, administrative Änderungen begründet planen und die Abläufe für historische Abfragen und die unterschiedlichen Flashback-Verfahren erklären.

    Einführung: UNDO besteht aus Informationen, die Oracle zu Änderungen von Transaktionen festhält. Oracle nutzt sie für mehrere interne Aufgaben. Flashback ist eine Familie verschiedener Funktionen, mit denen sich frühere Datenstände abfragen oder Daten zurücksetzen lassen. Diese Funktionen arbeiten nicht alle gleich: Eine historische Abfrage liest einen früheren Stand, während ein Wiederherstellungsverfahren den aktuellen Datenzustand verändern kann.

    Das Kapitel erklärt zuerst, welche Aufgaben UNDO erfüllt, und zeigt anschließend am Kundenbeispiel den Unterschied zwischen einer offenen Änderung, ROLLBACK, COMMIT und einer historischen Flashback Query. Danach folgen Konfiguration, Aufbewahrung und Diagnose, bevor die unterschiedlichen Flashback-Verfahren mit ihren Voraussetzungen und Grenzen eingeordnet werden.

    Oracle 19c: fachliche Grundlage

    Oracle 19c SE2: Flashback Query liest frühere Datenstände aus UNDO. Flashback Table und Flashback Database stehen in SE2 nicht zur Verfügung; ihre folgenden Beschreibungen dienen der technischen Abgrenzung. Flashback Drop über den Recycle Bin ist davon zu unterscheiden. Oracle-19c-Funktionsmatrix.

    Den Zusammenhang zwischen Transaktionsgrenzen, Sichtbarkeit und Abfrage-Snapshots erklärt Kapitel 11 – Transaktionen und Read Consistency verstehen.

    UNDO ist keine eigenständige Sicherungskopie einer Tabelle. Für einen Rückblick müssen die benötigten historischen Informationen noch verfügbar sein. Genau diese Verfügbarkeit untersuchen wir nach dem Grundprinzip.

    1. Die vier Kernaufgaben von UNDO

    Rollback: Nicht gewünschte oder nicht abgeschlossene Änderungen können logisch zurückgenommen werden.

    Read Consistency: Eine Abfrage kann eine konsistente Sicht passend zu ihrem Abfragezeitpunkt erhalten, auch wenn andere Sessions Daten parallel verändern.

    Transaction Recovery: Nach einem Instance-Ausfall werden nicht committete Transaktionen im Rahmen der Recovery logisch zurückgenommen.

    Flashback: Mehrere Flashback-Funktionen verwenden historische Informationen, wobei die konkrete technische Grundlage je nach Flashback-Funktion unterschiedlich ist.

    Merksatz:

    Redo beschreibt, wie Änderungen für Recovery wiederholt werden können.
    Undo ermöglicht unter anderem das logische Zurücknehmen von Änderungen und konsistente frühere Datenbilder.

    2. Beispiel: Zwei Sessions zur gleichen Zeit

    10:00 SELECT startet→10:01 andere Session ändert→COMMIT→SELECT liest alten konsistenten Stand

    Die laufende SELECT-Abfrage soll nicht plötzlich mitten im Ergebnis die neue Version sehen. Oracle rekonstruiert deshalb bei Bedarf die zum Abfragezeitpunkt passende Version mit Hilfe von UNDO.

    3. Rollback

    Bei einem Rollback verwendet Oracle Undo-Informationen, um noch nicht bestätigte Änderungen einer Transaktion logisch zurückzunehmen. Ohne Undo wäre ein normales Transaktions-Rollback nicht möglich.

    Durchgehendes Kundenbeispiel: erst zurücknehmen, dann historisch lesen

    Wir vertiefen das bereits verwendete Beispiel APP.KUNDE mit KUNDE_ID 4711. Der bestätigte Ausgangswert ist AKTIV. Zuerst wird eine Änderung zurückgenommen. Danach wird dieselbe Änderung bestätigt und der frühere Stand mit Flashback gelesen. Die Befehle werden nacheinander in derselben SQL*Plus-Session ausgeführt.

    Voraussetzungen: Ein vorbereitetes, isoliertes Lernschema mit einer bereits bestehenden Tabelle APP.KUNDE und genau einer Zeile für KUNDE_ID 4711, STATUS AKTIV. Keine anderen offenen Änderungen, keine parallelen Schreiber und keine DDL zwischen den Schritten. Benötigt werden SELECT und UPDATE auf der Tabelle sowie für historische Abfragen das FLASHBACK-Objektrecht, sofern nicht als Eigentümer gearbeitet wird. Für die SCN-Abfrage ist ein entsprechendes Leserecht auf V$DATABASE erforderlich. Diese Rechte gezielt bereitstellen lassen; keine SYS-Anmeldung für die Datenänderung verwenden. Bei einer neu angelegten Lerntabelle die Oracle-Hinweise zur Flashback-Nutzung unmittelbar nach CREATE TABLE beachten. Alle Ausgaben sind fiktiv; die SCN wird tatsächlich aus der eigenen Datenbank übernommen.

    Schritt 1: Ausgangswert und Zeitmarke festhalten

    SQL*Plus – lesender Ausgangspunkt
    SET AUTOCOMMIT OFF
    SELECT kunde_id, status FROM app.kunde WHERE kunde_id = 4711;
    COLUMN start_scn FORMAT 99999999999999999999 NEW_VALUE HIST_SCN
    SELECT current_scn AS start_scn FROM v$database;

    Fiktive Beispielausgabe:

    KUNDE_ID  STATUS
    --------  ------
    4711      AKTIV
    
    START_SCN
    ---------
    123456789

    Was sehe ich hier? Der Kunde ist zunächst AKTIV. COLUMN … NEW_VALUE speichert die ausgegebene SCN in der SQL*Plus-Variablen HIST_SCN. Die Musterzahl ist nicht manuell einzusetzen. SET AUTOCOMMIT OFF steuert den Client, nicht die Undo-Verwaltung.

    Wenn keine Zeile, mehrere Zeilen oder ein anderer Ausgangswert erscheinen, passt die Vorbereitung nicht zum gezeigten Ablauf. Erst diesen Unterschied klären. Die bestätigte Ausgangszeile muss bereits vor der erfassten SCN existieren.

    Schritt 2: Ändern, aber noch nicht bestätigen

    SQL*Plus – schreibender Schritt im Lernschema
    UPDATE app.kunde SET status = 'GESPERRT' WHERE kunde_id = 4711;
    SELECT kunde_id, status FROM app.kunde WHERE kunde_id = 4711;

    Fiktive Beispielausgabe:

    1 row updated.
    
    KUNDE_ID  STATUS
    --------  --------
    4711      GESPERRT

    Was sehe ich hier? Die eigene Session sieht ihre offene Änderung. Die Meldung „1 row updated“ bestätigt die betroffene Zeilenzahl, aber noch keinen COMMIT. Oracle hat Undo-Informationen für die Rücknahme erzeugt. Eine andere Session sieht bei einem normalen SELECT weiterhin den bestätigten Ausgangswert.

    Schritt 3: Die offene Änderung zurücknehmen

    SQL*Plus – Transaktion zurücknehmen und prüfen
    ROLLBACK;
    SELECT kunde_id, status FROM app.kunde WHERE kunde_id = 4711;

    Fiktive Beispielausgabe:

    Rollback complete.
    
    KUNDE_ID  STATUS
    --------  ------
    4711      AKTIV

    Was sehe ich hier? ROLLBACK beendet die Transaktion und nimmt deren offene Änderungen zurück. Deshalb ist der Kunde wieder AKTIV. Das ist die direkte Nutzung von UNDO zur Rücknahme; eine Flashback-Abfrage wird dafür nicht gebraucht.

    Schritt 4: Erneut ändern und diesmal bestätigen

    SQL*Plus – Änderung bestätigen; Rollback-Grenze beobachten
    UPDATE app.kunde SET status = 'GESPERRT' WHERE kunde_id = 4711;
    COMMIT;
    ROLLBACK;
    SELECT kunde_id, status FROM app.kunde WHERE kunde_id = 4711;

    Fiktive Beispielausgabe:

    1 row updated.
    Commit complete.
    Rollback complete.
    
    KUNDE_ID  STATUS
    --------  --------
    4711      GESPERRT

    Was sehe ich hier? COMMIT hat die Änderung abgeschlossen. Das nachfolgende ROLLBACK ist hier absichtlich enthalten: Es kann diese bereits bestätigte Änderung nicht zurücknehmen. Auch seine Erfolgsmeldung bedeutet nicht, dass eine historische Transaktion zurückgesetzt wurde.

    COMMIT gibt Transaktionssperren frei und entfernt Savepoints. Es leert nicht einfach den Undo-Tablespace. Historische Informationen können weiterhin für konsistente Abfragen und Flashback benötigt werden, bis ihr Platz wiederverwendet wird.

    Schritt 5: Den früheren Stand mit Flashback Query ansehen

    SQL*Plus – historische Abfrage, keine Datenänderung
    SELECT kunde_id, status
    FROM app.kunde AS OF SCN &HIST_SCN
    WHERE kunde_id = 4711;

    Fiktive Beispielausgabe:

    KUNDE_ID  STATUS
    --------  ------
    4711      AKTIV

    Was sehe ich hier? SQL*Plus ersetzt &HIST_SCN durch die in Schritt 1 gespeicherte SCN. Oracle liefert den damaligen bestätigten Stand. Die aktuelle Tabelle bleibt GESPERRT. Das funktioniert nur, solange die benötigte Historie verfügbar und der Rückblick technisch zulässig ist.

    Schritt 6: Historischen und aktuellen Zustand gemeinsam prüfen

    SQL*Plus – beide Datenstände gegenüberstellen
    SELECT 'HISTORISCH' AS datenstand, kunde_id, status
    FROM app.kunde AS OF SCN &HIST_SCN
    WHERE kunde_id = 4711
    UNION ALL
    SELECT 'AKTUELL', kunde_id, status
    FROM app.kunde
    WHERE kunde_id = 4711
    ORDER BY datenstand;

    Fiktive Beispielausgabe:

    DATENSTAND  KUNDE_ID  STATUS
    ----------  --------  --------
    AKTUELL     4711      GESPERRT
    HISTORISCH  4711      AKTIV

    Was sehe ich hier? Beide Zeilen gehören zum selben Kunden, aber zu verschiedenen Datenständen. Damit ist der Unterschied belegt: ROLLBACK hat zuvor eine offene Änderung zurückgenommen; Flashback Query hat jetzt eine frühere Version gelesen.

    Endzustand des Beispiels: Der Kunde bleibt aktuell GESPERRT. Eine fachlich gewünschte Rückkehr zu AKTIV wäre eine gesonderte, geprüfte Änderung und würde erst mit einem neuen COMMIT bestätigt. Ein SELECT AS OF erledigt das nicht. In produktiven Anwendungen müssen dabei insbesondere zwischenzeitliche Änderungen und abhängige Geschäftsprozesse berücksichtigt werden.

    Wenn Schritt 5 scheitert: Fehlende Rechte, nicht mehr verfügbares Undo, eine ungeeignete SCN oder zwischenzeitliche Strukturänderungen prüfen. Eine später erhöhte UNDO_RETENTION stellt bereits überschriebene Informationen nicht wieder her. Eine erfolgreiche Abfrage beweist wiederum nur diesen konkreten Rückblick, keine dauerhaft garantierte Historie.

    Ergänzung: Nur einen Teil einer offenen Transaktion zurücknehmen

    Ein SAVEPOINT markiert einen Zwischenstand innerhalb der aktuellen Transaktion. Mit SAVEPOINT vor_aenderung; vor einer Änderung und ROLLBACK TO SAVEPOINT vor_aenderung; danach werden nur die Änderungen seit dieser Marke zurückgenommen. Die Transaktion bleibt offen. Sie muss anschließend bewusst mit COMMIT oder ROLLBACK beendet werden. Nach einem COMMIT stehen ihre Savepoints nicht mehr zur Verfügung.

    Oracle 19c: ROLLBACK · COMMIT · Flashback Query

    4. Read Consistency

    Read Consistency sorgt dafür, dass eine Query einen logisch zusammengehörenden Datenstand sieht. Das ist ein Grund, warum Leser und Schreiber in Oracle nicht bei jeder normalen Situation gegenseitig blockieren müssen.

    5. SCN – die logische Zeit der Datenbank

    Die System Change Number ordnet Datenbankänderungen logisch. Eine Query kann damit bestimmen, welche Datenversion zu ihrer konsistenten Sicht gehört. SCN ist daher ein zentrales Konzept für Recovery und Flashback.

    Aktuelle SCN
    SELECT current_scn FROM v$database;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    CURRENT_SCN
    123456789

    Was sehe ich hier? Die SCN ist eine logische Datenbank-Zeitmarke, keine Uhrzeit in Sekunden. Eine spätere Abfrage kann bereits eine andere SCN liefern.

    Was sehe ich hier?

    Read-only im CDB-Root: Local Undo feststellen

    Read-only im CDB-Root: Local Undo feststellen
    SELECT property_name, property_value
    FROM database_properties
    WHERE property_name = 'LOCAL_UNDO_ENABLED';

    Fiktive Beispielausgabe:

    PROPERTY_NAMEPROPERTY_VALUE
    LOCAL_UNDO_ENABLEDTRUE

    Was sehe ich hier? Die CDB verwendet Local Undo. Die nachfolgenden Objekt-, Datei- und Parameterabfragen werden in der betroffenen PDB ausgeführt. Bei Shared Undo muss die Diagnose dem gemeinsam verwendeten Root-Undo zugeordnet werden; ein PDB-Parameter allein reicht dann nicht.

    Den aktuellen Container vor der Diagnose über SYS_CONTEXT('USERENV', 'CON_NAME') prüfen. Der Generator wechselt keine Container und führt keine Abfragen aus.

    6. Automatic Undo Management

    Bei Automatic Undo Management verwaltet Oracle die Undo-Segmente selbst in einem Undo-Tablespace. Der DBA dimensioniert und überwacht den Bereich, muss aber nicht wie in alten Architekturen einzelne Rollback-Segmente manuell steuern.

    UNDO-Konfiguration
    SELECT name, value
    FROM v$parameter
    WHERE name IN ('undo_management','undo_tablespace','undo_retention')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUE
    undo_managementAUTO
    undo_retention900
    undo_tablespaceUNDOTBS1

    Was sehe ich hier? Die Instanz verwendet automatische Undo-Verwaltung und UNDOTBS1. UNDO_RETENTION=900 entspricht 15 Minuten als Einstellung, garantiert allein aber keinen erfolgreichen Flashback über dieses Zeitfenster.

    7. UNDO_RETENTION: Zielwert und keine pauschale Platzgarantie

    UNDO_RETENTION beschreibt die angestrebte Mindestaufbewahrung in Sekunden. Oracle 19c berücksichtigt diesen Wert ab Release Update 19.7 sowohl bei automatisch wachsenden als auch bei fest dimensionierten Undo-Tablespaces und passt die Aufbewahrung an den Abfragebedarf an. Reicht der Platz für aktive Transaktionen nicht und ist keine RETENTION GUARANTEE aktiv, können noch nicht abgelaufene Undo-Informationen wiederverwendet werden.

    Ab Oracle 19c Release Update 19.9 wird UNDO_RETENTION nicht vom CDB-Root an PDBs vererbt. Eine Einstellung im Root bestätigt daher nicht den wirksamen Wert einer PDB. Prüfe den Wert im jeweils untersuchten Container. Die Änderbarkeit in einer PDB setzt Local Undo voraus; bei Shared Undo kann der Parameter dort nicht geändert werden. Diese Diagnose nimmt keine Parameteränderung vor. Oracle 19c: UNDO_RETENTION und RU-bezogene Einschränkungen.

    8. Retention Guarantee: Schutz mit einer Betriebsfolge

    RETENTION GUARANTEE schützt nicht abgelaufenes Undo vor Wiederverwendung. Reicht der verbleibende Platz für neue Änderungen nicht, können stattdessen DML-Operationen scheitern. Die Garantie schafft keinen zusätzlichen Speicher und ist deshalb keine pauschale Lösung für ORA-01555.

    Der vorhandene Zustand kann in DBA_TABLESPACES.RETENTION gelesen werden: GUARANTEE, NOGUARANTEE oder NOT APPLY. Automatisches Retention-Tuning gilt außerdem nicht in gleicher Weise für LOB-Historie, die im LOB-Segment verwaltet wird. Eine allgemeine Undo-Zeitangabe beweist deshalb nicht die Verfügbarkeit jeder alten LOB-Version.

    Typische Fehlinterpretation: „UNDO_RETENTION=3600 bedeutet, dass eine Stunde Undo garantiert vorhanden ist.“ Das ist ohne passende Kapazität und Retention Guarantee nicht allgemein richtig.
    Was sehe ich hier?

    Read-only im betroffenen Container: Undo-Dateien und Wachstumsgrenzen

    Read-only im betroffenen Container: Undo-Dateien und Wachstumsgrenzen
    SELECT t.tablespace_name, t.retention, t.block_size,
           d.file_id, d.file_name,
           ROUND(d.bytes / 1024 / 1024, 2) AS current_mib,
           d.autoextensible,
           ROUND(d.maxbytes / 1024 / 1024, 2) AS max_mib,
           CASE WHEN d.autoextensible = 'YES'
                THEN ROUND(GREATEST(d.maxbytes-d.bytes,0) / 1024 / 1024,2)
                ELSE 0 END AS growth_mib
    FROM dba_tablespaces t
    JOIN dba_data_files d ON d.tablespace_name=t.tablespace_name
    WHERE t.contents='UNDO'
    ORDER BY t.tablespace_name,d.file_id;

    Fiktive Beispielausgabe:

    TABLESPACE_NAMERETENTIONBLOCK_SIZEFILE_IDFILE_NAME
    UNDOTBS1NOGUARANTEE81927/oradata/APPDB/undo01.dbf

    Was sehe ich hier? Zusammengehörige Teilansichten einer Datei. Den aktiven Tablespace zusätzlich mit UNDO_TABLESPACE aus Abschnitt 6 abgleichen.

    CURRENT_MIBAUTOEXTENSIBLEMAX_MIBGROWTH_MIB
    2048YES40962048

    2048 MiB aktueller Dateigröße stehen 2048 MiB konfigurierter Wachstumsreserve gegenüber. Die Reserve ist kein Nachweis freier Storage-Kapazität. Autoextend benötigt tatsächlich verfügbaren Platz. EXPIRED-Extents sind wiederverwendbar; zugeordnete Extents, unzugeordneter freier Dateiplatz und künftiges Wachstum sind getrennte Größen.

    9. TUNED_UNDORETENTION

    Oracle berechnet anhand des realen Verbrauchs und des verfügbaren Platzes eine effektive Retention. Dieser Wert ist für die Diagnose oft interessanter als nur der statische Parameter.

    10. V$UNDOSTAT als Zeitreihe lesen

    Zeilen korrekt lesen: UNDOBLKS ist der Verbrauch im Statistikintervall, nicht der aktuelle Tablespace-Füllstand. MAXQUERYLEN und TUNED_UNDORETENTION sind Sekundenwerte. Das jüngste Intervall kann noch unvollständig sein; 48 Zeilen entsprechen deshalb ungefähr acht Stunden. In einer CDB mit Local Undo müssen die Werte zum untersuchten Container passen.

    V$UNDOSTAT arbeitet mit typischerweise zehnminütigen Statistikintervallen und hält diese für die letzten vier Tage. Wichtig sind unter anderem UNDOBLKS, TXNCOUNT, MAXQUERYLEN, SSOLDERRCNT, NOSPACEERRCNT und TUNED_UNDORETENTION.

    Undo-Trend
    SELECT begin_time,
           end_time,
           undoblks,
           txncount,
           maxquerylen,
           maxconcurrency,
           tuned_undoretention,
           ssolderrcnt,
           nospaceerrcnt,
           unxpstealcnt,
           unxpblkreucnt
    FROM v$undostat
    ORDER BY begin_time DESC
    FETCH FIRST 48 ROWS ONLY;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    BEGIN_TIMEEND_TIMEUNDOBLKSTXNCOUNTMAXQUERYLEN
    2026-10-08 09:50:002026-10-08 10:00:0012000800720
    MAXCONCURRENCYTUNED_UNDORETENTIONSSOLDERRCNTNOSPACEERRCNTUNXPSTEALCNTUNXPBLKREUCNT
    1490010264

    So liest du das Ergebnis: Das Beispiel zeigt einen Snapshot-too-old-Fehler ohne gemeldeten No-Space-Fehler. Die aggregierten Retention- und Laufzeitwerte beweisen nicht, dass jede benötigte alte Version verfügbar war. Betroffene Abfrage und Fehlerzeitpunkt weiter eingrenzen.

    Was sehe ich hier?

    V$UNDOSTAT fasst Undo-Kennzahlen in Zeitintervallen zusammen. ORA-01555- und Retention-Aussagen sollten immer über mehrere passende Intervalle betrachtet werden.

    MAXQUERYLEN zeigt die längste Query im jeweiligen Intervall. SSOLDERRCNT zeigt Snapshot-too-old-Ereignisse. NOSPACEERRCNT weist auf Undo-Platzprobleme hin. Erst im zeitlichen Zusammenhang werden diese Werte aussagekräftig.

    UNXPSTEALCNT zählt Versuche, nicht abgelaufene Extents zu übernehmen; UNXPBLKREUCNT zählt wiederverwendete nicht abgelaufene Blöcke. Das sind unterschiedliche Einheiten. MAXQUERYLEN misst vom Cursor-Öffnen bis zum letzten Fetch/Execute; die Abfrage kann vor dem Intervall begonnen haben. MAXQUERYID im Praxisabschnitt identifiziert die längste erfasste SQL, nicht automatisch die SQL mit ORA-01555.

    Rechenbeispiel: 12000 Undo-Blöcke × nachgewiesene 8192 Bytes = 93,75 MiB in 600 Sekunden, also 0,15625 MiB/s. Bei gleicher Rate entsprechen 900 Sekunden ungefähr 140,6 MiB. Das ist eine Verbrauchsrechnung ohne aktive Transaktionen, Lastspitzen und Reserve, keine fertige Größenempfehlung. Für das jüngste Teilintervall die tatsächliche Differenz END_TIME−BEGIN_TIME in Sekunden verwenden.

    11. ACTIVE, UNEXPIRED und EXPIRED

    StatusWas bedeutet das?
    ACTIVEUndo wird noch von einer laufenden Transaktion benötigt.
    UNEXPIREDTransaktion ist beendet, Undo soll noch für Read Consistency/Retention erhalten bleiben.
    EXPIREDUndo darf bei Platzbedarf wiederverwendet werden.

    12. Lange Transaktionen und Undo-Verbrauch

    Eine große oder lange Transaktion kann sehr viel ACTIVE Undo halten. Deshalb darf eine Undo-Analyse nicht nur die Tablespace-Größe betrachten; auch V$TRANSACTION und die verursachenden Sessions gehören dazu.

    Aktive Transaktionen
    SELECT s.sid,
           s.serial#,
           s.username,
           s.sql_id,
           t.used_ublk,
           t.used_urec,
           t.start_date
    FROM v$transaction t
    JOIN v$session s ON s.taddr=t.addr
    ORDER BY t.used_ublk DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESQL_IDUSED_UBLK
    11423817APP_USER8u3k2m9p4q7r18
    ZeileUSED_URECSTART_DATE
    112008.10.2026 09:58:00

    Was sehe ich hier? Ausschnitt offener Transaktionen, nach Undo-Blöcken sortiert. START_DATE ist hier ein DATE-Wert. Acht Undo-Blöcke und 120 Undo-Einträge sind nicht gleich acht Tabellenblöcke oder genau 120 geänderte Zeilen.

    13. ORA-01555 – Schritt für Schritt

    10:00 lange SELECT→viele Änderungen→altes Undo wiederverwendet→SELECT braucht alte Version→ORA-01555

    ORA-01555: snapshot too old bedeutet vereinfacht, dass Oracle für eine konsistente Lesesicht benötigte historische Informationen nicht mehr in der erforderlichen Form rekonstruieren kann. Ein häufiger Kontext ist, dass benötigtes Undo inzwischen wiederverwendet wurde.

    Die Ursache darf jedoch nicht automatisch auf „UNDO zu klein“ reduziert werden. Abfragedauer, Undo-Erzeugungsrate, Tablespace-Kapazität, UNDO_RETENTION, Retention-Verhalten und das SQL-/Anwendungsmuster gehören gemeinsam in die Analyse.

    Besonders wichtig: UNDO_RETENTION ist bei einem normal konfigurierten Autoextend-UNDO-Tablespace nicht pauschal eine Garantie, dass jede Undo-Information exakt so lange verfügbar bleibt. Das tatsächliche Verhalten hängt von der Tablespace-Konfiguration und dem Platzbedarf ab.

    14. Warum „UNDO vergrößern“ nicht immer die erste Antwort ist

    Eine schlecht formulierte SQL kann unnötig lange laufen. Eine Anwendung kann extrem viel Undo erzeugen. Eine Transaktion kann ungewöhnlich groß sein. Deshalb muss vor einer Größenänderung geklärt werden, welche Ursache vorliegt.

    UNDO verwalten: vom Befund zur Änderung

    Beginne mit den vorhandenen Abfragen: Container und Local/Shared Undo, UNDO_MANAGEMENT, UNDO_TABLESPACE, Dateien und V$UNDOSTAT. Dokumentiere die bisherigen Werte. Leite den Bedarf aus repräsentativen Lastspitzen, aktiven Transaktionen und dem benötigten Rückblick ab. Eine hohe Belegung allein ist kein Grund für einen Wechsel; EXPIRED kann wiederverwendbar sein.

    Reicht die Kapazität nicht, prüfe zuerst die Erweiterung des bestehenden Tablespaces nach Kapitel 8. Bigfile erlaubt keine zweite Datei. Ein neuer Undo-Tablespace ist eine gesonderte Option. Die folgende OMF-Schablone setzt eine Single Instance, AUTO-Verwaltung, ein gültiges DB_CREATE_FILE_DEST mit ausreichend freiem Speicher sowie CREATE TABLESPACE und ALTER SYSTEM voraus. In einer CDB gilt sie im geprüften Local-Undo-Container; Shared Undo wird im Root verwaltet. Die Werte sind Beispiele, keine Dimensionierungsempfehlung.

    Schreibende Lernreferenz – neuen UNDO-Bereich bereitstellen
    CREATE SMALLFILE UNDO TABLESPACE undotbs_neu
      DATAFILE SIZE 2G AUTOEXTEND ON NEXT 256M MAXSIZE 8G;

    Prüfe mit der Datei-Abfrage dieses Kapitels CONTENTS, Dateipfad, Größe und Wachstumslimit des neuen Tablespaces. Anlegen allein schaltet nicht um. Erst nach dieser Kontrolle folgt die Zuweisung. SCOPE=BOTH setzt für die Instanz ein SPFILE voraus; bei PFILE muss die dauerhafte Startkonfiguration gesondert gepflegt werden.

    Schreibende Lernreferenz – nach geprüfter Anlage umschalten
    ALTER SYSTEM SET undo_tablespace = 'UNDOTBS_NEU' SCOPE=BOTH;

    Kontrolliere UNDO_TABLESPACE erneut. Neue Transaktionen verwenden den neuen Bereich; laufende können den alten weiter benötigen. Ein Wechsel kopiert keine alte Historie. Den bisherigen Tablespace nicht unmittelbar löschen: Auch nach Ende der aktiven Transaktionen können Abfragen dessen historische Informationen brauchen. Das Löschen wird deshalb nicht als automatischer Abschlussschritt vorgegeben.

    Aufbewahrung gezielt einstellen und nachmessen

    Oracle empfiehlt grundsätzlich den Standardwert von UNDO_RETENTION. Ein längerer Flashback-Rückblick kann einen höheren Zielwert begründen. Erst Kapazität prüfen, dann beispielsweise eine Stunde anstreben:

    Schreibende Lernreferenz – begründeter Retention-Zielwert
    ALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH;

    Die RU- und Containerregeln aus Abschnitt 7 gelten weiterhin. Mehr Retention stellt bereits überschriebenes Undo nicht wieder her. RETENTION GUARANTEE wäre eine zusätzliche, bewusst abzuwägende Entscheidung: Sie schützt unexpired Undo, kann bei Platzmangel jedoch neue Änderungen verhindern. Sie wird hier nicht pauschal aktiviert.

    Erfolgskontrolle: Parameter und Dateiwerte erneut lesen; danach unter vergleichbarer Last V$UNDOSTAT, Fehlerzähler und Storage-Reserve beobachten. Einen benötigten historischen Stand tatsächlich abfragen. Eine erfolgreiche Parameteränderung allein belegt weder ausreichenden Speicher noch den gewünschten Rückblick.

    Flashback: zuerst das Ziel bestimmen

    „Flashback nutzen“ kann Lesen oder Wiederherstellen bedeuten. Die folgende Übersicht ordnet die bestehenden Verfahren ein. Beginne bei einem Datenfehler möglichst mit einer lesenden Untersuchung und einem fachlich bestätigten Zielzustand.

    VerfahrenZweckVerändert Daten?Technische Grundlage
    AS OFHistorisch lesenNeinUndo für diese Lernbeispiele
    Versions QueryZeilenhistorie untersuchenNeinUndo für diese Lernbeispiele
    Flashback TableTabelle zurücksetzenJaUndo
    Flashback DropGelöschtes Objekt zurückholenJaRecycle Bin
    Flashback DatabaseDatenbank zurücksetzenJaFlashback Logs und Redo

    15. Flashback Query

    Voraussetzungen: APP.KUNDE mit KUNDE_ID und STATUS ist ein erfundenes Lernschema und muss für eigene Abfragen durch ein vorhandenes Objekt ersetzt werden. Zusätzlich zu SELECT sind geeignete Flashback-Rechte erforderlich. Ein AS-OF-Zeitpunkt ist kein archiviertes Dauerprotokoll: fehlendes Undo oder zwischenzeitliche DDL können den Rückblick verhindern. Für exakt festgelegte Grenzen ist eine bekannte SCN eindeutiger als die zeitliche SCN-Zuordnung.

    Flashback Query liest einen historischen Datenstand, ohne die aktuelle Tabelle zu verändern. Das eignet sich hervorragend, um zu prüfen, wie ein Datensatz vor einigen Minuten aussah, sofern die erforderliche Undo-Historie noch vorhanden ist.

    AS OF TIMESTAMP
    SELECT *
    FROM app.kunde
    AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
    WHERE kunde_id=4711;

    Fiktive Beispielausgabe:

    KUNDE_IDSTATUS
    4711AKTIV

    Was sehe ich hier? Für dieses Beispiel sei APP.KUNDE eine Tabelle mit genau KUNDE_ID und STATUS. Bei einer angenommenen Abfrage um 10:30 Uhr zeigt AS OF den Stand um 10:20 Uhr. Tatsächliche Spalten bei SELECT * hängen von der Tabellendefinition ab; fehlendes Undo kann die Abfrage scheitern lassen.

    So gehst du mit Flashback Query vor

    1. Objekt, Schlüssel und Zeitpunkt vor der fehlerhaften Änderung bestimmen. Das vorhandene Beispiel untersucht APP.KUNDE, KUNDE_ID 4711.
    2. Im richtigen Container SELECT beziehungsweise READ und das FLASHBACK-Objektrecht prüfen lassen; benötigte Historie und DDL-Grenzen beachten. Keine pauschalen ANY-Rechte vergeben.
    3. Die vorhandene AS-OF-Abfrage ausführen. Sie liest frühere bestätigte Daten und verändert die aktuelle Tabelle nicht.
    4. Mit dem aktuellen Datensatz vergleichen; die kombinierte Abfrage in Abschnitt 24 zeigt beide Stände. Eine fehlende Zeile bedeutet nicht automatisch einen Fehler.
    5. Den fachlich richtigen Stand dokumentieren. Eine gewünschte Korrektur ist ein eigener Schreibvorgang, kein automatischer Effekt des SELECT.

    Für wiederholte Untersuchungen einen festen Zeitpunkt oder eine bekannte SCN verwenden: „vor zehn Minuten“ verschiebt sich bei jeder Ausführung. ORA-01555 kann fehlende ältere Informationen anzeigen; eine zwischenzeitliche Strukturänderung kann den Rückblick ebenfalls verhindern. Eine höhere Retention nach dem Fehler erzeugt die verlorene Historie nicht neu.

    16. AS OF SCN

    Wenn ein exakter SCN bekannt ist, kann statt eines Zeitpunkts auch die logische Datenbankzeit verwendet werden. Das ist besonders bei reproduzierbaren Analysen interessant.

    Was sehe ich hier?

    Read-only: historischer Kundenstand an einer bekannten SCN

    Read-only: historischer Kundenstand an einer bekannten SCN
    SELECT kunde_id, status
    FROM app.kunde AS OF SCN &HIST_SCN
    WHERE kunde_id = 4711;

    Fiktive Beispielausgabe:

    KUNDE_IDSTATUS
    4711AKTIV

    Was sehe ich hier? HIST_SCN ist eine zuvor an der Quelle festgehaltene historische SCN, kein beliebig übertragbarer Musterwert. Erforderliche Rechte und Historie müssen verfügbar sein.

    Relative Zeitangaben werden bei jeder Abfrage neu berechnet. Für wiederholbare Vergleiche dieselbe bekannte SCN verwenden. Die Zuordnung eines Zeitstempels zur SCN kann um bis zu drei Sekunden abweichen.

    Woher kommt HIST_SCN?

    Eine SCN wird beispielsweise vor einer geplanten Änderung mit der bereits gezeigten Abfrage auf V$DATABASE festgehalten. Eine erst nach einem Vorfall gelesene CURRENT_SCN ist kein historischer Ausgangspunkt. Die SCN muss zur untersuchten Datenbank gehören. SQL*Plus fragt bei &HIST_SCN nach dem einzusetzenden Zahlenwert; die fiktiven Werte im Wiki dürfen nicht ungeprüft übernommen werden.

    17. Flashback Versions Query

    Versions Query zeigt nicht nur einen alten Stand, sondern mehrere Versionen einer Zeile innerhalb eines Zeitbereichs. Damit kann nachvollzogen werden, ob eine Zeile beispielsweise INSERT, UPDATE oder DELETE durchlaufen hat.

    Versions Query
    SELECT versions_startscn,
           versions_endscn,
           versions_xid,
           versions_starttime,
           versions_endtime,
           versions_operation,
           kunde_id,
           status
    FROM app.kunde
    VERSIONS BETWEEN TIMESTAMP
         (SYSTIMESTAMP - INTERVAL '30' MINUTE)
     AND SYSTIMESTAMP
    WHERE kunde_id=4711
    ORDER BY versions_startscn NULLS FIRST;

    Fiktive Beispielausgabe:

    VERSIONS_STARTTIMEVERSIONS_ENDTIMEVERSIONS_OPERATIONKUNDE_IDSTATUSVERSIONS_STARTSCNVERSIONS_ENDSCNVERSIONS_XID
    08.10.2026 10:10:0008.10.2026 10:25:00U4711AKTIV12345000012345500005001A0012340000
    08.10.2026 10:25:00NULLU4711GESPERRT123455000NULL05001B0012350000

    Was sehe ich hier? Angenommener Abfragezeitpunkt 10:30 Uhr: Zwei durch Updates entstandene Versionen sind sichtbar. Bei der letzten U-Version bedeutet NULL als Endzeit hier, dass sie zum Abfragezeitpunkt aktuell ist. Die Ausgabe ist nach Versionsbeginn sortiert.

    Versionen entstehen an Commit-Grenzen; mehrere Änderungen innerhalb derselben Transaktion sind keine vollständige Anweisungshistorie. Ein NULL-Versionsbeginn kann eine vor dem ausgewählten Zeitraum entstandene Version bezeichnen. Ein NULL-Versionsende kann eine aktuelle Version oder eine DELETE-Version kennzeichnen.

    Versions Query Schritt für Schritt auswerten

    Grenze zuerst Schlüssel und Zeitraum ein, dann führe die bestehende Versions-Abfrage aus. Lies die Ausgabe nach VERSIONS_STARTSCN: I kennzeichnet eine eingefügte, U eine geänderte und D eine gelöschte Version. VERSIONS_XID ordnet sie einer Transaktion zu, identifiziert aber nicht allein den verantwortlichen Benutzer. Prüfe Versionsgrenzen und NULL-Werte anhand der vorhandenen Erklärung. Wähle anschließend einen gewünschten Stand für AS OF. Die Versionsliste ist keine vollständige Audit-Historie und nimmt keine Änderungen zurück.

    18. Flashback Table

    Flashback Table verändert dagegen den aktuellen Tabellenzustand und setzt die Tabelle logisch auf einen früheren Zustand zurück. Das ist keine reine Diagnosefunktion. Abhängigkeiten und fachliche Auswirkungen müssen vor Einsatz genau verstanden werden.

    Vorgehen für Flashback Table auf einen früheren Stand

    Oracle 19c: nicht in SE2 verfügbar. Zuerst Ziel-SCN mit AS OF prüfen, aktuelle SCN dokumentieren und abhängige Tabellen sowie Anwendungsschreibzugriffe berücksichtigen. Benötigt werden FLASHBACK, READ oder SELECT sowie INSERT, DELETE und ALTER; Row Movement muss aktiviert sein. Ausreichendes Undo und zulässige Tabellenstrukturen sind Voraussetzungen.

    Schreibende Lernreferenz – gesamte Tabelle zurücksetzen
    ALTER TABLE app.kunde ENABLE ROW MOVEMENT;
    FLASHBACK TABLE app.kunde TO SCN &HIST_SCN;

    Dies setzt die ganze Tabelle zurück, nicht nur KUNDE_ID 4711. Oracle sperrt die betroffenen Tabellen während des Vorgangs. Strukturänderungen können den Rückblick verhindern. Danach Datenbestand, Beziehungen und Anwendung prüfen. Ein normales ROLLBACK macht FLASHBACK TABLE nicht rückgängig; deshalb gehören Zielprüfung und dokumentierter Ausgangszustand vor den Befehl.

    19. Flashback Drop und Recycle Bin

    Ein normales DROP kann eine Tabelle in den Recycle Bin verschieben. Dort bleiben die abgelegten Objekte beziehungsweise Segmente erhalten, solange sie nicht gepurged oder durch Platzbedarf verdrängt werden. Flashback Drop kann daraus ein versehentlich gelöschtes Objekt wiederherstellen.

    Eine gelöschte Tabelle gezielt zurückholen

    Flashback Drop verwendet den Recycle Bin und ist von Flashback Table TO SCN zu unterscheiden. Als Eigentümer zuerst den passenden Eintrag anhand von ursprünglichem Namen und Löschzeit ermitteln:

    Lesend – Recycle Bin des angemeldeten Eigentümers
    SELECT object_name, original_name, droptime, can_undrop
    FROM user_recyclebin
    WHERE original_name = 'KUNDE' AND type = 'TABLE'
    ORDER BY droptime DESC;

    Den exakten BIN$-Namen auswählen, insbesondere bei mehrfach gelöschten Tabellen. In der folgenden Schablone den Platzhalter innerhalb der Anführungszeichen ersetzen. Der neue Name darf noch nicht belegt sein. Benötigt werden die Rechte zum Löschen der betreffenden Tabelle; Row Movement ist für TO BEFORE DROP nicht nötig.

    Schreibende Lernreferenz – als Eigentümer APP
    FLASHBACK TABLE "<exakter BIN$-Name>" TO BEFORE DROP RENAME TO kunde_wiederhergestellt;

    Anschließend Inhalt und abhängige Objekte prüfen. Referenzielle Constraints werden nicht automatisch wiederhergestellt. Nach PURGE oder Verdrängung aus dem Recycle Bin ist dieser Weg nicht mehr verfügbar. Eine leere Liste ist kein Nachweis, dass ein Backup keine Wiederherstellung erlaubt.

    20. Flashback Database

    Flashback Database ist ein Recovery-Verfahren für die gesamte Datenbank und verwendet Flashback Logs. Es ist deshalb technisch nicht einfach eine größere Form der Flashback Query. Planung, FRA und Recovery-Ziel spielen hier eine eigene Rolle.

    Flashback Database: kontrollierter Wiederherstellungsablauf

    Oracle 19c: nicht in SE2 verfügbar. Dieser Ablauf beschreibt eine vollständige Single-Instance-Datenbank, keine einzelne PDB. Voraussetzungen sind ARCHIVELOG, eine passende Fast Recovery Area und bereits vor dem Zielzeitpunkt verfügbare Flashback Logs sowie benötigtes Redo. Nachträgliches Aktivieren erzeugt keine Vergangenheit. Vorher Sicherungsstand, Ziel-SCN, Flashback-Fenster und Ausfallzeit prüfen.

    Lesend – Ausgangslage und vorhandenes Flashback-Fenster
    SELECT log_mode, flashback_on FROM v$database;
    SELECT oldest_flashback_scn, oldest_flashback_time,
           retention_target, flashback_size
    FROM v$flashback_database_log;

    Anwendung anhalten und die Datenbank kontrolliert in MOUNT bringen. Im freigegebenen Recovery-Ablauf folgt über RMAN als SYSBACKUP oder SYSDBA:

    RMAN – eingreifende Schablone, Ziel-SCN ersetzen
    FLASHBACK DATABASE TO SCN <gepruefte_Ziel_SCN>;

    Danach zunächst READ ONLY öffnen und den Datenstand prüfen. Nur bei bestätigtem Ergebnis wieder herunterfahren, mounten und mit OPEN RESETLOGS für den Betrieb öffnen. RESETLOGS beginnt eine neue Inkarnation; anschließend die Sicherungsstrategie fortführen und eine neue Sicherung einplanen. Bei falschem Ziel nicht vorschnell RESETLOGS ausführen, sondern den Recovery-Plan korrigieren. Für CDB/PDB und RAC gelten zusätzliche Abläufe.

    21. Ergebnis und Grenzen des gewählten Verfahrens prüfen

    Eine Erfolgsmeldung ersetzt keine Datenkontrolle. Vergleiche Schlüssel, Werte und Umfang mit dem bestätigten Ziel. Bei schreibenden Verfahren zusätzlich Abhängigkeiten und Anwendung prüfen. Flashback schützt nicht vor jedem Dateiverlust und ersetzt kein Backup.

    Flashback Drop ist von Flashback Table auf einen früheren Zeitpunkt zu unterscheiden. Nach PURGE ist die Wiederherstellung aus dem Recycle Bin nicht mehr möglich. Die Editionsabgrenzung und Voraussetzungen für Flashback Table auf einen früheren Zeitpunkt stehen in Abschnitt 18. Flashback Drop ist als eigenes Verfahren zu beurteilen.

    22. Diagnoseablauf bei Undo-Problemen

    Praxisbeispiel: ORA-01555 bei langem Report

    Beobachtung: Ein Report meldet um 10:00 Uhr ORA-01555. Die fiktive V$UNDOSTAT-Zeile zeigt für 09:50–10:00 Uhr SSOLDERRCNT=1 und NOSPACEERRCNT=0.

    1. Fehlerzeit, betroffene SQL und tatsächlichen Beginn des Reports erfassen. Der Zähler allein identifiziert keine SQL.
    2. Mit der gezeigten V$UNDOSTAT-Abfrage auch die vorhergehenden Intervalle betrachten. MAXQUERYLEN und TUNED_UNDORETENTION beschreiben das Intervall, keine Garantie für diese einzelne Abfrage.
    3. Undo-Tablespace, Wachstumslimit, verfügbare Kapazität und konkurrierende Transaktionen anhand der vorhandenen Abfragen prüfen.
    4. SQL-/Anwendungsablauf untersuchen: unnötig lange Laufzeit, hohe Änderungsrate oder besondere LOB-Historie können die Ursache mitbestimmen.

    Musterlösung: Benötigte ältere Informationen waren nicht mehr verfügbar. NOSPACEERRCNT=0 widerlegt das nicht. Erst wenn die Ursache und die Speicherreserve geklärt sind, lässt sich zwischen kürzerer Laufzeit, anderem Ausführungszeitpunkt oder angepasster Undo-Kapazität entscheiden. Ein erneuter Lauf nach einer begründeten Änderung muss separat geprüft werden.

    23. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Administrator's Guide – Managing Undo
    Undo, Retention und V$UNDOSTAT
    https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-undo.html

    Oracle Database 19c Reference – UNDO_RETENTION
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/UNDO_RETENTION.html
    Vertiefende Oracle-19c-Quellen: UNDO-Aufbewahrung und RU-Unterschiede · UNDO-Statistik

    Read-only Diagnosekette für Undo

    Undo Tablespace → Größe/Autoextend → V$UNDOSTAT → MAXQUERYLEN → TUNED_UNDORETENTION → SSOLDERRCNT/NOSPACEERRCNT → konkrete lange Queries/Transaktionen.

    24. DBA-Praxis: UNDO read-only analysieren

    Beginne mit der UNDO-Konfiguration aus Abschnitt 6. Dort stehen Abfrage, fiktive Ausgabe und Erklärung. Prüfe anschließend die folgenden Zeitintervalle und Transaktionen im selben Container und Fehlerzeitraum.

    Ziel der folgenden Abfrage:
    V$UNDOSTAT liefert Zeitintervalle zur Undo-Last. UNDOBLKS beschreibt verbrauchte Undo-Blöcke, MAXQUERYLEN die längste beobachtete Query-Laufzeit im Intervall und SSOLDERRCNT die Anzahl der ORA-01555-Ereignisse.
    READ ONLY – UNDO-Last und ORA-01555
    SELECT begin_time,
           end_time,
           undoblks,
           txncount,
           maxquerylen,
           maxqueryid,
           ssolderrcnt,
           nospaceerrcnt,
           tuned_undoretention
    FROM v$undostat
    ORDER BY begin_time DESC
    FETCH FIRST 24 ROWS ONLY;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileBEGIN_TIMEEND_TIMEUNDOBLKSTXNCOUNTMAXQUERYLEN
    108.10.2026 10:20:0008.10.2026 10:30:001200400300
    ZeileMAXQUERYIDSSOLDERRCNTNOSPACEERRCNTTUNED_UNDORETENTION
    18u3k2m9p4q7r1001200

    Was sehe ich hier? Ausschnitt eines Messintervalls. MAXQUERYLEN und TUNED_UNDORETENTION sind Sekunden; UNDOBLKS zählt verbrauchte Undo-Blöcke. Null Fehler in diesem Intervall beweisen keine globale Fehlerfreiheit.

    Ziel der folgenden Abfrage:
    Die Extent-Zustände zeigen, wie viel Undo aktuell ACTIVE, UNEXPIRED oder EXPIRED ist. ACTIVE gehört zu laufenden Transaktionen; UNEXPIRED liegt noch innerhalb des Retention-Kontexts; EXPIRED kann grundsätzlich bevorzugt wiederverwendet werden.
    READ ONLY – UNDO-Extents nach Status
    SELECT tablespace_name,
           status,
           ROUND(SUM(bytes) / 1024 / 1024, 2) AS mb
    FROM dba_undo_extents
    GROUP BY tablespace_name, status
    ORDER BY tablespace_name, status;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    TABLESPACE_NAMESTATUSMB
    UNDOTBS1ACTIVE128
    UNDOTBS1EXPIRED1024
    UNDOTBS1UNEXPIRED512

    So liest du das Ergebnis: ACTIVE gehört zu laufenden Transaktionen. EXPIRED kann wiederverwendet werden. Die Summe beschreibt zugeordnete Extents, nicht automatisch die gesamte Datei inklusive unzugeordnetem freien Platz.

    Ziel der folgenden Abfrage:
    Offene Transaktionen lassen sich mit ihrer Session verbinden. USED_UBLK und USED_UREC liefern Kontext zur Undo-Nutzung der Transaktion, aber keine exakte Prognose ihrer Rollback-Dauer.
    READ ONLY – offene Transaktionen und Undo
    SELECT s.sid,
           s.serial#,
           s.username,
           s.status,
           s.sql_id,
           TO_CHAR(t.start_date, 'YYYY-MM-DD HH24:MI:SS') AS start_date,
           t.used_ublk,
           t.used_urec
    FROM v$session s
    JOIN v$transaction t
      ON t.addr = s.taddr
    ORDER BY t.start_date, s.sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSSQL_ID
    1879201APP_USERINACTIVENULL
    ZeileSTART_DATEUSED_UBLKUSED_UREC
    12026-10-08 09:58:008120

    Was sehe ich hier? Die inaktive Session besitzt hier noch eine Transaktion. Deshalb reicht der Sessionstatus allein nicht aus, um offene Änderungen auszuschließen.

    Ziel der folgenden Abfrage:
    Eine Flashback Query ist ein lesender Zugriff auf einen früheren Datenzustand. Ob der gewünschte Zeitpunkt noch erreichbar ist, hängt unter anderem von der verfügbaren Undo-Historie ab.
    READ ONLY – Flashback Query Beispiel
    SELECT 'HISTORISCH' AS datenstand, kunde_id, status
    FROM app.kunde AS OF SCN &HIST_SCN
    WHERE kunde_id = 4711
    UNION ALL
    SELECT 'AKTUELL', kunde_id, status
    FROM app.kunde
    WHERE kunde_id = 4711
    ORDER BY datenstand;

    Fiktive Beispielausgabe:

    KUNDE_IDSTATUSDATENSTAND
    4711GESPERRTAKTUELL
    4711AKTIVHISTORISCH

    So liest du das Ergebnis: Die Zeile war an HIST_SCN AKTIV und ist aktuell GESPERRT. Fehlt eine Seite, gab es dort keine passende Zeile; das ist nicht gleich STATUS=NULL. Die Abfrage ändert nichts. Das Lernschema und ausreichende Rechte/Historie werden vorausgesetzt.

    DBA-Diagnosekette bei UNDO-Auffälligkeiten:

    1. Symptom bestimmen: ORA-01555, ORA-30036, lange Rollbacks, Platzdruck oder Flashback-Anforderung.
    2. Aktiven UNDO-Tablespace, UNDO_RETENTION und Autoextend-/Größenkontext prüfen.
    3. V$UNDOSTAT über den betroffenen Zeitraum analysieren.
    4. MAXQUERYLEN, TUNED_UNDORETENTION, SSOLDERRCNT und NOSPACEERRCNT gemeinsam betrachten.
    5. ACTIVE/UNEXPIRED/EXPIRED-Extents und offene Transaktionen untersuchen.
    6. SQL- und Anwendungsmuster einbeziehen; ORA-01555 nicht automatisch mit „UNDO vergrößern“ beantworten.
    7. Flashback-Funktion fachlich bestimmen: Query, Table, Database oder Drop.
    8. Erst danach eine administrative Änderung planen.
    Oracle-19c-Referenzen zu den Präzisierungen: Local Undo · Undo-Intervalle · Versions Query und SCN · Transaktionszeiten

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. UNDO unterstützt Rollback, Read Consistency und bestimmte Flashback-Abfragen. Es enthält ältere Datenversionen und ist kein Ersatz für ein Datenbankbackup.
    2. ACTIVE, UNEXPIRED und EXPIRED beschreiben unterschiedliche Nutzungszustände von Undo-Extents. Noch für aktive Transaktionen benötigtes Undo kann nicht beliebig wiederverwendet werden.
    3. UNDO_RETENTION allein garantiert keine unbegrenzte Aufbewahrung. RETENTION GUARANTEE schützt unexpired Undo, kann bei Platzmangel aber neue Änderungen scheitern lassen.
    4. ORA-01555 zeigt, dass eine Abfrage benötigte ältere Informationen nicht mehr erhalten konnte. Abfragedauer, Änderungsrate, Undo-Nutzung und Retention müssen gemeinsam untersucht werden.
    5. Flashback Query, Table, Drop und Database lösen unterschiedliche Aufgaben und haben verschiedene Voraussetzungen. Das passende Verfahren wird nach betroffenem Objekt und Wiederherstellungsziel gewählt.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Warum benötigt eine lange SELECT-Abfrage UNDO, obwohl sie selbst nichts ändert?
    Damit Oracle ältere Blockversionen für die konsistente Sicht der Query rekonstruieren kann.
    Frage 2: Was bedeutet ORA-01555 technisch?
    Eine benötigte ältere Datenversion kann nicht mehr aus verfügbarem Undo rekonstruiert werden.
    Frage 3: Warum ist Flashback Database etwas anderes als AS OF TIMESTAMP?
    Flashback Database bewegt den Zustand einer gesamten Database beziehungsweise geeigneter Datenfiles mit Flashback Logs und Redo zu einem früheren Zeitpunkt und ist ein Recovery-/Administrationsverfahren. Eine Flashback Query mit AS OF TIMESTAMP verändert die Database nicht, sondern rekonstruiert für die Abfrage einen früheren Datenstand aus den dafür noch verfügbaren Undo-Informationen.
    Frage 4: Beweist NOSPACEERRCNT=0, dass kein ORA-01555 auftreten kann?
    Nein. Fehlender Platz für neue Undo-Anforderungen und fehlende benötigte alte Versionen sind verschiedene Befunde. Fehlerzeitraum, SSOLDERRCNT und Abfragekontext gemeinsam prüfen.
    Frage 5: Ändert die AS-OF-Abfrage den aktuellen Kundenstatus?
    Nein. Flashback Query liest einen früheren Stand. Das Zurücksetzen einer Tabelle wäre eine andere Funktion mit eigenen Voraussetzungen und Folgen.
    Frage 6: Garantiert AUTOEXTENSIBLE=YES ausreichend Platz?
    Nein. MAXBYTES begrenzt das konfigurierte Wachstum; tatsächlich freier Storage muss zusätzlich vorhanden sein.
    Frage 7: Identifiziert MAXQUERYID die SQL mit ORA-01555?
    Nein. Es ist die längste erfasste SQL im Intervall. Der Fehler muss separat zugeordnet werden.
    Frage 8: Zeigt Versions Query jede einzelne Änderung innerhalb einer Transaktion?
    Nein. Die Versionen beziehen sich auf Commit-Grenzen; es ist keine vollständige Anweisungshistorie.

    24. Data Pump Export und Import – Architektur und Migrationen wirklich verstehen

    Was bei expdp und impdp intern passiert, wie konsistente Exporte entstehen und wie man sichere Importpläne entwickelt.

    Lernkompass
    Einfach gesagt Du lernst, wie Oracle Data Pump logische Exporte und Importe organisiert und wie Dumpfile, Logfile, DIRECTORY-Objekt und Data-Pump-Job zusammenhängen.
    Warum ist das wichtig? Data Pump ist kein RMAN-Ersatz. Es transportiert logische Datenbankobjekte und Daten und benötigt deshalb eine andere Denkweise als physisches Backup und Recovery.
    Nach diesem Kapitel Du kannst Data-Pump-Jobs read-only überwachen, Export-/Import-Modi unterscheiden, INCLUDE/EXCLUDE sowie REMAP-Optionen einordnen und typische Fehler systematisch analysieren.

    Einführung: Oracle Data Pump dient dazu, ausgewählte Datenbankobjekte und Daten logisch zu exportieren und zu importieren. Exportmodus und Filter bestimmen, was ein Job umfasst. Beim üblichen dateibasierten Verfahren enthält der Dumpbestand Daten und Objektbeschreibungen; er ist kein physisches Vollbackup der Datenbank. Transportable Tablespaces folgen einem besonderen Ablauf, bei dem Datenbankdateien zusätzlich behandelt werden.

    Das Kapitel arbeitet am Schemaübertragungsbeispiel und führt von Quelle, Ziel und Umfang über Verzeichnisse sowie Export- und Importoptionen bis zur Jobüberwachung und Nachkontrolle. So lässt sich der gemeldete technische Fortschritt vom tatsächlich erreichten Zustand im Ziel unterscheiden.

    Oracle 19c: fachliche Grundlage

    Fortschritt richtig filtern: Bei Data Pump enthält V$SESSION_LONGOPS.OPNAME den Jobnamen. Übernimm für &JOB_NAME den zuvor in DBA_DATAPUMP_JOBS ermittelten Namen exakt. Die Sicht meldet den Fortschritt des Tabellendatentransfers, nicht jede Metadatenphase. Kein passender Longops-Eintrag beweist deshalb keinen abgeschlossenen Job. Bei gleichnamigen Jobs zusätzlich Session und Eigentümer zuordnen.

    Für einen dateibasierten Job bezeichnet das Oracle-DIRECTORY-Objekt einen Pfad auf der Serverseite. Prüfe dessen Zuordnung und die benötigten Rechte vor der Pfadangabe: Ein vorhandenes Verzeichnis auf deinem Client ist noch kein erreichbares Dump-Ziel für den Datenbankserver.

    Data Pump kann auf unterschiedlichen Ebenen arbeiten: komplette Datenbank, Schemas, Tabellen, Tablespaces oder transportierbare Strukturen. Welche Objekte tatsächlich exportiert beziehungsweise importiert werden, hängt vom gewählten Modus und von Filtern wie INCLUDE oder EXCLUDE ab.

    Merksatz: Data Pump beantwortet die Frage „Wie übertrage ich logische Datenbankobjekte?“. RMAN beantwortet die Frage „Wie stelle ich eine Datenbank physisch wieder her?“.

    1. Data Pump ist serverseitig: Client steuert, Datenbank arbeitet

    expdp und impdp steuern einen serverseitigen Data-Pump-Job. Control- und Worker-Prozesse erledigen die Arbeit in der Datenbank. Deshalb kann ein Job serverseitig existieren, obwohl die ursprüngliche Clientverbindung getrennt wurde.

    2. Data Pump und RMAN klar unterscheiden

    Data Pump exportiert und importiert logische Datenbankinhalte: Metadaten, Tabelleninhalte und abhängige Objekte entsprechend dem gewählten Modus und den Filtern.

    RMAN sichert physische Datenbankstrukturen und ist für Restore-/Recovery-Szenarien ausgelegt. Ein erfolgreicher Data-Pump-Export beweist deshalb nicht, dass eine Datenbank nach einem Storage-Ausfall vollständig wiederhergestellt werden kann.

    Merksatz:

    Data Pump = logischer Export / Import / Transport
    RMAN = physisches Backup / Restore / Recovery

    3. Die Master Table

    Die Master Table enthält die Steuerinformationen des Jobs: welche Objekte bearbeitet werden, welcher Fortschritt erreicht wurde und wie der Job aufgebaut ist. Bei einem normalen erfolgreichen Abschluss wird sie typischerweise entfernt. Bei abgebrochenen oder gestoppten Jobs kann sie erhalten bleiben.

    Jeder Data-Pump-Job verwendet eine Control Job Table im Schema des Job-Owners. Ein Control Process koordiniert den Job und Worker Processes erledigen die eigentliche Daten-/Metadatenarbeit. Die Diagnose muss daher den serverseitigen Job betrachten und nicht nur den Clientprozess.

    4. PARALLEL editionsbewusst einordnen

    In Oracle 19c Standard Edition 2 ist der Data-Pump-Parallelitätsgrad auf 1 beschränkt. Paralleler Export und Import sind Enterprise-Edition-Funktionen. Die folgenden Worker-Erklärungen grenzen diese Architektur ab; für die SE2-Beispiele bleibt PARALLEL=1. DEGREE und Jobstatus werden nur gelesen.

    PARALLEL kann mehrere Worker einsetzen. Ist aber nur ein Dumpfile vorhanden, Storage langsam oder die CPU bereits stark belastet, bringt ein hoher Wert wenig oder verschlechtert andere Workloads. Parallelität muss zum System passen.

    5. Worker-Prozesse

    Worker erledigen konkrete Teile des Export- oder Importjobs. Bei PARALLEL können mehrere Worker gleichzeitig arbeiten. Die tatsächliche Beschleunigung hängt davon ab, ob Quellobjekte, Storage, CPU und Dumpfile-Struktur Parallelität sinnvoll unterstützen.

    6. Directory Objects – Datenbankname für einen OS-Pfad

    Ein Oracle-DIRECTORY ist ein Datenbankobjekt, das einen Namen auf einen serverseitigen Dateisystempfad abbildet. Data Pump verwendet den DIRECTORY-Namen; der Pfad selbst wird nicht als DIRECTORY=/pfad angegeben.

    Damit ein Job funktioniert, müssen zwei Ebenen passen: Der Datenbankbenutzer benötigt die erforderlichen Rechte auf dem DIRECTORY-Objekt und der Oracle-Betriebssystembenutzer muss auf den dahinterliegenden Pfad zugreifen können. Ein Datenbank-GRANT ersetzt keine Unix-Dateirechte und umgekehrt.

    READ ONLY – vorhandene DIRECTORY-Objekte
    SELECT directory_name,
           directory_path
    FROM dba_directories
    ORDER BY directory_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    DIRECTORY_NAMEDIRECTORY_PATH
    DP_DIR/export/datapump

    So liest du das Ergebnis: DP_DIR ist der in Data Pump verwendete Datenbankname. Der Pfad liegt auf dem Server; Betriebssystemrechte und freier Platz sind getrennt zu prüfen.

    READ ONLY – DIRECTORY-Berechtigungen
    SELECT grantee,
           table_name AS directory_name,
           privilege
    FROM dba_tab_privs
    WHERE type = 'DIRECTORY'
    ORDER BY table_name, grantee, privilege;

    Fiktive Beispielausgabe:

    GRANTEEDIRECTORY_NAMEPRIVILEGE
    DP_USERDP_DIRREAD
    DP_USERDP_DIRWRITE

    So liest du das Ergebnis: Die direkten Grants erlauben Zugriff auf das DIRECTORY-Objekt. Die View allein prüft nicht die Dateisystemrechte und ermittelt nicht vollständig alle effektiven Rechte aus Rollen und Privilegien.

    7. Export-Modi

    Der Modus bestimmt den logischen Umfang des Jobs. FULL ist nicht einfach „RMAN in logisch“, sondern exportiert die unterstützten Datenbankobjekte. SCHEMAS konzentriert sich auf Schemaobjekte eines Owners, TABLES auf ausgewählte Tabellen und TABLESPACES auf Objekte aus bestimmten Tablespaces.

    ModusTypischer ParameterGedanke
    FullFULL=YESData-Pump-Job auf Datenbankebene; erforderliche Privilegien und Objektumfang beachten.
    SchemaSCHEMAS=APPEin oder mehrere Schemas logisch exportieren beziehungsweise importieren.
    TableTABLES=APP.T1Gezielte Tabellen und abhängige Metadaten.
    TablespaceTABLESPACES=...Objekte auswählen, die in den genannten Tablespaces liegen.
    TransportableTRANSPORT_TABLESPACES=...Metadaten plus transportierbare Datafiles; andere Voraussetzungen als normaler Tabellen-/Schemaexport.
    Wichtig: Der Modus bestimmt den Ausgangspunkt der Objektauswahl. INCLUDE und EXCLUDE verfeinern diese Auswahl; sie sollten nicht als Ersatz für einen sauber gewählten Jobmodus verstanden werden.
    Multitenant: FULL=YES exportiert bei Verbindung zur PDB deren unterstützten logischen Umfang, nicht die gesamte CDB mit allen PDBs. Data Pump unterstützt keinen CDB-weiten Gesamtjob. Die Beispiele verwenden ausdrücklich den Service der betroffenen PDB.

    8. Schema Export

    Beispiel
    expdp DP_USER@APP_SERVICE \
      directory=DP_DIR \
      dumpfile=app_%U.dmp \
      logfile=app_export.log \
      schemas=APP

    Manuelles Lernbeispiel: Der Client fragt das Passwort interaktiv ab. DP_USER und APP_SERVICE sind Platzhalter für ein Konto mit passenden Rechten und den gewünschten Datenbank-/PDB-Service. Export erzeugt serverseitige Dateien und Jobmetadaten; Import kann Objekte und Daten verändern. SQLFILE führt die geplante Import-DDL nicht aus, schreibt aber eine Datei und kann eine gleichnamige Datei überschreiben. Der Generator startet keinen dieser Jobs.

    9. Parameterfile – warum es bei komplexen Jobs besser ist

    Bei umfangreichen Jobs ist eine PARFILE -Datei meist übersichtlicher als eine lange Kommandozeile. Parameter wie DIRECTORY, DUMPFILE, LOGFILE, SCHEMAS, INCLUDE, EXCLUDE, REMAP_SCHEMA oder REMAP_TABLESPACE lassen sich dort reproduzierbar dokumentieren.

    Passwörter sollten nicht im Skript, in einer PARFILE oder sichtbar in der Prozessliste abgelegt werden. Data Pump kann interaktiv nach dem Kennwort fragen; in automatisierten Umgebungen sollte eine dafür freigegebene sichere Credential-Strategie verwendet werden.

    REFERENZ – Beispiel einer Export-PARFILE
    DIRECTORY=DP_DIR
    DUMPFILE=app_%U.dmp
    LOGFILE=app_export.log
    SCHEMAS=APP
    PARALLEL=1

    %U ermöglicht eine eindeutige Nummerierung mehrerer Dumpfiles. Bei Parallelisierung muss die Dumpfile-Konfiguration zum Parallelitätsgrad und zum verfügbaren Storage passen. Mehr PARALLEL bedeutet nicht automatisch proportional mehr Durchsatz.

    Die PARFILE liest der Client von seinem lokalen Dateisystem. DIRECTORY bezeichnet dagegen den serverseitigen Ort für Dumpfiles und Logfiles; SQLFILE-Ausgaben entstehen ebenfalls serverseitig. Beispielaufruf: expdp DP_USER@APP_SERVICE parfile=app_export.par. DP_USER exportiert hier das fremde Schema APP; dafür ist DATAPUMP_EXP_FULL_DATABASE erforderlich. DIRECTORY-Grants allein reichen nicht. Das ist ein manuell auszuführendes Lernbeispiel; der Generator startet es nicht.

    10. DUMPFILE, %U und FILESIZE

    Mit %U kann Oracle mehrere Dumpfiles erzeugen. FILESIZE begrenzt die Größe einer einzelnen Datei. Das ist nützlich, wenn Dumpfiles aufgeteilt oder parallel beschrieben werden sollen.

    11. LOGFILE – wichtigstes Diagnoseartefakt

    Bei Data-Pump-Fehlern sollte das Log von oben nach unten gelesen werden. Die letzte ORA-Meldung ist oft nur eine Folge. Eine frühere UDI-/ORA-Meldung kann die eigentliche Ursache nennen.

    12. INCLUDE und EXCLUDE

    Oracle 19c: INCLUDE und EXCLUDE schließen sich innerhalb desselben Jobs aus. Sie werden als alternative Filterwege gewählt; die gemeinsame Verwendung in einem Job ist hier nicht unterstützt. Auch FLASHBACK_SCN und FLASHBACK_TIME sind alternative Angaben, keine gleichzeitig zu setzenden Parameter.

    Diese Filter arbeiten auf Objekttypen. Dadurch lassen sich beispielsweise Grants, Statistiken, Tabellen oder Indizes gezielt ein- beziehungsweise ausschließen. Wichtig ist, Abhängigkeiten zu verstehen: Wer einen Objekttyp ausschließt, kann Folgeobjekte oder fachliche Vollständigkeit beeinflussen.

    13. CONTENT

    WertBedeutungTypische Nutzung
    ALLDaten und MetadatenNormaler Export/Import
    DATA_ONLYNur TabellendatenDatenbeladung in vorbereitete Struktur
    METADATA_ONLYNur DefinitionenStrukturvergleich/Testaufbau

    14. QUERY

    QUERY begrenzt die exportierte Zeilenmenge. Das eignet sich für fachliche Teilmengen oder Testdaten. Da die Bedingung als SQL-Fragment übergeben wird, sind Shell-Quoting und Datumsformate typische Fehlerquellen.

    15. Warum Konsistenz bei langen Exporten wichtig ist

    Ein Export kann Minuten oder Stunden dauern. Ohne definierten logischen Bezug können verschiedene Tabellen zu unterschiedlichen realen Zeitpunkten gelesen werden. Bei abhängigen Daten kann ein konsistenter Exportpunkt deshalb wichtig sein.

    16. FLASHBACK_TIME und FLASHBACK_SCN

    Mit FLASHBACK_TIME oder FLASHBACK_SCN kann Data Pump Daten logisch zu einem gemeinsamen historischen Stand lesen. Technisch nutzt das die Flashback-/Undo-Fähigkeiten der Datenbank. Deshalb ist auch hier die verfügbare Historie relevant.

    Variante für einen gemeinsamen Exportstand: Ergänze in einer Kopie der Export-PARFILE FLASHBACK_SCN=123456789, wobei die Zahl ausschließlich ein Lernwert ist und durch eine zuvor ermittelte SCN der Quelle ersetzt werden muss. Verwende dazu die CURRENT_SCN-Abfrage aus Kapitel 23 an der tatsächlichen Quelle. Bei NETWORK_LINK gehört die SCN zur entfernten Quelldatenbank. FLASHBACK_TIME ist eine Alternative, keine zusätzliche Angabe. Die erforderliche Undo-Historie muss bis zum Lesen der betroffenen Daten erhalten bleiben; ein fester Exportpunkt verhindert ORA-01555 nicht automatisch.

    17. COMPRESSION

    COMPRESSION = METADATA_ONLY ist der Default und komprimiert Metadaten, nicht Tabelleninhalte. NONE schaltet die Kompression aus. ALL und DATA_ONLY komprimieren auch Nutzdaten und erfordern in Oracle 19c Enterprise Edition plus Advanced Compression; sie sind keine SE2-Optionen. Die namensgleichen BASIC-Algorithmen von Data Pump und RMAN dürfen lizenzfachlich nicht gleichgesetzt werden.

    Kompression kann I/O und Speicherplatz reduzieren, kostet aber CPU. Außerdem hängen einzelne Data-Pump-Kompressionsoptionen von Edition und Lizenzierung ab. Deshalb gehört die Lizenzprüfung zur Planung.

    18. Import ist nicht einfach der Export rückwärts

    Beim Import treffen Dump-Metadaten auf einen existierenden Zielzustand. Benutzer, Tablespaces, Quotas, bestehende Objekte, Grants und Abhängigkeiten können sich vom Quellsystem unterscheiden. Deshalb ist ein Import in der Praxis oft komplexer als der Export.

    Versionskompatibilität gehört zum Zielzustand. Der Exportparameter VERSION steuert, zu welcher Datenbankversion die exportierten Metadaten kompatibel sein sollen. Er führt kein Datenbank-Downgrade durch und übersetzt nicht jede neue Funktion in eine ältere Entsprechung. Nicht unterstützte Objekte oder Attribute können ausgeschlossen werden. Vor dem vorhandenen Migrationsablauf gehören deshalb Quellversion, Zielversion, COMPATIBLE, verwendete Funktionen und Exportprotokoll zusammen. Ein lesbarer Dump beweist noch nicht, dass der Zielbestand vollständig und fachlich gleichwertig entsteht. Oracle 19c.

    19. REMAP_SCHEMA

    REMAP_SCHEMA ändert den Owner beim Import. Das ist hilfreich für Testkopien, muss aber mit Grants, Synonymen, PL/SQL-Code und eventuell hart kodierten Schemanamen abgeglichen werden.

    Beispiel
    impdp DP_USER@APP_SERVICE \
      directory=DP_DIR \
      dumpfile=app_%U.dmp \
      logfile=app_import.log \
      remap_schema=APP:APP_TEST

    Manuelles Lernbeispiel: Der Client fragt das Passwort interaktiv ab. DP_USER und APP_SERVICE sind Platzhalter für ein Konto mit passenden Rechten und den gewünschten Datenbank-/PDB-Service. Export erzeugt serverseitige Dateien und Jobmetadaten; Import kann Objekte und Daten verändern. SQLFILE führt die geplante Import-DDL nicht aus, schreibt aber eine Datei und kann eine gleichnamige Datei überschreiben. Der Generator startet keinen dieser Jobs.

    20. REMAP_TABLESPACE

    REMAP_TABLESPACE lenkt importierte Segmente in einen anderen Ziel-Tablespace. Der Zieluser muss dort passenden Platz besitzen. Gerade bei Migrationen zwischen unterschiedlich aufgebauten Systemen ist diese Option sehr nützlich.

    21. TABLE_EXISTS_ACTION

    Voreinstellung beachten: TABLE_EXISTS_ACTION ist normalerweise SKIP; bei CONTENT=DATA_ONLY ist APPEND der Default. APPEND fügt Daten hinzu und prüft nicht, ob sie fachlich bereits vorhanden sind. Ein wiederholter Import kann deshalb Duplikate erzeugen oder an Constraints scheitern. SQLFILE ist kein Test der späteren Datenbeladung.

    SKIP, APPEND, TRUNCATE und REPLACE haben sehr unterschiedliche Auswirkungen. Besonders TRUNCATE und REPLACE sind verändernde Aktionen. Vor ihrem Einsatz muss klar sein, welche bestehenden Daten, Grants oder abhängigen Objekte betroffen sind.

    22. SQLFILE – Import vorab sichtbar machen

    SQLFILE ist eine der sichersten Möglichkeiten, einen unbekannten Dump zu untersuchen. impdp schreibt die geplanten DDL-Anweisungen in eine Datei, ohne sie auszuführen. Damit kann der DBA vorab sehen, welche Tablespaces, Benutzer, Grants und Objekte angesprochen werden.

    SQLFILE
    impdp DP_USER@APP_SERVICE \
      directory=DP_DIR \
      dumpfile=app_%U.dmp \
      remap_schema=APP:APP_TEST \
     sqlfile=app_preview.sql

    Manuelles Lernbeispiel: Der Client fragt das Passwort interaktiv ab. DP_USER und APP_SERVICE sind Platzhalter für ein Konto mit passenden Rechten und den gewünschten Datenbank-/PDB-Service. Export erzeugt serverseitige Dateien und Jobmetadaten; Import kann Objekte und Daten verändern. SQLFILE führt die geplante Import-DDL nicht aus, schreibt aber eine Datei und kann eine gleichnamige Datei überschreiben. Der Generator startet keinen dieser Jobs.

    Die Vorschau verwendet hier wie der geplante Import REMAP_SCHEMA=APP:APP_TEST. Übernimm auch weitere tatsächlich geplante Filter und Remap-Parameter identisch. SQLFILE zeigt die vorbereitete DDL, prüft aber weder die spätere Datenbeladung noch ausreichende Quotas oder erfolgreiche Constraint-Prüfungen.

    23. NETWORK_LINK

    NETWORK_LINK hat je nach Werkzeug einen anderen Datenweg: expdp liest die entfernte Quelle und schreibt Dumpfiles auf dem verbundenen Datenbankserver. impdp liest die entfernte Quelle und lädt direkt in die verbundene Zieldatenbank, ohne Dumpfiles. Beim Netzwerkexport bleiben Dumpfile-Verzeichnis, Schreibrechte und freier Platz notwendig. Datenbanklink, Rechte und Versionskompatibilität sind für beide Wege zu prüfen.

    24. DBA_DATAPUMP_JOBS: Status, Modus und Workergrad

    DBA_DATAPUMP_JOBS zeigt aktive Jobs und auch Control Job Tables ohne aktuell aktiven Job. Relevant sind OWNER_NAME, JOB_NAME, OPERATION, JOB_MODE, STATE, DEGREE und ATTACHED_SESSIONS.

    25. Worker und Sessions erkennen

    Data-Pump-Worker erscheinen als Datenbanksessions/Prozesse. Bei langsamen Jobs kann man dadurch Wait Events und Ressourcenverbrauch den Data-Pump-Prozessen zuordnen.

    26. Typische Importfehler verstehen

    FehlerbereichUrsachePrüfung
    DirectoryPfad/Rechte falschDBA_DIRECTORIES + OS
    QuotaZieluser darf keinen Segmentplatz belegenDBA_TS_QUOTAS
    Objekt existiertZielzustand kollidiertTABLE_EXISTS_ACTION
    AbhängigkeitVorheriges Objekt fehlgeschlagenLog weiter oben lesen

    27. Transportable Tablespaces einordnen

    Transportable Tablespaces kombinieren Metadatenübertragung mit physischen Datafiles. Das kann bei sehr großen Datenmengen erheblich schneller sein, ist aber ein anderes Verfahren als ein normaler Schema-Export.

    Oracle 19c SE2: Transportable Tablespaces einschließlich Cross-Platform und Full Transportable sind grundsätzlich Enterprise-Edition-Funktionen. Dokumentierte Ausnahme: Import transportabler Tablespaces aus Angeboten mit Enterprise-Edition-Software nach SE2, ohne Cross-Platform-Fähigkeiten. Für einen Wechsel Solaris SPARC → Linux darf daraus keine allgemeine SE2-Freigabe abgeleitet werden.

    28. Beispielhafter Migrationsablauf

    Inventarisieren→Export planen→Dump + Log prüfen→SQLFILE/Testimport→Import→Validieren

    29. Nachkontrolle nach Import

    30. DBA-Praxis: Data-Pump-Jobs read-only überwachen

    Ziel der folgenden Abfrage:
    DBA_DATAPUMP_JOBS zeigt bekannte Data-Pump-Jobs mit Modus, Status und Worker-Anzahl. Ein Eintrag allein beweist nicht, dass der Job aktuell aktiv Daten bewegt.
    READ ONLY – Data-Pump-Jobs
    SELECT owner_name,
           job_name,
           operation,
           job_mode,
           state,
           degree,
           attached_sessions,
           datapump_sessions
    FROM dba_datapump_jobs
    ORDER BY owner_name, job_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    OWNER_NAMEJOB_NAMEOPERATIONJOB_MODESTATE
    DP_USERSYS_EXPORT_SCHEMA_01EXPORTSCHEMAEXECUTING
    DEGREEATTACHED_SESSIONSDATAPUMP_SESSIONS
    113

    So liest du das Ergebnis: Der Export läuft mit Grad 1. Drei beteiligte Data-Pump-Sessions bedeuten nicht drei parallele Export-Worker: Steuerung und Client-Anbindung zählen ebenfalls zum Jobkontext.

    Ziel der folgenden Abfrage:
    DBA_DATAPUMP_SESSIONS verbindet Data-Pump-Jobs mit Datenbanksessions. Über SADDR kann die Session in V$SESSION zugeordnet werden.
    READ ONLY – Data-Pump-Sessions
    SELECT d.owner_name,
           d.job_name,
           d.session_type,
           s.sid,
           s.serial#,
           s.status,
           s.state,
           s.wait_class,
           s.event,
           s.sql_id
    FROM dba_datapump_sessions d
    JOIN v$session s
      ON s.saddr = d.saddr
    WHERE d.owner_name = '&JOB_OWNER'
      AND d.job_name = '&JOB_NAME'
    ORDER BY d.session_type, s.sid;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileOWNER_NAMEJOB_NAMESESSION_TYPESIDSERIAL#STATEWAIT_CLASS
    1DP_USERSYS_EXPORT_SCHEMA_01MASTER2105001WAITINGIdle
    ZeileSTATUSEVENTSQL_ID
    1ACTIVEwait for unread message on broadcast channelNULL

    Was sehe ich hier? Ausschnitt eines angenommenen laufenden Exports. Die Master-Session koordiniert den Job. EVENT allein sagt ohne Wait-Zustand nicht sicher aus, ob sie gerade wartet; ein NULL-SQL_ID kann dabei vorkommen.

    Ziel der folgenden Abfrage:
    V$SESSION_LONGOPS kann Fortschrittsinformationen für Data-Pump-Arbeit liefern. Nicht jede Phase muss dort mit einer unmittelbar verständlichen Prozentanzeige erscheinen; die Job- und Logdatei bleibt deshalb ebenfalls wichtig.
    READ ONLY – Data Pump in V$SESSION_LONGOPS
    SELECT l.sid, l.serial#, l.opname, l.sofar, l.totalwork, l.units,
           ROUND(l.sofar / NULLIF(l.totalwork,0)*100,2) AS percent_done,
           l.elapsed_seconds, l.time_remaining, l.last_update_time
    FROM v$session_longops l
    JOIN v$session s ON s.sid=l.sid AND s.serial#=l.serial#
    WHERE l.opname = '&JOB_NAME'
      AND l.totalwork > 0 AND l.sofar < l.totalwork
      AND EXISTS (SELECT 1 FROM dba_datapump_sessions d
                  WHERE d.saddr=s.saddr
                    AND d.owner_name='&JOB_OWNER'
                    AND d.job_name='&JOB_NAME')
    ORDER BY l.start_time;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#OPNAMESOFARTOTALWORK
    12115002SYS_EXPORT_SCHEMA_016001000
    ZeileUNITSPERCENT_DONEELAPSED_SECONDSTIME_REMAININGLAST_UPDATE_TIME
    1Megabytes60302008.10.2026 10:00:00

    Was sehe ich hier? Für &JOB_NAME=SYS_EXPORT_SCHEMA_01 sind 600 von 1.000 gemeldeten Einheiten verarbeitet. Das ergibt 60 %. Die Restzeit ist eine Schätzung für die erfasste Operation, keine Garantie für das Ende des gesamten Jobs.

    DBA-Diagnosekette bei Data-Pump-Problemen:

    1. Operation und Modus bestimmen: Export oder Import, FULL/SCHEMA/TABLE/TABLESPACE.
    2. Jobstatus über DBA_DATAPUMP_JOBS prüfen.
    3. Data-Pump-Sessions und aktuelle Waits zuordnen.
    4. Data-Pump-Logdatei auf den ersten relevanten ORA-/UDE-Fehler untersuchen.
    5. DIRECTORY-Objekt und serverseitigen Pfad prüfen.
    6. Datenbankprivilegien und OS-Dateirechte getrennt kontrollieren.
    7. Dumpfile-Verfügbarkeit, freien Storage und Dateigrößen berücksichtigen.
    8. Bei Importproblemen Quell-/Zielstruktur, Tablespaces, Benutzer und REMAP-Optionen prüfen.
    9. Erst danach den Job administrativ verändern, neu starten oder Importoptionen anpassen.

    Für die Abfragen JOB_OWNER=DP_USER und JOB_NAME=SYS_EXPORT_SCHEMA_01 verwenden. Owner und Jobname vor jeder Diagnose aus der Jobsicht übernehmen. Die Zuordnung gilt hier für die lokale Single-Instance-Umgebung. SOFAR<TOTALWORK allein beweist keine aktuell fortschreitende Operation; LAST_UPDATE_TIME und mehrere Messpunkte prüfen.

    Fiktive Beispielausgabe:

    ZeitOwner / JobSessionRolle / Befund
    10:00:00DP_USER / SYS_EXPORT_SCHEMA_01210 / 5001MASTER: WAITING, Idle, Broadcast-Nachricht
    10:00:00DP_USER / SYS_EXPORT_SCHEMA_01211 / 5002WORKER: 600 von 1000 Megabytes
    10:00:30DP_USER / SYS_EXPORT_SCHEMA_01211 / 5002WORKER: 800 von 1000 Megabytes

    Was sehe ich hier? Zusammengeführte Lernmesspunkte: Jobstatus EXECUTING, derselbe Worker zeigt Fortschritt von 60 % auf 80 %. Der wartende Master allein belegt keinen Stillstand. Die erfasste Datenoperation schreitet voran; Metadatenarbeit und andere Phasen können folgen. Eine geschätzte Restzeit ist keine zugesicherte Job-Endzeit.

    31. Typische Fehler richtig einordnen

    FehlerbildErste Prüfrichtung
    ORA-39087 / DIRECTORY ungültigExistiert das Oracle-DIRECTORY und wird der richtige DIRECTORY-Name verwendet?
    ORA-39070 / Logfile kann nicht geöffnet werdenDIRECTORY-Berechtigung, serverseitiger Pfad und OS-Schreibrechte prüfen.
    ORA-31640 / Dumpfile kann nicht geöffnet werdenDateiname, DIRECTORY, Existenz und OS-Leserechte prüfen.
    ORA-39151 / Objekt wird übersprungenImportoptionen und vorhandenes Zielobjekt prüfen; insbesondere TABLE_EXISTS_ACTION-Kontext.
    ORA-31684 / Objekt existiert bereitsObjekttyp und Importstrategie prüfen; nicht pauschal als kompletter Importfehler bewerten.
    Job scheinbar langsamWaits, Storage-I/O, Dumpfile-Layout, PARALLEL, Objektgrößen und Logfortschritt gemeinsam untersuchen.

    32. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Utilities – Data Pump Overview
    Control Job Table, Control Process, Worker und Parallelität
    https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html

    Oracle Database 19c Reference – DBA_DATAPUMP_JOBS / DBA_DATAPUMP_SESSIONS
    Jobstatus und beteiligte Sessions
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/DBA_DATAPUMP_JOBS.html
    Vertiefende Oracle-19c-Quellen: Data Pump Export · Data Pump Import
    Praxis: SQL*Loader und externe Tabellen gegenüber Data Pump einordnen

    Data Pump überträgt Daten und Metadaten in seinem eigenen Format. Eine CSV-Datei ist kein Data-Pump-Dump. Für dieses Labor verwendest du LAB_OWNER in LABPDB, CREATE TABLE und ausreichende Quota aus dem Rechte-Labor. Die Datei enthält UTF-8-Text ohne Kopfzeile, mit LF-Zeilenenden und Semikolon als Trennzeichen. Die Beispiele verwenden nur einfache Felder ohne eingebettete Zeilenumbrüche. Ausgangszustand: LAB_LOAD und LAB_EXT existieren noch nicht.

    1. Eine bewusst fehlerhafte Eingabedatei

    Datei kunden.csv – Daten, kein Shell- oder SQL-Befehl
    1;Alpha;10
    2;Beta;20
    3;Gamma;X

    Sage voraus, welche Zeile nicht in eine NUMBER-Spalte passt. Unterscheide fehlerhafte Datensätze von durch eine WHEN-Bedingung bewusst ausgeschlossenen Datensätzen. Die folgende Steuerdatei enthält keine WHEN-Bedingung, deshalb ist hier keine fachliche Discard-Auswahl vorgesehen.

    SQL*Plus als LAB_OWNER – Zieltabelle anlegen
    CREATE TABLE lab_load (id NUMBER, name VARCHAR2(40 CHAR), menge NUMBER)
    TABLESPACE lab_data;
    Datei kunden.ctl – SQL*Loader-Steuerdatei
    LOAD DATA
    CHARACTERSET AL32UTF8
    INFILE 'kunden.csv'
    BADFILE 'kunden.bad'
    INSERT INTO TABLE lab_load
    FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    (id INTEGER EXTERNAL, name CHAR, menge INTEGER EXTERNAL)

    2. Laden und Ergebnis bewerten

    Arbeite im Verzeichnis mit kunden.csv und kunden.ctl auf dem Rechner, auf dem SQL*Loader läuft. Ersetze LABPDB durch deinen funktionierenden Net-Service-Alias. Das Passwort wird interaktiv eingegeben. Ein Passwort gehört nicht als Teil des folgenden Kommandos in die Shell-Historie.

    Shell – SQL*Loader schreibt in die Labor-Datenbank und erzeugt Protokolldateien
    sqlldr userid=lab_owner@LABPDB control=kunden.ctl log=kunden.log direct=false
    SQL*Plus – lesende Kontrolle
    SELECT id, name, menge FROM lab_load ORDER BY id;

    Erwartung: 1/Alpha/10 und 2/Beta/20; der Datensatz 3/Gamma/X wird abgewiesen. Kontrolliere Log, BAD-Datei und Rückgabestatus. Zwei geladene Zeilen bedeuten keinen vollständig erfolgreichen Import aller drei Eingabezeilen. Bereits geladene und bestätigte Daten verschwinden nicht durch ein ROLLBACK in einer späteren SQL*Plus-Sitzung. Für eine Wiederholung zunächst die ausschließlich hierfür bestimmte Tabelle leeren oder neu anlegen; sonst ist INSERT in eine nicht leere Tabelle kein identischer Ausgangsfall.

    3. Dieselbe Datei als externe Tabelle lesen

    Jetzt muss kunden.csv auf dem Datenbankserver im vorbereiteten Verzeichnis /lab/import liegen. Ein DIRECTORY-Objekt erzeugt dieses OS-Verzeichnis nicht. Der Administrator legt das Objekt in LABPDB an; der Oracle-Software-Owner benötigt passende OS-Rechte. WRITE wird hier für Log-/Bad-Dateien benötigt. SQL*Loader liest im vorigen Beispiel dagegen auf dem Rechner des SQL*Loader-Prozesses.

    SQL*Plus als Administrator in LABPDB – Directory und Rechte
    CREATE DIRECTORY lab_import_dir AS '/lab/import';
    GRANT READ, WRITE ON DIRECTORY lab_import_dir TO lab_owner;
    SQL*Plus als LAB_OWNER – Definition einer externen Labortabelle
    CREATE TABLE lab_ext (
      id NUMBER, name VARCHAR2(40 CHAR), menge NUMBER
    )
    ORGANIZATION EXTERNAL (
      TYPE ORACLE_LOADER
      DEFAULT DIRECTORY lab_import_dir
      ACCESS PARAMETERS (
        RECORDS DELIMITED BY NEWLINE
        CHARACTERSET AL32UTF8
        BADFILE 'lab_ext_%p.bad'
        LOGFILE 'lab_ext_%p.log'
        FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
        MISSING FIELD VALUES ARE NULL
        (id CHAR(20), name CHAR(40), menge CHAR(20))
      )
      LOCATION ('kunden.csv')
    )
    REJECT LIMIT UNLIMITED;
    SQL*Plus – lesende Kontrolle
    SELECT id, name, menge FROM lab_ext ORDER BY id;

    Erwartung sind wiederum die beiden gültigen Zeilen. REJECT LIMIT UNLIMITED ist hier bewusst für die Beobachtung der Fehlerdatei gewählt; es erklärt verworfene Datensätze nicht zu fachlich akzeptierten Daten. Die Abfrage liest die externe Datei und kann dabei Log-/Bad-Dateien schreiben. Sie importiert die gültigen Zeilen nicht automatisch dauerhaft in LAB_LOAD. Die Spalten müssen tatsächlich gelesen werden; ein vereinfachtes COUNT allein ist kein gleichwertiger Konvertierungstest aller Felder.

    4. Rückweg und selbstständige Aufgabe

    Entferne als LAB_OWNER nach Abschluss LAB_EXT und LAB_LOAD mit DROP TABLE. Der Administrator entfernt danach ausschließlich LAB_IMPORT_DIR, sofern kein anderes Laborobjekt es verwendet. DROP DIRECTORY löscht keine OS-Dateien. Daten-, Log- und Bad-Dateien werden nach Sicherung der Lernnachweise gezielt im Laborverzeichnis bereinigt.

    Musterlösung und Abnahmekriterien

    Liefere eine Entscheidung für drei Fälle: Schema mit Metadaten übertragen → Data Pump; Textdatei dauerhaft in vorhandene Tabellen laden → SQL*Loader; serverseitige Datei per SQL untersuchen → externe Tabelle. Korrigiere X zu 30 und wiederhole beide Verfahren aus definiertem Ausgangszustand. Weise drei gültige Zeilen nach und erkläre den Unterschied zwischen Reject, Discard und fehlendem OS-Zugriff.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Data Pump arbeitet datenbankseitig; expdp und impdp steuern die Jobs. Directory Objects verweisen deshalb auf Pfade des Datenbankservers und benötigen passende Datenbank- und Betriebssystemrechte.
    2. Data Pump überträgt logisch ausgewählte Daten und Metadaten. Es ersetzt kein physisches RMAN-Backup für die Wiederherstellung der gesamten Datenbank.
    3. Exportmodus, Filter und CONTENT bestimmen den Umfang. Für einen definierten gemeinsamen Datenstand sind die dafür vorgesehenen Konsistenzeinstellungen zu beachten.
    4. Beim Import bestimmen unter anderem REMAP_SCHEMA, REMAP_TABLESPACE und TABLE_EXISTS_ACTION das Zielverhalten. SQLFILE macht vorgesehenes DDL sichtbar, führt den Import aber nicht aus.
    5. Ein abgeschlossener Job allein beweist noch keine vollständig brauchbare Migration. Logs, Objekte, Rechte und Daten werden nachkontrolliert; VERSION garantiert keine beliebige Abwärtskompatibilität.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Warum ist Data Pump serverseitig?
    Der Client startet und steuert einen Job, die eigentliche Arbeit wird von Datenbankprozessen ausgeführt.
    Frage 2: Warum kann ein Import komplexer als ein Export sein?
    Weil Dump-Metadaten auf einen bereits vorhandenen Zielzustand mit eigenen Benutzern, Tablespaces, Objekten und Rechten treffen.
    Frage 3: Wozu dient SQLFILE?
    Zur Vorabkontrolle der vorgesehenen DDL, ohne sie auszuführen.
    Frage 4: DP_DIR existiert. Ist damit ein Export schon startbereit?
    Nein. Zusätzlich DIRECTORY-Grants, Serverpfad, Betriebssystemrechte, freie Kapazität und Exportprivilegien prüfen. Der Datenbankname allein schafft kein Verzeichnis auf dem Server.
    Frage 5: Was ist bei TABLE_EXISTS_ACTION und CONTENT=DATA_ONLY zu beachten?
    Für DATA_ONLY ist APPEND der Standard statt SKIP. Wiederholtes Laden kann deshalb zusätzliche Zeilen oder Konflikte erzeugen. Vor dem Import den gewünschten Umgang mit vorhandenen Daten ausdrücklich festlegen.
    Frage 6: Schreibt expdp mit NETWORK_LINK keine Dumpfiles?
    Doch. Der Netzwerkexport schreibt Dumpfiles auf dem verbundenen Datenbankserver. Der direkte Netzwerkimport mit impdp benötigt keine Dumpfiles.
    Frage 7: Exportiert FULL=YES an einem PDB-Service die gesamte CDB?
    Nein. Der Job betrifft die verbundene PDB; Data Pump unterstützt keinen CDB-weiten Gesamtjob.
    Frage 8: Beweist ein unvollständiger Longops-Eintrag aktuellen Fortschritt?
    Nein. Jobzuordnung, Sessionidentität, LAST_UPDATE_TIME und Veränderungen zwischen Messpunkten prüfen. Die Prozentzahl gilt nur für die erfasste Operation.

    25. Backup & Recovery – Backup Readiness und Recovery Runbook

    Zweiteiliges Lern-, Praxis- und Nachschlagekapitel: Teil A für Backup & Recovery Readiness, Teil B für Restore-, Recovery- und Disaster-Recovery-Szenarien.

    Lernkompass
    Einfach gesagt Du lernst nicht nur, wie RMAN Backups erzeugt, sondern wie aus Backup, Metadaten und Redo eine belastbare Recovery-Kette entsteht.
    Warum ist das wichtig? Ein erfolgreicher Backup-Job beweist noch keine Wiederherstellbarkeit. Entscheidend sind verfügbare Backup Pieces, Controlfile-/SPFILE-Sicherung, Archived Redo, Restore-Validierung und ein geprüfter Recovery-Ablauf.
    Nach diesem Kapitel Du kannst Backup Readiness read-only bewerten und bei einem Ausfall systematisch zwischen RESTORE, RECOVER, PITR, Flashback und Disaster Recovery unterscheiden.

    Einführung: Bei einem Datenverlust oder Dateiausfall sind Backup, Restore und Recovery verschiedene Schritte. Ein Backup erzeugt Sicherungskopien. RESTORE holt ausgewählte Dateien daraus zurück; RECOVER wendet benötigte Redo-Informationen und gegebenenfalls inkrementelle Sicherungen an, um die Dateien bis zum gewünschten konsistenten Stand voranzubringen. Welche Schritte nötig sind, hängt vom Schaden und vom festgelegten Wiederherstellungsziel ab.

    Das Kapitel klärt zuerst, wie sich eine nutzbare Sicherungskette vor dem Ernstfall beurteilen lässt. Danach folgen RMAN-Abläufe für unterschiedliche Fehlerbilder und die Kontrolle des erreichten Zustands. Dadurch wird vor jeder Maßnahme sichtbar, was RMAN aus den vorhandenen Sicherungen und Redo-Informationen tatsächlich erreichen kann.

    Oracle 19c: fachliche Grundlage

    Die generischen Recovery-Abläufe sind Lernvorlagen. Ein betriebsfertiges Runbook benötigt konkrete Datenbankidentitäten, Sicherungsorte, Schlüssel, Zuständigkeiten und geprüfte Voraussetzungen. Platzhalter müssen vor der Anwendung ersetzt und die Abläufe in der vorgesehenen Testumgebung verifiziert werden.

    RMAN im DBA-Alltag: RMAN kennt die physische Struktur der Oracle-Datenbank und kann Sicherungen katalogisieren, validieren, restaurieren und für Recovery verwenden. Für die Bewertung sind unter anderem Backup-Level, Archivelog-Kette, Controlfile, DBID, Retention Policy und der tatsächlich erreichbare Recovery-Zeitpunkt wichtig.

    Archivierungsmodus als Backup-Voraussetzung: Im NOARCHIVELOG-Modus erlaubt RMAN kein inkonsistentes Datenbank-Backup. Für ein konsistentes Backup muss die Datenbank nach einem konsistenten Shutdown gemountet sein und während der Sicherung geschlossen bleiben. MOUNT allein beweist diesen Zustand nicht, insbesondere nicht unmittelbar nach einem Instanzfehler oder SHUTDOWN ABORT. Die Wiederherstellung eines solchen Backups liefert den gesicherten Stand; ohne die erforderliche Redo-Kette lässt sich daraus kein beliebiger späterer Datenstand herstellen. Diese Voraussetzungen werden hier erklärt, nicht automatisch hergestellt. Oracle 19c: Datenbank-Backups im NOARCHIVELOG-Modus.

    UNDO-Dateien zuordnen: Ein Dateiname mit UNDO ist kein technischer Nachweis. Die Dateiabfragen zeigen deshalb Tablespace-Namen aus V$TABLESPACE. Ordne sie der UNDO-Konfiguration im richtigen Container zu; die Dateiliste enthält auch andere Tablespaces. Bei geöffneter Datenbank kann DBA_TABLESPACES.CONTENTS = UNDO die Typzuordnung ergänzen.
    Weitere Editionsgrenzen: TSPITR und Flashback Transaction Query werden unten als allgemeine Oracle-Begriffe genannt, stehen in Oracle 19c SE2 aber nicht zur Verfügung. Gleiches gilt für Block Change Tracking, Block Media Recovery und RMAN-Tabellen-Recovery. Datenbank-PITR ist davon zu unterscheiden. Oracle-Funktionsmatrix.
    Laufende RMAN-Jobs: Neben RUNNING können auch RUNNING WITH WARNINGS und RUNNING WITH ERRORS einen noch laufenden Job bezeichnen. Die Statusabfrage berücksichtigt alle drei Varianten. Erfolgreiches Prozessende, Jobstatus und vollständige Recovery-Kette bleiben unterschiedliche Prüfpunkte.
    Oracle 19c SE2: Flashback Query liest frühere Datenstände aus UNDO. Flashback Table und Flashback Database stehen in SE2 nicht zur Verfügung; ihre folgenden Beschreibungen dienen der technischen Abgrenzung. Flashback Drop über den Recycle Bin ist davon zu unterscheiden. Oracle-19c-Funktionsmatrix.
    So ist Kapitel 25 aufgebaut

    Recovery-Ziel zuerst: Vor jeder Wiederherstellung muss fachlich feststehen, welcher Datenstand benötigt wird. Das RPO beschreibt den tolerierbaren Datenverlust, das RTO die tolerierbare Wiederanlaufzeit. RMAN entscheidet diese Vorgaben nicht; es zeigt, welcher Stand mit den vorhandenen Backups, Metadaten und Redo-Informationen technisch erreichbar ist.

    Teil A – Backup & Recovery Readiness: Wie RMAN arbeitet, was gesichert wird, welche Backuparten und Repository-Informationen existieren und wie vor einem Ernstfall geprüft wird, ob die Sicherungskette verwendbar ist.

    Teil B – Restore & Recovery: Wie Restore, Recover, PITR, Flashback, RESETLOGS und Incarnations zusammenhängen und wie konkrete Ausfallszenarien systematisch abgearbeitet werden.

    Wichtig: Ein erfolgreicher Backup-Job ist noch kein Recovery-Nachweis. Inventar, Restore-Auswahl, Lesbarkeit, Redo-Kette und ein geübter Wiederherstellungsablauf gehören zusammen.

    Teil A – Backup, Konfiguration & Recovery Readiness

    Leitfrage: „Sind die benötigten Sicherungen, Metadaten und Redo-Informationen vorhanden und technisch verwendbar?“

    RMAN verstehen: Aufgabe, Architektur und Grundbegriffe Was RMAN ist, welche Komponenten beteiligt sind und warum RMAN mehr als ein Kopierprogramm ist. RMANGrundlagen

    Eine belastbare Recovery-Kette lässt sich vereinfacht so lesen:

    SPFILE/PFILE → NOMOUNT → Controlfile → MOUNT → Datafiles RESTORE → Redo RECOVER → OPEN.

    Welche Schritte tatsächlich notwendig sind, hängt vom Schadensbild ab. Ist nur ein einzelnes Datafile betroffen, wird nicht automatisch die gesamte Datenbank restauriert. Fehlen dagegen Controlfile und Startparameter auf einem neuen Host, beginnt der Wiederaufbau wesentlich früher in der Kette.

    Schritt 1 Zielidentität, Sicherungsauftrag und Voraussetzungen prüfen; RMAN mit dem vorgesehenen Target verbinden.
    Schritt 2 RMAN liest Backup-Metadaten aus Controlfile und optional Recovery Catalog.
    Schritt 3 Ein oder mehrere Channels lesen Datenblöcke oder Archived Logs.
    Schritt 4 RMAN erzeugt Backupsets und Backup Pieces oder Image Copies.
    Schritt 5 Nach erfolgreichem Lauf werden die Metadaten im Controlfile und gegebenenfalls Catalog aktualisiert.
    Praxisbeispiel:
    Ein DBA startet ein Level-0-Backup. RMAN liest die verwendeten Datenblöcke aller Datafiles, erzeugt Backup Pieces auf dem NFS-Ziel und protokolliert im Controlfile, welche Dateien, SCNs und Checkpoints enthalten sind. Bei einem späteren Restore kann RMAN daraus die passende Sicherungskette ableiten.

    1. Read-only Diagnose-SQL

    Read-only Diagnose: RMAN-Backup-Jobs
    SELECT
        session_key,
        input_type,
        status,
        start_time,
        end_time,
        elapsed_seconds,
        input_bytes_display,
        output_bytes_display,
        output_device_type
    FROM v$rman_backup_job_details
    WHERE start_time >= SYSDATE - 14
    ORDER BY start_time DESC;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSESSION_KEYINPUT_TYPESTATUSSTART_TIMEEND_TIME
    1301DB INCRCOMPLETED08.10.2026 01:00:0008.10.2026 01:30:00
    ZeileELAPSED_SECONDSINPUT_BYTES_DISPLAYOUTPUT_BYTES_DISPLAYOUTPUT_DEVICE_TYPE
    1180020.00G12.00GDISK

    Was sehe ich hier? Ausschnitt einer Abfrage am 08.10.2026: Der Job dauerte 1.800 Sekunden. INPUT_BYTES_DISPLAY und OUTPUT_BYTES_DISPLAY sind formatierte Größen; die Differenz allein belegt keine bestimmte Kompressionsrate oder vollständige Recovery-Kette.

    2. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    RMAN> SHOW ALL;
    RMAN> REPORT SCHEMA;
    RMAN> LIST BACKUP SUMMARY;
    RMAN> REPORT OBSOLETE;
    RMAN> RESTORE DATABASE PREVIEW;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: RMAN sichert nicht nur Dateien. Es verwaltet eine komplette Recovery-Kette aus Backups, Archived Logs, SCNs und Incarnations.
    Was sichert RMAN eigentlich? – Datafiles, Controlfiles, Redo und SPFILE im Zusammenspiel Die physischen Bausteine der Oracle-Datenbank und ihre Rolle bei Backup, Restore und Recovery. RMANGrundlagenRecovery

    Warum ist dieses Kapitel wichtig? Ein RMAN-Backup ist nicht einfach eine einzelne Kopie der gesamten Datenbank. Oracle besteht aus mehreren physischen Komponenten mit unterschiedlichen Aufgaben. Erst wenn klar ist, was Datafiles, Controlfiles, Redo und SPFILE leisten, wird verständlich, warum ein Restore je nach Schadensbild unterschiedlich abläuft.

    RMAN kann insbesondere Datafiles, Controlfiles, SPFILE und Archived Redo Logs sichern. Online Redo Logs, Tempfiles und Password Files haben dagegen eine andere Rolle. Der zentrale Unterschied lautet: RESTORE bringt eine gesicherte Datei zurück; RECOVER wendet Redo an und bringt restaurierte Datafiles auf den erforderlichen konsistenten Stand.

    1. Die Oracle-Datenbank als Gesamtsystem

    Die Nutzdaten liegen in Datafiles. Das Controlfile beschreibt die physische Struktur der Datenbank. Online Redo Logs protokollieren aktuelle Änderungen. Archived Redo Logs bewahren abgeschlossene Redo-Sequenzen für Recovery auf. Das SPFILE enthält die Startparameter der Instanz.

    Vereinfachtes Bild:

    SPFILE → Wie startet die Instanz?
    Controlfile → Welche Dateien gehören zur Datenbank und welchen Stand kennt Oracle?
    Datafiles → Wo liegen Tabellen, Indizes, Undo und Dictionary-Daten?
    Online Redo → Welche aktuellen Änderungen wurden protokolliert?
    Archived Redo → Welche abgeschlossenen Redo-Sequenzen stehen für Recovery bereit?

    2. Datafiles – die eigentlichen persistenten Daten

    Datafiles sind die physischen Dateien permanenter Tablespaces. In ihnen liegen Oracle-Blöcke von Tabellen, Indizes, Data Dictionary und Undo. RMAN kann Datafiles als Backup Sets oder Image Copies sichern. Wird ein Datafile gelöscht, liefert RESTORE zunächst die gesicherte Version zurück.

    READ ONLY – Datafiles
    SELECT con_id, file#, name, status FROM v$datafile ORDER BY con_id, file#;

    Fiktive Beispielausgabe:

    CON_IDFILE#NAMESTATUS
    11/u02/oradata/ORCL/system01.dbfSYSTEM

    Was sehe ich hier? Ausschnitt aus dem CDB-Root. Der Dateistatus SYSTEM bezeichnet hier eine SYSTEM-Datafile; er darf nicht mit dem Tabellenstatus VALID verwechselt werden.

    Beispiel:
    Backup 02:00 Uhr, Datafile-Verlust 10:00 Uhr. RESTORE bringt den Stand 02:00 Uhr zurück. RECOVER wendet das danach entstandene Redo an. Erst dadurch kann das Datafile wieder bis zum Recovery-Ziel nachgeführt werden.

    3. Controlfiles – das physische Inhaltsverzeichnis

    Das Controlfile ist eine kleine, zentrale Binärdatei. Es enthält unter anderem Datenbankname, Datafile- und Redo-Log-Namen, Log-Sequenzen und Checkpoint-Informationen. Es kann außerdem RMAN-Repositorydaten über Backups enthalten. Ohne verwendbares Controlfile kann die Datenbank nicht normal MOUNTen.

    READ ONLY – Controlfiles
    SELECT name FROM v$controlfile ORDER BY name;

    Fiktive Beispielausgabe:

    NAME
    /u02/oradata/ORCL/control01.ctl
    /u05/oradata/ORCL/control02.ctl

    Was sehe ich hier? Zwei konfigurierte Controlfile-Pfade werden gezeigt. Unterschiedliche Verzeichnisse garantieren noch keine voneinander unabhängigen Speichersysteme.

    Controlfile Autobackup:
    Ein Controlfile-Autobackup ist für Disaster Recovery besonders wichtig. Ist das aktuelle Controlfile verloren, kann RMAN ein gesichertes Controlfile wiederherstellen. Die DBID sollte deshalb außerhalb der Datenbank dokumentiert sein.

    4. Online Redo Logs – die neuesten Änderungen

    Redo beschreibt Änderungen an Oracle-Blöcken. Es wird zunächst in Online Redo Log Groups geschrieben. Diese Logs sind kein normales RMAN-BACKUP-Objekt. Trotzdem können sie für Complete Recovery entscheidend sein, wenn sie noch nicht archiviertes Redo enthalten.

    READ ONLY – Redo
    SELECT l.group#, l.sequence#, l.status, f.member FROM v$log l JOIN v$logfile f ON f.group#=l.group# ORDER BY l.group#, f.member;

    Fiktive Beispielausgabe:

    GROUP#SEQUENCE#STATUSMEMBER
    1108INACTIVE/u03/redo/redo01a.log
    1108INACTIVE/u05/redo/redo01b.log

    Was sehe ich hier? Ausschnitt: Eine Gruppe kann mehrere Member besitzen und deshalb mehrfach erscheinen. Die Sequenz gehört zur Gruppe; die Datei wird pro Member ausgegeben.

    Wichtig:
    Der Verlust einer kompletten CURRENT-Redo-Gruppe kann die maximal erreichbare Recovery-Grenze bestimmen, wenn darin noch nicht archivierte Änderungen liegen.

    5. Archived Redo Logs – die Brücke zwischen Backup und aktuellem Stand

    Im ARCHIVELOG-Modus werden abgeschlossene Redo-Sequenzen archiviert. RMAN kann diese Archived Redo Logs sichern. Beim Media Recovery werden sie auf restaurierte Datafiles angewendet. Damit kann ein älteres Datafile-Backup nach vorne recovered werden.

    READ ONLY – Archivelogs
    SELECT thread#, sequence#, first_time, next_time, archived, name FROM v$archived_log ORDER BY thread#, sequence# DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileTHREAD#SEQUENCE#FIRST_TIMENEXT_TIMEARCHIVED
    1110808.10.2026 10:00:0008.10.2026 10:15:00YES
    ZeileNAME
    1/u04/arch/1_108.arc

    Was sehe ich hier? FIRST_TIME und NEXT_TIME begrenzen den erfassten Redo-Zeitraum dieser Sequenz. NEXT_TIME ist nicht die Dauer eines Backup-Jobs. Ein Metadateneintrag allein bestätigt keine lesbare Datei.

    6. SPFILE – die Startkonfiguration

    Das Server Parameter File enthält die Initialisierungsparameter der Instanz. Es enthält keine Nutzdaten, ist aber für den korrekten Start entscheidend. RMAN kann das aktuell verwendete SPFILE sichern und im Disaster-Fall wiederherstellen.

    READ ONLY – SPFILE
    SELECT value FROM v$parameter WHERE name='spfile';

    Fiktive Beispielausgabe:

    VALUE
    /u01/app/oracle/product/19c/dbhome_1/dbs/spfileORCL.ora

    Was sehe ich hier? Ein gesetzter Wert weist auf den verwendeten SPFILE-Pfad. Bei einem Start mit PFILE kann dieser Parameter leer sein; der Beispielpfad muss nicht deiner Installation entsprechen.

    7. Tempfiles – wichtig, aber kein normaler Datafile-Restore

    Tempfiles enthalten temporäre Arbeitsdaten und keine dauerhaft zu sichernden Nutzdaten. Sie werden deshalb nicht wie normale Datafiles restauriert. Bei Verlust wird die TEMP-Infrastruktur nach dem vorgesehenen Verfahren wieder bereitgestellt.

    8. Password File und Dateien außerhalb von RMAN

    Password File, Oracle-Netzwerkkonfiguration, Wallets/Keystores, Skripte und weitere betriebsrelevante Dateien können außerhalb des normalen RMAN-Sicherungsumfangs liegen. Ein vollständiges Disaster-Recovery-Konzept muss diese Komponenten separat berücksichtigen.

    9. Was sichert RMAN?

    KomponenteRMANBedeutung bei Recovery
    DatafilesJaRESTORE stellt sie bereit; RECOVER wendet Redo an.
    ControlfileJaBeschreibt die physische Datenbankstruktur und kann RMAN-Metadaten enthalten.
    SPFILEJaStellt die Startkonfiguration wieder her.
    Archived Redo LogsJaLiefern Redo für Media Recovery und PITR.
    Online Redo LogsNein, nicht als normales BACKUP-ObjektKönnen die neuesten, noch nicht archivierten Änderungen enthalten.
    TempfilesNicht wie normale DatafilesWerden bei Bedarf neu bereitgestellt.
    Password FileNeinSeparates Backup-/Betriebsverfahren erforderlich.

    10. Die komplette Recovery-Kette

    1. SPFILE/Parameter Startkonfiguration bereitstellen.
    2. NOMOUNT Instanz starten, ohne Controlfile zu mounten.
    3. Controlfile Falls erforderlich restaurieren.
    4. MOUNT Physische Struktur aus dem Controlfile laden.
    5. RESTORE Datafiles aus Backup bereitstellen.
    6. RECOVER Archived/verfügbares Redo anwenden.
    7. OPEN Nach erfolgreicher Recovery normal oder je nach Recovery-Art mit RESETLOGS öffnen.
    Merkkette:

    SPFILE → NOMOUNT → Controlfile → MOUNT → Datafiles RESTORE → Redo RECOVER → OPEN

    11. BACKUP, RESTORE und RECOVER nicht verwechseln

    BACKUP erzeugt eine Sicherung.

    RESTORE holt eine gesicherte Datei zurück.

    RECOVER wendet Redo auf restaurierte Datafiles an und bringt sie auf den erforderlichen Recovery-Stand.
    Backuparten: Full, Level 0, Level 1, Archivelog und Controlfile Die einzelnen Sicherungsarten verstehen und korrekt voneinander unterscheiden. RMANGrundlagen

    1. Was ist das?

    Eine Backupstrategie verbindet Sicherungsarten mit unterschiedlichen Aufgaben. Ein Full Backup und ein Incremental Level 0 sichern eine vollständige Datenfile-Basis; nur Level 0 dient als Ausgangspunkt für spätere Level-1-Backups. Bei Backup Sets kann RMAN bestimmte nicht benötigte Blöcke auslassen. Eine Image Copy bildet dagegen die Datei ab. Deshalb bedeuten „vollständig“ und „genauso groß wie die Originaldatei“ nicht dasselbe.

    Ein Level-1-Backup sichert nur geänderte Blöcke. Differential bedeutet: Änderungen seit dem letzten Level 0 oder Level 1. Cumulative bedeutet: Änderungen seit dem letzten Level 0. Archived Logs enthalten Redo und ermöglichen Recovery zwischen dem Datenbankbackup und dem gewünschten Zielzeitpunkt. Controlfile und SPFILE enthalten zentrale Wiederanlauf- und Konfigurationsinformationen.

    2. Warum wird das benötigt?

    • Level 0 reduziert den Aufwand der täglichen Vollsicherung, weil danach kleinere Level-1-Backups möglich sind.
    • Differential Level 1 ist meist kleiner und schneller, benötigt beim Restore aber mehrere Stufen.
    • Cumulative Level 1 ist größer, vereinfacht aber die Recovery-Kette.
    • Archivelogs schließen die zeitlichen Lücken zwischen Datenbankbackups.
    • Controlfile-/SPFILE-Autobackups ermöglichen einen Wiederanlauf auch nach Verlust zentraler Metadaten.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 Level 0 liest alle verwendeten Datenblöcke und markiert die Basis der Incremental-Kette.
    Schritt 2 Level 1 Differential verwendet den letzten Level-0- oder Level-1-Stand als Vergleich.
    Schritt 3 Level 1 Cumulative bezieht sich immer auf das letzte Level 0.
    Schritt 4 Archived Logs transportieren Redo-Sequenzen mit SCN-Bereichen.
    Schritt 5 Controlfile Autobackup wird unabhängig vom normalen Datenbankbackup besonders abgelegt.
    Praxisbeispiel:
    Sonntag wird ein Level 0 erstellt. Montag bis Samstag laufen differentielle Level-1-Backups. Zusätzlich werden alle 15 Minuten Archived Logs gesichert. Bei einem Restore am Freitag werden Level 0, die benötigten Level-1-Backups und anschließend die Archived Logs angewendet.

    4. Häufige Fehler und Missverständnisse

    • Ein Full Backup ist keine Incremental-Basis.
    • Ein vorhandenes Level 1 beweist keine vollständige Wiederherstellungskette. Fehlt bei der Erzeugung ein passendes Level 0 und ist COMPATIBLE mindestens 10.0, kann RMAN seit Dateierstellung geänderte Blöcke sichern. Für die Wiederherstellung müssen passende Basisdateien und die benötigten Folgeschritte trotzdem geprüft werden.
    • DELETE INPUT darf nur verwendet werden, wenn das Backup erfolgreich geschrieben und das Ziel zuverlässig ist.
    • Ein Datenbankbackup ohne passende Archived Logs reicht für Point-in-Time Recovery nicht aus.

    5. Wichtige Begriffe

    BegriffErklärung
    Full BackupSichert alle verwendeten Blöcke, ist aber keine Level-1-Basis.
    Level 0Vollständige Basis einer Incremental-Strategie.
    Level 1 DifferentialÄnderungen seit letztem Level 0 oder Level 1.
    Level 1 CumulativeÄnderungen seit letztem Level 0.
    Archivelog BackupSichert Redo für Media Recovery.
    Controlfile AutobackupSichert Controlfile und bei SPFILE-Nutzung auch das SPFILE.

    6. Relevante Views

    V$BACKUP_SET, V$BACKUP_PIECE, V$BACKUP_DATAFILE, V$BACKUP_REDOLOG

    7. Read-only Diagnose-SQL

    Backuparten: Full, Level 0, Level 1, Archivelog und Controlfile
    SELECT
        backup_type,
        incremental_level,
        start_time,
        completion_time,
        pieces,
        controlfile_included
    FROM v$backup_set
    WHERE completion_time >= SYSDATE - 14
    ORDER BY completion_time DESC;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    BACKUP_TYPEINCREMENTAL_LEVELSTART_TIMECOMPLETION_TIMEPIECES
    I12026-10-08 05:00:002026-10-08 05:08:001
    I02026-10-04 03:00:002026-10-04 03:42:001
    CONTROLFILE_INCLUDED
    NO
    NO

    So liest du das Ergebnis: I mit Level 0 ist die inkrementelle Basis; I mit Level 1 enthält Änderungsblöcke. Ein Full-Backup wäre BACKUP_TYPE=D mit NULL beim Level. CONTROLFILE_INCLUDED=NO in diesen Sets schließt ein separates Autobackup nicht aus.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    RMAN> BACKUP DATABASE;
    RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;
    RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;
    RMAN> BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE;
    RMAN> BACKUP ARCHIVELOG ALL;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: Full und Level 0 sehen ähnlich aus, erfüllen aber unterschiedliche Rollen. Nur Level 0 ist die Basis für Level 1.
    RMAN-Konfiguration mit SHOW ALL verstehen Alle aktuellen RMAN-Einstellungen lesen, jede Zeile verstehen und einzelne CONFIGURE-Parameter gezielt anpassen. RMANKonfigurationPraxis

    Einführung: RMAN besitzt eine Reihe dauerhaft gespeicherter Konfigurationseinstellungen. Diese legen zum Beispiel fest, wie lange Backups für die Recovery-Kette benötigt werden, ob das Controlfile automatisch gesichert wird, welches Backup-Ziel standardmäßig verwendet wird, wie viele Channels parallel arbeiten und welche Regeln für Archivelogs gelten. Der wichtigste erste Diagnosebefehl ist deshalb SHOW ALL.

    SHOW ALL verändert nichts. Der Befehl liest nur die aktuell für die Target-Datenbank gespeicherte RMAN-Konfiguration. Erst Befehle mit CONFIGURE ändern Einstellungen dauerhaft. Deshalb wird in diesem Abschnitt immer klar zwischen Lesen und manueller Änderung unterschieden.

    Wichtig ist außerdem: Die tatsächliche Ausgabe von SHOW ALL ist umgebungsabhängig. Zusätzliche CHANNEL-, SBT- oder Media-Manager-Einträge erscheinen nur, wenn sie für die jeweilige Datenbank konfiguriert wurden.

    Merksatz: SHOW ALL = nur lesen.   CONFIGURE = dauerhafte RMAN-Konfiguration ändern.

    1. Wie lese ich die komplette RMAN-Konfiguration?

    Nach dem Start von RMAN wird die gesamte gespeicherte Konfiguration mit einem einzigen Befehl angezeigt. Für eine reine Bestandsaufnahme ist dies der zentrale Einstiegspunkt.

    Read-only – komplette RMAN-Konfiguration anzeigen
    RMAN> SHOW ALL;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Was sehe ich hier?

    RMAN zeigt die aktuell gespeicherten CONFIGURE-Einstellungen der verbundenen Target-Datenbank. Die Ausgabe ist gleichzeitig eine sehr gute Dokumentation des Backup-Verhaltens, weil sie Retention, Backup-Ziel, Controlfile-Autobackup, Channels, Parallelism, Kompression, Verschlüsselung und Archivelog-Regeln zusammenfasst.

    2. Beispiel einer typischen SHOW-ALL-Ausgabe

    Beispielausgabe – Werte sind nicht automatisch deine produktiven Werte
    CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
    CONFIGURE BACKUP OPTIMIZATION OFF;
    CONFIGURE DEFAULT DEVICE TYPE TO DISK;
    CONFIGURE CONTROLFILE AUTOBACKUP ON;
    CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F';
    CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET;
    CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
    CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
    CONFIGURE MAXSETSIZE TO UNLIMITED;
    CONFIGURE ENCRYPTION FOR DATABASE OFF;
    CONFIGURE ENCRYPTION ALGORITHM 'AES128';
    CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE;
    CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS;
    CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;
    CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/path/to/snapcf_DB.f';
    Wichtig:
    Die obige Liste ist eine typische Oracle-19c-Konfiguration. SHOW ALL ist maßgeblich. Wenn beispielsweise ein expliziter DISK-Channel, ein SBT-Channel oder ein Media-Manager-Plugin konfiguriert ist, erscheinen zusätzliche CONFIGURE CHANNEL ...-Zeilen.

    3. Jede SHOW-ALL-Einstellung verstehen

    EinstellungBedeutungDBA-Frage
    RETENTION POLICYLegt fest, welche Backups RMAN für das definierte Recovery-Ziel noch benötigt. Typisch sind RECOVERY WINDOW oder REDUNDANCY.Wie weit zurück soll ein Recovery mit den aufbewahrten Backups möglich sein?
    BACKUP OPTIMIZATIONKann bereits ausreichend gesicherte Dateien bei bestimmten Backup-Szenarien überspringen.Soll RMAN identische beziehungsweise bereits ausreichend gesicherte Dateien erneut sichern?
    DEFAULT DEVICE TYPEDefiniert das Standardziel für Backup-Befehle, wenn kein Device Type ausdrücklich angegeben wird. Typisch: DISK oder SBT_TAPE.Wohin schreibt RMAN standardmäßig?
    CONTROLFILE AUTOBACKUPSichert Controlfile und SPFILE automatisch nach bestimmten Backup-/Strukturereignissen.Kann ich nach Verlust des Controlfiles beziehungsweise SPFILE die zentralen Metadaten unabhängig wiederfinden?
    CONTROLFILE AUTOBACKUP FORMATDefiniert Dateiname beziehungsweise Pfad des Controlfile-Autobackups je Device Type. %F erzeugt einen eindeutigen Namen mit DBID-/Zeitbezug.Wo wird das Autobackup abgelegt und wie finde ich es im Desasterfall?
    DEVICE TYPE ... PARALLELISMLegt fest, wie viele automatische Channels RMAN für diesen Device Type parallel verwenden darf.Wie viele Backup-Streams laufen gleichzeitig und kann Storage/CPU diese Parallelität sinnvoll tragen?
    BACKUP TYPE TO BACKUPSET / COPYBestimmt den Standard-Sicherungstyp für den Device Type.Sollen standardmäßig Backupsets oder Image Copies erzeugt werden?
    DATAFILE BACKUP COPIESLegt die Anzahl der RMAN-Kopien für Datafile-Backups je Device Type fest.Brauche ich Duplexing beziehungsweise mehrere identische Sicherungskopien?
    ARCHIVELOG BACKUP COPIESLegt die Anzahl der Kopien für Archivelog-Backups je Device Type fest.Wie viele Backupkopien der Archived Logs sollen erzeugt werden?
    MAXSETSIZEBegrenzt die maximale Größe eines Backupsets. UNLIMITED bedeutet keine zusätzliche globale Begrenzung durch diese Einstellung.Muss ein Backupset wegen Zielsystem, Transport oder Media Manager begrenzt werden?
    ENCRYPTION FOR DATABASESchaltet die RMAN-Backupverschlüsselung für die Datenbank als Standard ein oder aus.Müssen Backup Pieces verschlüsselt abgelegt werden und ist das Schlüssel-/Wallet-Konzept geklärt?
    ENCRYPTION ALGORITHMDefiniert den verwendeten Verschlüsselungsalgorithmus, wenn RMAN-Verschlüsselung aktiv ist.Welcher freigegebene Algorithmus soll verwendet werden?
    COMPRESSION ALGORITHMDefiniert den RMAN-Kompressionsalgorithmus für komprimierte Backupsets.Welche Kompression ist technisch und lizenzrechtlich zulässig?
    RMAN OUTPUT TO KEEPLegt die Aufbewahrungsdauer für RMAN-Ausgaben in den dafür vorgesehenen Output-Views fest. V$RMAN_OUTPUT liegt im Speicher und wird nicht im Controlfile gespeichert. Sichere für einen dauerhaften Nachweis zusätzlich das RMAN-Protokoll. Diese Einstellung ist nicht die Aufbewahrungsregel für Backups.Wie lange sollen RMAN-Ausgaben für Diagnose und Reporting verfügbar bleiben?
    ARCHIVELOG DELETION POLICYDefiniert, wann Archived Logs aus RMAN-Sicht gelöscht werden dürfen, zum Beispiel erst nach einer bestimmten Anzahl erfolgreicher Backups.Wann darf ein Archived Log sicher aus dem Quellbereich entfernt werden?
    SNAPSHOT CONTROLFILE NAMEPfad des Snapshot Controlfiles, das RMAN für konsistente Metadatenzugriffe während bestimmter Operationen verwendet.Ist der Pfad vorhanden, beschreibbar und für die Betriebsart sinnvoll?
    CHANNEL DEVICE TYPE ...Optionaler expliziter Channel mit Format, Parametern oder Media-Manager-Angaben. Diese Zeile erscheint nur bei entsprechender Konfiguration.Gibt es spezielle DISK-/SBT-Einstellungen, die das Standardverhalten überschreiben?

    4. Wie ändere ich eine einzelne RMAN-Einstellung?

    RMAN-Änderungen werden mit CONFIGURE dauerhaft im RMAN-Repository gespeichert. Sie gelten für nachfolgende RMAN-Läufe, bis sie erneut geändert oder mit CLEAR auf den Oracle-Default beziehungsweise die nicht explizit konfigurierte Einstellung zurückgesetzt werden.

    Nach jeder manuellen Änderung sollte unmittelbar erneut SHOW ALL ausgeführt und die dokumentierte Soll-Konfiguration mit der tatsächlichen Ausgabe verglichen werden.

    MANUELLE KONFIGURATIONSBEISPIELE – DAS WIKI FÜHRT KEINEN DIESER BEFEHLE AUS
    Sicherheitsregel: Die folgenden Befehle sind ausschließlich Lern- und Referenztext. create_dba_wiki.sh startet weder RMAN noch SQL*Plus und ändert keine Datenbank. Produktive Änderungen dürfen nur nach Freigabe mit einem dafür vorgesehenen Backup-Administrationskonto ausgeführt werden. Der Monitoring-/Read-only-Benutzer ist dafür nicht vorgesehen.

    5. Retention Policy ändern

    Ein Recovery Window von 14 Tagen ist keine Dateialtersgrenze. RMAN kann ein älteres Basisbackup benötigen, um den Beginn dieses Fensters wiederherzustellen. Dazu müssen passende inkrementelle Backups und Redo verfügbar sein. Die automatische FRA-Speicherverwaltung kann löschberechtigte Dateien bei Platzbedarf entfernen; eine ausdrücklich außerhalb der FRA konfigurierte FORMAT-Ablage wird dadurch nicht automatisch verwaltet.

    CONTROL_FILE_RECORD_KEEP_TIME betrifft wiederverwendbare Metadatensätze im Controlfile, nicht die Aufbewahrung der Backup-Dateien. Ein Recovery Catalog und regelmäßig übertragene Metadaten helfen bei längeren Historien; auch der Catalog ersetzt nicht die tatsächlichen Sicherungsdateien.

    Beispiele – Recovery Window oder Redundancy
    RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
    
    RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
    
    RMAN> CONFIGURE RETENTION POLICY CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Wirkung:
    Die Retention Policy entscheidet nicht direkt, wann Dateien automatisch gelöscht werden. Sie entscheidet zunächst, welche Backups bei REPORT OBSOLETE beziehungsweise DELETE OBSOLETE als nicht mehr für das Recovery-Ziel erforderlich gelten.

    6. Backup Optimization ein- oder ausschalten

    Backup Optimization
    RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
    
    RMAN> CONFIGURE BACKUP OPTIMIZATION OFF;
    
    RMAN> CONFIGURE BACKUP OPTIMIZATION CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    7. Standard-Device-Type festlegen

    DISK oder SBT als Standard
    RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;
    
    RMAN> CONFIGURE DEFAULT DEVICE TYPE TO SBT_TAPE;
    
    RMAN> CONFIGURE DEFAULT DEVICE TYPE CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    SBT-Hinweis:
    SBT_TAPE setzt einen korrekt installierten und freigegebenen Media Manager beziehungsweise ein Backup-Plugin voraus. Die Plugin-Parameter sind herstellerspezifisch.

    8. Controlfile Autobackup konfigurieren

    Autobackup und Format
    RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
    
    RMAN> CONFIGURE CONTROLFILE AUTOBACKUP OFF;
    
    RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/controlfile/%F';
    
    RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Praxisnutzen:
    Ein aktiviertes Controlfile-Autobackup ist für Desaster-Recovery besonders wichtig, weil Controlfile und SPFILE auch dann wiedergefunden werden können, wenn die normale RMAN-Metadatenquelle nicht mehr verfügbar ist.

    9. Parallelism und Standard-Backup-Typ konfigurieren

    Device Type DISK

    EE-Theoriebeispiel: Parallelism 2 gehört nicht zum SE2-Betrieb. CONFIGURE verändert die gespeicherte RMAN-Konfiguration und ist hier ausschließlich dokumentiert.

    RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET;
    
    RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET;
    
    RMAN> CONFIGURE DEVICE TYPE DISK CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Nicht einfach erhöhen:
    Mehr Parallelism bedeutet mehr gleichzeitige Channels und kann Backup-Zeit reduzieren, aber gleichzeitig CPU, I/O, NFS, SBT-Plugin und Produktionsworkload stärker belasten. Parallelism wird deshalb immer gegen die reale Plattform und die Oracle-Edition geprüft.

    10. Anzahl der Backup-Kopien einstellen

    Mehrere Backupkopien: COPIES betrifft identische Kopien von Backupsets, nicht Image Copies. Controlfile-Autobackups werden dadurch nicht duplexiert; Duplexing in der FRA ist nicht erlaubt. Die Ablageorte müssen ausdrücklich geplant werden. COPIES allein garantiert keine Trennung der Ausfallbereiche.

    Datafile- und Archivelog-Kopien
    RMAN> CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 2;
    RMAN> CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 2;
    
    RMAN> CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK CLEAR;
    RMAN> CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    11. MAXSETSIZE konfigurieren

    Backupset-Größe begrenzen
    RMAN> CONFIGURE MAXSETSIZE TO 50G;
    
    RMAN> CONFIGURE MAXSETSIZE TO UNLIMITED;
    
    RMAN> CONFIGURE MAXSETSIZE CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Einordnung:

    MAXSETSIZE begrenzt ein komplettes Backupset. Das ist nicht dasselbe wie die maximale Größe eines einzelnen Backup Pieces.

    12. RMAN-Verschlüsselung konfigurieren

    Edition und Ziel beachten: Native RMAN-Backupverschlüsselung nach DISK gehört in Oracle 19c zum Advanced-Security-Kontext und ist kein allgemeines SE2-Verfahren. Eine herstellereigene Verschlüsselung des Backupmediums ist davon zu unterscheiden. Das folgende Beispiel erklärt Syntax, keine pauschale Nutzungsberechtigung.

    Encryption
    RMAN> CONFIGURE ENCRYPTION FOR DATABASE ON;
    RMAN> CONFIGURE ENCRYPTION ALGORITHM 'AES256';
    
    RMAN> CONFIGURE ENCRYPTION FOR DATABASE OFF;
    
    RMAN> CONFIGURE ENCRYPTION FOR DATABASE CLEAR;
    RMAN> CONFIGURE ENCRYPTION ALGORITHM CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Vorher klären:
    Verschlüsselung darf nicht nur technisch aktiviert werden. Wallet/Keystore, Schlüsselverfügbarkeit, Restore-Verfahren und Lizenz-/Betriebsvorgaben müssen vorab dokumentiert und getestet sein.

    13. Kompressionsalgorithmus konfigurieren

    RMAN-Kompression
    RMAN> CONFIGURE COMPRESSION ALGORITHM 'BASIC'
          AS OF RELEASE 'DEFAULT'
          OPTIMIZE FOR LOAD TRUE;
    
    RMAN> CONFIGURE COMPRESSION ALGORITHM CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Lizenzhinweis:
    BASIC ist die konservative Referenz. Andere RMAN-Kompressionsalgorithmen können zusätzliche Lizenzvoraussetzungen haben. Vor Verwendung immer die für die konkrete Oracle-Edition und Lizenzierung zulässige Variante prüfen.

    14. RMAN-Output-Aufbewahrung einstellen

    RMAN Output
    RMAN> CONFIGURE RMAN OUTPUT TO KEEP FOR 14 DAYS;
    
    RMAN> CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    15. Archivelog Deletion Policy konfigurieren

    Beispiele für die Löschfreigabe von Archived Logs
    RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;
    
    RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK;
    
    RMAN> CONFIGURE ARCHIVELOG DELETION POLICY CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Sehr wichtig:
    Die Archivelog Deletion Policy muss zum Backup- und gegebenenfalls Data-Guard-Konzept passen. Eine aggressive Löschregel kann die Recovery-Kette gefährden. Deshalb zuerst Backupfrequenz, Restore-Anforderungen und Standby-Abhängigkeiten prüfen.

    16. Snapshot-Controlfile-Pfad konfigurieren

    Snapshot Controlfile
    RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/backup/rman/snapcf_DB.f';
    
    RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    17. Expliziten DISK-Channel konfigurieren

    Optionaler Channel mit FORMAT
    RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK
          FORMAT '/backup/%d_%T_%U.bkp';
    
    RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK CLEAR;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Was bewirkt das?

    Ein explizit konfigurierter Channel kann Standardwerte des Device Types ergänzen oder überschreiben. Wichtig: Ein erneutes CONFIGURE CHANNEL für dieselbe Konfiguration ersetzt deren bisherige Optionen. Werden beispielsweise nach MAXPIECESIZE nur FORMAT-Angaben gesetzt, kann MAXPIECESIZE auf den Default zurückfallen. Vorher-/Nachher-Ausgaben von SHOW ALL sind deshalb notwendig. Bei mehreren nummerierten Channels sind auch CHANNEL 1, CHANNEL 2 usw. möglich.

    18. SBT-/Media-Manager-Konfiguration erkennen

    Bei Veeam, Tape Libraries oder anderen Media Managern kann SHOW ALL zusätzliche SBT-Konfigurationen anzeigen. Diese enthalten beispielsweise Channel-Parameter, Library-Angaben oder herstellerspezifische Umgebungsparameter.

    Solche Parameter sollten niemals durch generische Beispielwerte ersetzt werden. Sie werden anhand der Dokumentation des eingesetzten Backup-Plugins und der bestehenden produktiven Konfiguration bewertet.

    Nur Syntaxbeispiel – keine echten Plugin-Parameter

    EE-Theoriebeispiel: Auch für SBT ist paralleles Backup kein SE2-Verfahren. Die Befehle verändern Einstellungen und werden vom Wiki nicht ausgeführt.

    RMAN> CONFIGURE DEVICE TYPE SBT_TAPE PARALLELISM 2 BACKUP TYPE TO BACKUPSET;
    
    RMAN> CONFIGURE CHANNEL DEVICE TYPE SBT_TAPE
          PARMS 'SBT_LIBRARY=<Hersteller-Library>, ENV=(...)';

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    19. Wie setze ich eine einzelne Konfiguration zurück?

    Viele CONFIGURE-Einstellungen können mit CLEAR entfernt werden. Dadurch wird die explizite Konfiguration gelöscht und RMAN verwendet wieder das entsprechende Default-Verhalten beziehungsweise die verbleibende höhere Konfigurationsebene.

    Beispiel CLEAR
    RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK CLEAR;
    RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK CLEAR;
    RMAN> CONFIGURE RETENTION POLICY CLEAR;
    
    RMAN> SHOW ALL;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    20. Sichere Vorgehensweise bei einer geplanten RMAN-Konfigurationsänderung

    1. Ist-Zustand sichern: SHOW ALL ausführen und Ausgabe in der Change-Dokumentation ablegen.
    2. Ziel definieren: Nur die Einstellung ändern, für die ein fachlicher Grund besteht.
    3. Abhängigkeiten prüfen: Storage, Media Manager, Retention, Archivelog-Kette, Restore-Verfahren und Lizenzierung berücksichtigen.
    4. Freigabe einholen: CONFIGURE-Befehl nur im freigegebenen Change ausführen.
    5. Nachkontrolle: Direkt danach erneut SHOW ALL ausführen.
    6. Backup testen: Nächsten Backup-Lauf und anschließend Restore-/Recovery-Fähigkeit kontrollieren.
    Praxisbeispiel:
    Die Retention soll von 7 auf 14 Tage erweitert werden. Zuerst wird SHOW ALL dokumentiert. Danach wird im freigegebenen Change ausschließlich CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS; gesetzt. Anschließend wird mit SHOW ALL kontrolliert, dass nur die gewünschte Einstellung geändert wurde. Erst danach wird bewertet, wie sich die neue Policy auf REPORT OBSOLETE, Backup-Speicherbedarf und Recovery-Kette auswirkt.
    Merksatz: Erst SHOW ALL, dann genau eine begründete CONFIGURE-Änderung, danach wieder SHOW ALL.
    Recovery Catalog: zentrales RMAN-Repository Warum ein Catalog verwendet wird, welche Informationen er speichert und wie Target und Catalog zusammenspielen. CatalogFortgeschritten

    1. Was ist das?

    Der Recovery Catalog ist ein separates Oracle-Schema, meist in einer eigenen Repository-Datenbank. Er speichert RMAN-Metadaten über Backups, Archived Logs, Incarnations, Stored Scripts und Datenbankstrukturen.

    Das Target-Controlfile bleibt weiterhin wichtig. RMAN synchronisiert Informationen aus dem Controlfile in den Catalog. Der Catalog erweitert also die Metadatenhaltung, ersetzt aber nicht das Controlfile.

    2. Warum wird das benötigt?

    • Die Historie ist nicht allein von der begrenzten Controlfile-Aufbewahrung abhängig.
    • Mehrere Datenbanken können zentral verwaltet werden.
    • Stored Scripts können zentral abgelegt werden.
    • Incarnations und ältere Backups bleiben länger nachvollziehbar.
    • Catalog-Reports können datenbankübergreifend erstellt werden.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 CONNECT TARGET verbindet RMAN mit der Zieldatenbank.
    Schritt 2 CONNECT CATALOG verbindet mit dem Catalog-Schema.
    Schritt 3 REGISTER DATABASE legt die Target-Datenbank im Catalog an.
    Schritt 4 RESYNC CATALOG überträgt neue Controlfile-Metadaten.
    Schritt 5 UPGRADE CATALOG aktualisiert Catalog-Packages nach Versionswechsel.
    Praxisbeispiel:
    Die Zieldatenbank wird mit DBID im zentralen RMAN-Catalog registriert. Danach synchronisiert RMAN die vorhandenen Backupinformationen. Bei späteren Backups werden Controlfile und Catalog gemeinsam aktualisiert.

    4. Häufige Fehler und Missverständnisse

    • Catalog-Benutzer, Service und Passwort müssen korrekt getrennt von Target-Verbindungen verwaltet werden.
    • Ein veralteter Catalog kann Package-Versionswarnungen erzeugen.
    • REGISTER DATABASE darf nicht versehentlich gegen den falschen Catalog erfolgen.
    • Catalog-Ausfall verhindert nicht zwingend jedes Backup, reduziert aber die zentrale Metadatenfunktion.

    5. Wichtige Begriffe

    BegriffErklärung
    REGISTER DATABASERegistriert eine Target-Datenbank im Catalog.
    RESYNC CATALOGSynchronisiert Controlfile-Informationen.
    UPGRADE CATALOGAktualisiert Catalog-Schema und Packages.
    RC_DATABASECatalog-View der registrierten Datenbanken.
    Stored ScriptIm Catalog gespeicherte RMAN-Befehlsfolge.
    DBIDEindeutige Kennung einer Oracle-Datenbank.

    6. Relevante Views

    RC_DATABASE, RC_BACKUP_SET, RC_BACKUP_PIECE, RC_RMAN_BACKUP_JOB_DETAILS

    7. Read-only Diagnose-SQL

    Recovery Catalog: zentrales RMAN-Repository
    SELECT
        db_key,
        dbid,
        name,
        resetlogs_change#,
        resetlogs_time
    FROM rc_database
    ORDER BY name, dbid;

    Fiktive Beispielausgabe:

    DB_KEYDBIDNAMERESETLOGS_CHANGE#RESETLOGS_TIME
    11234567890ORCL10000001.10.2026 08:00:00

    Was sehe ich hier? Diese Abfrage läuft im Recovery-Catalog-Schema. DB_KEY ist die Katalogkennung, DBID die Kennung der registrierten Datenbank; beide sind nicht austauschbar.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    RMAN> CONNECT TARGET /;
    RMAN> CONNECT CATALOG rman_user@RMAN;
    RMAN> REGISTER DATABASE;
    RMAN> RESYNC CATALOG;
    RMAN> UPGRADE CATALOG;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: Der Catalog erweitert die RMAN-Metadatenhaltung. Das Controlfile bleibt trotzdem Bestandteil jeder Recovery.
    Crosscheck, Expired, Obsolete und Delete Input Vier häufig verwechselte RMAN-Begriffe und ihre Auswirkungen auf Backup-Metadaten und Dateien. RMANPraxis

    1. Was ist das?

    RMAN unterscheidet zwischen dem physischen Zustand einer Datei und ihrer fachlichen Notwendigkeit für die Retention Policy. CROSSCHECK prüft bei DISK die Dateiverfügbarkeit beziehungsweise den Header, bei SBT die Bestätigung im Media-Manager-Katalog. Es liest nicht alle Sicherungsblöcke und ist kein vollständiger Integritätstest. Kann die Verfügbarkeit nicht bestätigt werden, kann RMAN den Eintrag als EXPIRED markieren; auch ein nicht erreichbares NFS-Ziel kann dahinterstehen. Der Befehl verändert Repository-Statuswerte und ist keine reine Leseabfrage.

    OBSOLETE bedeutet dagegen, dass ein Backup aufgrund der Retention Policy nicht mehr für das definierte Recovery-Ziel benötigt wird. DELETE INPUT bezieht sich auf die Quelldatei eines Archivelog-Backups und entfernt sie nach erfolgreicher Sicherung.

    2. Warum wird das benötigt?

    • CROSSCHECK gleicht Metadaten mit der Realität ab.
    • DELETE EXPIRED entfernt Repository-Einträge für Backups oder Kopien, die zuvor durch CROSSCHECK als EXPIRED markiert wurden.
    • DELETE OBSOLETE löscht Backups, die nach Retention Policy nicht mehr benötigt werden.
    • DELETE INPUT entfernt erfolgreich gesicherte Archived Logs aus dem Quellverzeichnis.
    • Die Befehle erfüllen unterschiedliche Aufgaben und dürfen nicht gleichgesetzt werden.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 RMAN liest die gespeicherten Piece- und Archivelog-Einträge.
    Schritt 2 CROSSCHECK prüft Erreichbarkeit je Device Type.
    Schritt 3 Retention Policy berechnet, welche Recovery-Kette aufbewahrt werden muss.
    Schritt 4 DELETE OBSOLETE entfernt passende Dateien und Metadaten.
    Schritt 5 DELETE INPUT entfernt nur Archivelog-Quellen nach erfolgreichem Backup.
    Praxisbeispiel:
    Ein NFS-Backup Piece wurde außerhalb von RMAN gelöscht. CROSSCHECK markiert es EXPIRED. Ein altes Level-0-Backup kann dagegen physisch vorhanden und AVAILABLE sein, aber wegen einer neueren vollständigen Kette als OBSOLETE gelten.

    4. Häufige Fehler und Missverständnisse

    • EXPIRED bedeutet nicht automatisch fachlich überflüssig.
    • OBSOLETE bedeutet nicht, dass die Datei fehlt.
    • DELETE INPUT ohne funktionierende Backupkontrolle kann die letzte lokale Archivelog-Kopie entfernen.
    • DELETE OBSOLETE muss zur gewünschten Recovery Window oder Redundancy passen.

    5. Wichtige Begriffe

    BegriffErklärung
    AVAILABLEDatei ist laut Crosscheck erreichbar.
    EXPIREDMetadaten vorhanden, Datei nicht erreichbar.
    OBSOLETENach Retention Policy nicht mehr benötigt.
    CROSSCHECKAbgleich von RMAN-Metadaten und Medium.
    DELETE INPUTLöscht Archivelog-Quelldatei nach erfolgreichem Backup.
    Retention PolicyDefiniert Recovery Window oder Redundancy.

    6. Relevante Views

    V$BACKUP_PIECE, V$BACKUP_SET, V$ARCHIVED_LOG, V$RMAN_CONFIGURATION

    7. Read-only Diagnose-SQL

    Crosscheck, Expired, Obsolete und Delete Input
    SELECT
        handle,
        status,
        completion_time,
        deleted,
        device_type
    FROM v$backup_piece
    WHERE completion_time >= SYSDATE - 30
    ORDER BY completion_time DESC;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    HANDLESTATUSCOMPLETION_TIMEDELETEDDEVICE_TYPE
    /backup/db_l0_01.bkpA2026-10-04 03:42:00NODISK

    So liest du das Ergebnis: A ist der Repository-Status AVAILABLE. Diese SELECT-Abfrage hat die Sicherungsdatei nicht geöffnet. Der Nachweis der Lesbarkeit erfordert eine passende aktive Validierung.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    RMAN> CROSSCHECK BACKUP DEVICE TYPE DISK;
    RMAN> DELETE NOPROMPT EXPIRED BACKUP DEVICE TYPE DISK;
    RMAN> REPORT OBSOLETE;
    RMAN> DELETE NOPROMPT OBSOLETE DEVICE TYPE DISK;
    RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: EXPIRED beschreibt Erreichbarkeit. OBSOLETE beschreibt Retention. DELETE INPUT betrifft die gesicherte Archivelog-Quelle.
    Recovery Readiness – Ist die Datenbank wirklich wiederherstellbar? Ein einheitlicher Pre-Check für Backupbestand, Archivelog-Kette, Controlfile/SPFILE und Restore-Validierung. ValidationISORead-only

    Einführung: Ein erfolgreicher Backup-Job ist nur ein Teil des Nachweises. Für einen belastbaren Recovery-Nachweis muss geprüft werden, ob RMAN die benötigten Sicherungen kennt, ob die Backup Pieces lesbar sind, ob Controlfile und SPFILE vorhanden sind und ob die Archivelog-Kette bis zum gewünschten Recovery-Zeitpunkt reicht.

    Die folgenden Schritte unterscheiden Inventarabfragen und aktive Validierung. RESTORE ... VALIDATE schreibt keine restaurierten Ausgabedateien, startet aber RMAN-Arbeit mit I/O, Sessions, Logs und Statusinformationen. Es ist daher keine reine SELECT-Abfrage. Produktive Restore-/Recovery-Aktionen beginnen erst in Teil B.

    1. SHOW ALL RMAN-Konfiguration und Retention dokumentieren.
    2. LIST BACKUP Database-, Archivelog-, Controlfile- und SPFILE-Backups inventarisieren.
    3. Archivelog-Kette Prüfen, ob das gewünschte RPO erreichbar ist.
    4. RESTORE ... VALIDATE Restore-Fähigkeit ohne echten Restore prüfen.
    5. Ergebnis Recovery Readiness als JA / EINGESCHRÄNKT / NEIN dokumentieren.

    1. RMAN-Konfiguration dokumentieren

    Read-only RMAN
    RMAN> SHOW ALL;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    2. Backupbestand dokumentieren

    Read-only RMAN
    RMAN> LIST BACKUP SUMMARY;
    RMAN> LIST BACKUP OF DATABASE;
    RMAN> LIST BACKUP OF ARCHIVELOG ALL;
    RMAN> LIST BACKUP OF CONTROLFILE;
    RMAN> LIST BACKUP OF SPFILE;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    3. Restore-Fähigkeit validieren

    RESTORE DATABASE VALIDATE prüft die für den angeforderten Datenbank-Restore ausgewählten Backups. Der Befehl führt kein RECOVER aus und belegt allein nicht die Lesbarkeit sämtlicher Archived Logs bis zu einem bestimmten Zielzeitpunkt. Diese Logs werden gezielt ausgewählt und separat validiert; eine echte Wiederherstellung mit Recovery prüft zusätzlich die Anwendung der Kette. Ein erfolgreicher Restore Validate ist daher kein vollständiger RPO-Nachweis.

    VALIDATE DATABASE prüft vorhandene Datenbankdateien; RESTORE DATABASE VALIDATE prüft dagegen die ausgewählten Sicherungen. Je nach Validierungsart können Korruptionsinformationen aktualisiert werden. CHECK LOGICAL prüft unterstützte Inkonsistenzen innerhalb einzelner Blöcke, nicht jede Beziehung zwischen Blöcken und keine fachliche Vollständigkeit der Anwendungsdaten.

    Controlfile-Restore vorbereiten: Im hier betrachteten NOMOUNT-Fall ohne Recovery Catalog die dokumentierte Quell-DBID mit SET DBID <quell_dbid>; setzen. Bei AUTOBACKUP-Suche ein abweichendes Autobackup-Format und den Gerätetyp bereitstellen; bei einem konkreten Piece dessen Zugänglichkeit prüfen. Diese Angaben müssen vor dem Ausfall extern dokumentiert sein. Nach Restore eines Backup-Controlfiles sind RECOVER und anschließend OPEN RESETLOGS erforderlich; das erreichbare Ziel hängt vom vorhandenen Redo ab.

    Validierung ohne Ausgabe restaurierter Dateien
    RMAN> RESTORE DATABASE VALIDATE;
    RMAN> RESTORE CONTROLFILE VALIDATE;
    RMAN> RESTORE SPFILE VALIDATE;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Gezielter Archivelog-Nachweis: Für den folgenden unabhängigen Lernfall wurde die benötigte Kette im aktuellen Inkarnationszweig auf Thread 1, Sequenzen 100 bis einschließlich 108 eingegrenzt. Die PITR-Grenze ist exklusiv 109. PREVIEW und VALIDATE verwenden denselben Zielkontext. Die Archivelog-Auswahl umfasst die nachgewiesene benötigte Spanne; diese Zahlen sind keine produktiven Vorgaben.

    RMAN-Validierung – liest Sicherungen, erzeugt I/O
    RUN {
      SET UNTIL SEQUENCE 109 THREAD 1;
      RESTORE DATABASE PREVIEW;
      RESTORE DATABASE VALIDATE;
      RESTORE ARCHIVELOG FROM SEQUENCE 100 UNTIL SEQUENCE 108 THREAD 1 VALIDATE;
    }

    Bei der Archivelog-Auswahl ist UNTIL SEQUENCE 108 einschließlich 108 gemeint; SET UNTIL SEQUENCE 109 bezeichnet dagegen die exklusive Recovery-Grenze. Vor Verwendung Startsequenz, Thread und Inkarnation aus der tatsächlichen Restore-/Recovery-Planung ableiten. Fehlende oder unlesbare erforderliche Sicherungen bedeuten: Nachweis nicht erbracht. Eine Bereichsauswahl ist kein eigenständiger Lückennachweis: die erwarteten Sequenzen mit Inventar und benötigter SCN-Abdeckung abgleichen. VALIDATE führt kein RECOVER aus; ein isolierter Wiederherstellungstest prüft zusätzlich die Anwendung der Kette und den Wiederanlauf.

    4. ISO-/Audit-Nachweis

    Merksatz: Backup erfolgreich bedeutet nicht automatisch Recovery nachgewiesen.
    Restore Validate und echter Restore-Test Was Validate tatsächlich prüft und warum ein echter Restore-Test trotzdem notwendig bleibt. ValidationPraxis

    1. Was ist das?

    RESTORE DATABASE VALIDATE simuliert die Auswahl und das Lesen der für einen Restore benötigten Backup Pieces, ohne Datafiles wiederherzustellen. RMAN prüft dabei, ob die Sicherungen bekannt und lesbar sind und ob die benötigte Restore-Kette grundsätzlich zusammengestellt werden kann.

    Ein Validate ist wesentlich aussagekräftiger als nur LIST BACKUP. Trotzdem ersetzt es keinen echten Restore-Test, weil Dateipfade, Mountpoints, Parameter, Controlfile-Szenarien, Zeitbedarf und Anwendungstest erst in einer realen Wiederherstellung vollständig sichtbar werden.

    2. Warum wird das benötigt?

    • Beschädigte oder nicht lesbare Pieces können früh erkannt werden.
    • Fehlende Teile der Backupkette werden vor dem Ernstfall sichtbar.
    • Restore-Auswahl und Channel-Zugriff werden geprüft.
    • Ein echter Restore-Test misst zusätzlich Ablauf, Dauer und organisatorische Vollständigkeit.
    • Recovery und Öffnen der Datenbank werden durch Validate allein nicht getestet.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 RMAN plant die Restore-Kette.
    Schritt 2 Channels öffnen die benötigten Backup Pieces.
    Schritt 3 Die Sicherungsblöcke werden gelesen und geprüft.
    Schritt 4 Es werden keine produktiven Datafiles überschrieben.
    Schritt 5 Der Job erscheint in RMAN-Status und Logausgabe.
    Praxisbeispiel:
    Sonntag um 06:00 Uhr läuft nach dem Level-0-Backup ein Restore Validate. Der DBA prüft Status, Laufzeit und Logdatei. Zusätzlich wird regelmäßig auf einem isolierten System ein echter Restore mit Recovery und Anwendungsprüfung durchgeführt.

    4. Häufige Fehler und Missverständnisse

    • Fehler und Warnungen einer Validierung müssen anhand der RMAN-Ausgabe und V$RMAN_STATUS untersucht werden; Backup-Jobstatus und Validierungsoperation sind unterschiedliche Quellen.
    • Eine leere oder nicht ausgewertete Logdatei macht den Cronlauf wertlos.
    • Validate prüft nicht automatisch alle organisatorischen Schritte eines Desaster-Recovery-Runbooks.

    5. Wichtige Begriffe

    BegriffErklärung
    RESTORE VALIDATELiest Backup Pieces ohne Datei-Restore.
    VALIDATE BACKUPSETPrüft ein vorhandenes Backupset.
    CHECK LOGICALErweitert Prüfungen um logische Blockkontrollen.
    Restore-TestTatsächliche Wiederherstellung auf Testsystem.
    RTOMaximal akzeptierte Wiederherstellungsdauer.
    RPOMaximal akzeptierter Datenverlust.

    6. Relevante Views

    V$RMAN_STATUS, V$RMAN_OUTPUT, V$RMAN_BACKUP_JOB_DETAILS, V$BACKUP_CORRUPTION

    7. Read-only Diagnose-SQL

    Restore Validate und echter Restore-Test
    SELECT
        session_recid,
        session_stamp,
        operation,
        status,
        start_time,
        end_time,
        object_type,
        output_device_type
    FROM v$rman_status
    WHERE start_time >= SYSDATE - 7
    ORDER BY start_time DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSESSION_RECIDSESSION_STAMPOPERATIONSTATUSSTART_TIME
    13011234500000RESTORECOMPLETED08.10.2026 01:00:00
    ZeileEND_TIMEOBJECT_TYPEOUTPUT_DEVICE_TYPE
    108.10.2026 01:30:00DB FULLDISK

    Was sehe ich hier? Fiktiver Ausschnitt eines RESTORE-DATABASE-VALIDATE-Laufs. OPERATION=RESTORE allein unterscheidet echten Restore und VALIDATE nicht; Aufruf und RMAN-Log gehören zum Nachweis. Eine Session kann mehrere Operationen mit unterschiedlichen Detailstufen enthalten; Zeilen nicht ohne Einordnung als unabhängige Backup-Jobs zählen.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    RMAN> RESTORE DATABASE VALIDATE;
    RMAN> VALIDATE BACKUPSET 123 CHECK LOGICAL;
    RMAN> LIST BACKUP SUMMARY;
    

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: Validate prüft die Lesbarkeit der Sicherungskette. Nur ein echter Restore-Test beweist den vollständigen Wiederanlauf.
    Oracle-19c-Hinweis: Der Data Recovery Advisor ist in Oracle 19c deprecated. Die frühere FAILURE-/ADVISE-/REPAIR-Diagnose wird deshalb in diesem Wiki nicht als normaler Diagnosepfad verwendet. Für die Readiness-Prüfung werden Repository-Inventar, PREVIEW, VALIDATE, Logs und passende dynamische Views verwendet.

    9. Blockkorruption als zusätzlichen Diagnosebaustein prüfen

    READ ONLY – bekannte Blockkorruptionen
    SELECT file#,
           block#,
           blocks,
           corruption_type
    FROM v$database_block_corruption
    ORDER BY file#, block#;

    Fiktive Beispielausgabe:

    FILE#BLOCK#BLOCKSCORRUPTION_TYPE
    712041CHECKSUM

    Was sehe ich hier? Angenommener Fehlerfall: Für einen Block ist eine Prüfsummenverletzung erfasst. Datei und Block müssen im Diagnosekontext untersucht werden. Eine leere Sicht wäre kein vollständiger Beweis, dass alle Dateien bereits validiert und fehlerfrei sind. Die Sicht ergänzt die Diagnose, ersetzt aber weder RESTORE ... VALIDATE noch einen Wiederherstellungstest.

    Praxisumgebung – vorhandene RMAN-Skripte und Crontab Die konkrete Backupkette mit Erklärungen zu Ablauf, Zweck, Risiken und Kontrolle. PraxisEigene Skripte

    1. Was bildet diese Umgebung ab?

    Die Konfiguration kombiniert ein wöchentliches Incremental Level 0, tägliche differentielle Level-1-Backups, Archivelog-Backups alle 15 Minuten und eine wöchentliche Restore-Validierung. Damit entsteht eine nachvollziehbare Sicherungskette: Das Level 0 ist die Basis, die Level-1-Backups reduzieren das tägliche Datenvolumen und die Archivelogs schließen die zeitlichen Lücken zwischen den Backups.

    2. Warum ist die Reihenfolge sinnvoll?

    • Sonntag 03:00 Uhr wird eine neue Level-0-Basis erstellt.
    • Sonntag 06:00 Uhr wird die aktuelle Sicherungskette mit Restore Validate gelesen.
    • Montag bis Samstag 05:00 Uhr sichern Level-1-Backups die geänderten Blöcke.
    • Alle 15 Minuten werden Archived Logs gesichert und nach erfolgreichem Backup mit DELETE INPUT entfernt.
    Praxisgedanke:
    Fällt am Freitag ein Datafile aus, benötigt RMAN das Level 0 vom Sonntag, die passenden Level-1-Backups und die Archived Logs bis zum gewünschten Recovery-Zeitpunkt.

    3. Wochenplan

    Sonntag 03:00 Level 0 + Archivelogs + Crosscheck + Delete Obsolete
    Sonntag 06:00 RESTORE DATABASE VALIDATE
    Montag bis Samstag 05:00 Level 1 Differential
    Alle 15 Minuten Archivelog-Backup mit DELETE INPUT

    4. Wichtige Kontrollen

    • Jeder Cronlauf benötigt eine auswertbare Logdatei oder ein zentrales Monitoring.
    • FAILED und COMPLETED WITH WARNINGS müssen aktiv bewertet werden.
    • Die NFS-Verfügbarkeit muss vor und während des Backups stabil sein.
    • DELETE OBSOLETE muss zur Retention Policy passen.
    • Restore Validate und echte Restore-Tests müssen getrennt betrachtet werden.
    • Die Solaris-Cron-Schreibweise 0,15,30,45 ist hier robuster als */15.

    5. Crontab

    Zeitplan ist keine Ablaufsteuerung: 06:00 Uhr garantiert nicht, dass das um 03:00 Uhr gestartete Backup bereits erfolgreich beendet ist. Vor Validierung dessen Abschluss prüfen und parallele Läufe durch eine betrieblich getestete Sperrung beziehungsweise Jobsteuerung verhindern. Die Skripte sind Lernvorlagen ohne solche Orchestrierung. Fehler vor dem Anlegen einer Logdatei dürfen nicht durch eine pauschale Umleitung nach /dev/null unsichtbar werden.

    RMAN-Wochenplan
    ##################################################
    #             Oracle RMAN Backup                 #
    ##################################################
    
    # Sonntag 03:00 Uhr - Level 0
    0 3 * * 0 /u01/app/ora19/backup/scripts/rman_level0_xxx.sh
    
    # Sonntag 06:00 Uhr - Backup validieren
    0 6 * * 0 /u01/app/ora19/backup/scripts/rman_validate_xxx.sh
    
    # Montag bis Samstag 05:00 Uhr - Level 1 Differential
    0 5 * * 1-6 /u01/app/ora19/backup/scripts/rman_level1_xxx.sh
    
    # Archivelogs alle 15 Minuten
    0,15,30,45 * * * * /u01/app/ora19/backup/scripts/rman_archivelog_xxx.sh

    6. Level 0

    Das Skript erzeugt die Incremental-Basis, erzwingt einen Log Switch, sichert anschließend die Archivelogs und bereinigt obsolete DISK-Backups gemäß RMAN-Retention.
    rman_level0_XXX.sh
    #!/usr/bin/bash
    umask 077
    
    export ORACLE_HOME=/u01/app/ora19/product/19.3.0/db_1
    export ORACLE_SID=XXX
    export PATH=$ORACLE_HOME/bin:$PATH
    
    # Logfile generieren
    LOGFILE="/u01/app/ora19/backup/rman_log/rman_level0_XXX_$(date '+%Y%m%d_%H%M%S')_$$.log"
    # Verzeichnisse und Oracle Home sind vorab betrieblich einzurichten.
    if [ ! -d "$(dirname "$LOGFILE")" ] || [ ! -w "$(dirname "$LOGFILE")" ] ||
       [ ! -x "$ORACLE_HOME/bin/rman" ]; then
      printf '%s\n' 'FEHLER: Logverzeichnis oder RMAN-Programm fehlt.' >&2
      exit 2
    fi
    
    # Pro Lauf eine eigene Logdatei; vorhandene Logs bleiben erhalten.
    
    # Startinformationen schreiben
    {
    echo "=========================================================="
    echo "RMAN LEVEL 0 BACKUP"
    echo "START: $(date '+%d.%m.%Y %H:%M:%S')"
    echo "=========================================================="
    } > "$LOGFILE" || exit 3
    
    # Zeitmessung starten
    SECONDS=0
    
    # RMAN Backup
    "$ORACLE_HOME/bin/rman" target / >> "$LOGFILE" 2>&1 <<EOF
    
    RUN {
    
    SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
    
    # 1 Kanal für Schreiben und anschließendes Lesen öffnen
    ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
    
    BACKUP AS BACKUPSET
    INCREMENTAL LEVEL 0
    DATABASE
    FORMAT '/backup/rman/DB_NAME/FULL/%d_L0_%U';
    
    BACKUP ARCHIVELOG ALL FORMAT '/backup/rman/DB_NAME/archive/%d_ARCH_%U' DELETE INPUT;
    
    # Kanal freigeben
    RELEASE CHANNEL ch1;
    
    }
    
    # Bereinigung alter Backups
    # Ausgelagert, aber mit expliziter DISK-Anweisung:
    CROSSCHECK BACKUP DEVICE TYPE DISK;
    DELETE NOPROMPT OBSOLETE DEVICE TYPE DISK;
    EOF
    RMAN_RC=$?
    
    # Gesamtlaufzeit berechnen und ins Log schreiben
    Laufzeit_Sekunden=$SECONDS
    Minuten=$((Laufzeit_Sekunden / 60))
    Sekunden=$((Laufzeit_Sekunden % 60))
    
    # Abschlussinformationen anhängen
    {
    echo
    echo "=========================================================="
    echo "ENDE: $(date '+%d.%m.%Y %H:%M:%S')"
    echo "GESAMTLAUFZEIT: ${Minuten} Minute(n) ${Sekunden} Sekunde(n)"
    echo "=========================================================="
    } >> "$LOGFILE"
    if [ "$?" -ne 0 ]; then exit 3; fi
    printf 'RMAN-Status: %s; Log: %s\n' "$RMAN_RC" "$LOGFILE"
    exit "$RMAN_RC"

    7. Level 1 Differential

    Das Skript sichert die seit dem letzten Level 0 oder Level 1 geänderten Blöcke. Dadurch ist es normalerweise kleiner und schneller als ein erneutes Level 0.
    rman_level1_XXX.sh
    #!/usr/bin/bash
    umask 077
    export ORACLE_HOME=/u01/app/ora19/product/19.3.0/db_1
    export ORACLE_SID=XXX
    export PATH=$ORACLE_HOME/bin:$PATH
    
    # Logfile generieren
    LOGFILE="/u01/app/ora19/backup/rman_log/rman_level1_XXX_$(date '+%Y%m%d_%H%M%S')_$$.log"
    # Verzeichnisse und Oracle Home sind vorab betrieblich einzurichten.
    if [ ! -d "$(dirname "$LOGFILE")" ] || [ ! -w "$(dirname "$LOGFILE")" ] ||
       [ ! -x "$ORACLE_HOME/bin/rman" ]; then
      printf '%s\n' 'FEHLER: Logverzeichnis oder RMAN-Programm fehlt.' >&2
      exit 2
    fi
    
    # Pro Lauf eine eigene Logdatei; vorhandene Logs bleiben erhalten.
    
    # Startinformationen schreiben (Erstellt die Datei neu mit ">")
    {
    echo "=========================================================="
    echo "RMAN LEVEL 1 BACKUP"
    echo "START: $(date '+%d.%m.%Y %H:%M:%S')"
    echo "=========================================================="
    } > "$LOGFILE" || exit 3
    
    # Zeitmessung starten
    SECONDS=0
    
    # RMAN Backup ausführen (Hängt die RMAN-Ausgabe an das Log an)
    "$ORACLE_HOME/bin/rman" target / >> "$LOGFILE" 2>&1 <<EOF
    RUN {
      # Für SE2 wird nur 1 Kanal allokiert
      ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
    
      # Inkrementelles differentielles Backup
      BACKUP INCREMENTAL LEVEL 1 
        DATABASE 
        FORMAT '/backup/rman/DB_NAME/incr/%d_L1_%U';
    
      # Kanal freigeben
      RELEASE CHANNEL ch1;
    }
    EOF
    RMAN_RC=$?
    
    # Gesamtlaufzeit berechnen
    Laufzeit_Sekunden=$SECONDS
    Minuten=$((Laufzeit_Sekunden / 60))
    Sekunden=$((Laufzeit_Sekunden % 60))
    
    # Abschlussinformationen anhängen
    {
    echo
    echo "=========================================================="
    echo "ENDE: $(date '+%d.%m.%Y %H:%M:%S')"
    echo "GESAMTLAUFZEIT: ${Minuten} Minute(n) ${Sekunden} Sekunde(n)"
    echo "=========================================================="
    } >> "$LOGFILE"
    if [ "$?" -ne 0 ]; then exit 3; fi
    printf 'RMAN-Status: %s; Log: %s\n' "$RMAN_RC" "$LOGFILE"
    exit "$RMAN_RC"

    8. Archivelog-Backup

    DELETE INPUT entfernt ein Archived Log erst nach erfolgreicher Sicherung in ein Backup Piece. Damit wird das Archive-Ziel entlastet, gleichzeitig steigt die Bedeutung des Backupziels.
    rman_archivelog_XXX.sh
    #!/usr/bin/bash
    umask 077
    
    export ORACLE_HOME=/u01/app/ora19/product/19.3.0/db_1
    export ORACLE_SID=XXX
    export PATH=$ORACLE_HOME/bin:$PATH
    
    LOGFILE="/u01/app/ora19/backup/rman_log/rman_arch_XXX_$(date '+%Y%m%d_%H%M%S')_$$.log"
    # Verzeichnisse und Oracle Home sind vorab betrieblich einzurichten.
    if [ ! -d "$(dirname "$LOGFILE")" ] || [ ! -w "$(dirname "$LOGFILE")" ] ||
       [ ! -x "$ORACLE_HOME/bin/rman" ]; then
      printf '%s\n' 'FEHLER: Logverzeichnis oder RMAN-Programm fehlt.' >&2
      exit 2
    fi
    
    # Pro Lauf eine eigene Logdatei; vorhandene Logs bleiben erhalten.
    
    {
    echo "=========================================================="
    echo "RMAN Archive Log BACKUP"
    echo "START: $(date '+%d.%m.%Y %H:%M:%S')"
    echo "=========================================================="
    } > "$LOGFILE" || exit 3
    
    # Zeitmessung starten
    SECONDS=0
    
    "$ORACLE_HOME/bin/rman" target / >> "$LOGFILE" 2>&1 <<EOF
    
    RUN {
    
    ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
    
    # SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
    BACKUP ARCHIVELOG ALL FORMAT '/backup/rman/DB_NAME/archive/%d_ARCH_%U' DELETE INPUT;
    
    RELEASE CHANNEL ch1;
    
    }
    
    EOF
    RMAN_RC=$?
    
    # Gesamtlaufzeit berechnen und ins Log schreiben
    Laufzeit_Sekunden=$SECONDS
    Minuten=$((Laufzeit_Sekunden / 60))
    Sekunden=$((Laufzeit_Sekunden % 60))
    
    # Abschlussinformationen anhängen
    {
    echo
    echo "=========================================================="
    echo "ENDE: $(date '+%d.%m.%Y %H:%M:%S')"
    echo "GESAMTLAUFZEIT: ${Minuten} Minute(n) ${Sekunden} Sekunde(n)"
    echo "=========================================================="
    } >> "$LOGFILE"
    if [ "$?" -ne 0 ]; then exit 3; fi
    printf 'RMAN-Status: %s; Log: %s\n' "$RMAN_RC" "$LOGFILE"
    exit "$RMAN_RC"

    9. Restore Validate

    RESTORE DATABASE VALIDATE liest die benötigten Backup Pieces, ohne produktive Datafiles wiederherzustellen. Es prüft die Restore-Kette, ersetzt aber keinen echten Wiederherstellungstest.
    rman_validate_xxx.sh
    #!/usr/bin/bash
    umask 077
    
    export ORACLE_HOME=/u01/app/ora19/product/19.3.0/db_1
    export ORACLE_SID=XXX
    export PATH=$ORACLE_HOME/bin:$PATH
    
    # Logfile generieren
    LOGFILE="/u01/app/ora19/backup/rman_log/rman_validate_xxx_$(date '+%Y%m%d_%H%M%S')_$$.log"
    # Verzeichnisse und Oracle Home sind vorab betrieblich einzurichten.
    if [ ! -d "$(dirname "$LOGFILE")" ] || [ ! -w "$(dirname "$LOGFILE")" ] ||
       [ ! -x "$ORACLE_HOME/bin/rman" ]; then
      printf '%s\n' 'FEHLER: Logverzeichnis oder RMAN-Programm fehlt.' >&2
      exit 2
    fi
    
    # Pro Lauf eine eigene Logdatei; vorhandene Logs bleiben erhalten.
    
    # Startinformationen schreiben
    {
    echo "=========================================================="
    echo "RMAN VALIDATE RESTORE"
    echo "START: $(date '+%d.%m.%Y %H:%M:%S')"
    echo "=========================================================="
    } > "$LOGFILE" || exit 3
    
    # Zeitmessung starten
    SECONDS=0
    
    # RMAN Validierung 
    "$ORACLE_HOME/bin/rman" target / >> "$LOGFILE" 2>&1 <<EOF
    
    RUN {
    ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;
    
    # Sofortige Validierung
    RESTORE DATABASE VALIDATE;
    
    # Kanal freigeben
    RELEASE CHANNEL ch1;
    }
    
    EOF
    RMAN_RC=$?
    
    # Gesamtlaufzeit berechnen und ins Log schreiben
    Laufzeit_Sekunden=$SECONDS
    Minuten=$((Laufzeit_Sekunden / 60))
    Sekunden=$((Laufzeit_Sekunden % 60))
    
    # Abschlussinformationen anhängen
    {
    echo
    echo "=========================================================="
    echo "ENDE: $(date '+%d.%m.%Y %H:%M:%S')"
    echo "GESAMTLAUFZEIT: ${Minuten} Minute(n) ${Sekunden} Sekunde(n)"
    echo "=========================================================="
    } >> "$LOGFILE"
    if [ "$?" -ne 0 ]; then exit 3; fi
    printf 'RMAN-Status: %s; Log: %s\n' "$RMAN_RC" "$LOGFILE"
    exit "$RMAN_RC"
    Was deckt dieser Ablauf ab?

    Bei geöffneter Datenbank führt BACKUP ARCHIVELOG ALL vor der Sicherung automatisch einen Logwechsel mit Archivierung aus. Allgemein gilt dies bei BACKUP ARCHIVELOG ohne UNTIL- oder SEQUENCE-Einschränkung. Bei nur gemounteter Datenbank gilt diese Aussage zum automatischen Wechsel nicht. Gesichert werden Archived Logs, nicht die Online-Redo-Dateien selbst. Ein cron-Takt von 15 Minuten garantiert dennoch allein keinen maximalen Datenverlust von 15 Minuten. Maßgeblich sind der tatsächlich archivierte, erfolgreich gesicherte und am Recovery-Ziel erreichbare Redo-Stand sowie die Ausfalldauer der Jobs.

    Die Beispiele erzeugen pro Lauf ein eigenes Log und geben den RMAN-Rückgabestatus an den Aufrufer weiter. Status 0 ist kein vollständiger Recovery-Nachweis; Backupkette, Loginhalt und Restore-/Recovery-Test bleiben getrennte Prüfpunkte. Die Logaufbewahrung wird betrieblich geplant, nicht durch pauschales Löschen beim nächsten Lauf ersetzt.

    10. Read-only Kontrolle

    Letzte RMAN-Jobs
    SELECT
        input_type,
        status,
        start_time,
        end_time,
        elapsed_seconds,
        input_bytes_display,
        output_bytes_display,
        output_device_type
    FROM v$rman_backup_job_details
    WHERE start_time >= SYSDATE - 14
    ORDER BY start_time DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileINPUT_TYPESTATUSSTART_TIMEEND_TIMEELAPSED_SECONDS
    1DB INCRCOMPLETED08.10.2026 01:00:0008.10.2026 01:30:001800
    ZeileINPUT_BYTES_DISPLAYOUTPUT_BYTES_DISPLAYOUTPUT_DEVICE_TYPE
    120.00G12.00GDISK

    Was sehe ich hier? Der erfasste Lauf ist abgeschlossen. Das bestätigt diesen Jobstatus, nicht automatisch die Wiederherstellbarkeit eines beliebigen Zielzeitpunkts.

    Merksatz: Eine gute Backupkette besteht nicht nur aus erfolgreichen Backups, sondern aus überwachten Logs, lesbaren Pieces, vollständigen Archived Logs und regelmäßig getesteten Restore-Abläufen.
    Praxisbeispiel: Läuft mein RMAN-Backup noch? Jobstatus, Fortschritt und RMAN-Sessions read-only gemeinsam beurteilen. PraxisDiagnose

    Situation: Das nächtliche RMAN-Backup läuft deutlich länger als gewohnt. Im Backup-Log erscheint seit einiger Zeit keine neue Ausgabe. Jetzt soll geklärt werden, ob der Job noch läuft, ob weiterhin Fortschritt erkennbar ist oder ob RMAN auf eine Ressource wartet.

    Die Diagnose betrachtet bewusst drei verschiedene Ebenen: RMAN-Job, Fortschritt einer Long Operation und RMAN-Session mit aktuellem Wait. Erst die Kombination ergibt ein belastbares Bild.

    1. Läuft aktuell ein RMAN-Backup-Job?

    V$RMAN_BACKUP_JOB_DETAILS – laufende Backup-Jobs
    SELECT session_key,
           input_type,
           status,
           start_time,
           elapsed_seconds,
           time_taken_display
    FROM   v$rman_backup_job_details
    WHERE  status IN ('RUNNING', 'RUNNING WITH WARNINGS', 'RUNNING WITH ERRORS')
    ORDER BY start_time;

    Fiktive Beispielausgabe:

    Zusammengehörige Teilansichten derselben Ergebniszeilen.

    SESSION_KEYINPUT_TYPESTATUSSTART_TIMEELAPSED_SECONDS
    920DB INCRRUNNING2026-10-08 05:00:00600
    TIME_TAKEN_DISPLAY
    00:10:00

    So liest du das Ergebnis: Ein inkrementeller Job ist noch aktiv erfasst. DB INCR zeigt das Level nicht. Für Fortschritt im nächsten Schritt SOFAR und TOTALWORK über mehrere Messungen vergleichen.

    Was sehe ich hier?

    Diese Abfrage zeigt RMAN-Backup-Jobs, die Oracle aktuell mit dem Status RUNNING kennt. INPUT_TYPE hilft bei der Einordnung der Backup-Art. START_TIME und ELAPSED_SECONDS zeigen, wie lange der Job bereits läuft.

    2. Macht das Backup noch Fortschritt?

    V$SESSION_LONGOPS – sichtbarer Fortschritt
    SELECT sid,
           serial#,
           opname,
           sofar,
           totalwork,
           units,
           ROUND(sofar / NULLIF(totalwork, 0) * 100, 2) AS percent_done,
           elapsed_seconds,
           time_remaining
    FROM   v$session_longops
    WHERE  opname LIKE 'RMAN%'
    AND    totalwork > 0
    AND    sofar < totalwork
    ORDER BY start_time;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#OPNAMESOFARTOTALWORK
    12105001RMAN: full datafile backup600010000
    ZeileUNITSPERCENT_DONEELAPSED_SECONDSTIME_REMAINING
    1Blocks603020

    Was sehe ich hier? 6.000 / 10.000 ergibt 60 %. Die Zeile beschreibt eine erfasste RMAN-Operation; das Ende dieser Operation muss nicht das Ende des gesamten Backups sein. Keine Zeile beweist keinen Stillstand oder Abschluss aller RMAN-Arbeit. SOFAR und TOTALWORK beziehen sich auf die von UNITS benannte Arbeitseinheit.

    Wichtige Einordnung: Wenn V$SESSION_LONGOPS keine Zeile liefert, ist das kein sicherer Beweis, dass kein RMAN-Backup läuft. Nicht jede Phase eines RMAN-Jobs muss zu jedem Zeitpunkt als passende Long Operation sichtbar sein.

    3. Welche RMAN-Sessions laufen und worauf warten sie?

    V$SESSION – RMAN-Sessions und Waits
    SELECT sid,
           serial#,
           status,
           program,
           module,
           client_info,
           state,
           event,
           wait_class,
           CASE WHEN state = 'WAITING'
                THEN ROUND(wait_time_micro / 1000000, 3)
           END AS current_wait_seconds
    FROM   v$session
    WHERE  LOWER(program) LIKE '%rman%'
       OR  LOWER(module)  LIKE '%rman%'
       OR  LOWER(client_info) LIKE 'rman%'
    ORDER BY sid;

    current_wait_seconds zeigt die Dauer des aktuellen Waits in Sekunden. NULL bedeutet hier, dass die Session gerade nicht wartet. EVENT kann dann den letzten Wait beschreiben. Die Namensfilter sind ein Diagnoseeinstieg, kein vollständiger Nachweis jeder RMAN-Aktivität.

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#STATUSPROGRAMMODULE
    12105001ACTIVErman@backup01rman backup
    ZeileCLIENT_INFOSTATEEVENTWAIT_CLASSCURRENT_WAIT_SECONDS
    1rman channel=ORA_DISK_1WAITINGRMAN backup & recovery I/OSystem I/O1

    Was sehe ich hier? Ausschnitt: Der Channel wartet gerade auf Backup-I/O. Die Zeile allein unterscheidet nicht zwischen normalem Fortschritt und einem dauerhaften Engpass; mehrere Messpunkte und RMAN-Protokoll hinzunehmen. Eine vorhandene RMAN-Session allein beweist noch keinen laufenden Datentransfer.

    ACTIVE bedeutet nicht automatisch „arbeitet ohne Pause“: Eine RMAN-Session kann ACTIVE sein und gleichzeitig auf I/O, Netzwerk, Media Manager oder andere Ressourcen warten. Deshalb Sessionstatus, Wait Event und sichtbaren Backup-Fortschritt gemeinsam beurteilen.

    4. Wie bewerte ich das Ergebnis?

    Diagnosekette:
    1. V$RMAN_BACKUP_JOB_DETAILS → Gibt es einen laufenden Job?
    2. V$SESSION_LONGOPS → Ist Fortschritt sichtbar?
    3. V$SESSION → Welche RMAN-Sessions existieren und worauf warten sie?
    4. Danach RMAN-, Media-Manager- und Betriebssystem-Logs prüfen → Gibt es Fehler, Retries oder lange Wartephasen?
    Lerneffekt: Ein vorhandener RMAN-Job, eine RMAN-Session und tatsächlicher Backup-Fortschritt sind unterschiedliche Beobachtungen. Erst die Kombination mehrerer Informationen ermöglicht eine belastbare Beurteilung.

    Teil B – Restore, Recovery & Disaster-Recovery Runbook

    Leitfrage: „Welcher Zustand soll erreicht werden, welche Recovery-Methode passt zum Schadensbild und welche Sicherungs-/Redo-Kette wird dafür benötigt?“

    Sicherheitsregel: Read-only Diagnose und administrative Recovery-Aktion bleiben klar getrennt. Das Wiki dokumentiert Recovery-Befehle, führt sie aber nicht automatisch aus.

    Restore und Recover: zwei verschiedene Schritte Warum Restore Dateien bereitstellt und Recover erst die Konsistenz herstellt. RecoveryGrundlagen

    1. Was ist das?

    Restore und Recover werden oft fälschlich als derselbe Vorgang betrachtet. Restore holt eine gesicherte Datei aus einem Backup Piece oder einer Image Copy zurück. Die Datei besitzt danach aber nur den Stand des Backupzeitpunkts.

    Recover wendet anschließend Archived Logs und gegebenenfalls Online Redo an. Dadurch werden Änderungen nachgezogen, bis die Datei den gewünschten SCN oder Zeitpunkt erreicht. Erst nach erfolgreichem Recover sind die Checkpoint-Informationen der beteiligten Dateien wieder zueinander passend.

    2. Warum wird das benötigt?

    • Ein Datafile-Backup hält einen früheren Sicherungsstand fest. Ob danach weitere Änderungen nachgeführt werden müssen, hängt vom Sicherungstyp, Datenbankzustand und gewünschten Recovery-Ziel ab; bei einer unveränderten, konsistent gesicherten Datenbank ist „immer älter“ keine zutreffende Regel.
    • Oracle kann inkrementelle Backups und erforderliches Redo anwenden, um Änderungen nach dem Basisbackup nachzuführen.
    • Restore und Recover können sich auf einzelne Datafiles, Tablespaces oder die gesamte Datenbank beziehen.
    • Vollständige Recovery und unvollständige Recovery haben unterschiedliche Open-Verfahren.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 RMAN bestimmt das passende Backup Piece.
    Schritt 2 Restore schreibt das Datafile an den Original- oder einen neuen Pfad.
    Schritt 3 Recover liest Archived Logs und Online Redo in SCN-Reihenfolge.
    Schritt 4 Oracle führt Roll Forward durch und verwendet Undo für Transaktionskonsistenz.
    Schritt 5 Nach vollständiger Recovery mit aktuellem Controlfile kann normal geöffnet werden. Nach PITR oder Recovery mit restauriertem Backup-Controlfile ist RESETLOGS erforderlich.
    Praxisbeispiel:
    Datafile 7 wurde gelöscht. RESTORE stellt Datafile 7 aus einem passenden Full-/Level-0-Backup oder einer Image Copy bereit. RECOVER wendet danach geeignete Level-1-Backups und erforderliches Redo an. Die Datei muss den für ihre Wiederverwendung erforderlichen konsistenten Stand erreichen; nicht alle Datafile-Header müssen deshalb dieselbe Checkpoint-SCN anzeigen.

    4. Häufige Fehler und Missverständnisse

    • Nur RESTORE auszuführen lässt die Datei möglicherweise weiter recovery-bedürftig.
    • Fehlende Archived Logs begrenzen den erreichbaren Stand.
    • Falsche Incarnation oder falsches Controlfile kann dazu führen, dass passende Backups nicht gefunden werden.

    5. Wichtige Begriffe

    BegriffErklärung
    RestoreBereitstellen einer Datei aus dem Backup.
    RecoverAnwenden von Redo auf die wiederhergestellte Datei.
    Media RecoveryRecovery physisch beschädigter oder verlorener Dateien.
    Checkpoint SCNKonsistenzmarke eines Datafiles oder Controlfiles.
    Complete RecoveryWiederherstellung sämtlicher bis zum Ausfall erforderlicher Änderungen. Der letzte noch verfügbare Archived Log allein definiert kein Complete Recovery.
    Incomplete RecoveryRecovery nur bis Zeit, SCN oder Sequenz.

    6. Relevante Views

    V$RECOVER_FILE, V$DATAFILE_HEADER, V$DATABASE, V$ARCHIVED_LOG

    7. Read-only Diagnose-SQL

    Restore und Recover: zwei verschiedene Schritte
    SELECT
        file#,
        online_status,
        error,
        change#,
        time
    FROM v$recover_file
    ORDER BY file#;

    Fiktive Beispielausgabe:

    FILE#ONLINE_STATUSERRORCHANGE#TIME
    7ONLINEFILE NOT FOUND12345000008.10.2026 09:00:00

    Was sehe ich hier? Angenommener Ausfall: Datei 7 wird als nicht gefunden gemeldet. Vor Recovery prüfen, ob ein Pfad-, Mount- oder tatsächlicher Dateiverlust vorliegt. Die Sicht kann bei bestimmten Controlfile-Situationen unvollständig sein.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    RMAN> STARTUP MOUNT;
    RMAN> RESTORE DATABASE;
    RMAN> RECOVER DATABASE;
    SQL>  ALTER DATABASE OPEN;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: RESTORE macht die Datei wieder vorhanden. RECOVER macht sie wieder aktuell und konsistent.
    Point-in-Time Recovery (PITR) Eine Datenbank bewusst auf einen früheren Zeitpunkt, SCN oder eine Sequenz zurücksetzen. PITRFortgeschritten

    1. Was ist das?

    Point-in-Time Recovery ist eine unvollständige Recovery. Sie wird verwendet, wenn nicht der neueste Stand gewünscht ist, sondern ein Stand unmittelbar vor einem logischen Fehler. Typische Beispiele sind ein versehentliches DROP TABLE, falsche Massendatenänderungen oder ein fehlerhaftes Deployment.

    RMAN stellt zunächst passende Backups wieder her und wendet Redo nur bis zum definierten Ziel an. Alle Änderungen nach diesem Ziel werden bewusst verworfen. Deshalb muss der Zielpunkt sorgfältig bestimmt und dokumentiert werden.

    2. Warum wird das benötigt?

    • PITR kann logische Fehler korrigieren, wenn kein geeigneter Export oder Flashback-Weg verfügbar ist.
    • UNTIL TIME ist für betriebliche Zeitangaben verständlich, muss aber Zeitzonen berücksichtigen.
    • UNTIL SCN ist technisch eindeutig.
    • UNTIL SEQUENCE eignet sich bei bekannter Redo-Sequenz.
    • Nach PITR entsteht mit OPEN RESETLOGS eine neue Incarnation.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 SET UNTIL legt die obere Recovery-Grenze fest.
    Schritt 2 RMAN wählt Backups, deren Checkpoint vor dem Ziel liegt.
    Schritt 3 Restore stellt diese Dateien bereit.
    Schritt 4 Recover wendet Redo nur bis zur Zielgrenze an.
    Schritt 5 OPEN RESETLOGS erzeugt eine neue Redo-Historie.
    Praxisbeispiel:
    Um 11:02 Uhr wurde eine Tabelle fehlerhaft geleert. Der DBA wählt 10:59 Uhr als Ziel. Vorher werden Alertlog, Anwendungsmeldungen und Archived-Log-Zeiträume geprüft. Anschließend wird auf einem Wiederherstellungssystem getestet, ob der fachlich richtige Stand erreicht wird.

    4. Häufige Fehler und Missverständnisse

    • Ein Zielzeitpunkt nach dem Fehler ist wirkungslos.
    • Ein zu früher Zielpunkt verwirft unnötig viele korrekte Änderungen.
    • Zeitstempel ohne Zeitzonenprüfung können zu einem falschen Ziel führen.
    • Nach RESETLOGS muss die neue Incarnation und ein neues Basisbackup berücksichtigt werden.

    5. Wichtige Begriffe

    BegriffErklärung
    UNTIL TIMERecovery-Grenze als Zeitstempel.
    UNTIL SCNRecovery-Grenze als System Change Number.
    UNTIL SEQUENCERecovery-Grenze als Redo-Sequenz.
    PITRUnvollständige Recovery auf einen früheren Stand.
    TSPITRPoint-in-Time Recovery eines Tablespaces.
    RESETLOGSStart einer neuen Redo-Historie nach PITR.

    6. Relevante Views

    V$DATABASE, V$DATABASE_INCARNATION, V$ARCHIVED_LOG, V$LOG_HISTORY

    7. Read-only Diagnose-SQL

    Point-in-Time Recovery (PITR)
    SELECT
        thread#,
        sequence#,
        first_time,
        next_time,
        first_change#,
        next_change#
    FROM v$archived_log
    WHERE first_time >= SYSDATE - 2
    ORDER BY thread#, sequence#;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileTHREAD#SEQUENCE#FIRST_TIMENEXT_TIMEFIRST_CHANGE#
    1110808.10.2026 10:00:0008.10.2026 10:15:00123450000
    ZeileNEXT_CHANGE#
    1123460000

    Was sehe ich hier? Die SCN-Spanne gehört zur Sequenz 108. Eine einzelne Zeile belegt noch keine lückenlose Redo-Kette über den gesamten benötigten Wiederherstellungszeitraum.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    RMAN> RUN {
      SET UNTIL TIME "TO_DATE('2026-08-05 10:59:00','YYYY-MM-DD HH24:MI:SS')";
      RESTORE DATABASE;
      RECOVER DATABASE;
    }
    
    SQL> ALTER DATABASE OPEN RESETLOGS;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: PITR rettet einen früheren Stand, verwirft aber alle späteren Änderungen. Der Zielpunkt ist die wichtigste Entscheidung.
    Flashback als Theorie und Abgrenzung zum Backup Flashback Query, Table, Drop, Transaction und Database verstehen, ohne sie mit Backup zu verwechseln. FlashbackTheorie

    1. Was ist das?

    Flashback ist eine Gruppe von Oracle-Funktionen, mit denen frühere Zustände gelesen oder wiederhergestellt werden können. Je nach Funktion stammen die Informationen aus Undo, Recycle Bin oder Flashback Logs.

    Flashback kann bei bestimmten logischen Fehlern deutlich schneller sein als ein vollständiges Restore/Recover. Es ist aber kein Ersatz für ein Backup, weil die benötigten Informationen nur begrenzt aufbewahrt werden und selbst durch Storage- oder Datenbankverlust betroffen sein können.

    2. Warum wird das benötigt?

    • Flashback Query liest ältere Daten über AS OF TIMESTAMP oder AS OF SCN.
    • Flashback Table setzt einzelne Tabellen auf einen früheren Zustand.
    • Flashback Drop stellt Objekte aus dem Recycle Bin wieder her.
    • Flashback Database setzt die gesamte Datenbank mithilfe von Flashback Logs zurück.
    • Flashback Transaction Query hilft bei der Analyse früherer Transaktionen.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 Flashback Query verwendet Undo für konsistente ältere Versionen.
    Schritt 2 Flashback Drop nutzt Recycle-Bin-Metadaten.
    Schritt 3 Flashback Database benötigt aktiviertes Flashback Logging.
    Schritt 4 Flashback Logs werden in der Recovery Area verwaltet.
    Schritt 5 Die tatsächlich erreichbare Zeit hängt von Last und Speicher ab.
    Praxisbeispiel:
    Eine Tabelle wurde vor zehn Minuten falsch geändert. Zunächst wird mit AS OF TIMESTAMP geprüft, ob die benötigten alten Werte noch über Undo verfügbar sind. Erst danach wird entschieden, ob Flashback Table, gezielte Korrektur oder PITR erforderlich ist.

    4. Häufige Fehler und Missverständnisse

    • DB_FLASHBACK_RETENTION_TARGET ist ein Zielwert, keine garantierte Aufbewahrungsdauer.
    • Flashback Query kann mit ORA-01555 scheitern, wenn Undo nicht mehr verfügbar ist.
    • Flashback Database schützt nicht vor Verlust des gesamten Storage.
    • Flashback-Aktionen benötigen ein geprüftes fachliches Ziel.

    5. Wichtige Begriffe

    BegriffErklärung
    AS OF TIMESTAMPHistorische Abfrage nach Zeit.
    AS OF SCNHistorische Abfrage nach SCN.
    Flashback TableRücksetzen einer Tabelle.
    Flashback DropWiederherstellung aus dem Recycle Bin.
    Flashback DatabaseDatenbankweites Zurücksetzen mit Flashback Logs.
    Retention TargetZielwert für Flashback-Aufbewahrung.

    6. Relevante Views

    V$DATABASE, V$FLASHBACK_DATABASE_LOG, V$FLASHBACK_DATABASE_STAT, FLASHBACK_TRANSACTION_QUERY, DBA_RECYCLEBIN

    7. Read-only Diagnose-SQL

    Flashback als Theorie und Abgrenzung zum Backup
    SELECT
        flashback_on,
        current_scn
    FROM v$database;
    
    SELECT
        oldest_flashback_scn,
        oldest_flashback_time,
        retention_target,
        flashback_size
    FROM v$flashback_database_log;

    Fiktive Beispielausgabe:

    SELECT 1.

    FLASHBACK_ONCURRENT_SCN
    YES123470000

    Einordnung zu SELECT 1: Eigenständiges Lernbeispiel einer passenden Edition und Konfiguration mit aktiviertem Flashback Database.

    Fiktive Beispielausgabe:

    SELECT 2.

    OLDEST_FLASHBACK_SCNOLDEST_FLASHBACK_TIMERETENTION_TARGETFLASHBACK_SIZE
    12340000008.10.2026 08:00:0014402147483648

    Einordnung zu SELECT 2: RETENTION_TARGET wird in Minuten angegeben, FLASHBACK_SIZE in Bytes. Das Ziel von 1.440 Minuten garantiert keine tatsächlich verfügbare Historie von 24 Stunden.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    -- Theoriebeispiel, nicht automatisch ausführen:
    SELECT *
    FROM schema.tabelle
    AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);
    
    RMAN> FLASHBACK DATABASE TO TIME
          "TO_DATE('2026-08-05 10:59:00','YYYY-MM-DD HH24:MI:SS')";

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: Flashback ist ein schnelles Rücksetzwerkzeug für bestimmte Fälle. Ein unabhängiges Backup bleibt unverzichtbar.
    OPEN RESETLOGS und neue Recovery-Linie Warum RESETLOGS nach unvollständiger Recovery erforderlich ist und eine neue Incarnation erzeugt. RESETLOGSFortgeschritten

    1. Was ist das?

    OPEN RESETLOGS wird nach einer unvollständigen Recovery oder bestimmten Controlfile-Recovery-Szenarien benötigt. Oracle setzt die Online-Redo-Sequenzen zurück, initialisiert die Redo-Historie neu und erzeugt eine neue Database Incarnation.

    Die Datenbank ist danach nicht dieselbe Recovery-Linie wie vor dem Fehler. Frühere Backups bleiben grundsätzlich bekannt, gehören aber zu älteren Incarnations. RMAN muss bei einer späteren Recovery wissen, welcher Linie gefolgt werden soll.

    2. Warum wird das benötigt?

    • Nach PITR stimmen die wiederhergestellten Datenfiles nicht mit der bisherigen Redo-Zukunft überein.
    • Eine neue Redo-Linie verhindert Vermischung alter und neuer Sequenzen.
    • Incarnations erlauben RMAN, mehrere RESETLOGS-Zweige zu verwalten.
    • Nach RESETLOGS sollte zeitnah ein neues Level 0 oder vollständiges Backup erstellt werden.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 Oracle öffnet die Datenbank am gewählten Recovery-Endpunkt.
    Schritt 2 Online Redo Logs werden neu initialisiert.
    Schritt 3 RESETLOGS_CHANGE# und RESETLOGS_TIME werden gesetzt.
    Schritt 4 V$DATABASE_INCARNATION erhält eine neue CURRENT-Incarnation.
    Schritt 5 Neue Backups gehören ab diesem Zeitpunkt zur neuen Linie.
    Praxisbeispiel:
    Nach PITR auf 10:59 Uhr wird die Datenbank mit RESETLOGS geöffnet. Anschließend werden Anwendung, Datenbestand und Alertlog geprüft. Danach wird ein neues Basisbackup erstellt, damit die neue Incarnation vollständig abgesichert ist.

    4. Häufige Fehler und Missverständnisse

    • RESETLOGS darf nicht als beliebiger Reparaturbefehl verwendet werden.
    • Ein Recovery-Versuch mit falscher Incarnation kann passende Backups ausblenden.
    • Nach RESETLOGS ohne neues Backup wächst das Recovery-Risiko.

    5. Wichtige Begriffe

    BegriffErklärung
    RESETLOGS_CHANGE#Start-SCN der neuen Incarnation.
    RESETLOGS_TIMEZeitpunkt der neuen Recovery-Linie.
    CURRENTAktuell aktive Incarnation.
    PARENTVorherige Incarnation.
    ORPHANNicht zur aktuellen Linie gehörender Zweig.
    RESET DATABASE TO INCARNATIONRMAN-Auswahl einer älteren Recovery-Linie.

    6. Relevante Views

    V$DATABASE, V$DATABASE_INCARNATION, V$LOG, V$LOG_HISTORY

    7. Read-only Diagnose-SQL

    OPEN RESETLOGS und neue Recovery-Linie
    SELECT
        incarnation#,
        resetlogs_change#,
        resetlogs_time,
        prior_incarnation#,
        status
    FROM v$database_incarnation
    ORDER BY incarnation#;

    Fiktive Beispielausgabe:

    INCARNATION#RESETLOGS_CHANGE#RESETLOGS_TIMEPRIOR_INCARNATION#STATUS
    110000001.10.2026 08:00:000PARENT
    212340000008.10.2026 08:00:001CURRENT

    Was sehe ich hier? Ein eigenständiges RESETLOGS-Beispiel: Inkarnation 2 ist aktuell und verweist auf Inkarnation 1. Eine frühere Inkarnation ist nicht automatisch wertlos; ihr Bezug zum Recovery-Ziel muss geprüft werden.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    SQL>  ALTER DATABASE OPEN RESETLOGS;
    RMAN> LIST INCARNATION OF DATABASE;
    RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: RESETLOGS beendet nicht nur Recovery. Es beginnt eine neue Datenbank-Incarnation und damit eine neue Backup- und Redo-Linie.
    Database Incarnations verstehen Wie RMAN mehrere RESETLOGS-Zweige verwaltet und warum die richtige Incarnation entscheidend ist. IncarnationsFortgeschritten

    1. Was ist das?

    Eine Database Incarnation beschreibt eine zusammenhängende Redo- und Recovery-Linie. Jede neue Datenbank beginnt mit einer Incarnation. Jedes OPEN RESETLOGS erzeugt eine weitere.

    RMAN verwendet Incarnations, um Backups und Archived Logs dem richtigen Recovery-Zweig zuzuordnen. Dadurch kann RMAN auch ältere Linien kennen, ohne sie mit der aktuellen Linie zu vermischen.

    2. Warum wird das benötigt?

    • Alte und neue Redo-Sequenzen können nach RESETLOGS gleiche Sequenznummern besitzen.
    • RESETLOGS_CHANGE# und Zeit unterscheiden die Linien eindeutig.
    • Recovery auf einen Zeitpunkt vor einem früheren RESETLOGS erfordert gegebenenfalls eine ältere Incarnation.
    • LIST INCARNATION zeigt die vorhandenen Zweige.

    3. Wie arbeitet Oracle beziehungsweise RMAN intern?

    Schritt 1 CURRENT markiert die aktive Linie.
    Schritt 2 PARENT kennzeichnet eine Vorgängerlinie der aktuellen Incarnation; den direkten Vorgänger zeigt PRIOR_INCARNATION#.
    Schritt 3 ORPHAN kennzeichnet einen nicht mehr aktiven Zweig.
    Schritt 4 RESET DATABASE TO INCARNATION ändert den RMAN-Kontext.
    Schritt 5 Danach bewertet RMAN Backups und Archived Logs gegen diese Linie.
    Praxisbeispiel:
    Eine Datenbank wurde bereits zweimal mit RESETLOGS geöffnet. Für eine sehr alte PITR-Anforderung muss RMAN auf die damalige Incarnation gesetzt werden, bevor Restore und Recover geplant werden.

    4. Häufige Fehler und Missverständnisse

    • Ein falscher Incarnation-Kontext kann scheinbar fehlende Backups verursachen.
    • RESET DATABASE TO INCARNATION verändert den RMAN-Recovery-Kontext und gehört in ein kontrolliertes Runbook.
    • Nach Abschluss muss klar dokumentiert sein, welche Linie aktuell verwendet wird.

    5. Wichtige Begriffe

    BegriffErklärung
    IncarnationZusammenhängende Redo- und Recovery-Linie.
    CURRENTAktuell verwendete Incarnation.
    PARENTVorfahr der aktuellen Incarnation; nicht zwingend nur der direkte Vorgänger.
    ORPHANVerlassener Recovery-Zweig.
    RESETLOGS SCNStart-SCN der Incarnation.
    DB_KEYCatalog-interner Schlüssel der Datenbank.

    6. Relevante Views

    V$DATABASE_INCARNATION, RC_DATABASE_INCARNATION

    7. Read-only Diagnose-SQL

    Database Incarnations verstehen
    SELECT
        incarnation#,
        resetlogs_change#,
        resetlogs_time,
        prior_resetlogs_change#,
        prior_resetlogs_time,
        status
    FROM v$database_incarnation
    ORDER BY incarnation#;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileINCARNATION#RESETLOGS_CHANGE#RESETLOGS_TIMEPRIOR_RESETLOGS_CHANGE#PRIOR_RESETLOGS_TIME
    1110000001.10.2026 08:00:000NULL
    2212340000008.10.2026 08:00:0010000001.10.2026 08:00:00
    ZeileSTATUS
    1PARENT
    2CURRENT

    Was sehe ich hier? Die zweite Zeile zeigt die aktuelle Inkarnation und den Resetlogs-Bezug zur Vorgängerinkarnation. RESETLOGS_CHANGE# ist eine SCN, keine fortlaufende Inkarnationsnummer.

    8. RMAN-/SQL-Lernbeispiel

    Beispielkommandos
    RMAN> LIST INCARNATION OF DATABASE;
    RMAN> RESET DATABASE TO INCARNATION 3;
    RMAN> LIST BACKUP OF DATABASE;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Merksatz: Incarnations verhindern, dass RMAN Backups verschiedener RESETLOGS-Linien verwechselt.
    PROD nach TEST duplizieren – RMAN DUPLICATE Schritt für Schritt Praxisablauf: SRCDB aus vorhandenen RMAN-Backups unter /backup/rman/SRCDB als TESTDB wiederherstellen – nur mit der AUXILIARY-Instanz. RMANPraxisBackup-based Duplicate

    Einführung: In diesem Praxisfall wird die produktive Datenbank SRCDB aus bereits vorhandenen RMAN-Backups als neue Datenbank TESTDB aufgebaut. Die Backups liegen unter /backup/rman/SRCDB.

    RMAN wird in diesem Ablauf nur mit TESTDB als AUXILIARY verbunden. Es gibt keine TARGET-Verbindung zur laufenden SRCDB-Datenbank und keine Recovery-Catalog-Verbindung. Die Quelle wird über ihre Backup-Metadaten, die SRCDB-DBID und die angegebene BACKUP LOCATION identifiziert.

    Der Ablauf lautet: Zielverzeichnisse vorbereiten, temporäres PFILE erstellen, TESTDB in NOMOUNT starten, RMAN als AUXILIARY verbinden, Quellname und DBID prüfen und anschließend das Backup-based DUPLICATE starten.

    Sehr wichtig:
    Dieser Abschnitt enthält echte administrative Befehle wie mkdir, STARTUP NOMOUNT und DUPLICATE DATABASE. Das Wiki zeigt sie nur als Arbeitsanleitung. create_dba_wiki.sh führt keinen dieser Befehle aus.
    1. Verzeichnisse TESTDB-Zielpfade vorbereiten.
    2. PFILEinitTESTDB.ora unter /oracle/admin/TESTDB/pfile/ erstellen.
    3. NOMOUNT TESTDB als Auxiliary-Instanz starten.
    4. RMAN Nur AUXILIARY / verbinden.
    5. Duplicate DBID + BACKUP LOCATION + TESTDB-Pfade verwenden.

    1. Ausgangssituation

    ElementWertBedeutung
    QuelleSRCDBProduktive Datenbank, deren RMAN-Backups verwendet werden.
    ZielTESTDBNeue Testdatenbank.
    Source DBID1234567890DBID der SRCDB-Datenbank.
    Backup Location/backup/rman/SRCDBVerzeichnis mit den SRCDB-RMAN-Backups.
    Oracle Home/u01/app/ora19/product/19.3.0/db_1Oracle-19c-Home der Testinstanz.
    PFILE/oracle/admin/TESTDB/pfile/initTESTDB.oraTemporäres PFILE für NOMOUNT.
    TESTDB-Basis/oracle/oradata/TESTDBZielbereich für TESTDB.

    2. TESTDB-Verzeichnisse anlegen

    MANUELLE OS-AKTION
    mkdir -p /oracle/admin/TESTDB/adump
    mkdir -p /oracle/admin/TESTDB/pfile
    mkdir -p /oracle/oradata/TESTDB/archive
    mkdir -p /oracle/oradata/TESTDB/data
    mkdir -p /oracle/oradata/TESTDB/control
    Warum?

    Alle im PFILE und im DUPLICATE angegebenen Zielverzeichnisse müssen vor dem Start vorhanden und für den Oracle-Software-Owner beschreibbar sein.

    3. Temporäres PFILE initTESTDB.ora erstellen

    Das PFILE liegt in diesem Betriebsverfahren unter /oracle/admin/TESTDB/pfile/initTESTDB.ora und dient dazu, die leere Auxiliary-Instanz bis NOMOUNT zu starten.

    Allgemeines Beispiel: Das temporäre PFILE setzt db_name=TESTDB passend zu DUPLICATE DATABASE TO TESTDB. SRCDB bezeichnet die Quelle. Das Beispiel verwendet eine eigenständige Non-CDB-Testdatenbank und dateibasierte, nicht durch OMF verwaltete Pfade. Mit der SPFILE-Klausel übernimmt RMAN die gesicherte Parameterdatei; zielabhängige Werte müssen dabei ausdrücklich angepasst werden.

    PFILE – MANUELL ERSTELLEN
    # ============================================================
    # Temporaeres PFILE fuer RMAN Duplicate SRCDB -> TESTDB
    # ============================================================
    
    # Name der eigenständigen Zieldatenbank, passend zu DUPLICATE ... TO
    # Quelle: SRCDB / Ziel des Duplicate: TESTDB
    db_name=TESTDB
    compatible=19.0.0
    
    sga_target=2G
    pga_aggregate_target=500M
    
    diagnostic_dest='/oracle/oradata/TESTDB'
    audit_file_dest='/oracle/admin/TESTDB/adump'
    
    control_files='/oracle/oradata/TESTDB/control/control01.ctl'
    Warum steht hier db_name=TESTDB?
    DB_NAME bezeichnet die Zieldatenbank und darf höchstens acht Zeichen lang sein. Der Name muss zur TO-Klausel passen. DB_UNIQUE_NAME ist eine zusätzliche Kennung und ersetzt DB_NAME nicht. Das PFILE-Verzeichnis muss ebenfalls vorhanden sein.

    diagnostic_dest definiert die Diagnose-Basis. audit_file_dest bezeichnet separat das klassische Audit-Verzeichnis.
    Oracle 19c: DUPLICATE · DB_NAME

    4. Oracle-Umgebung auf TESTDB setzen

    MANUELLE SHELL-AKTION
    export ORACLE_HOME=/u01/app/ora19/product/19.3.0/db_1
    export PATH=$ORACLE_HOME/bin:$PATH
    export ORACLE_SID=TESTDB
    Nicht nur TESTDB eingeben:
    Die Instanz wird mit export ORACLE_SID=TESTDB festgelegt.

    5. TESTDB in NOMOUNT starten

    STARTUP NOMOUNT
    sqlplus / as sysdba
    
    SQL> STARTUP NOMOUNT
         PFILE='/oracle/admin/TESTDB/pfile/initTESTDB.ora';
    
    SQL> EXIT;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Was muss erscheinen?

    ORACLE instance started. Die Instanz läuft, aber es ist noch kein Controlfile gemountet und keine Datenbank geöffnet.

    6. RMAN nur als AUXILIARY verbinden

    Weil die Sicherungen direkt über BACKUP LOCATION eingelesen werden, wird in diesem konkreten Ablauf keine TARGET-Verbindung zu SRCDB verwendet.

    RMAN STARTEN
    rman auxiliary / log=/oracle/admin/TESTDB/rman_duplicate.log append
    Kontrolle:

    RMAN muss eine Verbindung zur auxiliary database melden. Das Log wird unter /oracle/admin/TESTDB/rman_duplicate.log mitgeführt.

    7. Quellname und DBID prüfen

    SOURCE DBID
    -- Quellidentität für das folgende DUPLICATE dokumentieren:
    -- Datenbankname: SRCDB
    -- DBID: 1234567890

    Quellname SRCDB und DBID 1234567890 werden in der folgenden DUPLICATE-Anweisung gemeinsam angegeben. Beide müssen zu den verwendeten Sicherungen passen.

    8. Backup-based DUPLICATE starten

    ACHTUNG – ECHTER RESTORE/DUPLICATE
    Voraussetzungen des Beispiels: BACKUP LOCATION enthält zugängliche DISK-Sicherungen der Quelle einschließlich benötigter Datafiles, Controlfile, SPFILE und Archived Logs. Die Pfade gelten für eine dateibasierte Non-CDB auf kompatibler Plattform. JOB_QUEUE_PROCESSES=0 im Ziel verhindert reguläre Scheduler-/DBMS_JOB-Läufe beim Öffnen der Kopie. Zusätzlich muss die Testumgebung vorab von produktiven Diensten und ausgehenden Schnittstellen isoliert sein; dieser Parameter allein verhindert nicht jede externe Aktion.
    RMAN> DUPLICATE DATABASE SRCDB DBID 1234567890 TO TESTDB
          BACKUP LOCATION '/backup/rman/SRCDB'
          SPFILE
            PARAMETER_VALUE_CONVERT 'SRCDB','TESTDB'
            SET DB_UNIQUE_NAME='TESTDB'
            SET JOB_QUEUE_PROCESSES=0
            SET AUDIT_FILE_DEST='/oracle/admin/TESTDB/adump'
            SET DIAGNOSTIC_DEST='/oracle/oradata/TESTDB'
            SET LOG_ARCHIVE_DEST_1='LOCATION=/oracle/oradata/TESTDB/archive/'
            SET DB_FILE_NAME_CONVERT='/oracle/oradata/SRCDB/data/','/oracle/oradata/TESTDB/data/',
                                     '/oracle/oradata/SRCDB/','/oracle/oradata/TESTDB/'
            SET LOG_FILE_NAME_CONVERT='/oracle/oradata/SRCDB/','/oracle/oradata/TESTDB/'
            SET CONTROL_FILES='/oracle/oradata/TESTDB/control/control01.ctl',
                              '/oracle/oradata/TESTDB/data/cntrl2test.ctl',
                              '/oracle/oradata/TESTDB/data/cntrl3test.ctl';

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    9. Die DUPLICATE-Klauseln verstehen

    KlauselBedeutung
    DUPLICATE DATABASE TO TESTDBErzeugt die neue Duplicate-Datenbank TESTDB.
    BACKUP LOCATIONRMAN sucht die benötigten Backup Pieces unter /backup/rman/SRCDB.
    NOFILENAMECHECKUnterdrückt die Prüfung auf identische Dateinamen; nur bei sicher getrenntem SRCDB-/TESTDB-Storage verwenden.
    SPFILEDas SRCDB-SPFILE wird aus der Sicherung restauriert und mit den folgenden SET-Klauseln für TESTDB angepasst.
    PARAMETER_VALUE_CONVERTErsetzt die Zeichenfolge SRCDB in übernommenen Parameterwerten durch TESTDB. Andere Pfade müssen separat geprüft und angepasst werden.
    DB_UNIQUE_NAMESetzt den eindeutigen Namen auf TESTDB.
    LOG_ARCHIVE_DEST_1Setzt das TESTDB-Archivelog-Ziel auf /oracle/oradata/TESTDB/archive/.
    DB_FILE_NAME_CONVERTSetzt SRCDB-Datafile-Pfade auf die TESTDB-Zielpfade um.
    LOG_FILE_NAME_CONVERTSetzt SRCDB-Redo-Pfade auf TESTDB um.
    CONTROL_FILESDefiniert drei eigene Controlfiles für TESTDB.

    10. Dateinamenprüfung beibehalten

    Das Beispiel verwendet bewusst kein NOFILENAMECHECK: Die Dateinamen werden auf eigene Zielpfade umgesetzt. Auch bei diesem Mapping müssen alle übernommenen Parameter und sämtliche Dateiziele vorab auf Vollständigkeit geprüft werden. Ein anderes Quellverzeichnis wird durch die gezeigten Umsetzungen nicht automatisch erfasst.

    Achtung:
    NOFILENAMECHECK darf nur verwendet werden, wenn sicher ausgeschlossen ist, dass TESTDB auf produktive SRCDB-Dateien schreibt. Vor dem Start alle Mapping-Regeln und Mounts kontrollieren.

    11. Was macht RMAN intern?

    1. Backups lesen Backup Pieces in der BACKUP LOCATION inventarisieren.
    2. SPFILE SPFILE aus SRCDB-Backup restaurieren und für TESTDB anpassen.
    3. Controlfile Controlfile herstellen.
    4. Datafiles SRCDB-Datafiles nach TESTDB restaurieren.
    5. Recovery Archived Logs anwenden.
    6. Abschluss Eigenständige TESTDB-Datenbank finalisieren.

    12. RMAN-Log verfolgen

    Log beobachten
    tail -f /oracle/admin/TESTDB/rman_duplicate.log

    13. TESTDB nach dem Duplicate read-only kontrollieren

    Datenbankidentität
    SELECT name, db_unique_name, dbid, open_mode, log_mode
    FROM v$database;
    
    SELECT instance_name, host_name, status
    FROM v$instance;

    Fiktive Beispielausgabe:

    SELECT 1.

    NAMEDB_UNIQUE_NAMEDBIDOPEN_MODELOG_MODE
    TESTDBTESTDB2345678901READ WRITEARCHIVELOG

    Einordnung zu SELECT 1: Nachkontrolle der Zieldatenbank: TESTDB besitzt hier die neue fiktive DBID 2345678901; die Quelle hatte 1234567890. Ein eigenständiges Duplicate erhält eine neue DBID.

    Fiktive Beispielausgabe:

    SELECT 2.

    INSTANCE_NAMEHOST_NAMESTATUS
    TESTDBtestdb01OPEN

    Einordnung zu SELECT 2: Dann Instanz und Host prüfen. Identische Namen in anderen Umgebungen ersetzen keinen Abgleich der DBID und des Verbindungskontexts.

    Dateipfade
    SELECT file#, name
    FROM v$datafile
    ORDER BY file#;
    
    SELECT group#, member
    FROM v$logfile
    ORDER BY group#, member;
    
    SELECT name
    FROM v$controlfile
    ORDER BY name;

    Fiktive Beispielausgabe:

    SELECT 1.

    FILE#NAME
    1/oracle/oradata/TESTDB/data/system01.dbf

    Einordnung zu SELECT 1: Ausschnitt der Datafile-Pfade.

    Fiktive Beispielausgabe:

    SELECT 2.

    GROUP#MEMBER
    1/oracle/oradata/TESTDB/redo01a.log

    Einordnung zu SELECT 2: Ausschnitt der Redo-Member-Pfade; mehrere Member je Gruppe sind möglich.

    Fiktive Beispielausgabe:

    SELECT 3.

    NAME
    /oracle/oradata/TESTDB/control/control01.ctl

    Einordnung zu SELECT 3: Ausschnitt der Controlfile-Pfade. Diese drei Listen gehören zur Dateiplanung und dürfen nicht blind als vollständige Zielkonfiguration kopiert werden.

    Was muss stimmen?

    DB_NAME und DB_UNIQUE_NAME müssen TESTDB entsprechen. Datafiles, Redo Logs und Controlfiles dürfen nur auf TESTDB-Ziele zeigen.

    14. Erwartete TESTDB-Controlfiles

    /oracle/oradata/TESTDB/control/control01.ctl
    /oracle/oradata/TESTDB/data/cntrl2test.ctl
    /oracle/oradata/TESTDB/data/cntrl3test.ctl

    15. Relevante Parameter kontrollieren

    Read-only
    SELECT name, value
    FROM v$parameter
    WHERE name IN ('log_archive_dest_1',
                   'db_file_name_convert',
                   'log_file_name_convert',
                   'db_unique_name',
                   'control_files')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUE
    control_files/oracle/oradata/TESTDB/control/control01.ctl, /oracle/oradata/TESTDB/data/cntrl2test.ctl, /oracle/oradata/TESTDB/data/cntrl3test.ctl
    db_file_name_convert/oracle/oradata/SRCDB/data/, /oracle/oradata/TESTDB/data/, /oracle/oradata/SRCDB/, /oracle/oradata/TESTDB/
    db_unique_nameTESTDB
    log_archive_dest_1LOCATION=/oracle/oradata/TESTDB/archive/
    log_file_name_convert/oracle/oradata/SRCDB/, /oracle/oradata/TESTDB/

    Was sehe ich hier? Zielbeispiel passend zum Duplicate: TESTDB-Kennung, Archivziel, Controlfiles und Konvertierungsregeln prüfen. Zusätzliche Quellpfade sind durch diese Beispielregeln nicht automatisch abgedeckt.

    16. Typische Fehlerquellen

    ProblemTypische UrsachePrüfung
    LRM-00109PFILE nicht gefunden./oracle/admin/TESTDB/pfile/initTESTDB.ora prüfen.
    Keine Backups gefundenBackup Location, NFS-Mount oder DBID falsch./backup/rman/SRCDB und DBID kontrollieren.
    Archived Log fehltRecovery-Kette unvollständig.SRCDB-Archivelog-Backups prüfen.
    Datafile-Pfad falschDB_FILE_NAME_CONVERT deckt einen SRCDB-Pfad nicht ab.SRCDB-Datafiles vorab inventarisieren.
    Redo-Pfad falschLOG_FILE_NAME_CONVERT unvollständig.SRCDB-Redo-Pfade vorab inventarisieren.
    Controlfile nicht schreibbarVerzeichnis/Berechtigung falsch./oracle/oradata/TESTDB/control und /oracle/oradata/TESTDB/data prüfen.

    17. TESTDB nach dem Restore betrieblich absichern

    Ein erfolgreicher RMAN-Lauf reicht nicht:
    Scheduler Jobs, DB-Links, SMTP/Mail, externe Verzeichnisse, Schnittstellen, Batch-Konfigurationen, Services, Monitoring und Backup-Konfiguration müssen vor der normalen TESTDB-Nutzung auf TESTDB-Ziele umgestellt beziehungsweise nach Betriebsverfahren deaktiviert werden.
    Merksatz: AUXILIARY starten → Quellname und DBID prüfen → BACKUP LOCATION lesen → SRCDB-Pfade nach TESTDB umsetzen → Duplicate und TESTDB-Pfade kontrollieren.
    Szenario 1 – Datenbank startet wegen falschem Parameterwert nicht Erkennen, ob wirklich ein Restore notwendig ist oder nur SPFILE/PFILE korrigiert werden muss. RecoveryParameterRunbook

    1. Vollständiger Runbook-Ablauf

    1. Fehler sichern ORA-/LRM-Meldung und Zeitpunkt dokumentieren.
    2. Alertlog Ersten ursächlichen Fehler bestimmen.
    3. Parameter Fehlerhaften Parameter und Sollwert nachweisen.
    4. PFILE Aus SPFILE erzeugen und nur den fehlerhaften Wert korrigieren.
    5. Teststart Mit korrigiertem PFILE starten.
    6. SPFILE Erst nach erfolgreichem Test neu erzeugen.
    7. Neustart Regulär aus SPFILE starten.
    8. Kontrolle Instanz, PDBs, Parameter und Alertlog prüfen.
    READ ONLY
    SELECT name, value, isdefault, issys_modifiable
    FROM v$parameter
    WHERE name IN ('open_cursors','db_files','processes','compatible')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUEISDEFAULTISSYS_MODIFIABLE
    compatible19.0.0FALSEFALSE
    db_files200TRUEFALSE
    open_cursors300TRUEIMMEDIATE
    processes300FALSEFALSE

    Was sehe ich hier? Beispielwerte, keine Vorgabe. FALSE bei ISSYS_MODIFIABLE kennzeichnet statische Parameter; IMMEDIATE einen dynamisch systemweit änderbaren Parameter. ISDEFAULT ist keine Bewertung der Eignung.

    OS-DIAGNOSE
    adrci
    show homes
    set home diag/rdbms/<db_unique_name>/<sid>
    show alert -tail 100
    SYSDBA ERFORDERLICH – REPARATUR
    sqlplus / as sysdba
    CREATE PFILE='/tmp/init_REPAIR.ora' FROM SPFILE;
    
    -- /tmp/init_REPAIR.ora auf OS-Ebene kontrollieren/korrigieren.
    -- Beispiel: *.open_cursors=300
    
    STARTUP PFILE='/tmp/init_REPAIR.ora';
    
    -- Nur nach erfolgreichem Teststart:
    CREATE SPFILE FROM PFILE='/tmp/init_REPAIR.ora';
    SHUTDOWN IMMEDIATE;
    STARTUP;
    SHOW PDBS;
    
    -- Nur falls nach Betriebsverfahren erforderlich:
    ALTER PLUGGABLE DATABASE ALL OPEN;
    SHOW PDBS;
    STOP:
    Schlägt der Teststart weiter fehl, kein neues SPFILE erzeugen. Neuen Fehlerstack und Alertlog zuerst auswerten.

    Typisches Fehlerbild: Die Instanz startet, bricht aber wegen eines ungültigen oder zu kleinen statischen/Startparameters ab. Ein Restore der Datenbank ist in diesem Fall normalerweise nicht erforderlich. Zuerst muss geklärt werden, ob das Problem ausschließlich aus SPFILE/PFILE stammt.

    2. Diagnose

    Read-only – wenn die Instanz noch zugänglich ist
    SELECT name, value
    FROM v$parameter
    WHERE name IN ('open_cursors','db_files','processes','compatible')
    ORDER BY name;

    Fiktive Beispielausgabe:

    NAMEVALUE
    compatible19.0.0
    db_files200
    open_cursors300
    processes300

    Was sehe ich hier? Die Werte zeigen Konfiguration, nicht momentane Auslastung. Für einen Wiederaufbau müssen sie mit Dateibestand, Ressourcenbedarf und unterstützter Version abgeglichen werden. Vergleiche den betroffenen Parameter mit dem dokumentierten Sollwert; bei Startfehlern zusätzlich den Alert-Log- und ORA-/LRM-Kontext prüfen.

    3. Entscheidung

    Parameterfehler SPFILE/PFILE reparieren; kein Datafile-Restore.
    SPFILE selbst verloren SPFILE aus Autobackup wiederherstellen.
    Weitere Dateien fehlen Zum passenden Restore-Szenario wechseln.
    ADMINISTRATIVE REFERENZ – NICHT DURCH DAS WIKI AUSGEFÜHRT
    Typischer manueller Weg: PFILE aus SPFILE erzeugen, fehlerhaften Wert im PFILE korrigieren, SPFILE neu erzeugen und Instanz kontrolliert starten. Die konkreten Befehle müssen zum Betriebsverfahren passen.
    Merksatz: Startfehler zuerst diagnostizieren. Nicht jeder Startfehler ist ein Restore-Fall.
    Szenario 2 – Archive-/FRA-Bereich voll oder falsch dimensioniert ORA-19809/ORA-19804, hängende Log Switches und FRA-Ursache systematisch unterscheiden. RecoveryFRAArchive

    Worum geht es? Oracle muss erzeugte Redo-Informationen regelmäßig archivieren. Ist das Archive-Ziel oder die Fast Recovery Area voll, kann Oracle neue Archivelogs nicht mehr sauber ablegen. Das kann den normalen Datenbankbetrieb bis hin zum Stillstand beeinträchtigen.

    Was ist das Ziel? Zuerst wird festgestellt, welcher Bereich voll ist und warum er vollgelaufen ist. Erst danach wird entschieden, ob Storage, FRA-Größe oder ein fehlerhafter Backup-/Löschprozess die eigentliche Ursache ist.

    Merke: Einfach nur mehr Platz bereitzustellen kann das Problem lediglich verschieben. Die Ursache muss nachvollziehbar geklärt werden.

    1. Vollständiger Runbook-Ablauf

    READ ONLY – FRA/Archive
    SELECT name, space_limit, space_used, space_reclaimable, number_of_files
    FROM v$recovery_file_dest;
    SELECT file_type, percent_space_used, percent_space_reclaimable, number_of_files
    FROM v$recovery_area_usage ORDER BY file_type;
    SELECT name, value FROM v$parameter
    WHERE name IN ('db_recovery_file_dest','db_recovery_file_dest_size','log_archive_dest_1');

    Fiktive Beispielausgabe:

    SELECT 1.

    NAMESPACE_LIMITSPACE_USEDSPACE_RECLAIMABLENUMBER_OF_FILES
    /u04/fra1073741824001052266987520110

    Einordnung zu SELECT 1: Eigenständiges FRA-Beispiel: 100 GiB Limit, 98 GiB genutzt und keine als rückgewinnbar ausgewiesene Reserve. SPACE_RECLAIMABLE ist Teil der Nutzung, kein zusätzlicher belegter Bereich.

    Fiktive Beispielausgabe:

    SELECT 2.

    FILE_TYPEPERCENT_SPACE_USEDPERCENT_SPACE_RECLAIMABLENUMBER_OF_FILES
    ARCHIVED LOG780100
    BACKUP PIECE20010

    Einordnung zu SELECT 2: Ausschnitt nach Dateityp. Die Prozentwerte beziehen sich auf das FRA-Limit, nicht auf die jeweilige Dateigruppe.

    Fiktive Beispielausgabe:

    SELECT 3.

    NAMEVALUE
    db_recovery_file_dest/u04/fra
    db_recovery_file_dest_size107374182400
    log_archive_dest_1LOCATION=USE_DB_RECOVERY_FILE_DEST

    Einordnung zu SELECT 3: Die Parameter ordnen die FRA und das Archivziel zu. Das Limit in Bytes ist kein Nachweis über freien physischen Speicherplatz.

    OS-DIAGNOSE
    df -k <archive_oder_fra_mountpoint>
    adrci
    show alert -tail 100
    ADMINISTRATIVE AKTION – BEISPIEL NACH FREIGABE
    sqlplus / as sysdba
    -- Fiktiv: 100 GiB Limit, 98 GiB genutzt. 120G ist nur ein Lernwert.
    -- Erst nach Nachweis freier physischer Kapazitaet und Ursachenpruefung;
    -- bei PFILE-Start ist SCOPE=BOTH nicht anwendbar.
    ALTER SYSTEM SET db_recovery_file_dest_size=120G SCOPE=BOTH;
    STOP:
    Nicht pauschal nur die FRA vergrößern. Zuerst klären, ob Backup-/Löschprozess, Flashback, Retention oder Storage die Ursache ist.

    Typisches Fehlerbild: Log Switches hängen, Sessions blockieren oder die Datenbank kann wegen fehlendem Platz im Recovery-/Archive-Bereich nicht normal weiterarbeiten. Häufige Meldungen sind ORA-19809 und ORA-19804.

    2. Read-only Diagnose

    FRA-Auslastung und Parameter
    SELECT *
    FROM v$recovery_area_usage
    ORDER BY file_type;
    
    SELECT name, value
    FROM v$parameter
    WHERE name IN ('db_recovery_file_dest',
                   'db_recovery_file_dest_size',
                   'log_archive_dest_1')
    ORDER BY name;

    Fiktive Beispielausgabe:

    SELECT 1.

    FILE_TYPEPERCENT_SPACE_USEDPERCENT_SPACE_RECLAIMABLENUMBER_OF_FILESCON_ID
    ARCHIVED LOG7801000
    BACKUP PIECE200100

    Einordnung zu SELECT 1: Ausschnitt aus V$RECOVERY_AREA_USAGE in Oracle 19c. CON_ID=0 bezeichnet hier instanzweite Daten. Prozentwerte sind auf das FRA-Limit bezogen.

    Fiktive Beispielausgabe:

    SELECT 2.

    NAMEVALUE
    db_recovery_file_dest/u04/fra
    db_recovery_file_dest_size107374182400
    log_archive_dest_1LOCATION=USE_DB_RECOVERY_FILE_DEST

    Einordnung zu SELECT 2: Die Ablage ist hier ausdrücklich als FRA eingerichtet. Eine zusätzliche FORMAT-Ablage außerhalb der FRA wird nicht allein dadurch automatisch durch deren Platzverwaltung bereinigt.

    3. Ursachen unterscheiden

    Parameter zu klein/falsch Einheit oder Zielwert falsch gesetzt?
    Storage wirklich voll Filesystem/FRA-Kapazität prüfen.
    Archivelogs sammeln sich Backup- und Löschkonzept prüfen.
    Flashback/Backups belegen Platz Belegung nach FILE_TYPE bewerten.
    MÖGLICHE MASSNAHMEN – NUR DOKUMENTIERT
    Je nach Ursache kann eine freigegebene Kapazitätserweiterung, Korrektur von db_recovery_file_dest_size, Bereinigung nach Backup-/Retention-Konzept oder Storage-Maßnahme erforderlich sein. Nicht pauschal nur den Parameter erhöhen.
    Szenario 3 – TEMP-Dateien verloren Warum TEMP anders behandelt wird als normale Datafiles und wann kein RMAN-Restore notwendig ist. RecoveryTEMPRunbook

    Worum geht es? Tempfiles enthalten temporäre Arbeitsdaten, beispielsweise für Sortierungen und Hash-Operationen. Anders als normale Datafiles enthalten sie keine dauerhaft wiederherzustellenden Nutzdaten.

    Was ist das Ziel? Zuerst werden betroffener Container, TEMP-Tablespace und vorhandene Tempfiles bestimmt. Danach wird wieder ein verwendbares Tempfile bereitgestellt und die TEMP-Funktion kontrolliert.

    Merke: Ein verlorenes Tempfile wird nicht wie ein normales Datafile mit der klassischen RESTORE-/RECOVER-Kette behandelt.

    1. Vollständiger Runbook-Ablauf

    READ ONLY
    SELECT con_id, file#, name, bytes/1024/1024 AS mb
    FROM v$tempfile ORDER BY con_id, file#;

    Fiktive Beispielausgabe:

    CON_IDFILE#NAMEMB
    11/u02/oradata/ORCL/temp01.dbf2048
    33/u02/oradata/ORCL/APPPDB/temp01.dbf1024

    Was sehe ich hier? Ausschnitt der Tempfiles in zwei Containern. Die Abfrage zeigt die Dateigröße und keine aktuelle TEMP-Auslastung. Tempfiles werden nicht wie persistente Datafiles aus einem normalen RMAN-Backup restauriert.

    ADMINISTRATIVE AKTION – TEMPFILE NEU ANLEGEN
    sqlplus / as sysdba
    -- Beispiel; Pfad/Groesse/Tablespace anpassen:
    ALTER TABLESPACE TEMP
      ADD TEMPFILE '/oracle/oradata/TESTDB/temp02.dbf'
      SIZE 2G AUTOEXTEND ON NEXT 512M MAXSIZE 30G;
    STOP:
    TEMP wird nicht wie ein normales Datafile aus RMAN restauriert. Container und TEMP-Tablespace vor jeder Aktion eindeutig bestimmen.

    Besonderheit: Tempfiles enthalten keine dauerhaft zu sichernden Nutzdaten wie normale Datafiles. Deshalb werden sie nicht wie normale Datafiles aus RMAN-Backups restauriert. Je nach Situation kann Oracle fehlende Tempfiles beim erneuten Öffnen neu anlegen; alternativ wird ein neues Tempfile angelegt und der defekte Eintrag anschließend entfernt.

    Read-only Diagnose
    SELECT con_id, file#, name, bytes/1024/1024 AS mb
    FROM v$tempfile
    ORDER BY con_id, file#;

    Fiktive Beispielausgabe:

    CON_IDFILE#NAMEMB
    11/u02/oradata/ORCL/temp01.dbf2048
    33/u02/oradata/ORCL/APPPDB/temp01.dbf1024

    Was sehe ich hier? Ausschnitt der Tempfiles in zwei Containern. Die Abfrage zeigt die Dateigröße und keine aktuelle TEMP-Auslastung. Tempfiles werden nicht wie persistente Datafiles aus einem normalen RMAN-Backup restauriert.

    Wichtig:
    Ein fehlendes TEMPFILE ist normalerweise kein RMAN-Restore-Fall. Administrative TEMPFILE-Änderungen werden nur nach Freigabe vorgenommen.
    Szenario 4 – UNDO-Datafiles im Root-Container / PDB$SEED verloren Fehlende UNDO-Datafiles diagnostizieren und Restore/Recover der betroffenen Dateien planen. RecoveryUNDORMAN

    Worum geht es? UNDO wird für Rollbacks, Read Consistency und laufende Transaktionen benötigt. Der Verlust eines UNDO-Datafiles ist deshalb deutlich kritischer als der Verlust eines Tempfiles.

    Was ist das Ziel? Tablespace, Container und File# müssen zuerst eindeutig bestimmt werden. Danach wird geprüft, welches Backup verfügbar ist und welcher Restore-/Recovery-Weg zum aktuellen Datenbankzustand passt.

    Multitenant-Hinweis: Root-Container, PDB$SEED und PDBs dürfen nicht verwechselt werden. Container und File# gehören immer gemeinsam zur Diagnose.

    1. Vollständiger Runbook-Ablauf

    READ ONLY
    SELECT name, value FROM v$parameter WHERE name='undo_tablespace';
    SELECT d.con_id, d.file#, t.name AS tablespace_name,
           d.name AS file_name, d.status
    FROM v$datafile d
    JOIN v$tablespace t ON t.ts# = d.ts# AND t.con_id = d.con_id
    ORDER BY d.con_id, t.name, d.file#;

    Fiktive Beispielausgabe:

    SELECT 1.

    NAMEVALUE
    undo_tablespaceUNDOTBS1

    Einordnung zu SELECT 1: Diese Einstellung gehört zum aktuellen Instanz-/Containerkontext.

    Fiktive Beispielausgabe:

    SELECT 2.

    CON_IDFILE#TABLESPACE_NAMEFILE_NAMESTATUS
    11SYSTEM/u02/oradata/ORCL/system01.dbfSYSTEM
    14UNDOTBS1/u02/oradata/ORCL/undotbs01.dbfONLINE

    Einordnung zu SELECT 2: Ausschnitt der Dateizuordnung. Der Join berücksichtigt Container und Tablespace-Kennung, um gleichartige Kennungen anderer Container nicht zu vermischen.

    RMAN ANALYSE
    LIST BACKUP OF DATAFILE <file#>;
    RESTORE DATAFILE <file#> PREVIEW;
    RESTORE DATAFILE <file#> VALIDATE;
    VALIDATE DATAFILE <file#>;
    SYSDBA / RMAN – RESTORE UND RECOVER

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe (Platzhalter ersetzen):

    RESTORE DATAFILE <file#>;
    RECOVER DATAFILE <file#>;
    STOP:
    Root-/PDB$SEED-UNDO kann einen anderen Datenbankzustand erfordern. Vor Restore den betroffenen Container und File# zweifelsfrei bestimmen.
    Read-only – betroffene Datafiles finden
    SELECT d.con_id, d.file#, t.name AS tablespace_name,
           d.name AS file_name, d.status
    FROM v$datafile d
    JOIN v$tablespace t ON t.ts# = d.ts# AND t.con_id = d.con_id
    ORDER BY d.con_id, t.name, d.file#;

    Fiktive Beispielausgabe:

    CON_IDFILE#TABLESPACE_NAMEFILE_NAMESTATUS
    11SYSTEM/u02/oradata/ORCL/system01.dbfSYSTEM
    14UNDOTBS1/u02/oradata/ORCL/undotbs01.dbfONLINE

    Was sehe ich hier? Ausschnitt: SYSTEM und UNDOTBS1 sind unterschiedlichen Datafiles zugeordnet. Eine Tablespace-Bezeichnung ist kein Dateiname und die Abfrage ist keine aktuelle Belegungsanalyse.

    RMAN Analyse
    RMAN> LIST BACKUP OF DATAFILE <file#>;
    RMAN> RESTORE DATAFILE <file#> PREVIEW;
    RMAN> RESTORE DATAFILE <file#> VALIDATE;
    RMAN> VALIDATE DATAFILE <file#>;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    RECOVERY-REFERENZ – VERÄNDERT DIE DATENBANK
    Der eigentliche Restore/Recover der betroffenen Datafiles und das anschließende Online-Schalten erfolgen nur im freigegebenen Recovery-Verfahren.
    Szenario 5 – Alle aktuellen Controlfiles verloren oder korrupt Controlfile aus Autobackup wiederherstellen, Datenbank mounten und erforderliches Media Recovery erkennen. RecoveryControlfileKritisch

    Worum geht es? Das Controlfile beschreibt zentrale Teile der physischen Datenbankstruktur, darunter Datafiles, Redo Logs und Checkpoint-Informationen. Ohne verwendbares Controlfile kann die Datenbank nicht normal gemountet werden.

    Was ist das Ziel? Ein gesichertes Controlfile wird restauriert, die Datenbank damit gemountet und anschließend mit den verfügbaren Redo-/Archivelog-Informationen recovered.

    Merke: RESTORE CONTROLFILE allein macht die Datenbank noch nicht konsistent. MOUNT, RECOVER und die korrekte OPEN-Entscheidung gehören zur gesamten Kette.

    1. Vollständiger Runbook-Ablauf

    RMAN ANALYSE
    -- Nur bei erreichbarer Metadatenquelle, z. B. Recovery Catalog:
    LIST BACKUP OF CONTROLFILE;
    -- Ohne alle Controlfiles und ohne Catalog: externe Backup-Logs,
    -- DBID, Autobackup-Format und Geraetezugriff zuerst klaeren.
    SYSDBA / RMAN – CONTROLFILE RECOVERY

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe (Platzhalter ersetzen):

    STARTUP NOMOUNT;
    SET DBID <quell_dbid>;
    # Abweichendes Autobackup-Format und Device Type vorher bereitstellen.
    RESTORE CONTROLFILE FROM AUTOBACKUP;
    ALTER DATABASE MOUNT;
    RECOVER DATABASE;
    
    # Nach Recovery mit restauriertem Backup-Controlfile erforderlich:
    ALTER DATABASE OPEN RESETLOGS;
    LIST INCARNATION;
    STOP:
    Schlägt RESTORE CONTROLFILE fehl, nicht mit MOUNT fortfahren. DBID, Backup Piece und Backup-Zugriff klären.

    Typisches Fehlerbild: Die Instanz kann starten, die Datenbank aber nicht gemountet werden. Häufig erscheint ORA-00205. Sind wirklich alle Controlfile-Member verloren, wird ein Backup-Controlfile benötigt.

    Controlfile-Restore vorbereiten: Im hier betrachteten NOMOUNT-Fall ohne Recovery Catalog die dokumentierte Quell-DBID mit SET DBID <quell_dbid>; setzen. Bei AUTOBACKUP-Suche ein abweichendes Autobackup-Format und den Gerätetyp bereitstellen; bei einem konkreten Piece dessen Zugänglichkeit prüfen. Diese Angaben müssen vor dem Ausfall extern dokumentiert sein. Nach Restore eines Backup-Controlfiles sind RECOVER und anschließend OPEN RESETLOGS erforderlich; das erreichbare Ziel hängt vom vorhandenen Redo ab.

    RMAN Analyse
    -- Ohne Controlfile/Catalog kein normales LIST-/PREVIEW-Inventar.
    -- Externe Sicherungsprotokolle und Autobackup-Suchparameter pruefen.
    TYPISCHER RECOVERY-PFAD – NUR REFERENZ
    STARTUP NOMOUNT;
    SET DBID <quell_dbid>;
    # Autobackup-Suchparameter und Device Type wie oben vorbereiten.
    RESTORE CONTROLFILE FROM AUTOBACKUP;
    ALTER DATABASE MOUNT;
    RECOVER DATABASE;
    ALTER DATABASE OPEN RESETLOGS;

    Ablaufschablone für dieses Szenario: DBID, Autobackup-Suchparameter und Device Type müssen vorbereitet sein. Die Befehle gehören in RMAN; Platzhalter vor Verwendung ersetzen.

    Warum RESETLOGS?
    Nach Recovery mit einem restaurierten Backup-Controlfile ist ein OPEN RESETLOGS erforderlich. Danach Incarnation und Backupstrategie kontrollieren und zeitnah ein neues Basisbackup einplanen.
    Szenario 6 – Controlfiles verloren und neuestes Controlfile-Autobackup unbrauchbar Wenn der automatische Controlfile-Restore scheitert: älteres gültiges Backup Piece identifizieren und gezielt verwenden. RecoveryControlfileFallback

    Worum geht es? Hier sind nicht nur die aktuellen Controlfiles verloren, sondern auch das zuerst erwartete Controlfile-Autobackup ist unbrauchbar. Deshalb muss gezielt ein älteres, noch lesbares Backup Piece gefunden werden.

    Was ist das Ziel? Vorhandene Backup Pieces werden inventarisiert, ein konkretes Controlfile-Backup wird ausgewählt und danach als Grundlage für MOUNT und Recovery verwendet.

    Besonderheit: Ein älteres Controlfile kennt möglicherweise neuere Backups noch nicht. Nach dem MOUNT muss deshalb das RMAN-Inventar besonders sorgfältig geprüft werden.

    1. Vollständiger Runbook-Ablauf

    OS-DIAGNOSE
    ls -ltr <backup_verzeichnis>
    find <backup_verzeichnis> -type f -print
    SYSDBA / RMAN – ÄLTERES CONTROLFILE-PIECE

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe (Platzhalter ersetzen):

    STARTUP NOMOUNT;
    RESTORE CONTROLFILE
      FROM '<vollstaendiger_Pfad_zu_gueltigem_Controlfile_Backup_Piece>';
    ALTER DATABASE MOUNT;
    RECOVER DATABASE;
    ALTER DATABASE OPEN RESETLOGS;
    LIST INCARNATION;
    STOP:
    Ein älteres Controlfile kennt eventuell neuere Backups noch nicht. Nach MOUNT RMAN-Inventar und verfügbare Pieces kontrollieren.
    1. Fehlerstack lesen Welches Autobackup ist unlesbar?
    2. Backup Storage prüfen Existieren ältere Controlfile-Autobackups?
    3. Konkretes Piece bestimmen Nicht blind denselben defekten Autobackup erneut versuchen.
    4. Controlfile herstellen Gültiges älteres Piece verwenden.
    5. Recovery Danach Datenbank bis zum erreichbaren Redo-Stand recovern.
    RMAN Diagnose / Preview
    -- Ohne gemountetes Controlfile und ohne Catalog gibt es
    -- kein normales LIST-/PREVIEW-Inventar der Backups.
    -- DBID, dokumentierte Autobackup-Formate und Backup-Logs prüfen.
    -- Der folgende RESTORE aus einem konkreten Piece ist eine Änderung.

    LIST BACKUP und repositorygestützte PREVIEW-Abfragen setzen eine passende Metadatenquelle voraus. Im NOMOUNT-Zustand nach Verlust aller Controlfiles ohne Recovery Catalog sind zuerst die extern dokumentierte DBID, Sicherungsprotokolle, Gerätezugriff und Autobackup-Suchparameter relevant.

    FALLBACK – NUR REFERENZ

    Controlfile-Restore vorbereiten: Im hier betrachteten NOMOUNT-Fall ohne Recovery Catalog die dokumentierte Quell-DBID mit SET DBID <quell_dbid>; setzen. Bei AUTOBACKUP-Suche ein abweichendes Autobackup-Format und den Gerätetyp bereitstellen; bei einem konkreten Piece dessen Zugänglichkeit prüfen. Diese Angaben müssen vor dem Ausfall extern dokumentiert sein. Nach Restore eines Backup-Controlfiles sind RECOVER und anschließend OPEN RESETLOGS erforderlich; das erreichbare Ziel hängt vom vorhandenen Redo ab.

    RMAN> RESTORE CONTROLFILE
          FROM '<vollstaendiger_Pfad_zu_gueltigem_Controlfile_Backup_Piece>';

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Szenario 7 – Ein Member der CURRENT Online-Redo-Gruppe verloren Warum Multiplexing hilft und warum der Verlust eines einzelnen Members nicht mit dem Verlust der ganzen Gruppe gleichzusetzen ist. RecoveryRedoMultiplexing

    Worum geht es? Eine Online-Redo-Gruppe kann mehrere Members besitzen. Ist nur ein Member verloren, kann die Gruppe weiterhin nutzbar sein, solange mindestens ein weiteres Member derselben Gruppe intakt ist.

    Was ist das Ziel? Gruppe, Status und alle Members werden zuerst eindeutig geprüft. Erst wenn ein gesundes Member nachgewiesen ist, wird das fehlende Member nach dem Betriebsverfahren ersetzt.

    Abgrenzung: Sind alle Members der CURRENT-Gruppe verloren, gilt dieses Verfahren nicht. Dann ist Szenario 8 relevant.

    1. Vollständiger Runbook-Ablauf

    READ ONLY
    SELECT l.group#, l.sequence#, l.status AS group_status,
           f.status AS member_status, f.member
    FROM v$log l JOIN v$logfile f ON f.group#=l.group#
    ORDER BY l.group#, f.member;

    Fiktive Beispielausgabe:

    GROUP#SEQUENCE#GROUP_STATUSMEMBER_STATUSMEMBER
    1108INACTIVENULL/u03/redo/redo01a.log

    Was sehe ich hier? Der Gruppenstatus ist INACTIVE; der normale Member-Status kann NULL sein. Gruppen- und Memberstatus beantworten verschiedene Fragen.

    SYSDBA – MEMBER ERSETZEN
    Vor dem Austausch: Solange die Gruppe CURRENT oder ACTIVE ist, darf ihr Member nicht mit dieser Folge entfernt werden. Bei intaktem zweiten Member zuerst nach Betriebsverfahren auf eine andere Gruppe wechseln und den Checkpoint-/Archivierungsfortschritt abwarten. Anschließend STATUS und ARCHIVED erneut lesen. Ist kein sicherer Wechsel möglich, wird der Ablauf abgebrochen und die Redo-Störung weiter untersucht. Ein neu hinzugefügtes Member kann bis zur ersten Verwendung INVALID zeigen.
    -- MANUELLE REFERENZ: erst NACH Prüfung der Voraussetzungen!
    -- Die betroffene Gruppe muss INACTIVE sein und darf nicht CURRENT sein.
    -- Im ARCHIVELOG-Modus zusätzlich ARCHIVED = YES prüfen.
    -- Mindestens ein anderes intaktes Member dieser Gruppe muss bestehen.
    ALTER DATABASE DROP LOGFILE MEMBER '<fehlendes_member>';
    ALTER DATABASE ADD LOGFILE MEMBER '<neues_member>' TO GROUP <group#>;
    STOP:
    Fehlen alle Members der CURRENT-Gruppe, nicht diesen Ablauf verwenden, sondern Szenario 8.
    Read-only Diagnose
    SELECT l.group#,
           l.status AS group_status,
           f.status AS member_status,
           f.member
    FROM v$log l
    JOIN v$logfile f ON f.group# = l.group#
    ORDER BY l.group#, f.member;

    Fiktive Beispielausgabe:

    GROUP#GROUP_STATUSMEMBER_STATUSMEMBER
    1INACTIVENULL/u03/redo/redo01a.log

    Was sehe ich hier? Ein leerer Member-Status ist hier normal. Er darf nicht mit einem unbekannten Gruppenstatus oder einer bewiesen verlorenen Datei gleichgesetzt werden.

    Entscheidend:

    Existiert mindestens ein intaktes Member der CURRENT-Gruppe, ist das eine andere Situation als der Verlust aller Members. Zuerst Alertlog und tatsächlichen Dateistatus prüfen.

    ADMINISTRATIVE REDO-ÄNDERUNG – NUR REFERENZ
    Ein fehlendes Member kann nach Freigabe aus der Konfiguration entfernt und als neues Member wieder hinzugefügt werden. Niemals ein noch benötigtes CURRENT-Redo unüberlegt manipulieren.
    Szenario 8 – Alle Members der CURRENT Online-Redo-Gruppe verloren Kritischer Redo-Verlust: vollständiges Recovery gegen unvollständiges Recovery und möglichen Datenverlust abgrenzen. RecoveryRedoDatenverlust

    Worum geht es? Der Verlust aller Members der aktuell beschriebenen Redo-Gruppe ist ein kritischer Recovery-Fall. Nicht archiviertes Redo aus dieser Gruppe kann nicht aus Archivelogs rekonstruiert werden.

    Was ist das Ziel? Der letzte sicher erreichbare Recovery-Stand wird bestimmt. Danach wird entschieden, ob Complete Recovery noch möglich ist oder ein Incomplete-/Point-in-Time-Recovery erforderlich wird.

    Konsequenz: Ein Incomplete Recovery kann Datenverlust bedeuten. Recovery-Ziel und maximal erreichbarer Stand müssen vor der Ausführung dokumentiert und freigegeben werden.

    1. Vollständiger Runbook-Ablauf

    READ ONLY
    SELECT group#, sequence#, status, first_change# FROM v$log ORDER BY group#;
    SELECT sequence#, first_change#, next_change#, first_time, next_time, name
    FROM v$archived_log WHERE archived='YES' ORDER BY sequence# DESC;

    Fiktive Beispielausgabe:

    SELECT 1.

    GROUP#SEQUENCE#STATUSFIRST_CHANGE#
    1108INACTIVE123450000
    2109CURRENT123460000

    Einordnung zu SELECT 1: Ausschnitt eines eigenständigen Redo-Beispiels.

    Fiktive Beispielausgabe:

    SELECT 2.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSEQUENCE#FIRST_CHANGE#NEXT_CHANGE#FIRST_TIMENEXT_TIME
    110812345000012346000008.10.2026 10:00:0008.10.2026 10:15:00
    ZeileNAME
    1/u04/arch/1_108.arc

    Einordnung zu SELECT 2: Sequenz 108 wurde archiviert und deckt die gezeigte SCN-Spanne ab. Die aktuelle Sequenz 109 ist damit nicht automatisch gesichert.

    RMAN ANALYSE
    LIST BACKUP SUMMARY;
    RESTORE DATABASE PREVIEW;
    RESTORE DATABASE VALIDATE;
    SYSDBA / RMAN – INCOMPLETE RECOVERY

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe (Platzhalter ersetzen):

    STARTUP MOUNT;
    RUN {
      SET UNTIL SEQUENCE <erste_nicht_mehr_anzuwendende_sequence> THREAD 1;
      RESTORE DATABASE;
      RECOVER DATABASE;
    }
    ALTER DATABASE OPEN RESETLOGS;
    LIST INCARNATION;

    Die Grenze ist exklusiv: UNTIL SEQUENCE 101 THREAD 1 wendet Sequenz 101 nicht mehr an. Sind alle benötigten Logs bis einschließlich 100 lückenlos verfügbar und ist dieser Stand das geprüfte Ziel, ist 101 die Grenze. Das Beispiel setzt eine Single-Instance-Datenbank mit Redo-Thread 1 voraus. Eine hohe vorhandene Sequenznummer allein beweist keine vollständige Recovery-Kette. Das Ziel muss bereits vor RESTORE feststehen.

    STOP / DATENVERLUST:
    Recovery-Ziel vor SET UNTIL und OPEN RESETLOGS dokumentieren und freigeben. Nicht archiviertes verlorenes Redo kann nicht rekonstruiert werden.
    Kritischer Fall:
    Fehlen alle Members der CURRENT-Gruppe und enthält diese noch nicht archiviertes Redo, kann ein vollständiges Recovery unmöglich sein. Der maximal erreichbare Stand endet dann vor dem verlorenen Redo.
    Read-only Diagnose
    SELECT l.group#, l.sequence#, l.status, f.member
    FROM v$log l
    JOIN v$logfile f ON f.group# = l.group#
    ORDER BY l.group#, f.member;
    
    SELECT sequence#, first_change#, next_change#, first_time, next_time, name
    FROM v$archived_log
    ORDER BY sequence# DESC;

    Fiktive Beispielausgabe:

    SELECT 1.

    GROUP#SEQUENCE#STATUSMEMBER
    1108INACTIVE/u03/redo/redo01a.log

    Einordnung zu SELECT 1: Ausschnitt der Online-Redo-Gruppen und ihrer Member.

    Fiktive Beispielausgabe:

    SELECT 2.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSEQUENCE#FIRST_CHANGE#NEXT_CHANGE#FIRST_TIMENEXT_TIME
    110812345000012346000008.10.2026 10:00:0008.10.2026 10:15:00
    ZeileNAME
    1/u04/arch/1_108.arc

    Einordnung zu SELECT 2: Ausschnitt der Archivhistorie. Die beiden Abfragen sind Hilfen zur Bestandsaufnahme, keine automatische Recovery-Anweisung.

    RMAN Analyse
    RMAN> RESTORE DATABASE PREVIEW;
    RMAN> RESTORE DATABASE VALIDATE;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Keine abweichende Kurzfassung verwenden: Maßgeblich ist der oben gezeigte RUN-Block mit dem zuvor festgelegten Ziel. RECOVER DATABASE ohne wirksame UNTIL-Grenze fordert grundsätzlich vollständiges Recovery an. Ein Kommentar begrenzt das Recovery nicht.

    Merksatz: Ein Redo-Member verloren ist nicht dasselbe wie die gesamte CURRENT-Gruppe verloren.
    Szenario 9 – Worst Case: alle Dateien der aktiven Datenbank verloren Password File, SPFILE, Controlfile, Datafiles und Recovery in der richtigen Reihenfolge wiederaufbauen. Disaster RecoveryRMANWorst Case

    Worum geht es? In diesem Worst-Case stehen die aktiven Dateien der Datenbank nicht mehr zur Verfügung. Die Datenbank muss aus den vorhandenen RMAN-Sicherungen und Archivelogs neu aufgebaut werden.

    Was ist das Ziel? Die Kette wird von außen nach innen aufgebaut: Oracle-Umgebung und Startparameter, Controlfile, Datafiles und zuletzt Recovery mit Redo/Archivelogs.

    Vorher klären: Welche Backups sind vorhanden und lesbar? Welche DBID wird benötigt? Bis zu welchem Zeitpunkt bzw. SCN ist eine Wiederherstellung technisch möglich?

    1. Vollständiger Runbook-Ablauf

    DISASTER RECOVERY – SYSDBA / RMAN

    Shell – Eingabe (Platzhalter ersetzen):

    export ORACLE_SID=<SID>
    export ORACLE_HOME=<ORACLE_HOME>
    export PATH=$ORACLE_HOME/bin:$PATH

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe (Platzhalter ersetzen):

    SET DBID <DBID>;
    STARTUP FORCE NOMOUNT;
    
    # Falls SPFILE fehlt:
    RESTORE SPFILE FROM AUTOBACKUP;
    SHUTDOWN IMMEDIATE;
    STARTUP NOMOUNT;
    
    RESTORE CONTROLFILE FROM AUTOBACKUP;
    ALTER DATABASE MOUNT;
    # VOR RESTORE: erreichbares Ziel und Redo-Kette festlegen.
    # Variante A: vollstaendige Recovery, nur wenn erforderliches Redo verfuegbar.
    RESTORE DATABASE;
    RECOVER DATABASE;
    # Variante B STATT A: geplante PITR; Grenze vor RESTORE und RECOVER setzen.
    # RUN {
    #   SET UNTIL SCN <erste_nicht_mehr_anzuwendende_scn>;
    #   RESTORE DATABASE;
    #   RECOVER DATABASE;
    # }
    # Bei fehlendem erforderlichem Redo abbrechen; kein blindes OPEN RESETLOGS.
    
    # Nach Recovery mit restauriertem Backup-Controlfile:
    ALTER DATABASE OPEN RESETLOGS;
    LIST INCARNATION;
    NACHKONTROLLE – READ ONLY
    SELECT instance_name, status, database_status FROM v$instance;
    SELECT name, open_mode, database_role FROM v$database;
    SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;
    SELECT file#, name, status FROM v$datafile ORDER BY file#;

    Fiktive Beispielausgabe:

    SELECT 1.

    INSTANCE_NAMESTATUSDATABASE_STATUS
    ORCLOPENACTIVE

    Einordnung zu SELECT 1: Instanzzustand prüfen.

    Fiktive Beispielausgabe:

    SELECT 2.

    NAMEOPEN_MODEDATABASE_ROLE
    ORCLREAD WRITEPRIMARY

    Einordnung zu SELECT 2: Datenbankrolle und Öffnungsmodus prüfen.

    Fiktive Beispielausgabe:

    SELECT 3.

    CON_IDNAMEOPEN_MODE
    2PDB$SEEDREAD ONLY
    3APPPDBREAD WRITE

    Einordnung zu SELECT 3: Aus dem Root den PDB-Zustand prüfen.

    Fiktive Beispielausgabe:

    SELECT 4.

    FILE#NAMESTATUS
    1/u02/oradata/ORCL/system01.dbfSYSTEM

    Einordnung zu SELECT 4: Ausschnitt der Datafiles. Dass die Datenbank geöffnet ist, beweist nicht die Verfügbarkeit jeder Anwendung oder Datei.

    Nach RESETLOGS:
    Neue Incarnation dokumentieren und ein neues belastbares Basisbackup nach Betriebsverfahren erzeugen.
    1. Oracle-Umgebung ORACLE_HOME, ORACLE_SID, Verzeichnisse und Berechtigungen prüfen.
    2. Password File Remote-/administrativen Zugriff wieder ermöglichen.
    3. SPFILE Aus Autobackup wiederherstellen.
    4. NOMOUNT Instanz mit restauriertem SPFILE starten.
    5. Controlfile Aus Autobackup wiederherstellen und MOUNT.
    6. Datafiles RESTORE DATABASE.
    7. Recovery Bis zum vorab geprüften und freigegebenen Ziel; bei PITR eine wirksame UNTIL-Grenze verwenden.
    8. RESETLOGS Falls unvollständiges Recovery / Backup-Controlfile dies erfordert.
    9. IncarnationLIST INCARNATION dokumentieren.
    10. Neues Backup Nach erfolgreichem Recovery neues Basisbackup einplanen.
    DISASTER-RECOVERY-REFERENZ – NICHT AUTOMATISCH
    Massgeblich ist der vollstaendige Ablauf oben mit DBID, NOMOUNT,
    SPFILE-Neustart und vorab festgelegtem Recovery-Ziel.
    Szenario 10 – Datenbank auf komplett neuem Host wiederherstellen Vom leeren Host bis zur geöffneten Datenbank: Infrastruktur, Oracle Net, Password File, SPFILE, Controlfile, Datafiles und Recovery. Disaster RecoveryNew HostISO

    Worum geht es? Eine Wiederherstellung auf einem neuen Host umfasst mehr als RMAN. Auch Betriebssystemvoraussetzungen, Oracle-Software, Verzeichnisse, Mounts, Netzwerk und administrative Zugriffsmöglichkeiten müssen wieder bereitstehen.

    Was ist das Ziel? Zuerst entsteht eine lauffähige Oracle-Zielumgebung. Danach folgen SPFILE, Controlfile, MOUNT, Datafile-Restore und Recovery bis zum definierten Ziel.

    Praxisnutzen: Dieses Szenario eignet sich besonders als Disaster-Recovery-Nachweis, weil die vollständige Wiederanlaufkette dokumentiert und getestet werden kann.

    1. Vollständiger Runbook-Ablauf

    1. Host OS, Benutzer/Gruppen, Filesysteme und Mounts.
    2. Oracle Kompatible 19c-Version und Patchstand.
    3. Backup Pieces und Archivelogs lesbar bereitstellen.
    4. Oracle Net Listener/TNS vorbereiten.
    5. Password File Nach Betriebsstandard bereitstellen.
    6. SPFILE/Controlfile Mit DBID aus Autobackup restaurieren.
    7. Restore Datafiles auf Zielpfade.
    8. Recovery Bis zum definierten Recovery-Ziel.
    9. Open OPEN oder RESETLOGS je nach Recovery-Art.
    10. Kontrolle PDBs, Services, Listener, Alertlog, Anwendung, Backup.
    NEUER HOST – SYSDBA / RMAN

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe (Platzhalter ersetzen):

    SET DBID <DBID>;
    STARTUP FORCE NOMOUNT;
    RESTORE SPFILE FROM AUTOBACKUP;
    SHUTDOWN IMMEDIATE;
    STARTUP NOMOUNT;
    RESTORE CONTROLFILE FROM AUTOBACKUP;
    ALTER DATABASE MOUNT;
    # VOR RESTORE: erreichbares Ziel und Redo-Kette festlegen.
    # Variante A: vollstaendige Recovery, nur wenn erforderliches Redo verfuegbar.
    RESTORE DATABASE;
    RECOVER DATABASE;
    # Variante B STATT A: geplante PITR; Grenze vor RESTORE und RECOVER setzen.
    # RUN {
    #   SET UNTIL SCN <erste_nicht_mehr_anzuwendende_scn>;
    #   RESTORE DATABASE;
    #   RECOVER DATABASE;
    # }
    # Bei fehlendem erforderlichem Redo abbrechen; kein blindes OPEN RESETLOGS.
    ALTER DATABASE OPEN RESETLOGS;
    LIST INCARNATION;
    Andere Zielpfade:
    Bei abweichenden Pfaden SET NEWNAME/SWITCH DATAFILE ALL oder passende Namenskonvertierung in den freigegebenen Restore-Plan aufnehmen.
    1. Betriebssystem Oracle-User, Gruppen, Filesysteme und Mounts bereit.
    2. Oracle Software Passende 19c-Version und Patchstand installieren.
    3. Backup bereitstellen Sicheres Medium/NFS/FRA auf dem neuen Host erreichbar machen.
    4. Oracle Net Listener/TNS und gegebenenfalls statischen Service vorbereiten.
    5. Password File Administrativen Zugriff herstellen.
    6. SPFILE Aus Autobackup wiederherstellen und Pfade prüfen.
    7. Controlfile Wiederherstellen und Datenbank mounten.
    8. Datafiles Restore auf Zielpfade.
    9. Recovery Redo/Archivelogs anwenden.
    10. Nachkontrolle PDBs, Services, Alertlog, Anwendung und neues Backup.
    Szenario 11 – RMAN Duplicate/Restore bricht wegen DB_FILES ab Wenn die Zielinstanz nur 150 Datafiles zulässt, die PROD-Datenbank aber mehr benötigt: Pre-Check, Ursache und korrekte Zielkonfiguration. RMANDB_FILESPROD→SCHUL

    Worum geht es? Beim Duplicate werden die Datafiles der Quelle in der Auxiliary-/Zieldatenbank registriert. Ist der statische Parameter DB_FILES zu klein, kann Oracle ab einer bestimmten File-Nummer keine weiteren Datafiles einbinden und der Duplicate bricht ab.

    Was ist das Ziel? Auf der Quelle werden sowohl die Anzahl der Datafiles als auch die höchste verwendete FILE# ermittelt. Daraus wird mit Reserve ein geeigneter Zielwert für DB_FILES abgeleitet.

    Wichtig: DB_FILES=250 ist ein Praxisbeispiel und kein allgemeiner Oracle-Standardwert. Der Wert muss zur jeweiligen Quelldatenbank passen.

    1. Vollständiger Runbook-Ablauf bei zu kleinem DB_FILES

    READ ONLY – Quelle
    SELECT COUNT(*) AS datafile_count,
           MAX(file#) AS highest_file_number
    FROM v$datafile;
    SELECT name, value FROM v$parameter WHERE name='db_files';

    Fiktive Beispielausgabe:

    SELECT 1.

    DATAFILE_COUNTHIGHEST_FILE_NUMBER
    187200

    Einordnung zu SELECT 1: 187 vorhandene Datafiles, höchste Dateinummer 200: Lücken sind möglich. Das separat geprüfte Ziel mit DB_FILES=150 ist zu klein.

    Fiktive Beispielausgabe:

    SELECT 2.

    NAMEVALUE
    db_files300

    Einordnung zu SELECT 2: Der Quellparameter steht hier auf 300. Der Zielwert 150 wird separat an der Auxiliary geprüft. Höchste Dateinummer, Bestand und geplantes Wachstum zusammen bewerten; nicht allein die Zahl sichtbarer Zeilen verwenden.

    1. Quelle messen COUNT(*) und insbesondere MAX(file#) bestimmen.
    2. Zielwert Höchste File-Nummer plus Reserve festlegen.
    3. Fehlversuch beenden Nicht mit unverändertem Ziel fortsetzen.
    4. Ziel-SPFILE DB_FILES im Duplicate explizit setzen.
    5. Auxiliary neu starten Statischer Parameter muss beim Start wirksam sein.
    6. Duplicate neu starten Mit korrigierter Zielkonfiguration.
    7. Kontrolle DB_FILES, COUNT(*) und MAX(file#) vergleichen.
    RMAN DUPLICATE – ADMINISTRATIVE AKTION
    rman auxiliary /
    DUPLICATE DATABASE TO SCHUL
      BACKUP LOCATION '<PROD_Backup_Pfad>'
      SPFILE
        SET DB_FILES=250
        ... ;
    Wichtig:
    250 ist ein Praxisbeispiel, kein allgemeiner Sollwert. Der Wert wird aus höchster File-Nummer der Quelle plus sinnvoller Reserve abgeleitet.

    Typisches Fehlerbild: Ein Restore oder Duplicate von PROD nach TEST/SCHUL läuft bereits und bricht beim Einbinden weiterer Datafiles ab, weil die Auxiliary-/Zieldatenbank mit einem zu kleinen Wert für DB_FILES gestartet wurde. Ein häufiger Ausgangswert ist 150; in der Zielumgebung kann beispielsweise 250 erforderlich sein.

    Wichtig: Nicht nur COUNT(*) betrachten. Für die Plausibilität ist auch die höchste verwendete File-Nummer relevant. Ein Datenbankbestand kann Lücken in den File-Nummern besitzen.

    2. PROD vor dem Restore/Duplicate read-only prüfen

    Datafile-Anzahl und höchste File#
    SELECT COUNT(*) AS datafile_count,
           MAX(file#) AS highest_file_number
    FROM v$datafile;
    
    SELECT name, value
    FROM v$parameter
    WHERE name = 'db_files';

    Fiktive Beispielausgabe:

    SELECT 1.

    DATAFILE_COUNTHIGHEST_FILE_NUMBER
    187200

    Einordnung zu SELECT 1: 187 vorhandene Datafiles, höchste Dateinummer 200: Lücken sind möglich. Das separat geprüfte Ziel mit DB_FILES=150 ist zu klein.

    Fiktive Beispielausgabe:

    SELECT 2.

    NAMEVALUE
    db_files300

    Einordnung zu SELECT 2: Der Quellparameter steht hier auf 300. Der Zielwert 150 wird separat an der Auxiliary geprüft. Höchste Dateinummer, Bestand und geplantes Wachstum zusammen bewerten; nicht allein die Zahl sichtbarer Zeilen verwenden.

    Beispiel:

    PROD hat 187 Datafiles beziehungsweise eine höchste relevante File-Nummer oberhalb 150. Die SCHUL-Instanz startet mit db_files=150. Damit ist das Ziel für die Quelle nicht ausreichend dimensioniert.

    3. Pre-Check vor jedem Full Restore / Duplicate

    4. Wo wird DB_FILES für die Auxiliary-Datenbank gesetzt?

    Bei einem Backup-based Duplicate mit SPFILE sollte der Zielwert ausdrücklich im Duplicate-Block gesetzt werden. Dadurch ist dokumentiert, mit welchem Wert die neue TEST-/SCHUL-Datenbank aufgebaut wird.

    DUPLICATE-REFERENZ – VERÄNDERT DIE ZIELDATENBANK
    RMAN> DUPLICATE DATABASE TO SCHUL
          BACKUP LOCATION '<PROD_Backup_Pfad>'
          SPFILE
            SET DB_FILES=250
            ... ;

    Lehrdialog: Prompts wie RMAN> und SQL> nicht eingeben. Die Zeilen gehören in das jeweils genannte Werkzeug; der kopierte Dialog ist kein ausführbares Skript.

    Restart-Verhalten:
    DB_FILES ist ein Startparameter. Eine Änderung muss beim Aufbau/Start der Zielinstanz wirksam sein; ein laufender Restore lässt sich nicht dadurch reparieren, dass der Wert nur in einer bereits laufenden Instanz „irgendwie“ erhöht wird. Der Auxiliary-Start beziehungsweise Duplicate-Ablauf muss mit dem korrigierten Wert neu angesetzt werden.

    5. Sinnvollen Zielwert bestimmen

    Beispiel:
    Aktuell: 187 Datafiles, höchste FILE# 200
    Reserve: ca. 50
    rechnerischer Zielrahmen: 200 + 50 = 250
    gewählter Wert: DB_FILES=250
    Merksatz: DB_FILES immer vor Restore/Duplicate prüfen. Ein zu kleiner Wert kann einen ansonsten korrekten Restore erst mitten im Lauf abbrechen lassen.
    Szenario 12 – Beim Spiegeln wurden versehentlich PROD-Datafiles statt TEST-/SCHUL-Datafiles gelöscht Kritischer Produktionsvorfall: Spiegelung stoppen, PROD-Schaden feststellen und gelöschte Datafiles kontrolliert mit RMAN wiederherstellen. RecoveryRMANPRODCritical

    Worum geht es? Beim Aufbau einer TEST- oder SCHUL-Datenbank wurden durch eine falsche Pfadzuordnung, eine falsche Umgebung, eine Verwechslung von Quelle und Ziel oder einen fehlerhaften Cleanup nicht die Ziel-Dateien, sondern Datafiles der produktiven Datenbank gelöscht. Ab diesem Zeitpunkt handelt es sich nicht mehr primär um einen fehlgeschlagenen Duplicate, sondern um einen Produktions-Recovery-Incident.

    Was ist jetzt das Ziel? Zuerst muss verhindert werden, dass weitere PROD-Dateien gelöscht oder überschrieben werden. Danach wird festgestellt, welche Datafiles fehlen, welche Tablespaces/Container betroffen sind und ob Controlfiles und Online Redo Logs noch intakt sind. Erst nach dieser Bestandsaufnahme wird die passende Recovery-Variante gewählt.

    Recovery-Grundsatz: Sind Controlfiles und die erforderliche Redo-/Archivelog-Kette noch vorhanden, können verlorene Datafiles aus RMAN-Backups restauriert und anschließend bis zum aktuellen konsistenten Stand recovered werden. Sind Controlfiles oder eine komplette aktuelle Redo-Gruppe ebenfalls verloren, gelten die entsprechenden Spezial-Szenarien dieses Runbooks.

    SOFORTMASSNAHME:
    Spiegelungs-/Duplicate-/Cleanup-Prozess sofort stoppen. Keine weiteren Dateien löschen, verschieben, umbenennen oder durch TEST-/SCHUL-Dateien ersetzen. PROD nicht unkontrolliert neu starten. Vor jeder administrativen Aktion Host, SID, DBID, DB_UNIQUE_NAME und die betroffenen Pfade eindeutig verifizieren.
    1. Schaden stoppen Duplicate/Cleanup beenden.
    2. PROD identifizieren Host, SID, DBID und Rolle prüfen.
    3. Schaden erfassen Fehlende Datafiles und Tablespaces bestimmen.
    4. Alertlog Zeitpunkt und Folgefehler dokumentieren.
    5. Backup-Kette LIST, PREVIEW und VALIDATE ausführen.
    6. Variante wählen Datafile- oder Whole-Database-Recovery.
    7. Restore PROD-Dateien aus Backup restaurieren.
    8. Recover Redo/Archivelogs anwenden.
    9. Kontrolle Datafile-Header, PDBs, Tablespaces und Alertlog.
    10. Ursache Duplicate-/Pfadkonfiguration korrigieren.

    1. Vor jeder Aktion: Bin ich wirklich auf PROD?

    OS-DIAGNOSE
    hostname
    echo "$ORACLE_SID"
    echo "$ORACLE_HOME"
    ps -ef | grep '[o]ra_pmon_'
    READ ONLY – PROD eindeutig identifizieren
    SELECT i.instance_name,
           i.host_name,
           i.status,
           d.name,
           d.db_unique_name,
           d.dbid,
           d.open_mode,
           d.database_role
    FROM v$instance i
    CROSS JOIN v$database d;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileINSTANCE_NAMEHOST_NAMESTATUSNAMEDB_UNIQUE_NAME
    1ORCLdb01OPENORCLORCL
    ZeileDBIDOPEN_MODEDATABASE_ROLE
    11234567890READ WRITEPRIMARY

    Was sehe ich hier? Diese Identitätsprüfung verhindert Verwechslungen zwischen Quelle, Klon und Wiederherstellungsziel. Beispielnamen sind keine realen Verbindungsdaten.

    STOP:
    Stimmen Host, SID, DBID oder DB_UNIQUE_NAME nicht mit der erwarteten PROD-Datenbank überein, keine Recovery-Befehle ausführen.

    2. Fehlende oder recovery-pflichtige PROD-Datafiles ermitteln

    Das Controlfile kennt die erwarteten Datafiles. Zusätzlich zeigt der Datafile-Header-Check, welche Dateien nicht gelesen werden können oder Media Recovery benötigen.

    READ ONLY – Datafiles
    SELECT con_id, file#, name, status, enabled
    FROM v$datafile
    ORDER BY con_id, file#;
    
    SELECT file#, status, error, recover, tablespace_name, name
    FROM v$datafile_header
    WHERE recover = 'YES'
       OR error IS NOT NULL
    ORDER BY file#;

    Fiktive Beispielausgabe:

    SELECT 1.

    CON_IDFILE#NAMESTATUSENABLED
    17/u02/oradata/ORCL/app_data01.dbfONLINEREAD WRITE

    Einordnung zu SELECT 1: Ausschnitt der bekannten Datafiles und ihres Aktivierungszustands.

    Fiktive Beispielausgabe:

    SELECT 2.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    FILE#STATUSERRORRECOVERTABLESPACE_NAMENAME
    7NULLFILE NOT FOUNDNULLNULLNULL

    Einordnung zu SELECT 2: Fiktiver Verlust von Datei 7: Der Header ist nicht lesbar. Headerabhängige Angaben können fehlen; die erwartete Datei und ihr Tablespace werden anhand der vorherigen Metadatenliste und des Alertlogs zugeordnet. FILE NOT FOUND verlangt auch die Prüfung von Mount, Pfad und Zugriffsrechten. Nach erfolgreicher Recovery wird dieselbe Filterabfrage wiederholt; das spätere Beispiel ohne Treffer ist die Nachkontrolle.

    READ ONLY – CDB/PDB-Zuordnung
    SELECT con_id, file_id, tablespace_name, file_name, status
    FROM cdb_data_files
    ORDER BY con_id, file_id;

    Fiktive Beispielausgabe:

    CON_IDFILE_IDTABLESPACE_NAMEFILE_NAMESTATUS
    17APP_DATA/u02/oradata/ORCL/app_data01.dbfAVAILABLE

    Was sehe ich hier? Ausschnitt einer ausreichend berechtigten Root-Session. AVAILABLE in CDB_DATA_FILES ist nicht dasselbe wie der Öffnungsmodus einer PDB oder eine erfolgreiche Leseprüfung der ganzen Datei. Für erwartete Dateien und Header-/Recovery-Probleme ergänzend V$DATAFILE und V$DATAFILE_HEADER im passenden Container betrachten.

    3. Filesystem und Alertlog kontrollieren

    OS-DIAGNOSE – nur prüfen
    ls -l <betroffenes_PROD_Datafile>
    df -k <PROD_Datafile_Mountpoint>
    
    adrci
    show homes
    set home diag/rdbms/<db_unique_name>/<sid>
    show alert -tail 200
    Nicht tun:
    Keine leeren Ersatzdateien mit touch erzeugen, keine TEST-/SCHUL-Dateien nach PROD kopieren und keine Dateien aus einem anderen Datenbankstand manuell als Ersatz verwenden.

    4. Vor dem echten Restore die Backup-Kette prüfen

    LIST BACKUP zeigt das Inventar. PREVIEW zeigt, welche Sicherungen RMAN verwenden würde. VALIDATE prüft die Restore-Kette, ohne die produktiven Datafiles zu restaurieren.

    RMAN ANALYSE

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe (Platzhalter ersetzen):

    LIST BACKUP SUMMARY;
    LIST BACKUP OF DATABASE;
    LIST BACKUP OF ARCHIVELOG ALL;
    
    RESTORE DATABASE PREVIEW;
    RESTORE DATABASE VALIDATE;
    
    # Alternativ gezielt:
    RESTORE DATAFILE <file#1>,<file#2> PREVIEW;
    RESTORE DATAFILE <file#1>,<file#2> VALIDATE;
    STOP:
    Kann VALIDATE benötigte Backup Pieces oder Archivelogs nicht lesen, nicht blind mit RESTORE fortfahren. Erst Backup-Zugriff, Channels, Catalog/Controlfile-Metadaten und Recovery-Kette klären.

    5. Entscheidung: einzelne Datafiles oder komplette Datenbank?

    Nur einzelne Datafiles betroffen: gezielter Datafile-/Tablespace-Restore und Recovery.

    Viele oder alle Datafiles betroffen: kontrollierter Whole-Database-Restore im MOUNT-Zustand.

    Controlfiles oder komplette Online-Redo-Gruppe ebenfalls verloren: nicht mit diesem Standardweg fortfahren; die Controlfile-/Redo-Szenarien dieses Runbooks verwenden.

    6. Variante A – einzelne PROD-Datafiles restaurieren

    Nur wenn der konkrete Dateityp und Datenbankzustand es zulassen, kann ein betroffenes Datafile offline genommen und gezielt restauriert werden. SYSTEM, aktive UNDO-Strukturen und Root-kritische Dateien benötigen gegebenenfalls einen MOUNT-basierten Ablauf.

    SYSDBA / RMAN – EINZELNES DATAFILE

    Shell – Eingabe:

    sqlplus / as sysdba

    SQL*Plus – Eingabe (Platzhalter ersetzen):

    -- Nur wenn fuer dieses Datafile zulaessig:
    ALTER DATABASE DATAFILE <file#> OFFLINE;
    
    exit

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe (Platzhalter ersetzen):

    RESTORE DATAFILE <file#>;
    RECOVER DATAFILE <file#>;
    exit

    Shell – Eingabe:

    sqlplus / as sysdba

    SQL*Plus – Eingabe (Platzhalter ersetzen):

    ALTER DATABASE DATAFILE <file#> ONLINE;

    7. Variante B – viele oder alle PROD-Datafiles restaurieren

    Dieser Ablauf setzt voraus, dass verwendbares SPFILE und Controlfile vorhanden sind und nicht gleichzeitig eine komplette Online-Redo-Gruppe verloren wurde.

    SYSDBA / RMAN – COMPLETE DATABASE RECOVERY

    Shell – Eingabe:

    sqlplus / as sysdba

    SQL*Plus – Eingabe:

    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    exit

    Shell – Eingabe:

    rman target /

    RMAN – Eingabe:

    RESTORE DATABASE;
    RECOVER DATABASE;
    exit

    Shell – Eingabe:

    sqlplus / as sysdba

    SQL*Plus – Eingabe:

    ALTER DATABASE OPEN;
    Warum normalerweise kein RESETLOGS?
    Gelingt ein vollständiges Complete Recovery bis zum aktuellen Stand und bleiben Controlfile-/Redo-Strukturen verwendbar, wird normal mit ALTER DATABASE OPEN geöffnet. RESETLOGS gehört zu anderen Recovery-Situationen, etwa Incomplete Recovery.

    8. Nachkontrolle

    READ ONLY – Recovery-Ergebnis
    SELECT instance_name, status, database_status FROM v$instance;
    SELECT name, db_unique_name, open_mode, database_role FROM v$database;
    SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;
    
    SELECT file#, status, error, recover, tablespace_name, name
    FROM v$datafile_header
    WHERE recover = 'YES'
       OR error IS NOT NULL
    ORDER BY file#;

    Fiktive Beispielausgabe:

    SELECT 1.

    INSTANCE_NAMESTATUSDATABASE_STATUS
    ORCLOPENACTIVE

    Einordnung zu SELECT 1: Instanzzustand nach der Maßnahme.

    Fiktive Beispielausgabe:

    SELECT 2.

    NAMEDB_UNIQUE_NAMEOPEN_MODEDATABASE_ROLE
    ORCLORCLREAD WRITEPRIMARY

    Einordnung zu SELECT 2: Datenbankidentität und Rolle nach der Maßnahme.

    Fiktive Beispielausgabe:

    SELECT 3.

    CON_IDNAMEOPEN_MODE
    2PDB$SEEDREAD ONLY
    3APPPDBREAD WRITE

    Einordnung zu SELECT 3: PDB-Zustände im Root kontrollieren.

    Fiktive Beispielausgabe:

    SELECT 4.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    Keine Zeilen ausgewählt.

    Einordnung zu SELECT 4: Keine Treffer im hier gewählten Header-Fehlerfilter. Danach weiterhin Anwendung, Alert Log und geplante Recovery-Nachkontrollen prüfen.

    Erwartetes Ergebnis:
    PROD ist wieder im vorgesehenen OPEN-Zustand, die wiederhergestellten Datafiles melden keinen Recovery-Bedarf mehr, die erforderlichen PDBs/Tablespaces sind verfügbar und das Alertlog zeigt keine neuen Media-Recovery-/Datafile-Fehler.

    9. Ursache vor der nächsten Spiegelung beseitigen

    CHECKLISTE PROD → TEST/SCHUL
    [ ] Richtiger Ziel-Host?
    [ ] Richtige ORACLE_SID der TEST-/SCHUL-Instanz?
    [ ] Richtiger DB_UNIQUE_NAME?
    [ ] PFILE/SPFILE verwendet ausschließlich Zielpfade?
    [ ] CONTROL_FILES liegen ausschließlich im Zielbereich?
    [ ] DB_FILE_NAME_CONVERT Quelle -> Ziel korrekt?
    [ ] LOG_FILE_NAME_CONVERT Quelle -> Ziel korrekt?
    [ ] LOG_ARCHIVE_DEST_1 zeigt auf den Zielbereich?
    [ ] Kein Zielpfad entspricht einem PROD-Datafile-Pfad?
    [ ] BACKUP LOCATION zeigt auf den Backup-Bereich?
    [ ] Dateinamenprüfung aktiv; kein NOFILENAMECHECK in diesem Beispiel?
    [ ] Vor Cleanup/Löschen Host + SID + Pfad erneut geprüft?
    Besondere Gefahr bei NOFILENAMECHECK:
    Die Option ersetzt keine saubere Pfadplanung. Wenn Quell- und Zielpfade kollidieren oder dieselben Storage-Dateien adressieren, kann ein TEST-/SCHUL-Duplicate produktive Dateien gefährden. Die Zielpfade müssen eindeutig von PROD getrennt sein.

    10. ISO-/Incident-Dokumentation

    Dokumentieren:
    Zeitpunkt und Auslöser • Host/SID • betroffene PROD-Dateien • erste Fehler • Zeitpunkt des Abbruchs • verwendete Backups • PREVIEW-/VALIDATE-Ergebnis • Recovery-Variante • Restore-/Recover-Zeiten • erreichter Recovery-Stand • Funktionskontrolle • Root Cause der falschen Pfadzuordnung • Schutzmaßnahme gegen Wiederholung.
    Merksatz:
    Wenn beim TEST-/SCHUL-Duplicate produktive Datafiles gelöscht werden, wird PROD wie ein echter Media-Recovery-Incident behandelt: Schaden stoppen → Schaden bestimmen → Backup-Kette validieren → Restore → Recover → PROD prüfen → Ursache beseitigen.

    Zusammenhängende Vorher-/Nachher-Kontrolle der Runbooks: Im Fehlerfall aus Szenario 12 ist beispielsweise Datei 7 als FILE NOT FOUND zu dokumentieren; nach erfolgreicher Recovery darf derselbe Befund nicht mehr bestehen. Eine beliebige intakte SYSTEM-Datei ist kein Nachweis für Datei 7. Ein Datenbank-VALIDATE allein bestätigt keine Archivelog-Lesbarkeit; dafür die im Readiness-Abschnitt gezeigte, zum tatsächlichen Ziel passende Archivelog-Validierung ergänzen.

    Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Backup and Recovery User's Guide
    Backup-/Recovery-Strategie, RMAN, Restore, Recovery und Recovery Catalog
    https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/

    Complete Database Recovery
    RESTORE ... PREVIEW liest Repository-Metadaten; RESTORE ... VALIDATE liest und prüft die für den Restore ausgewählten Backups.
    https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/rman-complete-database-recovery.html

    RMAN Backup Concepts
    Backupsets, Image Copies, Incrementals und Retention Policy
    https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/rman-backup-concepts.html
    Vertiefende Oracle-19c-Quellen: RESTORE · RECOVER · DUPLICATE · Inkrementelle Sicherungen · Lizenzinformationen
    Geführte Praxisübung: War die Sicherung erfolgreich?

    So arbeitest du mit der Übung: Lies zuerst die Situation, betrachte die Abfrage und beantworte die Fragen anhand der Beispielausgabe. Öffne anschließend die Musterlösung. Alle Werte sind erfundene Lernbeispiele. Die SELECT-Abfragen lesen Informationen; der Wiki-Generator führt sie nicht aus. Voraussetzung sind passende Leserechte und die Verbindung zur betroffenen Datenbank beziehungsweise PDB.

    Situation: Du kontrollierst morgens die Sicherungen. Ein vollständiges Datenbankbackup wurde erfolgreich beendet, aber bei der letzten Archivelog-Sicherung steht eine Warnung. Du möchtest eine verständliche Aussage für den Betrieb formulieren, ohne die Warnung zu übersehen.

    Prüfung: Die Abfrage zeigt höchstens fünf der zuletzt gestarteten, im verfügbaren Repository erfassten Backup-Jobs. Die jüngste Zeile steht oben.

    SELECT session_key, input_type, status,
           TO_CHAR(start_time,'DD.MM.YYYY HH24:MI') AS startzeit,
           TO_CHAR(end_time,'DD.MM.YYYY HH24:MI') AS endzeit
    FROM v$rman_backup_job_details
    ORDER BY start_time DESC, session_key DESC
    FETCH FIRST 5 ROWS ONLY;

    Was sehe ich hier? Jede Zeile beschreibt einen Backup-Job. INPUT_TYPE ist dessen von Oracle zusammengefasste Art; STATUS meldet das Ergebnis. STARTZEIT und ENDZEIT erlauben die zeitliche Einordnung. Die gekürzte Lerntabelle zeigt hier drei Zeilen.

    SESSION_KEYINPUT_TYPESTATUSSTARTZEITENDZEIT
    913ARCHIVELOGCOMPLETED WITH WARNINGS01.10.2026 06:0001.10.2026 06:03
    912DB FULLCOMPLETED30.09.2026 18:2030.09.2026 19:05
    911ARCHIVELOGCOMPLETED30.09.2026 18:0030.09.2026 18:02

    Deine Aufgabe: Welcher Job benötigt eine genauere Prüfung? Kannst du allein mit diesen Zeilen zusagen, dass eine Wiederherstellung bis 06:00 Uhr möglich ist? Zeigt DB INCR das genaue Incremental-Level?

    Musterlösung und nächster Prüfschritt

    Job 912 ist mit COMPLETED beendet worden. Job 913 ist abgeschlossen, enthält aber Warnungen und muss anhand der zugehörigen RMAN-Ausgabe untersucht werden. Aus dem Status allein geht weder die Ursache noch die Bedeutung der Warnung hervor. Die SESSION_KEY hilft bei der Zuordnung; für die genaue Verbindung mit RMAN-Ausgaben werden auch die Repository-Identifikatoren SESSION_RECID und SESSION_STAMP verwendet.

    Eine passende erste Meldung wäre: „Das Datenbank-Fullbackup wurde erfolgreich beendet. Die jüngste Archivelog-Sicherung ist mit Warnungen abgeschlossen; die RMAN-Ausgabe und die betroffene Redo-Abdeckung werden noch geprüft.“ Damit ist klar, was bestätigt wurde und welche Prüfung noch offen ist.

    Für den gewünschten Wiederherstellungszeitpunkt brauchst du eine passende Basissicherung und die erforderlichen weiteren Sicherungen sowie Redo ohne Lücken, verfügbare und lesbare Backup-Dateien und die notwendigen Metadaten. Die Uhrzeit eines Backup-Jobs beschreibt keine garantierte Grenze der Redo-Abdeckung. Auch fünf angezeigte Jobs können nicht die gesamte Kette abbilden. Die weiteren Prüfungen stehen im Backup-und-Recovery-Kapitel.

    DB INCR bezeichnet einen inkrementellen Job, zeigt aber nicht dessen Level 0 oder Level 1. DB FULL ist ebenfalls nicht mit Level 0 gleichzusetzen. Enthält ein Job verschiedene Sicherungsarten, fasst INPUT_TYPE ihn nach Oracles Prioritätsregeln zusammen. Ein DB-FULL-Job kann somit auch Archivelogs enthalten; diese Liste ist kein vollständiges Inventar aller gesicherten Objekte.

    Grenze der Aussage: Eine leere Ergebnisliste beweist nicht, dass niemals gesichert wurde. Prüfe Datenbank, Sichtbarkeit und vorhandene Repository-Historie. Ein erfolgreicher Jobstatus ersetzt weder die Prüfung der Sicherungskette noch einen getesteten Wiederherstellungsablauf.

    Oracle 19c: V$RMAN_BACKUP_JOB_DETAILS

    Oracle-19c-Referenzen zu den Diagnosebeispielen: Archivelog-Auswahl · DELETE

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. BACKUP sichert Daten, RESTORE stellt Dateien wieder bereit und RECOVER spielt erforderliche Änderungen nach. Diese drei Schritte erfüllen unterschiedliche Aufgaben.
    2. Die Wiederherstellbarkeit hängt von einer vollständigen Kette aus passenden Sicherungen und benötigtem Redo ab. Controlfile, Startkonfiguration und zusätzlich benötigte Dateien müssen ebenfalls verfügbar sein.
    3. Ein Full Backup ist nicht dasselbe wie ein inkrementelles Level-0-Backup. Level 0 bildet die Basis für darauf aufbauende inkrementelle Sicherungen.
    4. Retention Policy, Archivelog Deletion Policy und tatsächliche Verfügbarkeit der Sicherungen sind getrennte Aspekte. EXPIRED bedeutet nicht dasselbe wie OBSOLETE.
    5. Erfolgreiche Backup-Jobs und VALIDATE sind wichtige Nachweise, ersetzen aber keinen geprüften Wiederherstellungsablauf. Recovery-Ziel, benötigte Zeit und fachliche Nachkontrolle gehören in das Runbook.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Die Antworten sind bewusst eingeklappt.
    Frage 1: Was ist der Unterschied zwischen Restore und Recovery?
    Restore stellt gesicherte Dateien wieder her; Recovery wendet geeignete inkrementelle Backups und erforderliches Redo an, um sie auf den gewünschten konsistenten Stand zu bringen.
    Frage 2: Warum ist ein erfolgreiches Backup allein noch kein Beweis für Wiederherstellbarkeit?
    Entscheidend ist die vollständige Recovery-Kette einschließlich benötigter Backups, Redo-/Archivelogs und Metadaten.
    Frage 3: Was bedeutet PITR?
    Point-in-Time Recovery ist eine unvollständige Recovery bis zu einem gewählten Ziel, beispielsweise Zeit, SCN oder Log Sequence. Bei einer vollständigen Database-PITR wird die Database anschließend typischerweise mit RESETLOGS geöffnet. Davon zu unterscheiden sind objekt- oder tablespacebezogene Recovery-Verfahren.
    Frage 4: Warum ist ein Full Backup nicht dasselbe wie ein Level 0?
    Beide sichern grundsätzlich alle verwendeten Blöcke, aber nur ein Incremental Level 0 kann als Basis für nachfolgende Level-1-Backups dienen.
    Frage 5: Was ist der Unterschied zwischen EXPIRED und OBSOLETE?
    EXPIRED beschreibt nach CROSSCHECK eine nicht bestätigte physische Verfügbarkeit. OBSOLETE beschreibt, dass ein Backup nach der Retention Policy für das definierte Recovery-Ziel nicht mehr benötigt wird.
    Frage 6: Löscht eine konfigurierte Retention Policy automatisch alle alten Backup Pieces?
    Nein. Die Retention Policy dient RMAN zur Bewertung, welche Backups für das Recovery-Ziel noch erforderlich beziehungsweise obsolete sind. Eine tatsächliche Löschung ist eine separate Aktion beziehungsweise erfolgt nur im Rahmen dafür vorgesehener Speicherverwaltungsmechanismen.
    Frage 7: Warum ist BACKUP ARCHIVELOG ALL DELETE INPUT keine reine Diagnose?
    Der Befehl sichert Archived Logs und entfernt anschließend Input-Dateien nach RMAN-Semantik. Er verändert damit den Dateibestand und muss in die gesamte Recovery- und gegebenenfalls Standby-Strategie passen.
    Frage 8: Welche Identität erwartest du nach einem eigenständigen TESTDB-Duplicate?
    TESTDB mit eigener DBID und ausschließlich geplanten Zielpfaden. Quellidentität und Quellpfade sind kein erfolgreicher Zielnachweis.

    26. Patchmanagement – vom Oracle-Patchzyklus bis zur technischen Nachkontrolle

    Warum Oracle regelmäßig gepatcht wird, welche Ebenen betroffen sind und wie ein kontrollierter Patch-Lifecycle aufgebaut ist.

    Lernkompass
    Einfach gesagt Du lernst, wie Oracle-Patches auf Software- und Datenbankebene wirken und warum OPatch-Inventar und SQL-Patch-Registry gemeinsam betrachtet werden müssen.
    Warum ist das wichtig? Ein erfolgreich gepatchtes ORACLE_HOME bedeutet noch nicht automatisch, dass alle SQL-Anteile eines Patches in der Datenbank erfolgreich registriert wurden. Patchstand, datapatch-Status und Komponentenstatus gehören zusammen.
    Nach diesem Kapitel Du kannst den Patchstand read-only prüfen, RU und One-off fachlich unterscheiden, datapatch-Ergebnisse bewerten und einen Patchvorgang mit Prechecks und Postchecks strukturieren.

    Einführung: Ein Oracle-Patch bringt Korrekturen oder Sicherheitsbehebungen in eine installierte Oracle-Umgebung. Je nach Patch werden neben Dateien im Oracle Home auch SQL-Änderungen in einer oder mehreren Datenbanken ausgeführt. Diese Ebenen haben getrennte Nachweise: Ein erfolgreich aktualisiertes Oracle Home bestätigt noch nicht automatisch den SQL-Patchstand der Datenbanken.

    Das Kapitel führt von den Patcharten und der Zielbestimmung über Planung und Prechecks bis zur Datenbank-Nachbearbeitung und technischen Kontrolle. Es zeigt, welche Information aus dem Softwareinventar stammt und was erst in der Datenbank geprüft wird. Für die konkreten Befehle und Voraussetzungen bleibt das README des ausgewählten Patches maßgeblich.

    Oracle 19c: fachliche Grundlage

    Die wichtigste Denkregel lautet: Software-Inventar und Datenbank-Registry sind unterschiedliche Informationsquellen. opatch lsinventory beschreibt Patches im Oracle Home. DBA_REGISTRY_SQLPATCH beschreibt SQL-Patch-Versuche, die durch datapatch in der Datenbank registriert wurden.

    Ein sauberer Postcheck vergleicht deshalb nicht nur eine Versionsnummer, sondern prüft Oracle Home, SQL-Patch-Status, Datenbankkomponenten, Alert Log und Anwendungsverhalten gemeinsam.

    Offizielle Oracle-Quellen
    Oracle Critical Patch Updates, Critical Security Patch Updates and Security Alerts
    Oracle Database 19c Patch Maintenance

    Diese Links sind bewusst als Primärquellen eingebaut. Patch README und My Oracle Support bleiben für den konkreten Patch maßgeblich.

    1. Welche Patcharten muss ein DBA unterscheiden?

    Release Update (RU): kumulatives, regelmäßig bereitgestelltes Patchbundle für Oracle Database. Ein neueres RU enthält die vorherigen RU-Korrekturen dieser Linie.

    One-off / Interim Patch: gezielter Patch für einen konkreten Fehler oder eine spezielle Anforderung. Vor Kombination mit einem RU müssen Konflikte und gegebenenfalls eine passende Neuversion beziehungsweise ein Merge geprüft werden.

    OPatch: Werkzeug für die Patchverwaltung eines Oracle Homes. Es arbeitet auf Softwareebene und kann unter anderem Inventar und Konfliktinformationen liefern.

    datapatch: führt die zu einem installierten Patch gehörenden SQL-Änderungen in den relevanten Datenbanken aus und aktualisiert dabei die SQL-Patch-Registry.

    Merksatz:

    OPatch-Ebene = Oracle-Home-Software
    datapatch-Ebene = SQL-Änderungen innerhalb der Datenbank

    Beide Ebenen müssen nach einem Patchvorgang zueinander passen.

    2. Oracle-Patchzyklus

    Oracle veröffentlicht Critical Patch Updates regulär am dritten Dienstag der Monate Januar, April, Juli und Oktober. Dieser quartalsweise Rhythmus ist der zentrale Takt für die Sicherheits- und Patchplanung vieler On-Premises-Systeme.

    Seit 2026 veröffentlicht Oracle für Produkte, die Critical Security Patch Updates erhalten, in weiteren Monaten zusätzliche Sicherheitsupdates. Für die betriebliche Datenbankplanung bleibt deshalb wichtig, die jeweils aktuelle Oracle Security Alerts-Seite und das konkrete Patch README zu prüfen und nicht nur nach einem starren Kalender zu arbeiten.

    JAN→APR→JUL→OKT→nächstes Quartal

    3. Oracle-Veröffentlichung ist nicht gleich Produktionstermin

    Dass Oracle einen RU oder ein Sicherheitsupdate veröffentlicht, bedeutet nicht, dass jede produktive Datenbank am selben Tag gepatcht werden muss. Der interne Unternehmensprozess umfasst typischerweise Bewertung, Download, Testsystem, Funktionstest, Freigabe, Wartungsfenster und anschließende Produktion.

    Ein sinnvoller interner Zyklus kann beispielsweise quartalsweise direkt an den Oracle-CPU-Takt gekoppelt sein. Wie schnell nach Veröffentlichung produktiv gepatcht wird, hängt vom Sicherheitsrisiko, den betrieblichen Vorgaben, Testmöglichkeiten und Wartungsfenstern ab.

    4. Ein typischer Patch-Lifecycle

    Oracle Release→Bewerten→Test→Freigabe→Produktion→Nachkontrolle

    5. Was gehört zum Oracle-Patchmanagement?

    Je nach Plattform können mehrere Ebenen beteiligt sein: Database Home, Grid Infrastructure, Listener-/Netzwerkhome, OPatch selbst und die SQL-Komponenten der Datenbank. Hinzu kommen Anwendungen und externe Treiber, die nach einer Wartung getestet werden müssen.

    6. CPU, Security Advisory und RU nicht verwechseln

    Der Critical Patch Update ist Oracles Sicherheitsveröffentlichungsprozess und Advisory. Der konkrete Database RU ist das technische Patchbundle für die Datenbanksoftware. Ein DBA sollte deshalb sowohl das Security Advisory als auch das README des tatsächlich einzuspielenden Patches lesen.

    7. README ist die technische Wahrheit für den konkreten Patch

    Allgemeines Patchwissen reicht nicht für eine produktive Wartung. Das README des konkreten Patches nennt Voraussetzungen, OPatch-Mindestversion, Konfliktprüfungen, erforderliche Stop-/Startschritte, datapatch-Anforderungen und Rollbackverfahren.

    8. Mehrere Oracle Homes – klassische Fehlerquelle

    Auf einem Host können mehrere Homes liegen. Ein falsches ORACLE_HOME führt dann zu einer korrekten OPatch-Ausgabe für das falsche Home. Deshalb sollte die Home-Zuordnung immer mit laufenden Prozessen, ORACLE_SID und Konfiguration korreliert werden.

    9. Listener kann aus einem anderen Home laufen

    Der Listener muss nicht zwingend aus demselben Oracle Home wie die Datenbank gestartet worden sein. Gerade bei lang gewachsenen Systemen ist diese Annahme gefährlich. Vor Wartung sollte der tatsächliche Prozesspfad geprüft werden.

    10. Konfliktanalyse

    Ein vorhandener One-off kann dieselben Dateien verändern wie der neue RU. Dann entsteht ein Konflikt. Diese Situation muss vor dem Wartungsfenster geklärt werden. Ein produktiver Patchtermin ist der falsche Zeitpunkt, um erstmals festzustellen, dass ein Interimsfix kollidiert.

    11. Prechecks

    12. Warum ein Rollback-Plan dazugehört

    Auch ein gut getesteter Patch kann auf einem konkreten System unerwartet scheitern. Deshalb muss vor Beginn definiert sein, wann abgebrochen wird und wie der alte Zustand wiederhergestellt werden kann. Ohne Rückweg ist eine Wartung nicht kontrolliert.

    Patch-Rollback und Release-Downgrade unterscheiden: Ein RU innerhalb von 19c wird nach seinem konkreten Patchverfahren zurückgenommen. Beim später beschriebenen Release-Upgrade kommt zusätzlich COMPATIBLE ins Spiel: Dieser Parameter ist keine Anzeige des installierten RU, sondern steuert Release-Kompatibilität. Oracle empfiehlt, ihn erst nach gründlichen Tests der aktualisierten Datenbank anzuheben. Nach einer Anhebung ist ein Downgrade auf das frühere Kompatibilitätsniveau nicht durch einfaches Zurücksetzen möglich; auch ein Flashback zu früheren Restore Points ist kein pauschaler Rückweg. Der gewählte Rückfallplan muss diese Grenze berücksichtigen. Oracle 19c.

    13. Binary Patch

    Der Binary Patch verändert Dateien im Oracle Home. Je nach Patch müssen Prozesse beendet sein. Nach erfolgreichem Binary Patch ist zunächst nur die Softwareebene aktualisiert.

    14. DBA_REGISTRY_SQLPATCH

    DBA_REGISTRY_SQLPATCH wird durch datapatch aktualisiert. Die View enthält nicht nur den Patchnamen, sondern unter anderem ACTION, STATUS, ACTION_TIME, Quell-/Zielversion und den zugehörigen Logfile-Pfad. Ein alter fehlgeschlagener Versuch kann daher neben einem späteren erfolgreichen Retry sichtbar bleiben.

    Für die Bewertung wird deshalb nicht einfach nach irgendeiner Zeile mit WITH ERRORS gesucht. Entscheidend ist die zeitliche Folge der Versuche und der aktuelle Endzustand.

    READ ONLY – SQL-Patchhistorie
    SELECT install_id,
           patch_id,
           patch_type,
           action,
           status,
           action_time,
           description,
           source_version,
           target_version,
           logfile
    FROM dba_registry_sqlpatch
    ORDER BY action_time DESC, patch_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    INSTALL_IDPATCH_IDPATCH_TYPEACTIONSTATUS
    299900001RUAPPLYSUCCESS
    199900001RUAPPLYWITH ERRORS
    ACTION_TIMEDESCRIPTIONSOURCE_VERSIONTARGET_VERSIONLOGFILE
    2026-10-08 09:20:00Fiktiver RU-Test19.21.0.0.019.22.0.0.0/diag/sqlpatch/test_success.log
    2026-10-08 09:00:00Fiktiver RU-Test19.21.0.0.019.22.0.0.0/diag/sqlpatch/test_error.log

    So liest du das Ergebnis: Die Patch-ID ist absichtlich erfunden und nicht für Downloads bestimmt. Der spätere Versuch war erfolgreich; die ältere Fehlerzeile bleibt Historie. Der tatsächliche Endzustand wird zusätzlich mit Home-Inventar, Container und Komponenten abgeglichen.

    15. CDB und PDBs

    Container einzeln nachweisen: Die DBA_REGISTRY_SQLPATCH-Abfrage unten gilt für den Container der Verbindung. In einer CDB die erforderlichen PDBs und den Root getrennt prüfen oder eine dafür geeignete containerübergreifende Sicht verwenden. Eine leere Registry ist kein Beweis für ein ungepatchtes Oracle Home: Manche Patches haben keinen SQL-Anteil. Umgekehrt belegt eine erfolgreiche SQL-Zeile nicht, aus welchem Home eine Instanz heute tatsächlich gestartet wurde.

    In Multitenant-Umgebungen muss datapatch die relevanten Container erreichen. Deshalb gehört der Open-Mode der PDBs zur Vorbereitung und Nachkontrolle. Ein CDB-Patchzustand allein beweist nicht automatisch, dass jede PDB erfolgreich verarbeitet wurde.

    READ ONLY – PDB-Zustand aus CDB$ROOT
    SELECT con_id, name, open_mode, restricted
    FROM v$pdbs ORDER BY con_id;

    Fiktive Beispielausgabe:

    CON_IDNAMEOPEN_MODERESTRICTED
    2PDB$SEEDREAD ONLYNO
    3APPPDBREAD WRITENO

    Nur für eine CDB im Root: Erwartete PDBs und Zugriffsmöglichkeiten mit dem Patchverfahren abgleichen. Anschließend die bereits gezeigte DBA_REGISTRY_SQLPATCH-Abfrage in jedem erforderlichen Container durchführen und Containername dokumentieren. READ WRITE allein bestätigt keinen SQL-Patch-Erfolg.

    READ ONLY – Verbindungskontext
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS container_name
    FROM dual;

    Fiktive Beispielausgabe:

    CONTAINER_NAME
    APPPDB

    APPLY und ROLLBACK: SUCCESS bewertet die jeweilige Aktion. Ein späteres ROLLBACK/SUCCESS bedeutet erfolgreiche Rücknahme; ein früheres APPLY/SUCCESS beweist dann nicht den heutigen Installationsstand. Je Patch und Container Verlauf, Logs und Home-Inventar gemeinsam lesen. Ein Home-Rückwechsel allein ist kein pauschales SQL-Rollbackverfahren; dafür gilt das konkrete README.

    16. Alert Log nach dem Patch

    Ein erfolgreicher Patchprozess endet nicht bei „command completed successfully“. Startup-Fehler, Komponentenprobleme oder neue ORA-Meldungen können erst beim Datenbankstart sichtbar werden. Das Alert Log ist deshalb Teil der technischen Abnahme.

    17. Anwendungstest

    Die Datenbank kann technisch OPEN sein und trotzdem kann eine Anwendung wegen geändertem Verhalten, Treiberproblemen oder invaliden Objekten nicht funktionieren. Ein fachlicher Smoke-Test gehört deshalb zur Freigabe.

    18. Patchstand read-only feststellen

    Ziel der folgenden Abfrage:
    Die Oracle-Home-Seite wird mit OPatch geprüft. Entscheidend ist, dass das OPatch aus genau dem Oracle Home verwendet wird, dessen Inventar untersucht werden soll.
    OS-DIAGNOSE – Oracle Home und OPatch
    echo "$ORACLE_HOME"
    "$ORACLE_HOME/OPatch/opatch" version
    "$ORACLE_HOME/OPatch/opatch" lspatches
    "$ORACLE_HOME/OPatch/opatch" lsinventory
    Was sehe ich hier?
    opatch version zeigt die Werkzeugversion; lspatches listet Patches im gewählten Home; lsinventory liefert dessen Inventar. Diese OS-Ausgaben zeigen keine SQL-Patch-Ausführung in einer PDB. Das tatsächlich verwendete Home muss zusätzlich zur Umgebung passen.
    Ziel der folgenden Abfrage:
    Nach dem Patchen sollte auch der Status der registrierten Datenbankkomponenten geprüft werden. Ein Patchstand und ein Komponentenstatus beantworten unterschiedliche Fragen.
    READ ONLY – Datenbankkomponenten
    SELECT comp_id,
           comp_name,
           version,
           status
    FROM dba_registry
    ORDER BY comp_id;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    COMP_IDCOMP_NAMEVERSIONSTATUS
    CATALOGOracle Database Catalog Views19.0.0.0.0VALID
    CATPROCOracle Database Packages and Types19.0.0.0.0VALID

    So liest du das Ergebnis: Gekürzte Zeilenauswahl: Beide Komponenten sind gültig. Ihre VERSION ist keine vollständige Ersatzprüfung des aktuellen RU-Stands.

    READ ONLY – ungültige Objekte vor und nach der Wartung
    SELECT owner, object_name, object_type, status
    FROM dba_objects
    WHERE status = 'INVALID'
    ORDER BY owner, object_type, object_name;

    Fiktive Beispielausgabe:

    OWNEROBJECT_NAMEOBJECT_TYPESTATUS
    APP_USERREPORT_VIEWVIEWINVALID

    Beide Abfragen im selben Container durchführen und Zeitpunkte festhalten. Die fiktive Zeile ist bereits vor der Wartung vorhanden. Erst der Vergleich der Objektidentitäten zeigt neue oder verschwundene Invalid Objects; gleiche Gesamtzahlen können unterschiedliche Objekte verbergen. Keine automatische Neukompilierung.

    19. In-place und Out-of-place unterscheiden

    Beim In-place-Patching wird das vorhandene Oracle Home verändert. Beim Out-of-place-Patching wird ein separates, vorbereitetes Oracle Home verwendet und die Datenbank anschließend auf dieses Home umgestellt. Oracle empfiehlt für Patch Maintenance grundsätzlich Out-of-place-Verfahren, weil Quell- und Ziel-Home klarer getrennt und Rollback-/Testabläufe besser planbar sind.

    Welche Methode in einer konkreten Betriebs- und Clusterumgebung eingesetzt wird, muss jedoch zum vorhandenen Betriebs-, Cluster- und Change-Konzept passen. Das Wiki legt deshalb keine universelle Umschaltprozedur fest.

    20. Oracle-19c-Dokumentation als Grundlage

    Oracle Database Patch Maintenance, Release 19c and Later
    RUs, Patch Delivery und Patch-Maintenance-Grundsätze
    https://docs.oracle.com/en/database/oracle/oracle-database/19/dbptc/

    DBA_REGISTRY_SQLPATCH
    SQL-Patchhistorie, APPLY/ROLLBACK, SUCCESS/WITH ERRORS und datapatch
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/DBA_REGISTRY_SQLPATCH.html

    Ergebnis der Nachkontrolle: Verknüpfe das tatsächlich genutzte Oracle Home mit OPatch-Inventar, SQL-Patchhistorie je erforderlichem Container, Komponentenstatus, neuen Invalid Objects und Anwendungstest. Ein alter fehlgeschlagener Versuch ist nach einem erfolgreichen Retry kein Beweis für einen weiterhin fehlerhaften Endzustand. Prüfe bei Fehlern das zur Registry-Zeile gehörende LOGFILE.

    Oracle-19c-Referenzen zu den Diagnosebeispielen: PDB-Zustand · Objektstatus

    Für die Nachkontrolle Oracle Home, betriebene Instanz, Container, Binary-Inventar und SQL-Patchstatus getrennt zuordnen. Die allgemeine 19c-Dokumentation ersetzt nicht die README des konkreten Patchpakets.

    Praxis: Ein Upgrade nach 19c planen, prüfen und abnehmen

    Ein Release Upgrade verändert die Datenbankversion und ist nicht dasselbe wie ein RU innerhalb von 19c. Dieses Labor betrachtet eine eigene, kompatible 12.2.0.1-Lernquelle und ein vorbereitetes 19c-Ziel-Home auf derselben unterstützten Plattform. Es wird nicht gleichzeitig die Plattform, der Zeichensatz oder die Architektur gewechselt. Eine Non-CDB-zu-PDB-Konvertierung ist eine zusätzliche Aufgabe. AutoUpgrade besitzt einen eigenen Werkzeugstand; verwende die von Oracle für den konkreten Fall vorgesehene Version und prüfe deren Hilfe und Anforderungen.

    1. Einen belastbaren Ausgangspunkt sichern

    • Notiere DBID, SID, DB_NAME, CDB-Status, alle Container, Quell-Home, Ziel-Home, Edition und RU.
    • Dokumentiere Komponentenstatus, ungültige Objekte, Zeitzonendateiversion sowie fachliche Testdaten und Client-Verbindungen vor dem Upgrade.
    • Prüfe den unterstützten direkten Upgradepfad, freien Platz, Ziel-Home und die benötigten Optionen. Der Name 19c allein belegt keine Kombination beliebiger Quellstände.
    • Erstelle und erprobe eine vollständige Rücksicherung einschließlich relevanter Konfiguration. Ein Home-Rückwechsel allein setzt ein bereits aktualisiertes Dictionary nicht zurück.
    SQL*Plus – lesende Kontrolle
    SELECT name, dbid, cdb, open_mode FROM v$database;
    SELECT comp_id, version, status FROM dba_registry ORDER BY comp_id;
    SELECT owner, object_type, COUNT(*) AS invalid_count
    FROM dba_objects WHERE status='INVALID'
    GROUP BY owner, object_type ORDER BY owner, object_type;
    SELECT filename, version FROM v$timezone_file;

    Bei einer CDB die Komponenten- und Objektkontrolle im Root und in den betroffenen PDBs durchführen. Der Ausgangsbestand ungültiger Objekte muss von neu entstandenen Fehlern unterschieden werden.

    2. Konfiguration und reine Bereitschaftsanalyse

    Datei /lab/upgrade/lab.cfg – Pfade und SID an die Laborquelle anpassen
    global.autoupg_log_dir=/lab/upgrade/log
    upg1.sid=LABOLD
    upg1.source_home=/lab/oracle/product/12.2/dbhome_1
    upg1.target_home=/lab/oracle/product/19c/dbhome_1
    upg1.start_time=NOW
    Shell als Software-Owner – Bereitschaftsanalyse; erzeugt Protokolle
    java -jar /lab/tools/autoupgrade.jar -config /lab/upgrade/lab.cfg -mode analyze

    Analyze führt die Bereitschaftsprüfung aus, nicht das eigentliche Upgrade. Werte die erzeugten Berichte für jeden betroffenen Container aus. Halte pro Befund Ursache, Maßnahme und erneuten Prüfnachweis fest. Überspringe einen fehlgeschlagenen Check nicht allein, um die nächste Stufe zu erreichen. Das verwendete Java und AutoUpgrade müssen zusammenpassen.

    3. Durchführung als bewusster Entscheidungspunkt

    ModusBedeutung für die Übung
    analyzeBerichte lesen und jeden offenen Punkt bewerten.
    fixupsKann Änderungen an der Quelle vornehmen; nur nach geprüfter Maßnahme und gesicherter Rückkehr ausführen.
    deployFührt den Upgradeablauf einschließlich Änderungen und Zustandswechseln aus; benötigt das freigegebene Laborfenster.

    Führe Deploy erst nach erfolgreicher Vorprüfung, abgestimmter Ausfallzeit und erprobtem Rückweg aus. Prüfe vorher die Restoration-Einstellungen der konkreten AutoUpgrade-Version. Ein Guaranteed Restore Point beziehungsweise Flashback-Rückweg darf in einer SE2-Übung nicht stillschweigend vorausgesetzt werden. Nutze dort den vorbereiteten Backup-/Restore-Rückweg; Einstellungen zum Abschalten einer automatischen Restoration sind versionsbezogen zu dokumentieren.

    Shell – nur für die geprüfte Laborquelle; verändert die Datenbank
    java -jar /lab/tools/autoupgrade.jar -config /lab/upgrade/lab.cfg -mode deploy

    4. Technische und fachliche Nachkontrolle

    Prüfe Jobabschluss und vollständige Logs. Wiederhole die Ausgangsabfragen, bestätige das tatsächlich verwendete Ziel-Home und prüfe SQL-Patchstatus und Container. Teste Anmeldung über die vorgesehenen Services, Lesen und Schreiben der eigenen Beispieldaten sowie einen kontrollierten Commit/Rollback. Ein erfolgreicher SELECT auf V$VERSION beweist weder fehlerfreie Komponenten noch funktionierende Anwendungen. Sichere die akzeptierte neue Basis nach Abschluss der Nacharbeiten.

    5. Rückfall praktisch beschreiben

    Lege vorab fest, bis wann ein Rückfall entschieden wird und welche Änderungen seit dem Upgrade dadurch verloren gehen können. Beim Restore-Rückweg werden die passende Datenbankbasis und benötigte Konfiguration wiederhergestellt und mit dem passenden Quell-Home betrieben. Ein VM-Snapshot ist nur dann ein verwendbarer Rückweg, wenn alle relevanten Datenträger und die Datenbankkonsistenz berücksichtigt und der Ablauf tatsächlich geprüft wurden. Für eine Wiederholung des Labors zuerst diesen definierten Ausgangszustand herstellen.

    Musterlösung und Abnahmekriterien

    Die Abnahme verlangt drei Nachweise: keine ungeklärten blockierenden Vorprüfungen, ein nachvollziehbar abgeschlossener Upgradejob und erfolgreiche technische sowie fachliche Tests. Zusätzlich erklärst du an einem gespielten Abbruchfall den Rückweg. Ohne diese Belege ist „Deploy beendet“ keine vollständige Freigabe.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Patchplanung beginnt mit dem richtigen Produkt, Release, Oracle Home und konkreten Patch. Die zugehörige README legt Voraussetzungen, Durchführung und Nachkontrollen fest.
    2. Binary-Patching und datenbankseitige SQL-Patchschritte sind getrennte Teile des Ablaufs. Ein erfolgreiches OPatch-Ergebnis beweist deshalb noch keinen vollständigen Patchabschluss.
    3. Das Inventory des richtigen Oracle Homes und DBA_REGISTRY_SQLPATCH ergänzen sich. In Multitenant-Umgebungen muss auch der Zustand der betroffenen PDBs berücksichtigt werden.
    4. Vor dem Eingriff werden Konflikte, Sicherung, Wartungsfenster und Rückfallweg geprüft. Ein RU-Rollback ist nicht dasselbe wie ein Release-Downgrade; COMPATIBLE kann den Rückweg begrenzen.
    5. Die Nachkontrolle umfasst technische Statuswerte, Logs und Anwendungstests. Erst ihr gemeinsames Ergebnis zeigt, ob die Umgebung nach dem Patch wie vorgesehen arbeitet.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: In welchem regulären Zyklus veröffentlicht Oracle Critical Patch Updates?
    Am dritten Dienstag im Januar, April, Juli und Oktober.
    Frage 2: Warum ist der Oracle-Veröffentlichungstag nicht automatisch der Produktionstermin?
    Weil Bewertung, Test, Freigabe, Rollbackplanung und Wartungsfenster dazwischen liegen.
    Frage 3: Warum sind OPatch und datapatch zwei unterschiedliche Schritte?
    OPatch ändert den Softwarebestand des Oracle Homes; datapatch aktualisiert erforderliche SQL-Komponenten innerhalb der Datenbank.
    Frage 4: Warum wird lsinventory vor und nach dem Patch gesichert?
    Damit Ausgangs- und Endzustand des Oracle Homes nachvollziehbar verglichen werden können.
    Frage 5: Beweist SUCCESS allein einen installierten Patch?
    Nein. ACTION muss APPLY oder ROLLBACK zugeordnet und der Verlauf je Patch und Container bewertet werden.
    Frage 6: Beweist eine geöffnete CDB den SQL-Patchstand aller PDBs?
    Nein. Erforderliche Container, Open-Mode und jeweilige SQL-Patchhistorie getrennt nachweisen.
    Frage 7: Ist ein altes INVALID-Objekt automatisch ein neuer Patchfehler?
    Nein. Vorher-/Nachher-Bestand nach Owner, Name und Typ vergleichen.
    Frage 8: Warum reicht das Zurückstellen von ORACLE_HOME nicht als universeller Rollback?
    Binärdateien und SQL-Komponenten können unterschiedliche Zustände haben. Das patchbezogene Rollbackverfahren und die Nachkontrolle sind maßgeblich.

    27. Oracle Scheduler – automatische Aufgaben verstehen

    Vom verständlichen Beispieljob bis zur gezielten Diagnose von Planung, Laufzeit und Fehlern.

    Lernkompass
    Einfach gesagt Der Scheduler ist ein Aufgabenplaner in Oracle. Er verbindet eine Aufgabe mit einem Startplan und hält Informationen über ihre Ausführung fest.
    Warum ist das wichtig? „Aktiviert“ bedeutet noch nicht „erfolgreich gelaufen“. Ein geplanter Start, eine laufende Aufgabe und ein fertiges Ergebnis sind unterschiedliche Zustände.
    Nach diesem Kapitel Du kannst eine geplante Aufgabe verfolgen, ihren letzten Lauf prüfen und bei Problemen die passende Diagnosequelle wählen.

    Einführung: Oracle Scheduler ist der in Oracle eingebaute Aufgabenplaner. Ein Job beschreibt eine Aufgabe und legt fest, wodurch oder nach welcher Zeitregel sie gestartet werden soll. Scheduler speichert Informationen über technische Läufe; ein erfolgreicher Laufstatus beweist für sich allein noch nicht, dass ein Bericht oder ein anderes fachliches Ergebnis vollständig und richtig ist.

    Am bestehenden Job REPORT_DAILY verfolgt das Kapitel den Weg von der Definition und dem geplanten Termin bis zu Laufdetails und Fehlern. Du lernst, Programm, Zeitplan, Zeitzone und Status in der passenden Reihenfolge zu prüfen. So lässt sich ein ausgebliebener oder fehlgeschlagener Lauf erst einordnen, bevor der Job erneut gestartet oder seine Planung geändert wird.

    Oracle 19c: fachliche Grundlage

    1. Drei Fragen vor jeder Diagnose

    Was soll passieren? Unser Beispieljob soll eine Berichtsprozedur aufrufen. Wann soll es passieren? Täglich um 06:00 Uhr in der vorgesehenen Zeitzone. Was ist wirklich passiert? Das klären die laufenden Jobs und die gespeicherten Laufdetails.

    Diese Trennung verhindert einen häufigen Irrtum: Eine vorhandene Planung ist kein Beweis für ein erzeugtes Berichtsergebnis. Der Scheduler kann einen Aufruf als erfolgreich bewerten, während der fachliche Bericht unvollständig ist. Deshalb gehören technischer Laufstatus und fachliche Erfolgskontrolle zusammen.

    2. Job, Programm, Zeitplan und Jobklasse

    BausteinEinfach erklärtBeispiel
    JobDer konkrete Arbeitsauftrag mit Namen und Besitzer.APP_USER.REPORT_DAILY
    ProgrammEine wiederverwendbare Beschreibung der auszuführenden Aufgabe.REPORT_PROGRAM ruft eine gespeicherte Berichtsprozedur auf.
    Zeitplan / ScheduleDie Beschreibung der Termine.DAILY_0600 beschreibt tägliche Starts um 06:00 Uhr.
    JobklasseEine Gruppe für betriebliche Eigenschaften, etwa Logging oder Ressourcenzuordnung.REPORT_CLASS fasst ähnliche Berichtsjobs zusammen.

    Ein Job muss nicht zwingend ein separates Programm- oder Zeitplanobjekt verwenden. Seine Aufgabe und Wiederholungsregel können direkt in der Jobdefinition stehen. Inline heißt hier „direkt im Job eingetragen“. Ein benanntes Programm oder ein benannter Zeitplan kann dagegen von mehreren Jobs verwendet werden.

    Der Owner ist das Schema, dem der Job gehört. Ein gleicher Jobname in zwei Schemas bezeichnet zwei verschiedene Jobs. Die Jobklasse erklärt nicht allein, mit welchen fachlichen Rechten der Programmcode arbeitet. Dafür sind Besitzer, Programmtyp und Ausführungskontext zu prüfen; die Grundlagen stehen im Security-Kapitel.

    3. Die Zeitregel lesen

    Die Kalenderregel heißt REPEAT_INTERVAL. Bei FREQ=DAILY;BYHOUR=6;BYMINUTE=0;BYSECOND=0 steht DAILY für täglich, BYHOUR für die Stunde und die beiden anderen Teile für Minute und Sekunde. Sie beschreibt Kalendertermine, nicht einen garantiert sekundengenauen Start unter jeder Lastsituation.

    Bei FREQ=WEEKLY;BYDAY=MON;BYHOUR=6;BYMINUTE=0;BYSECOND=0 wird Montag um 06:00 Uhr gewählt. Eine Regel wie FREQ=HOURLY;INTERVAL=2 verwendet dagegen ein Stundenintervall; Startdatum und weitere Bestandteile bestimmen ihre zeitliche Einordnung. Die Kalenderregel allein sollte deshalb nicht ohne Startdatum und Zeitzone gelesen werden.

    Ein Einmallauf braucht keine dauerhafte Wiederholung. Ein Job kann außerdem über Ereignisse, Zeitfenster oder komplexere Bedingungen angestoßen werden. Die folgenden Diagnosebeispiele konzentrieren sich auf einen gewöhnlichen lokalen, zeitgesteuerten Job.

    4. Zeitzone und Sommerzeit

    „06:00 Uhr“ braucht einen Ort beziehungsweise eine Zeitzone. Die Region Europe/Berlin berücksichtigt Sommer- und Winterzeit. Ein bloßer Offset wie +01:00 beschreibt dagegen einen festen Abstand und enthält nicht dieselben regionalen Umstellungsregeln.

    START_DATE oder ein benannter Zeitplan geben den zeitlichen Kontext vor; fehlen Angaben, können Scheduler-Defaults relevant werden. Deshalb werden Startdatum, Kalenderregel und NEXT_RUN_DATE gemeinsam geprüft. Bei der Zeitumstellung können lokale Uhrzeiten fehlen oder doppelt vorkommen. Für einen kritischen Job müssen die berechneten Termine seiner konkreten Regel überprüft werden, statt pauschal einen zusätzlichen oder ausgelassenen Lauf anzunehmen.

    Unser Bericht um 06:00 Uhr vermeidet zwar die übliche lokale Umstellungsstunde, braucht aber weiterhin den richtigen Zeitzonenkontext. Die Anzeige eines SQL-Clients kann Zeiten zudem anders formatieren. Die unten verwendeten Ausgaben zeigen deshalb den Zeitzonenanteil ausdrücklich.

    5. Jobzustand und Laufergebnis unterscheiden

    AnzeigeBedeutungWas daraus noch nicht folgt
    ENABLED = TRUEDer Job ist aktiviert.Nicht jeder geplante Lauf war erfolgreich.
    SCHEDULEDDer Job ist für Ausführung nach seinen Bedingungen eingeplant.Er arbeitet nicht zwingend gerade.
    RUNNINGDer Job wird ausgeführt.Er macht nicht zwingend messbaren Fortschritt.
    DISABLEDDer Job ist nicht regulär aktiviert.Die Ursache ist damit noch nicht bekannt.
    BROKEN / weitere FehlerzuständeWeitere Ausführung kann durch Fehlerbedingungen eingeschränkt sein.Fehlerdetails und Konfiguration müssen gelesen werden.
    SUCCEEDED im LaufprotokollDieser protokollierte Aufruf wurde technisch als erfolgreich abgeschlossen.Der fachliche Bericht wurde nicht allein dadurch geprüft.
    FAILED im LaufprotokollDieser protokollierte Lauf ist fehlgeschlagen.Der aktuelle Jobzustand muss nicht ebenfalls FAILED lauten.

    STATE in der Jobdefinition beschreibt den Jobzustand. STATUS in den Laufdetails beschreibt eine bestimmte Ausführung. Ein wiederholender Job kann nach einem erfolgreichen Lauf wieder SCHEDULED sein. Ein vergangener Fehler kann im Protokoll stehen, während ein späterer Lauf bereits erfolgreich war.

    Warum kann technischer Erfolg fachlichen Misserfolg verdecken? Der Scheduler sieht den Ausgang des aufgerufenen Programms, nicht die Bedeutung jeder Berichtszeile. Fängt die Prozedur einen Fehler ab und gibt ihn nicht weiter, kann der Aufruf normal enden. Damit erklärt sich, warum zum bestehenden REPORT_DAILY-Beispiel sowohl Laufdetails als auch das erwartete Berichtsergebnis gehören. Bei widersprüchlichen Befunden wird die Fehlerbehandlung des aufgerufenen Codes geprüft; das PL/SQL-Kapitel erklärt die Weitergabe von Ausnahmen. Oracle 19c.

    LAST_START_DATE ist der letzte Start, nicht der letzte erfolgreiche Abschluss. NEXT_RUN_DATE ist der vorgesehene nächste Termin, keine Garantie für dessen tatsächlichen Start. Ein fehlender nächster Termin kann beispielsweise zu einem deaktivierten oder abgeschlossenen Job passen und ist ohne Kontext kein allgemeiner Fehlerbeweis.

    6. Für Interessierte: die Jobübersicht auslesen

    SELECT: Aktivierung, Zustand und nächste Ausführung

    OWNER und JOB_NAME müssen zu dem tatsächlich untersuchten Auftrag passen. Die Platzhalter werden in SQL*Plus abgefragt; UPPER eignet sich für gewöhnliche Namen.

    READ ONLY – Jobübersicht
    SELECT owner, job_name, enabled, state, job_type,
           TO_CHAR(last_start_date,
                   'DD.MM.YYYY HH24:MI:SS TZH:TZM') AS last_start,
           TO_CHAR(next_run_date,
                   'DD.MM.YYYY HH24:MI:SS TZH:TZM') AS next_run,
           run_count, failure_count
    FROM   dba_scheduler_jobs
    WHERE  owner = UPPER('&OWNER')
    AND    job_name = UPPER('&JOB_NAME');

    Fiktive Beispielausgabe:

    Geteilte Beispielausgabe: Gleiche Beispielzeile gehört in beiden Teilansichten zusammen. „Beispielzeile“ dient nur der Darstellung und ist keine zusätzliche SQL-Ergebnisspalte.

    Zusammengehörige Teilansicht: Spalten 1–5
    BeispielzeileOWNERJOB_NAMEENABLEDSTATE
    1APP_USERREPORT_DAILYTRUESCHEDULED
    Zusammengehörige Teilansicht: Spalten 6–7
    JOB_TYPELAST_START
    STORED_PROCEDURE30.09.2026 06:00:20 +02:00
    Spalten 7–9
    BeispielzeileNEXT_RUNRUN_COUNTFAILURE_COUNT
    101.10.2026 06:00:00 +02:00302

    Der Job ist aktiviert und wieder eingeplant. Der letzte Start war 20 Sekunden nach 06:00 Uhr. RUN_COUNT und FAILURE_COUNT sind Zähler der Jobdefinition, keine vollständige zeitlich sortierte Historie. Die zwei gezählten Fehler erklären deshalb noch nicht, ob gerade der letzte Lauf misslang.

    Für die DBA_-Views werden passende Leserechte benötigt. USER_SCHEDULER_JOBS zeigt die eigenen Jobs, ALL_SCHEDULER_JOBS die zugänglichen. Keine Ergebniszeile kann auch auf falschen Owner, Container oder Sichtbarkeit zurückgehen. Speziell mit Anführungszeichen angelegte Namen benötigen passende Groß-/Kleinschreibung.

    7. Für Interessierte: Aufgabe und Zeitplan nachvollziehen

    SELECT: Inline-Angaben oder benannte Objekte lesen
    READ ONLY – Programmaktion und Kalenderkontext
    SELECT COALESCE(j.job_type, p.program_type) AS job_type,
           j.program_owner, j.program_name,
           COALESCE(j.job_action, p.program_action) AS action_definition,
           j.schedule_owner, j.schedule_name,
           COALESCE(j.repeat_interval, s.repeat_interval) AS calendar_rule,
           TO_CHAR(COALESCE(j.start_date, s.start_date),
                   'DD.MM.YYYY HH24:MI TZR') AS schedule_start,
           j.job_class
    FROM   dba_scheduler_jobs j
    LEFT JOIN dba_scheduler_programs p
           ON p.owner = j.program_owner
          AND p.program_name = j.program_name
    LEFT JOIN dba_scheduler_schedules s
           ON s.owner = j.schedule_owner
          AND s.schedule_name = j.schedule_name
    WHERE  j.owner = UPPER('&OWNER')
    AND    j.job_name = UPPER('&JOB_NAME');

    Fiktive Beispielausgabe: Inline-Job: PROGRAM_- und SCHEDULE_-Namen sind hier NULL.

    Zusammengehörige Teilansicht: Spalten 1–5
    JOB_TYPEPROGRAM_OWNERPROGRAM_NAMESCHEDULE_OWNERSCHEDULE_NAME
    STORED_PROCEDURENULLNULLNULLNULL
    Zusammengehörige Teilansicht: Spalten 6–9
    ACTION_DEFINITIONCALENDAR_RULESCHEDULE_STARTJOB_CLASS
    APP_USER.BUILD_DAILY_REPORTFREQ=DAILY;BYHOUR=6;BYMINUTE=0;BYSECOND=001.09.2026 06:00 Europe/BerlinDEFAULT_JOB_CLASS

    Die Aktion nennt die gespeicherte Prozedur, die aufgerufen werden soll. Sie wird durch diese SELECT-Abfrage nicht ausgeführt. COALESCE nimmt hier die direkt vorhandene Angabe oder die aus dem passenden benannten Objekt. Das erklärt die Herkunft der Definition; Jobargumente und weitere Ausführungsbedingungen sind gesondert zu prüfen.

    Ein benannter Zeitplan liefert seine Regel aus DBA_SCHEDULER_SCHEDULES. Fenster-, Ereignis- oder andere Spezialpläne lassen sich durch diese vereinfachte Zusammenführung nicht vollständig erklären. NEXT_RUN_DATE aus der Übersicht bleibt eine wichtige Gegenprüfung der tatsächlich vorgesehenen Termine.

    8. Für Interessierte: läuft der Job gerade?

    SELECT: laufende Ausführung und Session zuordnen
    READ ONLY – Aktuell laufender Scheduler-Job
    SELECT r.owner, r.job_name, r.running_instance,
           r.session_id, s.serial#, s.status AS session_status,
           r.elapsed_time, r.cpu_used, s.state AS wait_state, s.event
    FROM   dba_scheduler_running_jobs r
    LEFT JOIN v$session s ON s.sid = r.session_id
          AND r.running_instance = (SELECT instance_number FROM v$instance)
    WHERE  r.owner = UPPER('&OWNER')
    AND    r.job_name = UPPER('&JOB_NAME');

    Fiktive Beispielausgabe:

    während einer Ausführung.

    Geteilte Beispielausgabe: Gleiche Beispielzeile gehört in beiden Teilansichten zusammen. „Beispielzeile“ dient nur der Darstellung und ist keine zusätzliche SQL-Ergebnisspalte.

    Zusammengehörige Teilansicht: Spalten 1–5
    BeispielzeileOWNERJOB_NAMERUNNING_INSTANCESESSION_ID
    1APP_USERREPORT_DAILY1212
    Zusammengehörige Teilansicht: Spalten 6–7
    SERIAL#SESSION_STATUS
    3517ACTIVE
    Spalten 7–10
    BeispielzeileELAPSED_TIMECPU_USEDWAIT_STATEEVENT
    1+000 00:04:00+000 00:00:35.00WAITINGdb file sequential read

    ELAPSED_TIME zeigt im Beispiel vier Minuten vergangene Laufzeit, CPU_USED 35 Sekunden erfasste CPU-Zeit. Die Differenz ist nicht automatisch exakt die I/O-Wartezeit: Messumfang und weitere Zustände müssen beachtet werden. WAIT_STATE=WAITING macht EVENT im Beispiel zu einem aktuellen Wait. Eine einzelne Zeile beweist trotzdem keinen dauerhaften Engpass; dafür sind weitere Messpunkte und die Laufhistorie erforderlich.

    Keine Zeile bedeutet: In dieser Quelle wurde zum Abfragezeitpunkt kein passender laufender Job gefunden. Sie beweist keinen früheren erfolgreichen Lauf. Die Sessionzuordnung gilt hier für die angenommene lokale Single-Instance-Datenbank. Die Abfrage ordnet Sessions nur innerhalb der lokalen Instanz zu; externe oder entfernte Jobs brauchen weitere Quellen.

    9. Für Interessierte: Start, Dauer und Fehler eines Laufes

    SELECT: die letzten zehn Laufprotokolle lesen
    READ ONLY – Vergangene Ausführungen
    SELECT log_id, status, error# AS error_number,
           TO_CHAR(req_start_date,
                   'DD.MM.YYYY HH24:MI:SS TZH:TZM') AS requested_start,
           TO_CHAR(actual_start_date,
                   'DD.MM.YYYY HH24:MI:SS TZH:TZM') AS actual_start,
           run_duration,
           SUBSTR(errors, 1, 300) AS error_text,
           SUBSTR(additional_info, 1, 300) AS additional_info
    FROM   dba_scheduler_job_run_details
    WHERE  owner = UPPER('&OWNER')
    AND    job_name = UPPER('&JOB_NAME')
    ORDER BY log_date DESC, log_id DESC
    FETCH FIRST 10 ROWS ONLY;

    Fiktive Beispielausgabe: Der letzte erfolgreiche Lauf und ein früherer Fehler.

    Zusammengehörige Teilansicht: Spalten 1–5
    LOG_IDSTATUSERROR_NUMBERREQUESTED_STARTACTUAL_START
    501SUCCEEDED030.09.2026 06:00:00 +02:0030.09.2026 06:00:20 +02:00
    498FAILED94229.09.2026 06:00:00 +02:0029.09.2026 06:00:05 +02:00
    Zusammengehörige Teilansicht: Spalten 6–8
    RUN_DURATIONERROR_TEXTADDITIONAL_INFO
    +000 00:02:40NULLNULL
    +000 00:00:02ORA-00942: table or view does not existNULL

    REQ_START_DATE ist der angeforderte Termin. ACTUAL_START_DATE ist der tatsächliche Beginn. Im erfolgreichen Beispiel beträgt die Startverzögerung 20 Sekunden; die Laufdauer von 2 Minuten und 40 Sekunden beginnt erst danach. „Start verspätet“ und „Ausführung langsam“ sind somit zwei verschiedene Beobachtungen.

    ERROR_NUMBER = 942 und der Text lenken die Untersuchung auf Objektname, Sichtbarkeit und Rechte. Das ist noch keine allgemeine Aussage, dass die Tabelle tatsächlich physisch fehlt. Prüfe, in welchem Kontext das Programm läuft. Die Lösung ist nicht automatisch eine breite Rechtevergabe.

    NULL bei ERROR_TEXT ist im erfolgreichen Beispiel kein Fehler. Der Text und ADDITIONAL_INFO werden hier auf 300 Zeichen gekürzt. OUTPUT wird bewusst nicht pauschal ausgegeben, weil Programmausgaben sensible Inhalte enthalten können. Für eine vollständige Diagnose werden passende Details gezielt gelesen.

    10. Warum ein Job verspätet startet oder nicht startet

    Zuerst wird geklärt, ob der Termin überhaupt erwartet werden durfte: Ist der Job aktiviert, hat er einen gültigen Plan, ist seine Endgrenze erreicht oder gibt es eine Einschränkung? Danach folgen betriebliche Fragen wie verfügbare Jobprozesse, Last, Ressourcenregeln und noch laufende Arbeit.

    Eine Kalenderregel garantiert keine Ausführung exakt zur Sekunde. Bei gewöhnlichen wiederholenden zeitgesteuerten Jobs wird ein noch laufender Job nicht einfach bei jedem nächsten Termin als beliebige zusätzliche Instanz parallel gestartet. Wie spätere Termine behandelt werden, muss mit Jobtyp und Bedingungen geprüft werden. Eine verpasste Serie wird nicht pauschal vollständig nachgeholt.

    Ein SCHEDULE_LIMIT kann begrenzen, wie lange nach einem vorgesehenen Termin eine Ausführung noch zulässig ist. MAX_RUN_DURATION ist davon getrennt: Es kann ein Ereignis bei Überschreitung einer Laufdauer auslösen, beendet den Job aber nicht allein automatisch. Eine wirksame Reaktion muss passend eingerichtet sein.

    11. Für Interessierte: Grenzen und Jobprozesse prüfen

    SELECT: relevante Jobgrenzen und Prozesskonfiguration
    READ ONLY – Jobgrenzen und Jobprozess-Parameter
    SELECT j.enabled, j.state, j.schedule_limit,
           j.max_run_duration, j.max_failures,
           j.logging_level, j.store_output, j.auto_drop,
           jc.logging_level AS class_logging_level, jc.log_history AS class_log_history,
           p.value AS job_queue_processes
    FROM   dba_scheduler_jobs j
    LEFT JOIN dba_scheduler_job_classes jc ON jc.job_class_name = j.job_class
    CROSS JOIN v$parameter p
    WHERE  p.name = 'job_queue_processes'
    AND    j.owner = UPPER('&OWNER')
    AND    j.job_name = UPPER('&JOB_NAME');

    Fiktive Beispielausgabe:

    Zusammengehörige Teilansicht: Spalten 1–5
    ENABLEDSTATESCHEDULE_LIMITMAX_RUN_DURATIONMAX_FAILURES
    TRUESCHEDULEDNULL+000 00:30:00NULL
    Zusammengehörige Teilansicht: Spalten 6–10
    LOGGING_LEVELSTORE_OUTPUTAUTO_DROPCLASS_LOGGING_LEVELCLASS_LOG_HISTORY
    RUNSFALSETRUERUNSNULL
    Zusammengehörige Teilansicht: Spalten 11–11
    JOB_QUEUE_PROCESSES
    20

    Im Beispiel ist keine ausgewiesene Verspätungsgrenze gesetzt. Die 30-Minuten-Laufdauer ist kein eingebauter automatischer Abbruchbefehl. LOGGING_LEVEL = RUNS beschreibt die Jobprotokollierung; das höhere Logging-Level aus Job und Jobklasse ist maßgeblich; die Klasse bildet das Mindestniveau. CLASS_LOG_HISTORY=NULL verwendet den globalen Default. AUTO_DROP=TRUE löscht einen wiederholenden Job nicht nach jedem einzelnen Lauf; seine Abschlussbedingungen sind entscheidend. STORE_OUTPUT = FALSE erklärt, warum Programmausgaben nicht einfach als gespeicherter Output erwartet werden dürfen.

    JOB_QUEUE_PROCESSES begrenzt die verwendbaren Job-Slave-Prozesse; es ist keine Zusage, dass 20 bestimmte Jobs gleichzeitig starten. Ein Wert 0 verhindert entsprechende Scheduler-/DBMS_JOB-Ausführungen. Im CDB-Root verhindert JOB_QUEUE_PROCESSES=0 entsprechende Ausführungen im Root und in sämtlichen PDBs, selbst bei positivem PDB-Wert. Ein PDB-Wert 0 sperrt entsprechende Jobs dieser PDB. Root und betroffene PDB deshalb getrennt prüfen. Diese Diagnose ändert den Parameter nicht.

    12. Wenn das Protokoll keine passenden Zeilen enthält

    Vielleicht wurde der Job nicht ausgeführt. Vielleicht wurde nur ein anderer Owner abgefragt, der Lauf nicht entsprechend protokolliert oder die Historie bereits bereinigt. Ein nach einem Einmallauf automatisch entferntes Jobobjekt ist ebenfalls anders zu behandeln als ein dauerhaft wiederholender Job. Die Konfiguration AUTO_DROP ist dabei relevant.

    Die Protokollierungsstufe und die Aufbewahrung der Scheduler-Historie sind eigene Einstellungen. Die Scheduler-Logaufbewahrung steuert nicht die Aufbewahrung fachlicher Berichte und nicht die Dauer, für die Audit-Dateien erhalten bleiben.

    SELECT: globalen Scheduler-Log-Default lesen
    READ ONLY – Globale Scheduler-Logaufbewahrung
    SELECT attribute_name, value
    FROM   dba_scheduler_global_attribute
    WHERE  attribute_name = 'LOG_HISTORY';

    Fiktive Beispielausgabe:

    ATTRIBUTE_NAMEVALUE
    LOG_HISTORY30

    Der fiktive globale Wert 30 beschreibt den Scheduler-Default in Tagen. Jobklassen können eigene Aufbewahrungswerte verwenden, und eine tatsächlich verfügbare Historie hängt zusätzlich von Logging und Bereinigung ab. Eine ältere fehlende Zeile ist deshalb nicht automatisch ein ausgefallener Lauf.

    13. Rechte und Ausführungskontext

    Ein Programm, das interaktiv funktioniert, kann als Job andere Umgebungsbedingungen haben. Prüfe den Owner, den tatsächlichen Programmaufruf, Argumente und erforderliche direkte Rechte. Bei gespeicherten Programmen spielt der Besitzer- oder Aufruferkontext mit; dafür verweist dieses Kapitel auf Security, statt alle Rechtearten erneut zu erklären.

    Ein externer Job führt ein Betriebssystemprogramm aus und benötigt dafür einen passenden Sicherheits- und Credential-Kontext. Ein Credential beschreibt Zugangsinformationen für einen solchen Kontext. Es wird hier weder erzeugt noch mit geheimen Werten ausgegeben. Ein Scheduler-Job ist nicht automatisch ein Shellskript.

    14. Scheduler, cron und ältere DBMS_JOB-Aufträge

    VerfahrenPlaner und UmfeldDiagnosequelle
    Oracle SchedulerAuftrag in der Datenbank; kann Programme und Kalenderobjekte verwenden.DBA_SCHEDULER_JOBS, laufende Jobs und Laufdetails.
    cronAuftrag des Betriebssystems; startet meist einen OS-Befehl oder ein Skript.crontab, OS-Protokolle, Skriptlogs und dessen Umgebung.
    DBMS_JOBÄltere Schnittstelle; bei 19c-Upgrades können Aufträge als Scheduler-Jobs neu angelegt werden.DBA_JOBS und DBA_JOBS_RUNNING; bei migrierten Aufträgen zusätzlich die Scheduler-Zuordnung prüfen.

    Ein durch cron gestartetes SQL*Plus-Skript wird nicht allein dadurch zu einem Scheduler-Job. Ein RMAN-Backup aus cron erscheint deshalb nicht automatisch in DBA_SCHEDULER_JOB_RUN_DETAILS. Umgekehrt ist ein Datenbankjob nicht durch einen fehlenden crontab-Eintrag widerlegt.

    Bei cron sind Login-Umgebung, PATH und Oracle-Variablen gesondert zu prüfen. Beim Scheduler geht es um Jobdefinition und dessen Ausführungskontext. Die richtige erste Frage lautet daher: Wer plant und startet diese Aufgabe tatsächlich?

    15. Audit-Bereinigung richtig einordnen

    Ein Audit-Purge-Job kann durch einen Scheduler-Auftrag ausgeführt werden. Die Audit-Management-Konfiguration erklärt den betroffenen Trail und die Bereinigungsgrenze. Scheduler-Laufdetails erklären, wann der zugehörige Auftrag tatsächlich lief und ob dabei ein Fehler auftrat.

    Beide Quellen beantworten unterschiedliche Fragen. Ein erfolgreicher technischer Aufruf beweist nicht, dass Dateien eines anderen Trails oder eines alten Pfads entfernt wurden. Die Archive-Zeitmarke und der untersuchte Audit-Bereich müssen passen. Die vertiefte Aufbewahrungsdiagnose steht im Security-Kapitel.

    16. Drei Praxisfälle und eine Diagnosekette

    Fall 1 – „Aktiviert, aber kein Bericht“:

    Lies Jobdefinition, nächste Termine und letzte Laufdetails. Ist ein Lauf technisch erfolgreich, prüfe zusätzlich das fachliche Berichtsergebnis. Ist keine Zeile sichtbar, kläre Logging, Aufbewahrung und den richtigen Jobnamen.

    Fall 2 – „Der Bericht kommt immer später“:

    Vergleiche angeforderten und tatsächlichen Start mit der Laufdauer. Eine wachsende Startverzögerung lenkt die Untersuchung auf Planung und Startbedingungen; eine wachsende Laufdauer auf die ausgeführte Arbeit. Während eines Laufs helfen Session- und Fortschrittsbeobachtungen.

    Fall 3 – „Seit gestern ORA-00942“:

    Prüfe Objektbezeichnung und Ausführungskontext des aufgerufenen Programms. Vergleiche mit dem vorherigen Lauf und bekannten Änderungen. Der Fehlertext ist ein Anhaltspunkt, kein Auftrag zur automatischen Rechtevergabe.

    1. Planer identifizieren: Scheduler, cron oder DBMS_JOB?
    2. Owner und konkreten Auftrag bestimmen.
    3. Aktivierung, Definition, Kalenderregel und Zeitzone lesen.
    4. Eine aktuelle Ausführung oder passende letzte Laufdetails suchen.
    5. Startverzögerung, Laufdauer und Fehler getrennt bewerten.
    6. Die technische Beobachtung mit dem fachlichen Ergebnis verbinden.
    Vertiefende Oracle-19c-Quellen: Jobdefinitionen · Laufende Jobs

    17. Weiterführende Informationen

    Oracle 19c: Scheduler Concepts, Scheduling Jobs, Job Run Details und DBMS_SCHEDULER.

    Read-only: Das Kapitel richtet keinen Job ein, startet oder stoppt keinen Auftrag und verändert keine Job- oder Parameterkonfiguration. Die sechs Diagnosebeispiele sind SELECT-Abfragen.
    Oracle-19c-Referenzen zu den Diagnosebeispielen: Logging und Jobklassen · Jobprozesse · DBMS_JOB bei Upgrades

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Ein Scheduler-Job verbindet eine Aufgabe mit Ausführungsbedingungen. Programm, Zeitplan und Jobklasse beschreiben dabei unterschiedliche Teile der Konfiguration.
    2. Aktivierung, geplanter Start, aktueller Lauf und Ergebnis eines vergangenen Laufes sind unterschiedliche Zustände. Sie müssen in den jeweils passenden Views geprüft werden.
    3. Kalenderausdruck, Startdatum und Zeitzone bestimmen den Zeitplan gemeinsam. Gerade bei Sommerzeitwechseln genügt eine Uhrzeit ohne Zeitzonenkontext nicht.
    4. Verspätete oder ausbleibende Ausführungen können mit Limits, Ressourcen oder Berechtigungen zusammenhängen. Scheduler-, cron- und DBMS_JOB-Aufträge sind getrennt zu untersuchen.
    5. SUCCEEDED beschreibt das technische Ergebnis aus Sicht des Schedulers. Verschluckt das aufgerufene Programm einen Fehler, kann das fachliche Ergebnis trotzdem falsch oder unvollständig sein.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Bedeutet ENABLED = TRUE, dass der letzte Lauf erfolgreich war?
    Nein. Aktivierung ist Konfiguration; das Laufergebnis steht in den Laufdetails.
    Frage 2: Ist ein 20 Sekunden verspäteter Start dasselbe wie eine 20 Sekunden längere Laufdauer?
    Nein. Die Startverzögerung liegt vor dem tatsächlichen Beginn.
    Frage 3: Beendet MAX_RUN_DURATION den Job automatisch?
    Nicht allein durch diesen Wert. Die Überschreitung kann ein Ereignis auslösen; eine passende Reaktion muss gesondert vorhanden sein.
    Frage 4: Steuert LOG_HISTORY die Audit-Dateiaufbewahrung?
    Nein. Scheduler-Historie und Audit-Trail sind unterschiedliche Bereiche.
    Frage 5: Beweist SUCCEEDED einen fachlich vollständigen Bericht?
    Nein. Zusätzlich muss das erwartete Berichtsergebnis geprüft werden.
    Frage 6: Warum genügt LOGGING_LEVEL des Jobs allein nicht?
    Die Jobklasse kann ein höheres Mindestniveau erzwingen. Beide Werte gemeinsam lesen.
    Frage 7: Kann eine PDB mit positivem JOB_QUEUE_PROCESSES trotz Root-Wert 0 Jobs starten?
    Nein. Der Root-Wert 0 verhindert entsprechende Scheduler- und DBMS_JOB-Ausführungen in der gesamten CDB.
    Frage 8: Beweist eine leere Laufhistorie einen erfolgreichen oder ausgefallenen Job?
    Nein. Erwartete Termine, Owner, Container, Logging, Aufbewahrung und AUTO_DROP prüfen.

    28. NLS und Zeichensätze verstehen

    Warum dasselbe Datum anders aussieht und wie Texte, Zahlen und Zeitzonen zuverlässig eingeordnet werden.

    Lernkompass
    Einfach gesagt Ein gespeicherter Wert und seine Anzeige sind nicht dasselbe. Zeichensätze erklären außerdem, wie Textzeichen als Bytes transportiert und gespeichert werden.
    Warum ist das wichtig? Ein anderes Datumsbild beweist keine Datenänderung. Ein falsch dargestellter Umlaut kann dagegen auf einen Fehler im Textweg hinweisen.
    Nach diesem Kapitel Du kannst Anzeigeformat, Zeichensatz und Verbindungsumgebung trennen und die passende Diagnose lesen.

    Einführung: Oracle Globalization Support steuert unter anderem regionale Regeln und die Verarbeitung von Text zwischen Client und Datenbank. Viele der zugehörigen Einstellungen werden weiterhin als NLS-Parameter bezeichnet. Ein gespeicherter Wert, seine Anzeige und die Kodierung seiner Zeichen sind verschiedene Dinge: Ein Datum kann anders formatiert erscheinen, ohne verändert worden zu sein; fehlerhafte Umlaute können auf ein Problem bei der Zeichensatzdeklaration oder -umwandlung hinweisen.

    Das Kapitel ordnet diese Ebenen und zeigt, wie Datenbank, Session und Client an der Darstellung und Übertragung beteiligt sind. An den vorhandenen Beispielen lernst du, Werte und Formate ausdrücklich zu prüfen und Konvertierungen einzuordnen. So lässt sich ein Anzeigeproblem gezielt untersuchen, bevor eine Zeichensatzmigration überhaupt erwogen wird.

    Oracle 19c: fachliche Grundlage

    1. Vier Dinge, die nicht verwechselt werden dürfen

    EbeneFrageBeispiel
    DatentypWas ist der gespeicherte Wert?Ein DATE ist ein Datum mit Uhrzeit, keine fertige Zeichenfolge.
    AnzeigeformatWie wird der Wert als Text gezeigt?30.09.2026 oder 2026-09-30.
    ZeichensatzWie werden Zeichen in Bytes abgebildet?WE8MSWIN1252 oder AL32UTF8.
    ZeitzoneAuf welchen regionalen Zeitkontext bezieht sich eine Zeit?Europe/Berlin oder ein fester Offset wie +02:00.

    NLS steht für National Language Support. Gemeint sind unter anderem sprach- und regionsabhängige Regeln für Zahlen, Datumsangaben und Vergleiche. Diese Einstellungen sind nicht automatisch eine Aussage über den Zeichensatz aller beteiligten Dateien.

    Eine HTML-Datei kann als UTF-8 gespeichert sein, während eine Datenbank WE8MSWIN1252 verwendet. Das ist nicht allein ein Fehler. Entscheidend ist, dass jeder Übergang die tatsächlich verwendete Kodierung kennt und richtig umsetzt.

    2. Datenbank, Instanz, Session und Client

    Die Datenbank besitzt festgelegte Zeichensätze. Die Instanz liefert Initialwerte für bestimmte Einstellungen. Eine Session ist der logische Kontext einer Datenbankanmeldung; sie kann davon abweichende NLS-Werte besitzen. Der Client ist beispielsweise SQL*Plus oder die Anwendung, mit der die Verbindung hergestellt wird.

    Für die Frage „Warum sieht Ben ein anderes Datumsformat?“ sind deshalb seine Session und seine Anwendung wichtig. Eine Abfrage in deiner Administrator-Session zeigt nicht automatisch Bens Sessionwerte. Eine Anwendung kann Einstellungen beim Verbindungsaufbau selbst setzen oder Werte im eigenen Programmformat anzeigen.

    Bei bestimmten Ausdrücken kann ein ausdrücklich angegebenes Format die Session-Vorgabe umgehen. Explizite Formatierung ist deshalb eine nützliche Diagnosehilfe, ohne die Verbindungseinstellung zu verändern.

    3. Für Interessierte: Datenbankzeichensätze lesen

    SELECT: Zeichensatz für normale und nationale Texttypen
    READ ONLY – Datenbankzeichensätze
    SELECT parameter, value
    FROM   nls_database_parameters
    WHERE  parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET')
    ORDER BY parameter;

    Fiktive Beispielausgabe:

    PARAMETERVALUE
    NLS_CHARACTERSETWE8MSWIN1252
    NLS_NCHAR_CHARACTERSETAL16UTF16

    NLS_CHARACTERSET bezeichnet hier den Zeichensatz für normale Texttypen wie CHAR, VARCHAR2 und CLOB. NLS_NCHAR_CHARACTERSET gehört zu NCHAR, NVARCHAR2 und NCLOB. Der zweite Wert macht eine VARCHAR2-Spalte nicht automatisch zu einer Unicode-Spalte.

    WE8MSWIN1252 ist ein Einbytezeichensatz für einen begrenzten Zeichenumfang. AL32UTF8 ist ein Unicode-Zeichensatz mit variabler Byteanzahl je Zeichen. Der ältere Oracle-Zeichensatzname UTF8 ist nicht einfach ein anderer Name für AL32UTF8. Die exakte Bezeichnung ist deshalb wichtig.

    Diese Abfrage beschreibt die Datenbankseite. Sie beweist nicht, welche Kodierung eine CSV-Datei, ein Terminal oder eine Anwendung gerade verwendet. In Multitenant ist der betrachtete Containerkontext mitzuführen.

    4. Für Interessierte: NLS-Ebenen vergleichen

    SELECT: ausgewählte Datenbank-, Instanz- und eigene Sessionwerte
    READ ONLY – NLS-Werte nach Quelle
    SELECT source_level, parameter, value
    FROM (
        SELECT 'DATABASE' AS source_level, parameter, value
        FROM   nls_database_parameters
        UNION ALL
        SELECT 'INSTANCE', parameter, value
        FROM   nls_instance_parameters
        UNION ALL
        SELECT 'SESSION', parameter, value
        FROM   nls_session_parameters
    )
    WHERE parameter IN ('NLS_DATE_FORMAT', 'NLS_DATE_LANGUAGE',
                        'NLS_NUMERIC_CHARACTERS', 'NLS_LENGTH_SEMANTICS',
                        'NLS_SORT', 'NLS_COMP')
    ORDER BY parameter, source_level;

    Fiktive Beispielausgabe: nur der Datumsformatvergleich ist dargestellt.

    SOURCE_LEVELPARAMETERVALUE
    DATABASENLS_DATE_FORMATDD-MON-RR
    INSTANCENLS_DATE_FORMATDD-MON-RR
    SESSIONNLS_DATE_FORMATDD.MM.YYYY

    Die SESSION-Zeile zeigt den Wert deiner aktuellen Verbindung. Dass dieser von anderen Quellen abweicht, ist nicht automatisch ein Fehler. Die DATABASE-Zeile ist keine Behauptung über die Formatierung jeder heute verbundenen Anwendung.

    NULL oder fehlende Werte werden im Kontext ihrer Quelle betrachtet. Vor einer Diagnose muss klar sein, welche Ebene die konkrete SQL-Verarbeitung oder Anzeige beeinflusst. Die Abfrage ändert keine dieser Einstellungen.

    5. Ein Datum ist keine Zeichenfolge

    Oracle DATE enthält Jahr, Monat, Tag und eine Uhrzeit bis zur Sekunde. Es besitzt keine eigene Zeitzoneninformation. Eine Anzeige ohne Uhrzeit bedeutet deshalb nicht, dass im Wert keine Uhrzeit vorhanden ist. TIMESTAMP kann zusätzlich Sekundenbruchteile enthalten; Zeitzoneninformationen hängen vom konkreten Timestamp-Typ ab.

    Die Uhrzeit wirkt auch im Filter. Ein DATE-Literal ohne Uhrzeit bezeichnet Mitternacht. Ein Gleichheitsvergleich trifft daher nicht automatisch alle Werte desselben Kalendertags. Für einen ganzen Tag ist eine Untergrenze einschließlich Tagesbeginn und eine Obergrenze ausschließlich des nächsten Tages ein klares Denkmodell. BETWEEN schließt dagegen beide Grenzen ein. Diese Unterscheidung betrifft den gespeicherten Zeitwert; eine andere Anzeigemaske löst sie nicht. Bei Datentypen mit Zeitzonenbezug muss zusätzlich feststehen, in welcher Zone der gewünschte Tag gilt. Oracle 19c.

    Ein Text wie 01/02/2026 ist dagegen zunächst eine Zeichenfolge. Ohne festgelegte Regeln kann er als 1. Februar oder 2. Januar verstanden werden. Wenn SQL einen solchen Text stillschweigend in ein Datum umwandelt, kann die aktuelle NLS-Umgebung über das Ergebnis entscheiden oder einen Fehler auslösen.

    SELECT: denselben Datumswert ausdrücklich formatieren
    READ ONLY – Ein Wert, zwei Anzeigen
    SELECT TO_CHAR(d, 'DD.MM.YYYY HH24:MI:SS') AS german_display,
           TO_CHAR(d, 'YYYY-MM-DD HH24:MI:SS') AS iso_like_display
    FROM (
        SELECT DATE '2026-09-30' + (14 * 60 + 30) / 1440 AS d
        FROM   dual
    );

    Fiktive Beispielausgabe:

    GERMAN_DISPLAYISO_LIKE_DISPLAY
    30.09.2026 14:30:002026-09-30 14:30:00

    Beide Spalten entstehen aus demselben DATE-Wert. TO_CHAR erzeugt die sichtbare Zeichenfolge. Die Ausgabe verändert das Datum nicht. Das DATE-Literal benennt den Tag eindeutig; die hinzugefügte Tagesfraktion liefert 14:30 Uhr. Das Beispiel enthält keine Zeitzone und darf nicht als vollständiger internationaler Zeitstempel missverstanden werden.

    Für Texteingaben sind ausdrückliche Umwandlungsregeln oder passende typisierte Bind-Werte wichtig. Ein Bind-Wert ist ein separat übergebener Wert; ein bereits als Datum übergebener Wert muss nicht erst aus einem mehrdeutigen Text gelesen werden.

    READ ONLY – Texteingabe ausdrücklich in DATE umwandeln
    SELECT TO_CHAR(TO_DATE('01/02/2026','DD/MM/YYYY'),
                   'YYYY-MM-DD') AS date_display
    FROM dual;

    Fiktive Beispielausgabe:

    DATE_DISPLAY
    2026-02-01

    Die Eingabe bedeutet hier ausdrücklich 1. Februar. TO_DATE interpretiert den Text mit der angegebenen Maske; TO_CHAR bestimmt separat die Ausgabe. Einen bereits als DATE übergebenen Bind-Wert nicht erneut durch TO_DATE schicken. Bei Monatsnamen zusätzlich die passende NLS_DATE_LANGUAGE festlegen.

    6. Komma und Punkt bei Zahlen

    Eine gespeicherte NUMBER ist nicht automatisch „deutsch“ oder „englisch“. Regionsabhängig ist vor allem ihre Textdarstellung und die Interpretation von Zahlentext. NLS_NUMERIC_CHARACTERS beschreibt zwei Zeichen: zuerst das Dezimalzeichen, danach das Gruppierungszeichen.

    Der Wert ,. bedeutet Dezimalkomma und Gruppierungspunkt. ., bedeutet Dezimalpunkt und Gruppierungskomma. Daraus folgt nicht, dass jede Anwendung dieselbe Formatierung nutzt: Sie kann eine eigene Anzeige erzeugen.

    SELECT: eine Zahl mit festgelegter Darstellung anzeigen
    READ ONLY – Explizite Zahlenformatierung
    SELECT TO_CHAR(1234.5, 'FM9G999D00',
                   'NLS_NUMERIC_CHARACTERS='',.''') AS german_display,
           TO_CHAR(1234.5, 'FM9G999D00',
                   'NLS_NUMERIC_CHARACTERS=''.,''') AS english_display
    FROM   dual;

    Fiktive Beispielausgabe:

    GERMAN_DISPLAYENGLISH_DISPLAY
    1.234,501,234.50

    D bezeichnet im Format das Dezimalzeichen, G das Gruppierungszeichen. FM vermeidet hier Auffüllleerzeichen. Die zwei Anzeigen unterscheiden sich, der Ausgangswert 1234.5 bleibt derselbe. Der Punkt im SQL-Zahlenliteral ist nicht mit einer beliebig formatierten Eingabedatei gleichzusetzen.

    Ein Text aus einer CSV-Datei muss mit seinem vereinbarten Format gelesen werden. Ein pauschales Ersetzen aller Punkte oder Kommata kann Gruppierung und Dezimalstellen verwechseln. Diagnose beginnt deshalb mit einem konkreten Eingabewert und dessen Herkunft.

    7. Wie aus einem Umlaut falsche Zeichen werden

    Ein Zeichen wird als ein oder mehrere Bytes übertragen. Werden diese Bytes später unter dem falschen Zeichensatz interpretiert, kann aus einem Umlaut eine merkwürdige Zeichenfolge werden. Müller ist ein typisches Erscheinungsbild einer falschen Interpretation, aber allein daraus lässt sich nicht jede beteiligte Einstellung sicher bestimmen.

    Ein Fragezeichen kann auch entstehen, wenn eine Konvertierung ein Zeichen im Zielzeichensatz nicht abbilden kann. Ein bereits verlorenes Zeichen wird nicht automatisch wiederhergestellt, indem die spätere Anzeige umgestellt wird. Deshalb unterscheiden wir Anzeigeproblem und bereits falsch gespeicherten Inhalt.

    Verfolge einen einzelnen Testwert vom ursprünglichen Text über Datei oder Eingabe, Client und Verbindung bis zur Datenbank und zurück zur Ausgabe. Ändere nicht mehrere Einstellungen auf einmal. Sonst ist nicht mehr erkennbar, welcher Übergang den Fehler verursacht hat.

    READ ONLY – einen vorhandenen VARCHAR2-Wert untersuchen
    SELECT text_value, LENGTH(text_value) AS characters,
           LENGTHB(text_value) AS bytes, DUMP(text_value, 1016) AS byte_dump
    FROM app_user.text_probe
    WHERE id = :id;

    Fiktive Beispielausgabe:

    TEXT_VALUECHARACTERSBYTESBYTE_DUMP
    Müller66Typ=1 Len=6 CharacterSet=WE8MSWIN1252: 4d,fc,6c,6c,65,72

    APP_USER.TEXT_PROBE, TEXT_VALUE und ID sind Platzhalter für ein vorhandenes zugängliches Objekt; das Kapitel legt keine Tabelle an. Den Bind-Wert :id im Client setzen. DUMP zeigt hier die gespeicherten Bytes hexadezimal samt Zeichensatz: FC steht in WE8MSWIN1252 für ü. Die Textanzeige kann dennoch clientseitig falsch sein. Die Bytes allein verraten nicht, an welchem früheren Übergang ein Fehler entstand; Originaleingabe und Transportweg vergleichen.

    8. NLS_LANG beschreibt nicht einfach die Datenbank

    Bei passenden Oracle-Clients, etwa SQL*Plus über OCI, kann NLS_LANG die Form language_territory.characterset haben. Der Zeichensatzteil beschreibt die vom Client verwendete Textkodierung. Er soll die tatsächlich übertragenen Clientbytes beschreiben und wird nicht blind dem Datenbankzeichensatz gleichgesetzt.

    Die Einstellung kann je nach Clientinstallation aus Umgebung oder Konfiguration stammen. JDBC-Verbindungen haben eigene Treiber- und Locale-Regeln; dieselbe Umgebungsvariable ist daher nicht bei jedem Programm die alleinige Steuerung. Auch Terminalkodierung und Dateikodierung sind eigene Teile des Weges.

    Eine SQL-Abfrage auf Sessionparameter liest nicht zuverlässig den vollständigen NLS_LANG-Wert eines fremden Clients aus. Die Clientseite muss dort geprüft werden, wo das Programm tatsächlich läuft. Bei einem cron-Job kann das eine andere Umgebung sein als beim interaktiven Terminal; die OS-Grundlagen stehen im Betriebssystem-Kapitel.

    9. Zeichenlänge und Bytelänge

    „Zehn Zeichen“ ist nicht immer „zehn Bytes“. In einem Einbytezeichensatz belegt ein abbildbares Textzeichen gewöhnlich ein Byte. In AL32UTF8 können Zeichen unterschiedlich viele Bytes benötigen. Eine Spaltenbegrenzung muss deshalb erkennen lassen, ob sie Bytes oder Zeichen meint.

    NLS_LENGTH_SEMANTICS liefert einen Standard für bestimmte neu definierte Texttypen, wenn BYTE oder CHAR nicht ausdrücklich angegeben ist. Es ändert nicht rückwirkend die Definition vorhandener Spalten. Eine ausdrücklich mit BYTE oder CHAR definierte Spalte bleibt anhand ihrer tatsächlichen Metadaten zu beurteilen.

    SELECT: Zeichen und Bytes desselben Wortes zählen
    READ ONLY – LENGTH und LENGTHB
    SELECT text_value,
           LENGTH(text_value) AS characters,
           LENGTHB(text_value) AS bytes
    FROM (
        SELECT CAST(UNISTR('M\00FCller') AS VARCHAR2(20)) AS text_value
        FROM   dual
    );

    Fiktive Beispielausgabe:

    TEXT_VALUECHARACTERSBYTES
    Müller66

    UNISTR erzeugt das ü über die Unicode-Angabe; CAST wandelt das Wort in den normalen VARCHAR2-Zeichensatz der Datenbank um. Das Wort ist in beiden hier besprochenen Datenbankzeichensätzen darstellbar. Bei AL32UTF8 hätte dieses konkrete Wort weiterhin sechs Zeichen, aber sieben Bytes: das ü belegt dort zwei Bytes.

    LENGTH zählt hier Zeichen und LENGTHB Bytes. Die Aussage gilt für diesen konkreten VARCHAR2-Ausdruck, nicht pauschal für beliebige LOBs oder alle denkbaren Zeichenbegriffe. Die sichtbare Anzeige braucht weiterhin einen korrekt konfigurierten Client.

    SYS-Ausnahme: Als SYS angemeldete Sessions verwenden NLS_LENGTH_SEMANTICS nicht als normalen Standard. Ohne ausdrücklich angegebenes BYTE oder CHAR gilt bei ihren neu erzeugten Objekten BYTE. Deshalb einen administrativen Test nicht ungeprüft auf den Anwendungskontext übertragen.

    10. Für Interessierte: vorhandene Spaltendefinition prüfen

    SELECT: Byte- oder Zeichensemantik aus Metadaten lesen
    READ ONLY – Textspalten eines Objekts
    SELECT column_name, data_type, data_length,
           char_length, char_used
    FROM   all_tab_columns
    WHERE  owner = UPPER('&OWNER')
    AND    table_name = UPPER('&OBJEKT')
    AND    data_type IN ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2')
    ORDER BY column_id;

    Fiktive Beispielausgabe:

    COLUMN_NAMEDATA_TYPEDATA_LENGTHCHAR_LENGTHCHAR_USED
    SHORT_CODEVARCHAR21010B
    DISPLAY_NAMEVARCHAR24040C

    Die Zeilenfolge entspricht hier COLUMN_ID: SHORT_CODE wurde vor DISPLAY_NAME definiert. Bei NCHAR/NVARCHAR2 gelten andere Zeichensatz- und Längenregeln als bei den dargestellten VARCHAR2-Beispielen; die Abfrage zeigt den Datentyp deshalb ausdrücklich mit an.

    DATA_LENGTH beschreibt die maximale Bytelänge; CHAR_LENGTH die in der Definition ausgewiesene Zeichenlänge. CHAR_USED = B bezeichnet Byte- und C Zeichensemantik. Im Einbytebeispiel können diese Zahlen gleich sein, ohne dass die beiden Definitionen dieselbe Semantik hätten.

    Bei einer Mehrbytekodierung kann die maximale Bytelänge einer CHAR-semantischen Spalte entsprechend größer ausfallen. Weitere Datentyp- und Systemgrenzen bleiben trotzdem relevant. Die Abfrage liest nur zugängliche Objekte; keine Zeile kann auf falschen Namen, Owner oder fehlende Sichtbarkeit zurückgehen.

    11. Sortierung und Vergleiche

    Textvergleich ist ebenfalls mehr als ein Bytevergleich. Eine sprachliche Sortierung kann Umlaute anders einordnen als eine binäre Reihenfolge. Ob Groß-/Kleinschreibung oder Akzente für einen Vergleich wichtig sind, hängt von den tatsächlich geltenden Regeln ab.

    NLS_SORT und NLS_COMP sind Hinweise auf Sessionregeln. In Oracle 19c können außerdem ausdrücklich definierte Kollationen und Funktionen im konkreten Ausdruck mitwirken. Eine Kollation ist eine Regel für Vergleich und Sortierung. Die Sessionparameter allein erklären deshalb nicht automatisch jeden Vergleich jeder Spalte.

    Für eine Diagnose braucht es den konkreten Ausdruck und ein erwartetes Ergebnis: Soll Müller neben Mueller stehen? Soll A mit a gleichgesetzt werden? Eine solche fachliche Festlegung ist etwas anderes als die Zeichensatzfrage, ob ü überhaupt gespeichert werden kann.

    12. Zeitzonen sind keine Datumsformatmasken

    Die Timestamp-Typen unterscheiden: TIMESTAMP speichert keine Zeitzone. TIMESTAMP WITH TIME ZONE enthält zusätzlich Zeitzoneninformation. TIMESTAMP WITH LOCAL TIME ZONE normalisiert beim Speichern auf den Datenbank-Zeitkontext und wird beim Lesen in der Sessionzeitzone dargestellt; die ursprüngliche Eingabezone bleibt dabei nicht als eigenständige Information erhalten. Deshalb kann eine andere Session dieselben Daten mit einer anderen Uhrzeit anzeigen.

    Ein anderes Datumsformat ändert die Reihenfolge sichtbarer Bestandteile. Eine Zeitzonenumrechnung kann dagegen die dargestellte Uhrzeit verändern, obwohl derselbe Zeitpunkt gemeint ist. DATE und TIMESTAMP ohne Zeitzone liefern dafür keinen vollständigen regionalen Kontext.

    DBTIMEZONE ist eine Datenbank-Zeitzoneneinstellung und nicht einfach der Beweis für die Zeitzone des Betriebssystems oder aller Sessions. SESSIONTIMEZONE gehört zur aktuellen Verbindung. CURRENT_TIMESTAMP und SYSTIMESTAMP haben unterschiedliche Zeitkontexte. Insbesondere spielt DBTIMEZONE bei TIMESTAMP WITH LOCAL TIME ZONE eine eigene Rolle.

    SELECT: aktuelle Session- und Systemzeitkontexte vergleichen
    READ ONLY – Zeitzonenkontext
    SELECT dbtimezone AS database_timezone,
           sessiontimezone AS session_timezone,
           TO_CHAR(current_timestamp,
                   'DD.MM.YYYY HH24:MI:SS TZH:TZM') AS current_session_time,
           TO_CHAR(systimestamp,
                   'DD.MM.YYYY HH24:MI:SS TZH:TZM') AS current_system_time
    FROM   dual;

    Fiktive Beispielausgabe:

    DATABASE_TIMEZONESESSION_TIMEZONECURRENT_SESSION_TIMECURRENT_SYSTEM_TIME
    +00:00Europe/Berlin30.09.2026 10:30:00 +02:0030.09.2026 08:30:00 +00:00

    Die Sessionanzeige und die Systemanzeige können denselben Zeitpunkt mit verschiedenen Uhrzeiten und Offsets ausdrücken. Ein Datenbankwert +00:00 zwingt nicht jede Anwendung zur UTC-Anzeige. Im Beispiel ist der Host-Zeitkontext ebenfalls UTC; das folgt aber aus der dargestellten Systemzeit, nicht allein aus DBTIMEZONE.

    Für Scheduler-Termine sind Kalenderregel und deren Zeitzone relevant. Das erklärt Kapitel 27 genauer. Eine SQL-Datumsanzeige allein beweist außerdem keine korrekte NTP-Synchronisierung des Hosts.

    13. Drei Praxisfälle

    Fall 1 – „Das Datum ist falsch“:

    Prüfe zuerst Datentyp und ausdrücklich formatierte Anzeige. Wird nur ein anderer Aufbau gezeigt, muss kein gespeicherter Wert falsch sein. Geht es um eine verschobene Uhrzeit, gehört der Zeitzonenkontext zur Prüfung.

    Fall 2 – „Umlaute sind kaputt“:

    Nimm einen konkreten Textwert und verfolge seine Herkunft. Vergleiche ursprüngliche Datei, Clientkodierung, Datenbankzeichensatz und Ausgabe. Kläre, ob nur die Anzeige falsch ist oder bereits falscher Text gespeichert wurde.

    Fall 3 – „Zu lang trotz passender Zeichenanzahl“:

    Lies die Spaltendefinition und vergleiche Zeichen- mit Bytelänge. Eine BYTE-Grenze kann bei Mehrbytezeichen früher erreicht werden. Die aktuelle NLS_LENGTH_SEMANTICS-Einstellung ist kein Ersatz für die vorhandene Definition.

    14. Ein geplanter Zeichensatzwechsel ist eine Migration

    Ein Datenbankzeichensatz lässt sich nicht wie eine reine Anzeigeformatmaske behandeln. Ein Wechsel betrifft gespeicherte Daten, Konvertierbarkeit, Längengrenzen und Anwendungen. Er benötigt Analyse, Test und einen passenden Migrationsweg. Eine vermeintliche Reparatur durch pauschales Umbenennen einer Einstellung kann vorhandene falsche Bytes nicht zuverlässig korrigieren.

    Dieses Wiki gibt dafür keinen automatischen Änderungsbefehl. Es sammelt zunächst die Informationen, mit denen eine notwendige Migration oder eine reine Clientkorrektur voneinander unterschieden werden können.

    15. Diagnosekette

    1. Symptom benennen: Anzeige, Textverlust, Zahleneingabe, Längengrenze oder Zeitzone?
    2. Den tatsächlich betroffenen Client und seine Verbindung bestimmen.
    3. Datenbankzeichensatz und passende Sessionwerte lesen.
    4. Einen konkreten Wert mit ausdrücklicher Formatierung beziehungsweise Zeichen- und Bytezählung prüfen.
    5. Bei Textproblemen jeden Übergang zwischen Datei, Client und Datenbank betrachten.
    6. Vorhandene Spalten- und Datentypdefinitionen berücksichtigen.
    7. Erst danach eine konkrete Korrektur planen; das Skript verändert keine Einstellungen.
    Vertiefende Oracle-19c-Quellen: Globalisierungseinstellungen · Datum, Zeit und Zeitzonen

    16. Weiterführende Informationen

    Oracle 19c: Globalization Support, NLS_LENGTH_SEMANTICS und SQL*Plus und NLS.

    Read-only: Neun SELECT-Beispiele lesen oder berechnen Werte. Keine Änderung von Parametern, Spalten oder Zeichensätzen und keine automatische Datenkonvertierung vorhandener Inhalte.
    Oracle-19c-Referenzen zu den Diagnosebeispielen: DUMP · TO_DATE · SYS und Längensemantik

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Zeichensatz, Darstellungsformat, Sortierung und Zeitzone sind verschiedene Themen. Eine Änderung an einer dieser Einstellungen löst nicht automatisch Probleme der anderen.
    2. Datenbank-, Instanz-, Session- und Clientwerte können voneinander abweichen. Für ein konkretes Ergebnis zählt deshalb der tatsächlich wirksame Ausführungskontext.
    3. Ein DATE-Wert ist keine formatierte Zeichenfolge und enthält auch eine Uhrzeit. Explizite Konvertierungen und passende Zeitintervalle vermeiden missverständliche Datumsvergleiche.
    4. NLS_LANG muss zur Zeichencodierung des betreffenden Clients passen. Falsche Konvertierungen können Zeichen beschädigen; Zeichenlänge und Bytelänge sind nicht immer gleich.
    5. Ein Zeichensatzwechsel ist eine geplante Migration. Vorher müssen Datenbestand, Anwendungen, Längenbegrenzungen und Konvertierungsrisiken untersucht werden.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Prüfe anschließend deine Antwort und bewerte deinen Lernstand.
    Frage 1: Sind 30.09.2026 und 2026-09-30 zwingend verschiedene Daten?
    Nein. Es können zwei Anzeigen desselben Datumswerts sein.
    Frage 2: Muss der Clientzeichensatz immer dem Datenbankzeichensatz entsprechen?
    Nein. Er muss die tatsächliche Clientkodierung korrekt beschreiben; erforderliche Konvertierung wird berücksichtigt.
    Frage 3: Verändert NLS_LENGTH_SEMANTICS bestehende Spaltendefinitionen?
    Nein. Maßgeblich sind die tatsächlichen Metadaten der vorhandenen Spalte.
    Frage 4: Hat ein Oracle DATE einen eingebauten regionalen Zeitzonennamen?
    Nein. Es enthält Datum und Uhrzeit, aber keine eigene Zeitzoneninformation.
    Frage 5: Beweisen richtig aussehende Umlaute in einer Session die korrekte Kodierung jeder Exportdatei?
    Nein. Jede Datei und jeder Clientübergang hat seinen eigenen Kontext.
    Frage 6: Was zeigt DUMP(text_value,1016)?
    Interne Bytes in Hexadezimaldarstellung einschließlich Zeichensatz des Ausdrucks; nicht automatisch die historische Fehlerursache.
    Frage 7: Warum TO_DATE nicht auf einen bereits typisierten DATE-Wert anwenden?
    TO_DATE erwartet Text. Eine unnötige implizite Umwandlung in Text kann wieder NLS-Abhängigkeiten einführen.
    Frage 8: Bewahrt TIMESTAMP WITH LOCAL TIME ZONE die ursprüngliche Eingabezone auf?
    Nein. Die Speicherung wird normalisiert; die Anzeige erfolgt in der Sessionzeitzone.

    29. DBA Betriebscheck – strukturierter Morning Check

    Technischer Tagescheck mit Begründung, Views, Interpretation und Eskalationshinweisen.

    Lernkompass
    Einfach gesagt Du lernst, wie ein strukturierter Oracle-Betriebscheck den aktuellen Zustand einer Datenbank erfasst, ohne Konfiguration oder Sessions zu verändern.
    Warum ist das wichtig? Ein einzelner grüner Messwert beweist keinen gesunden Betrieb. Instance-Status, Alert Log, Storage, Tablespaces, Sessions, Waits, Redo, UNDO und Backup Readiness müssen als zusammenhängendes Betriebsbild betrachtet werden.
    Nach diesem Kapitel Du kannst einen read-only Morning-/Betriebscheck in sinnvoller Reihenfolge durchführen, Auffälligkeiten priorisieren und daraus gezielte Diagnosepfade ableiten.

    Einführung: Ein DBA-Betriebscheck ist eine regelmäßig wiederholte Bestandsaufnahme der wichtigsten Datenbankzustände. Er prüft, ob Instanz und Datenbank im erwarteten Zustand sind und ob zentrale Betriebsbereiche wie Alert Log, Speicherplatz, Sessions, Scheduler-Jobs und Sicherungen Auffälligkeiten zeigen. Die Ergebnisse liefern Hinweise für die Diagnose; ein unauffälliger Check beweist weder, dass keine Ursache vorliegt, noch dass sich die Datenbank aus einer Sicherung erfolgreich wiederherstellen lässt.

    Die folgende Übersicht ordnet die Prüffragen nach Betriebsbereichen und nennt passende Datenquellen. Du lernst, Auffälligkeiten mit Zeitpunkt und betroffenem System festzuhalten und gezielt in die Fachkapitel zu wechseln. So entsteht eine nachvollziehbare Übergabe: Was wurde geprüft, was weicht ab und welcher nächste Schritt ist begründet?

    Oracle 19c: fachliche Grundlage

    Momentaufnahme und Verlauf: Ein unauffälliger Wert schließt ein früheres Problem nicht aus; ein kurzer Ausschlag beweist noch keinen dauerhaften Engpass. Vergleiche aktuelle Befunde deshalb mit passenden früheren Messungen und dem üblichen Arbeitsaufkommen. Die folgenden Schritte priorisieren Auffälligkeiten und führen für die Ursachenanalyse in die Fachkapitel.

    Dabei muss zwischen Zustand, Symptom und Ursache unterschieden werden. Beispielsweise ist eine hohe Zahl aktiver Sessions zunächst ein Zustand. Erst zusammen mit Wait Events, CPU, SQL und Anwendungskontext wird daraus eine belastbare Diagnose.

    Morning-Check Fortschritt
    0 von 0 erledigt
    Die Checkbox bedeutet nur geprüft, nicht automatisch OK. Auffällige Ergebnisse werden anschließend im passenden Detailreport oder im DBA Troubleshooting untersucht.
    ErledigtBereichWas wird geprüft?Warum?ViewsWann nachfassen?
    Instanz / DBSTATUS, DATABASE_STATUS, OPEN_MODE, DATABASE_ROLE, STARTUP_TIMEErkennt Neustarts und falsche Betriebszustände.V$INSTANCE, V$DATABASEAbweichung vom erwarteten Betriebszustand oder unerwarteter Neustart
    AlertlogORA-, WARNING-, Startup-, Shutdown-, Checkpoint- und Redo-MeldungenViele kritische Probleme werden zuerst hier sichtbar.V$DIAG_ALERT_EXTneue ORA-Fehler oder wiederkehrende Muster
    RMANletzte L0/L1/ARCHIVE-/Controlfile-Sicherung, Status und AlterRecovery-Fähigkeit hängt von einer intakten Kette ab.V$RMAN_BACKUP_JOB_DETAILS, V$BACKUP_SETFAILED, WARNINGS, zu alte Sicherung
    Sessionsaktive Sessions, lange Calls, Module, SQL_IDZeigt aktuelle Anwendungs- und Lastsituation.V$SESSIONungewöhnlich viele ACTIVE Sessions
    LocksBlocker-/Waiter-KettenEine Blockierung kann ganze Anwendungsketten stoppen.V$SESSION, V$LOCK, V$TRANSACTIONBLOCKING_SESSION_STATUS='VALID' oder anhaltende relevante Waits
    Wait EventsNon-Idle-Waits, Häufigkeit und WartezeitZeigt, worauf Oracle tatsächlich wartet.V$SYSTEM_EVENT, V$SESSION_EVENTneue dominante Wait Class
    RedoSwitchrate, Gruppenzustand, Redo-WaitsBeeinflusst Commit, Checkpoints und Recovery.V$LOG, V$LOG_HISTORYSwitches im Minutenbereich, checkpoint not complete
    Schedulerfehlgeschlagene JobsAutomatisierte Abläufe können unbemerkt ausfallen.DBA_SCHEDULER_JOBS, DBA_SCHEDULER_JOB_RUN_DETAILSneuer fehlgeschlagener Lauf oder erwarteter Lauf fehlt
    StorageDatafile-Größe, Autoextend, Maxsize, WachstumProzentwerte allein zeigen nicht die echte Reserve.DBA_DATA_FILES, DBA_FREE_SPACE, DBA_SEGMENTSgeringe Reserve, Maxsize fast erreicht

    1. Empfohlene Reihenfolge

    1. Instanzstatus→ 2. Alertlog→ 3. RMAN→ 4. Sessions / Locks→ 5. Waits / Redo→ 6. Jobs / Storage

    2. Datenbankidentität und Betriebszustand

    Ziel der folgenden Abfrage:
    Vor jeder Bewertung muss klar sein, welche Instance auf welchem Host betrachtet wird und in welchem Zustand sich die Datenbank befindet.
    READ ONLY – Instance und Datenbank
    SELECT i.instance_name,
           i.host_name,
           i.status AS instance_status,
           i.database_status,
           i.startup_time,
           d.name AS db_name,
           d.db_unique_name,
           d.open_mode,
           d.database_role,
           d.log_mode
    FROM v$instance i
    CROSS JOIN v$database d;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    Zusammengehörige Teilansicht: Spalten 1–5
    ZeileINSTANCE_NAMEHOST_NAMEINSTANCE_STATUSDATABASE_STATUS
    1ORCLdb01OPENACTIVE
    Zusammengehörige Teilansicht: Spalten 6–7
    STARTUP_TIMEDB_NAME
    08.10.2026 08:00:00ORCL
    ZeileDB_UNIQUE_NAMEOPEN_MODEDATABASE_ROLELOG_MODE
    1ORCLREAD WRITEPRIMARYARCHIVELOG

    Was sehe ich hier? Die Übersicht verbindet Instanz- und Datenbankinformationen. Rollen- und Öffnungsmodus passen hier zu einer geöffneten Primärdatenbank; sie ersetzen nicht die weiteren Zustandsprüfungen.

    Bewertung: Ein erwartetes OPEN READ WRITE ist für eine normale Primärdatenbank typisch. Andere Zustände sind nicht automatisch Fehler: MOUNT, READ ONLY oder eine andere DATABASE_ROLE können je nach Betriebszweck korrekt sein.
    READ ONLY – erwartete Anwendungs-PDBs aus CDB$ROOT
    SELECT con_id, name, open_mode, restricted
    FROM v$pdbs ORDER BY con_id;

    Fiktive Beispielausgabe:

    CON_IDNAMEOPEN_MODERESTRICTED
    2PDB$SEEDREAD ONLYNO
    3APPPDBMOUNTEDNULL

    Fiktiver Befund: Die CDB kann READ WRITE sein, während APPPDB noch MOUNTED ist. Gegen den betrieblich erwarteten Zustand prüfen; PDB$SEED ist üblicherweise READ ONLY. Bei Non-CDB entfällt dieser Schritt. Zusätzlich den vorgesehenen Anwendungsservice und einen lesenden Verbindungs-/Smoke-Test über den tatsächlichen Clientweg prüfen. Ein lokales SYSDBA-Login bestätigt weder Listener noch Anwendungszugriff.

    3. Alert Log als zeitliche Ereignisquelle

    Filtergrenze: Die folgende Suche zeigt nur Meldungen mit ORA-, WARNING oder ERROR. Normale Start-/Stopp-, Archivierungs- oder Checkpoint-Meldungen können fehlen. Für einen Vorfall denselben Zeitraum zusätzlich ohne Textfilter lesen und die Ereignisfolge prüfen. „Keine Treffer“ bedeutet nur „keine Treffer für diesen Filter“.

    Das Alert Log verbindet viele Einzelbeobachtungen zeitlich. ORA-Fehler, Startup/Shutdown, Redo-/Checkpoint-Probleme, Speicherfehler und weitere kritische Ereignisse sollten deshalb immer für denselben Zeitraum wie die gemessene Auffälligkeit betrachtet werden.

    Ein einzelnes Wort wie WARNING ist dabei noch keine automatische Kritikalität. Meldung, Zeitpunkt, Wiederholung und Auswirkung bestimmen die Bewertung.

    READ ONLY – Alert-Meldungen aus V$DIAG_ALERT_EXT
    SELECT originating_timestamp,
           message_type,
           message_level,
           message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '24' HOUR
      AND (message_text LIKE '%ORA-%'
           OR UPPER(message_text) LIKE '%WARNING%'
           OR UPPER(message_text) LIKE '%ERROR%')
    ORDER BY originating_timestamp DESC;

    Fiktive Beispielausgabe:

    ORIGINATING_TIMESTAMPMESSAGE_TYPEMESSAGE_LEVELMESSAGE_TEXT
    08.10.2026 10:25:00 +02:0021ORA-00600: internal error code, arguments: [demo]

    Was sehe ich hier? Schematischer Lernfall innerhalb der letzten 24 Stunden: Ein interner Fehler verlangt die Prüfung des vollständigen Incident- und Trace-Kontexts. [demo] ist ein erfundener Platzhalter, keine reale Fehlerursache oder Reparaturanweisung.

    4. Host, Filesystem und Mountpoints: Datenbankzustand endet nicht bei V$DATABASE

    Ein Morning Check muss auch prüfen, ob die für Oracle relevanten Filesysteme beziehungsweise NFS-Mounts erreichbar sind und ausreichend freien Platz besitzen. Eine Datenbank kann aktuell OPEN sein und trotzdem kurz vor einem Betriebsproblem stehen, wenn Archive-, Diagnostic- oder Backup-Ziele volllaufen.

    Diese Hostprüfung ist read-only. Sie bewertet Erreichbarkeit, Kapazität und Auffälligkeiten; sie mountet keine Filesysteme und löscht keine Dateien.

    5. Tablespace-Kapazität richtig bewerten

    Eine reine Prozentanzeige kann irreführen. Ein großer Tablespace mit 90 % Belegung kann mehr freien Speicher besitzen als ein kleiner Tablespace mit 70 %. Deshalb sollten belegt, frei, aktuelle Größe, Autoextend und maximal erreichbare Größe gemeinsam betrachtet werden.

    READ ONLY – Tablespace-Größe und freier Platz
    WITH df AS (
        SELECT tablespace_name,
               SUM(bytes) AS bytes,
               SUM(CASE
                     WHEN autoextensible = 'YES' THEN maxbytes
                     ELSE bytes
                   END) AS maxbytes
        FROM dba_data_files
        GROUP BY tablespace_name
    ),
    fs AS (
        SELECT tablespace_name,
               SUM(bytes) AS free_bytes
        FROM dba_free_space
        GROUP BY tablespace_name
    )
    SELECT df.tablespace_name,
           ROUND(df.bytes / 1024 / 1024 / 1024, 2) AS current_gb,
           ROUND((df.bytes - NVL(fs.free_bytes, 0)) / 1024 / 1024 / 1024, 2) AS used_gb,
           ROUND(NVL(fs.free_bytes, 0) / 1024 / 1024 / 1024, 2) AS free_gb,
           ROUND((df.bytes - NVL(fs.free_bytes, 0)) / NULLIF(df.bytes, 0) * 100, 2) AS used_pct,
           ROUND(df.maxbytes / 1024 / 1024 / 1024, 2) AS max_gb
    FROM df
    LEFT JOIN fs
      ON fs.tablespace_name = df.tablespace_name
    ORDER BY used_pct DESC;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. Die Teilansichten gehören zeilenweise zusammen und zeigen gemeinsam alle ausgewählten Spalten. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    TABLESPACE_NAMECURRENT_GBUSED_GBFREE_GBUSED_PCT
    APP_DATA100802080
    MAX_GB
    150

    So liest du das Ergebnis: 100 GiB allokiert minus 20 GiB freie Extents ergeben 80 GiB belegt und 80 %. MAX_GB=150 folgt den Dateigrenzen, nicht einem Nachweis verfügbarer Storagekapazität.

    Gültigkeitsgrenze: Diese Rechnung setzt online befindliche, auswertbare Datafiles voraus. Prüfe den Datei-/Tablespace-Zustand vorher: Bei Offline-Dateien können Extentinformationen fehlen. NVL(...,0) darf dann nicht als Beweis vollständiger Belegung gelesen werden. USED_GB beschreibt allokierten Platz abzüglich freier Extents, keine Netto-Nutzdatenmenge. MAX_GB garantiert keinen freien Storage-Platz. Die Division durch 1024³ liefert technisch GiB.

    6. Resource Limits: Spitzen und aktuelle Auslastung früh erkennen

    V$RESOURCE_LIMIT zeigt unter anderem aktuelle und maximale Nutzung konfigurierter Ressourcen wie processes und sessions. Für den Betriebscheck ist besonders die Annäherung an das konfigurierte Limit interessant.

    Der historische Spitzenwert seit Instance-Start ist dabei kein aktueller Lastwert. CURRENT_UTILIZATION und MAX_UTILIZATION beantworten unterschiedliche Fragen.

    READ ONLY – Prozesse und Sessions
    SELECT resource_name,
           current_utilization,
           max_utilization,
           limit_value
    FROM v$resource_limit
    WHERE resource_name IN ('processes','sessions')
    ORDER BY resource_name;

    Fiktive Beispielausgabe:

    Lernwerte, keine Messung. NULL steht für einen fehlenden Wert. Datumsanzeigen können vom SQL-Client abhängen.

    RESOURCE_NAMECURRENT_UTILIZATIONMAX_UTILIZATIONLIMIT_VALUE
    processes84121300
    sessions102146472

    So liest du das Ergebnis: Die aktuellen Werte liegen unter den Grenzen. Der Peak bleibt seit Instanzstart erhalten und ist nicht automatisch ein aktueller Alarm.

    7. Sessions und Blocking

    ACTIVE ist keine Fehlerbewertung. Eine aktive Session kann auf CPU arbeiten oder auf eine Ressource warten. INACTIVE bedeutet ebenfalls nicht automatisch, dass eine Session unnötig ist. Für den Betriebscheck sind deshalb vor allem auffällige Wartezeiten und Blocking-Beziehungen relevant.

    READ ONLY – aktive User-Sessions
    SELECT sid,
           serial#,
           username,
           status,
           sql_id,
           event,
           wait_class,
           state,
           CASE WHEN state = 'WAITING'
                THEN ROUND(wait_time_micro / 1000000, 3) END AS current_wait_seconds,
           module,
           machine
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    ORDER BY current_wait_seconds DESC NULLS LAST;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSSQL_ID
    11423817APP_USERACTIVE8u3k2m9p4q7r1
    ZeileEVENTWAIT_CLASSSTATECURRENT_WAIT_SECONDSMODULE
    1enq: TX - row lock contentionApplicationWAITING12Bestellportal
    ZeileMACHINE
    1app01

    Was sehe ich hier? Die aktive Session wartet in diesem Beispiel auf eine Zeilensperre. STATE=WAITING macht den Wait aktuell; MODULE und MACHINE helfen bei der Zuordnung.

    READ ONLY – aktuell blockierte Sessions
    SELECT sid,
           serial#,
           username,
           blocking_session_status,
           blocking_session,
           final_blocking_session_status,
           final_blocking_session,
           event,
           CASE WHEN state = 'WAITING'
                THEN ROUND(wait_time_micro / 1000000, 3) END AS current_wait_seconds,
           sql_id
    FROM v$session
    WHERE blocking_session_status = 'VALID'
    ORDER BY current_wait_seconds DESC NULLS LAST;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMEBLOCKING_SESSION_STATUSBLOCKING_SESSION
    11423817APP_USERVALID87
    ZeileFINAL_BLOCKING_SESSION_STATUSFINAL_BLOCKING_SESSIONEVENTCURRENT_WAIT_SECONDSSQL_ID
    1VALID87enq: TX - row lock contention128u3k2m9p4q7r1

    Was sehe ich hier? Die gültige Blockerangabe verweist auf SID 87. Vor einer Maßnahme dessen aktuelle SERIAL# und Transaktion prüfen; eine SID kann später wiederverwendet werden.

    CURRENT_WAIT_SECONDS wird nur für STATE=WAITING ausgegeben. NULL bedeutet hier keinen aktuellen Wait und nicht null Sekunden SQL-Laufzeit. Aktive CPU-Arbeit und CPU-Zuteilung am Host sind getrennt zu untersuchen.

    8. Wait Events nicht isoliert bewerten

    Wait Events zeigen, worauf Oracle wartet. Sie sind ein Diagnoseeinstieg und noch keine fertige Ursachenanalyse. Derselbe Wait kann je nach SQL, Last, I/O-Pfad und Zeitfenster eine andere Bedeutung haben.

    READ ONLY – aktuelle User-Waits
    SELECT event,
           wait_class,
           COUNT(*) AS sessions
    FROM v$session
    WHERE state = 'WAITING'
      AND type = 'USER'
      AND status = 'ACTIVE'
      AND wait_class <> 'Idle'
    GROUP BY event, wait_class
    ORDER BY sessions DESC, event;

    Fiktive Beispielausgabe:

    EVENTWAIT_CLASSSESSIONS
    enq: TX - row lock contentionApplication3
    db file sequential readUser I/O1

    Was sehe ich hier? Drei aktuell wartende Benutzersessions teilen hier denselben Sperr-Wait. Das zählt Sessions im Abfragemoment, keine Wait-Ereignisse über einen Zeitraum.

    Weiterführung: Auffällige Waits werden nicht im Betriebscheck „repariert“. Sie werden in Kapitel 30 Wait Events und gegebenenfalls Kapitel 31 Performance Tuning tiefer analysiert.

    9. Redo und Log-Switches

    Die Stundenliste gruppiert V$LOG_HISTORY nach dem Beginn einer bekannten Sequenz (FIRST_TIME), nicht nach dem exakten Ende des Logwechsels. Aktuelle Sequenz, Controlfile-Aufbewahrung und Stunden ohne Treffer begrenzen die Aussage; die Einordnung steht in Kapitel 18.

    Eine feste Zahl „zulässiger Log Switches pro Stunde“ gibt es nicht. Die Switch-Rate muss mit Redo-Größe, erzeugtem Redo, Workload und Alert-Log-Ereignissen zusammen betrachtet werden.

    READ ONLY – Log-Switches der letzten 24 Stunden
    SELECT TO_CHAR(first_time, 'YYYY-MM-DD HH24') AS hour,
           COUNT(*) AS sequenzanfaenge
    FROM v$log_history
    WHERE first_time >= SYSDATE - 1
    GROUP BY TO_CHAR(first_time, 'YYYY-MM-DD HH24')
    ORDER BY hour;

    Gezählt werden historisch erfasste Sequenzanfänge nach FIRST_TIME, keine lückenlos gemessenen Switch-Abschlusszeitpunkte. Die verfügbare Historie und eine noch laufende Sequenz begrenzen die Aussage; Stunden ohne Treffer erscheinen nicht als Nullzeilen. Einordnung: Kapitel 18.

    Fiktive Beispielausgabe:

    HOURSEQUENZANFAENGE
    2026-10-08 094
    2026-10-08 102

    Was sehe ich hier? Ausschnitt einer Messung am 08.10.2026 um 10:30 Uhr. Die Stunde stammt aus FIRST_TIME; der Zähler erfasst Sequenzanfänge und nicht zwingend die exakten Switch-Zeitpunkte.

    READ ONLY – Online Redo Logs
    SELECT group#,
           thread#,
           sequence#,
           ROUND(bytes / 1024 / 1024) AS size_mb,
           members,
           archived,
           status
    FROM v$log
    ORDER BY group#;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileGROUP#THREAD#SEQUENCE#SIZE_MBMEMBERS
    11110710242
    22110810242
    33110910242
    ZeileARCHIVEDSTATUS
    1YESINACTIVE
    2YESACTIVE
    3NOCURRENT

    Was sehe ich hier? Gruppe 3 ist aktuell. Gruppe 2 ist bereits archiviert, wird aber noch für Instance Recovery benötigt. Daher sind ACTIVE und ARCHIVED=YES kein Widerspruch.

    Zeitfenster dokumentieren: Alertlog, Scheduler und UNDO verwenden hier 24 Stunden; RMAN zeigt sieben Tage als Kontext für die Sicherungskette. Liegt der letzte Check länger zurück, die Untergrenze entsprechend setzen. Momentane Session- und TEMP-Werte sind keine Nacht-Historie. UNDO-Intervalle umfassen gewöhnlich zehn Minuten; die neueste Zeile kann noch unvollständig sein.

    10. UNDO und TEMP

    TEMP richtig einordnen: V$TEMP_SPACE_HEADER beschreibt belegte und freie Bereiche laut Space Header. Bereits allokierte temporäre Extents können zur Wiederverwendung vorgehalten werden. Dieser Wert darf nicht allein als aktuell durch eine SQL-Anweisung verbrauchter Speicher interpretiert werden. Aktuelle Verbraucher mit V$TEMPSEG_USAGE und aktive Workareas mit V$SQL_WORKAREA_ACTIVE zuordnen; DBA_TEMP_FREE_SPACE ergänzt die Tablespace-Reserve.

    UNDO und TEMP sollten nicht nur über einen momentanen Füllstand bewertet werden. Bei UNDO sind insbesondere ORA-01555, Platzfehler, Query-Laufzeiten und die abgestimmte Retention interessant. TEMP-Verbrauch ist workloadabhängig und kann durch Sort-, Hash- oder andere Workareas stark schwanken.

    READ ONLY – aktuelle UNDO-Statistik
    SELECT begin_time,
           end_time,
           undoblks,
           txncount,
           maxquerylen,
           ssolderrcnt,
           nospaceerrcnt,
           tuned_undoretention
    FROM v$undostat
    WHERE end_time >= SYSDATE - 1
    ORDER BY begin_time DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileBEGIN_TIMEEND_TIMEUNDOBLKSTXNCOUNTMAXQUERYLEN
    108.10.2026 10:20:0008.10.2026 10:30:001200400300
    ZeileSSOLDERRCNTNOSPACEERRCNTTUNED_UNDORETENTION
    1001200

    Was sehe ich hier? Ausschnitt: Die längste erfasste Abfrage dauerte 300 Sekunden; die getunte Undo-Aufbewahrung beträgt hier 1.200 Sekunden. Für diesen Zeitraum wurden keine Fehler in den beiden ausgewählten Fehlerzählern erfasst.

    READ ONLY – TEMP-Nutzung
    SELECT tablespace_name,
           ROUND(SUM(bytes_used) / 1024 / 1024, 2) AS used_mb,
           ROUND(SUM(bytes_free) / 1024 / 1024, 2) AS free_mb
    FROM v$temp_space_header
    GROUP BY tablespace_name
    ORDER BY tablespace_name;

    Fiktive Beispielausgabe:

    TABLESPACE_NAMEUSED_MBFREE_MB
    TEMP5123584

    So liest du das Ergebnis: Die Werte summieren sich hier auf 4096 MiB laut Space Header. Daraus lässt sich weder die verursachende SQL noch ein Speichermangel ableiten; aktuelle Verbraucher und wiederverwendbare Bereiche zusätzlich prüfen.

    11. Scheduler und betriebliche Jobs: Fehler seit dem letzten Check sichtbar machen

    Geplante Datenbankjobs können fachlich wichtig sein, obwohl die Instance selbst gesund wirkt. Deshalb gehört ein Blick auf fehlgeschlagene oder unerwartet lange Scheduler-Läufe in einen umfassenden Betriebscheck, sofern die Anwendung Oracle Scheduler verwendet.

    Der Check bewertet nur Status und Historie. Er startet, stoppt oder aktiviert keine Jobs.

    READ ONLY – nicht erfolgreich abgeschlossene Scheduler-Läufe
    SELECT owner,
           job_name,
           status,
           actual_start_date,
           run_duration,
           error#,
           additional_info
    FROM dba_scheduler_job_run_details
    WHERE log_date >= SYSTIMESTAMP - INTERVAL '24' HOUR
      AND status <> 'SUCCEEDED'
    ORDER BY log_date DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileOWNERJOB_NAMESTATUSACTUAL_START_DATERUN_DURATION
    1APPNACHTLAUFFAILED08.10.2026 02:00:00 +02:00+000 00:00:02
    ZeileERROR#ADDITIONAL_INFO
    1942NULL

    Was sehe ich hier? Ein fehlgeschlagener Lauf innerhalb der letzten 24 Stunden: ERROR#=942 verweist auf ORA-00942. Objektname, Ausführungsschema und direkte Rechte prüfen; das Beispiel beweist nicht, dass die Tabelle tatsächlich gelöscht wurde.

    READ ONLY – erwarteten Job mit letzten protokollierten Läufen vergleichen
    WITH runs AS (
      SELECT owner, job_name, MAX(actual_start_date) AS last_logged_start,
             MAX(CASE WHEN status = 'SUCCEEDED' THEN actual_start_date END) AS last_success_start
      FROM dba_scheduler_job_run_details
      WHERE owner = UPPER('&OWNER') AND job_name = UPPER('&JOB_NAME')
      GROUP BY owner, job_name
    )
    SELECT j.owner, j.job_name, j.enabled, j.state, j.next_run_date,
           r.last_logged_start, r.last_success_start
    FROM dba_scheduler_jobs j
    LEFT JOIN runs r ON r.owner = j.owner AND r.job_name = j.job_name
    WHERE j.owner = UPPER('&OWNER') AND j.job_name = UPPER('&JOB_NAME');

    Fiktive Beispielausgabe:

    OWNERJOB_NAMEENABLEDSTATENEXT_RUN_DATE
    APPNACHTLAUFFALSEDISABLEDNULL
    LAST_LOGGED_STARTLAST_SUCCESS_START
    07.10.2026 02:00 +02:0007.10.2026 02:00 +02:00

    Fiktiv geprüft am 08.10.2026 um 08:00 Uhr: Erwartet war ein Lauf um 02:00 Uhr, der letzte protokollierte Erfolg stammt aber vom Vortag. Der Job ist deaktiviert; den Grund und die betriebliche Freigabe prüfen. Eine fehlende Historie allein beweist keinen Ausfall: Logging und Aufbewahrung prüfen. Fehlt das Jobobjekt selbst, erscheint keine Zeile; mit der externen Soll-Liste sowie AUTO_DROP abgleichen. LAST_SUCCESS_START ist der Start eines erfolgreich protokollierten Laufs, nicht dessen Abschlusszeit.

    12. Backup Readiness im Betriebscheck

    Backupart ist kein Inventar: INPUT_TYPE fasst den Job zusammen. DB INCR unterscheidet Level 0 und Level 1 nicht; ein Datenbankjob kann auch Archivelogs enthalten. Für den Nachweis einzelner Sicherungsarten V$BACKUP_SET/V$BACKUP_DATAFILE und RMAN LIST verwenden. Ein vor dem Sieben-Tage-Fenster gestarteter Langläufer fehlt außerdem im gezeigten Zeitfilter.

    Der Betriebscheck soll nicht nur fragen, ob irgendwann ein Backup lief. Entscheidend ist, ob die erwarteten Backuparten im vorgesehenen Zeitfenster erfolgreich waren und ob Auffälligkeiten wie FAILED-Jobs sichtbar sind. Die eigentliche Restore-Fähigkeit wird in Kapitel 25 mit RMAN PREVIEW/VALIDATE vertieft.

    READ ONLY – RMAN Jobhistorie
    SELECT session_key,
           input_type,
           status,
           start_time,
           end_time,
           ROUND(elapsed_seconds / 60, 1) AS duration_min,
           output_device_type
    FROM v$rman_backup_job_details
    WHERE start_time >= SYSDATE - 7
    ORDER BY start_time DESC;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSESSION_KEYINPUT_TYPESTATUSSTART_TIMEEND_TIME
    1301DB INCRCOMPLETED08.10.2026 01:00:0008.10.2026 01:30:00
    ZeileDURATION_MINOUTPUT_DEVICE_TYPE
    130DISK

    Was sehe ich hier? Der RMAN-Job dauerte hier 30 Minuten und wurde als COMPLETED registriert. Eine solche Statuszeile ersetzt weder die Prüfung der vollständigen Recovery-Kette noch einen Wiederherstellungstest.

    Wichtig: COMPLETED in der Jobhistorie ist ein Betriebsindikator, aber kein vollständiger Recovery-Nachweis. Recovery Readiness umfasst zusätzlich Backup-Verfügbarkeit, Controlfile/SPFILE und die benötigte Redo-Kette.

    Fiktive Beispielausgabe:

    SOLLISTBEWERTUNGNÄCHSTE PRÜFUNG
    L0 Sonntag, L1 täglich, Archive alle 15 MinutenL0/L1 nachgewiesen; letztes Archive-Jobende 06:00, Check 08:00Archivelog-Nachweis offenJoblogs, gesicherte Sequenzen und Lücken prüfen

    Unabhängiger Lernfall, keine Messung deiner Datenbanken. Der Jobendzeitpunkt ist keine garantierte Redo-Abdeckung. L0/L1 über V$BACKUP_SET/V$BACKUP_DATAFILE und RMAN LIST belegen; bei täglich erwarteten FULL-Backups einen entsprechenden Sollplan verwenden. Fachlich bestätigte Recovery-Ziele und Validierung bleiben Teil von Kapitel 25.

    13. Ampelstatus: Bewertung statt Einzelgrenzwert

    Ein Management-Dashboard darf Messwerte verdichten, sollte aber transparent machen, warum ein Status GRÜN, GELB oder ROT ist. Besonders bei CPU, aktiven Sessions, Tablespace-Auslastung oder Redo-Switches sind starre Einzelgrenzen ohne Kontext problematisch.

    StatusBedeutungDBA-Reaktion
    NICHT BEWERTBARMessung fehlt, ist veraltet oder nicht zugänglich.Messweg, Zeitstempel und Leserechte klären; weder Entwarnung noch bestätigter Ausfall.
    GRÜNKein aktueller Hinweis auf Handlungsbedarf im definierten Betriebsrahmen.Trend weiter beobachten.
    GELBAuffälligkeit, Trend oder Annäherung an einen betrieblichen Grenzwert.Kontext analysieren und Entwicklung beobachten.
    ROTKonkreter Fehler, Ausfall, kritischer Ressourcenengpass oder definierter Betriebsgrenzwert verletzt.Fachdiagnose priorisieren; Maßnahme erst nach Ursachenanalyse.
    SE2-Kontext: Bei Oracle Database SE2 muss die technische Plattform-/Lizenzgrenze bei der Bewertung von Parallelität und aktiven CPU-Threads berücksichtigt werden. Eine reine Sessionanzahl ist jedoch nicht mit CPU-Auslastung gleichzusetzen.

    14. Vom Morning Check zur Fachdiagnose

    Wenn der Betriebscheck eine Auffälligkeit meldet:

    1. Zeitpunkt und betroffene Datenbank sichern.
    2. Messwert gegen vorherige Werte beziehungsweise Normalbetrieb vergleichen.
    3. Gleichzeitige Alert-Log-Ereignisse prüfen.
    4. Abhängige Messwerte korrelieren: CPU, Sessions, Waits, I/O, Redo, UNDO, Storage.
    5. Betroffenen Fachbereich bestimmen.
    6. In das passende Diagnosekapitel wechseln.
    7. Ursache dokumentieren und erst danach eine administrative Maßnahme planen.
    8. Nach einer freigegebenen Maßnahme dieselben Kennzahlen erneut messen.
    Grundprinzip: Ein guter Betriebscheck beantwortet nicht automatisch jede Ursache. Er sorgt dafür, dass die richtige Auffälligkeit früh erkannt und mit den richtigen Informationen an die nächste Diagnosestufe übergeben wird.

    15. Oracle-19c-Dokumentation als Grundlage

    Oracle Database 19c Reference
    Dynamische Performance Views für Instance-, Session-, Resource-, Redo-, Undo- und RMAN-Status
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/

    Oracle Database 19c Administrator's Guide
    Betrieb, Storage, Alert/Diagnostic-Infrastruktur und Scheduler-Verwaltung
    https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/
    Vertiefende Oracle-19c-Quellen: TEMP Space Header · TEMP-Reserve · RMAN-Jobdetails
    Oracle-19c-Referenzen zu den Diagnosebeispielen: PDB-Zustand · UNDO-Intervalle

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Der Betriebscheck beginnt mit Identität, Erreichbarkeit und Betriebszustand der richtigen Datenbank. CDB, PDB und Service werden dabei nicht gleichgesetzt.
    2. Alert Log und Jobprotokolle müssen für ein definiertes Zeitfenster gelesen werden. Alte Ereignisse und neue Störungen dürfen nicht vermischt werden.
    3. Kapazität umfasst Datenbankdateien, Tablespaces, TEMP, UNDO und den darunterliegenden Storage. Autoextend oder freier Platz an einer einzigen Stelle ist keine vollständige Entwarnung.
    4. Sessions, Blocking, Waits und Ressourcenlimits zeigen unterschiedliche Aspekte des Betriebs. Bewertung und Priorität ergeben sich aus Auswirkung, Verlauf und Vergleich mit dem normalen Zustand.
    5. Backup Readiness und fehlgeschlagene Betriebsjobs gehören zum täglichen Gesamtbild. Ein auffälliger Befund wird gezielt an die passende Fachdiagnose weitergegeben.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Bedeutet eine abgehakte Prüfung automatisch GRÜN?

    Nein. Die Checkbox dokumentiert die Durchführung; Befund und Bewertung müssen zusätzlich festgehalten werden.

    Frage 2: Beweist eine leere Fehlerhistorie, dass alle geplanten Jobs liefen?
    Nein. Erwartete Jobs und Termine mit tatsächlichen Läufen, Logging und Aufbewahrung abgleichen.
    Frage 3: Beweist MAX_GB in der Tablespace-Abfrage freien Storage?

    Nein. Der Wert folgt den Dateigrenzen. Dateisystem, ASM, Quotas und konkurrierendes Wachstum können vorher begrenzen.

    Frage 4: Reicht COMPLETED als Recovery-Nachweis?

    Nein. Backupbestand, Lesbarkeit, Redo-Abdeckung, Metadaten und ein geübter Restore-/Recovery-Ablauf müssen zum geforderten Ziel passen.

    Frage 5: Ist eine offene CDB ausreichend für einen erfolgreichen Anwendungszugriff?
    Nein. PDB-Zustand, Restriktionen, Service und tatsächlicher Verbindungsweg gehören dazu.
    Frage 6: Erfassen zwölf UNDO-Intervalle sicher die gesamte Nacht?
    Nein. Gewöhnlich sind das ungefähr zwei Stunden; das laufende Intervall kann unvollständig sein.
    Frage 7: Welche Bewertung erhält eine fehlgeschlagene Messung ohne weiteren Befund?
    Nicht bewertbar. Ursache der Messlücke klären und keine grüne Entwarnung ableiten.
    Frage 8: Ist ein Archivelog-Jobende gleichzeitig die garantierte Recovery-Grenze?
    Nein. Gesicherte Sequenzen und die erforderliche lückenlose Recovery-Kette prüfen.

    30. Wait Events – verstehen, warum Oracle manchmal warten muss

    Vom einfachen Grundprinzip des Wartens bis zur gezielten Session- und SQL-Diagnose.

    Lernkompass
    Einfach gesagt Wenn Oracle gerade nicht auf CPU arbeitet, wartet eine Session häufig auf etwas: Daten, Redo, Netzwerk, Locks oder andere Ressourcen.
    Warum ist das wichtig? Wait Events geben diesem Warten einen Namen. Sie sind Hinweise auf Zeitverbrauch, aber nicht automatisch Fehler.
    Nach diesem Kapitel Du kannst wichtige Waits lesen, Idle von Non-Idle unterscheiden und den Wait mit Session und SQL verbinden.

    Einführung: Ein Wait Event benennt einen von Oracle erfassten Wartegrund. Eine Session benötigt beispielsweise Daten vom Storage oder wartet auf eine gesperrte Ressource. Solche Wartezeiten gehören zum normalen Datenbankbetrieb. Ob sie einen Engpass erklären, lässt sich erst aus ihrem Umfang und dem Zusammenhang mit der betroffenen Arbeit beurteilen.

    Das Kapitel führt vom einzelnen Wartezustand zu den unterschiedlichen Messquellen. Du lernst, einen aktuellen Wait von gesammelten Zeitwerten zu unterscheiden und die zusätzlichen Event-Parameter passend zu lesen. Damit kannst du eine Beobachtung einer Session zuordnen, ohne jeden Eventnamen als Fehler zu behandeln. Die Priorisierung gegenüber CPU- und anderen Zeiten wird im anschließenden Tuning-Kapitel vertieft.

    Oracle 19c: fachliche Grundlage

    Ein Oracle-Prozess kann CPU nutzen, auf ein von Oracle erfasstes Ereignis warten oder vom Betriebssystem noch auf CPU-Zuteilung warten. Ein nicht gemeldeter aktueller Oracle-Wait beweist daher keine tatsächliche CPU-Ausführung. Wait Events erklären viele Wartezustände; für Scheduling und CPU-Engpässe werden zusätzlich Hostmessungen benötigt.

    1. CPU-Zeit und Wait-Zeit

    Eine aktive Datenbanksession kann gerade CPU verbrauchen oder innerhalb ihres Calls auf ein Event warten. Deshalb bedeutet ACTIVE nicht automatisch ON CPU.

    ACTIVE Call → ON CPU oder auf CPU-Zuteilung wartend oder WAITING

    Die vereinfachte Darstellung schließt CPU-Zuteilung nicht aus: Auch ohne aktuellen Oracle-Wait kann der Prozess beim Betriebssystem auf CPU warten. ACTIVE ist kein Messnachweis tatsächlicher CPU-Nutzung.

    2. Was ist ein Wait Event?

    Ein Wait Event besitzt einen Namen und zusätzliche Parameter. Der Name beschreibt die Art des Wartens, zum Beispiel db file sequential read oder log file sync.

    Der Name allein reicht nicht. Bei I/O-Waits muss beispielsweise ermittelt werden, welche Datei oder welcher Block betroffen ist; bei Lock-Waits welche Session blockiert.

    3. Wait Classes

    Wait ClassGrundideeTypische Richtung
    User I/OForeground wartet auf Daten-I/O.SQL, Zugriffspfad, Storage.
    System I/OOracle-interne I/O-Arbeit.Background-/Storage-Kontext.
    CommitCommit wartet auf Redo-Durability.LGWR, Redo-I/O, Commit-Rate.
    ConcurrencyKonkurrenz um interne oder logische Ressourcen.Hot Blocks, Mutex/Latch, Parallelität.
    ApplicationHäufig Anwendungs-/Lock-bezogene Wartezeit.Transaktionen, Blocker.
    NetworkKommunikation mit Client oder anderen Komponenten.Clientverhalten, Round-Trips, Netzwerk.
    IdleSession wartet erwartungsgemäß auf neue Arbeit.Meist nicht erster Tuningansatz.

    4. Idle und Non-Idle unterscheiden

    Idle Waits bedeuten nicht, dass Oracle ein Problem hat. Beispielsweise kann eine Session einfach darauf warten, dass der Client die nächste Anfrage sendet.

    Deshalb werden Idle Waits in vielen Performanceauswertungen zunächst herausgefiltert. Trotzdem können sie bei Netzwerk- oder Anwendungsdiagnosen wichtige Hinweise liefern.

    5. Aktueller Session-Wait vs. kumulierte Statistik

    V$SESSION Zeigt den aktuellen beziehungsweise letzten bekannten Wait-Zustand einer Session.
    V$SESSION_EVENT Kumuliert Waits je Session.
    V$SYSTEM_EVENT Kumuliert Waits instanzweit seit Startup.
    V$SYSTEM_WAIT_CLASS Aggregiert instanzweite Wartezeit nach Wait Class.
    Kumulierte Werte seit Instance-Start sind keine direkte Aussage über die letzten fünf Minuten. Für kurze Zeiträume werden Differenzen zweier Messpunkte oder historische zeitbezogene Daten benötigt.

    6. Aktuelle Non-Idle-Waits lesen

    Aktuelle USER-Session-Waits
    SELECT
        sid,
        serial#,
        username,
        status,
        sql_id,
        event,
        wait_class,
        state,
        ROUND(wait_time_micro / 1000000, 3) AS wait_seconds,
        ROUND(time_since_last_wait_micro / 1000000, 3) AS since_last_wait_seconds,
        blocking_session_status,
        blocking_session,
        final_blocking_session_status,
        final_blocking_session
    FROM v$session
    WHERE type = 'USER'
      AND state = 'WAITING'
      AND wait_class <> 'Idle'
    ORDER BY wait_time_micro DESC;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMESTATUSSQL_ID
    11423817APP_USERACTIVE8u3k2m9p4q7r1
    ZeileEVENTWAIT_CLASSSTATEWAIT_SECONDSSINCE_LAST_WAIT_SECONDS
    1enq: TX - row lock contentionApplicationWAITING120
    ZeileBLOCKING_SESSION_STATUSBLOCKING_SESSIONFINAL_BLOCKING_SESSION_STATUSFINAL_BLOCKING_SESSION
    1VALID87VALID87

    Was sehe ich hier? Die Session wartet seit etwa zwölf Sekunden auf eine Zeilensperre. Bei STATE=WAITING ist die Zeit seit dem letzten abgeschlossenen Wait hier 0. Der Filter STATE=WAITING wählt aktuell wartende User-Sessions aus. WAIT_SECONDS beschreibt die bisherige Dauer dieses Waits, nicht die Gesamtlaufzeit der SQL-Anweisung oder Transaktion. Die Momentaufnahme kann sich unmittelbar danach ändern.

    7. STATE richtig interpretieren

    Der STATE-Wert hilft zu unterscheiden, ob eine Session aktuell wartet oder ob der letzte Wait bereits beendet wurde. Damit sollte SECONDS_IN_WAIT nicht ohne Kontext interpretiert werden.

    STATEEinordnung
    WAITINGSession wartet aktuell auf das angezeigte Event.
    WAITED KNOWN TIMELetzter Wait ist beendet; Dauer war bekannt.
    WAITED SHORT TIMELetzter Wait war sehr kurz.

    8. WAIT_TIME_MICRO und TIME_SINCE_LAST_WAIT_MICRO richtig lesen

    Bei aktuellen Oracle-Versionen sind WAIT_TIME_MICRO und TIME_SINCE_LAST_WAIT_MICRO für eine präzisere Diagnose geeigneter als die älteren Felder WAIT_TIME und SECONDS_IN_WAIT. Entscheidend bleibt der Sessionzustand: Bei STATE='WAITING' beschreibt WAIT_TIME_MICRO die bisherige Dauer des aktuellen Waits. Wenn die Session nicht mehr wartet, beschreibt derselbe Wert die Dauer des letzten Waits.

    TIME_SINCE_LAST_WAIT_MICRO beantwortet dagegen die Frage, wie viel Zeit seit dem Ende des letzten Waits vergangen ist. Bei einer aktuell wartenden Session ist dieser Wert 0. Damit werden aktuelle und bereits beendete Waits sauberer voneinander getrennt.

    Merksatz: Ein Eventname ohne STATE und Zeitkontext kann den letzten Wait statt eines aktuell bestehenden Problems beschreiben.

    9. P1, P2 und P3 – eventabhängige Parameter

    Viele Wait Events liefern drei numerische Zusatzparameter P1, P2 und P3 sowie beschreibende Namen P1TEXT, P2TEXT und P3TEXT. Ihre Bedeutung ist nicht universell, sondern hängt vom jeweiligen Event ab.

    Bei einem Datafile-I/O-Wait können beispielsweise Datei- und Blockinformationen enthalten sein; bei anderen Events haben dieselben Felder eine völlig andere Bedeutung.

    Aktueller Wait inklusive P1/P2/P3
    SELECT
        sid,
        serial#,
        event,
        state,
        p1text,
        p1,
        p2text,
        p2,
        p3text,
        p3
    FROM v$session
    WHERE type = 'USER'
      AND state = 'WAITING'
      AND wait_class <> 'Idle'
    ORDER BY sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#EVENTSTATEP1TEXT
    11423817db file sequential readWAITINGfile#
    ZeileP1P2TEXTP2P3TEXTP3
    17block#1204blocks1

    Was sehe ich hier? Eigenständiger I/O-Lernfall: Ein einzelner Block aus Datei 7 wird gelesen. Die Bedeutung der drei Parameter gehört immer zum konkreten Event, nicht zu ihrer bloßen Positionsnummer.

    10. Häufige Wait Events richtig weiterleiten

    Wait EventKurze EinordnungFachwissen
    db file sequential readEinzelblock-I/O; mit SQL, Objekt und Latenz korrelieren.Wait-Lexikon / Performance
    db file scattered readMehrblock-I/O; Zugriffspfad und I/O gemeinsam betrachten.Wait-Lexikon / Execution Plan
    log file syncForeground wartet im COMMIT-Kontext auf Redo-Persistenz.Redo Logs
    enq: TX - row lock contentionLock-/Transaktionskonflikt.Locks & Blockierungen
    buffer busy waitsConcurrency auf Buffer-/Blockebene; Kontext erforderlich.Wait-Lexikon
    free buffer waitsForeground findet nicht schnell genug wiederverwendbare Buffer.SGA / PGA und DBWn
    SQL*Net-WaitsNetzwerk-/Client-Kommunikation; nicht automatisch Datenbankproblem.Oracle Net
    Prinzip: Dieses Kapitel erklärt die Wait-Methodik. Die interne Mechanik des jeweiligen Fachthemas bleibt im zuständigen Fachkapitel.

    11. V$SESSION_WAIT_HISTORY: die letzten zehn Waits einer aktiven Session

    V$SESSION_WAIT_HISTORY liefert die letzten zehn Wait Events je aktiver Session. Das ist kein langfristiges Performancearchiv, kann aber bei einer gerade auffälligen Session helfen zu erkennen, ob sie wiederholt zwischen denselben Wait-Typen wechselt.

    SEQ#=1 kennzeichnet dabei den jüngsten Eintrag. Die View ersetzt keine Intervallmessung und keine historische Langzeitanalyse.

    READ ONLY – kurze Wait-Historie einer Session
    SELECT sid,
           seq#,
           event,
           p1text,
           p1,
           p2text,
           p2,
           p3text,
           p3,
           ROUND(wait_time_micro / 1000, 3) AS wait_ms
    FROM v$session_wait_history
    WHERE sid = &SID
    ORDER BY seq#;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSEQ#EVENTP1TEXTP1
    11421db file sequential readfile#7
    ZeileP2TEXTP2P3TEXTP3WAIT_MS
    1block#1204blocks12

    Was sehe ich hier? Für &SID=142 zeigt der Ausschnitt einen zuletzt abgeschlossenen Wait von 2 ms. Die Historie enthält nur wenige zurückliegende Waits und ist keine dauerhafte Zeitreihe.

    12. V$EVENT_NAME: Parameter eines Wait Events nachschlagen

    Die Bedeutung von P1, P2 und P3 ist eventabhängig. V$EVENT_NAME zeigt für die aktuelle Oracle-Version den stabilen Eventnamen, die Wait Class und die Bezeichnungen der drei Parameter. Damit sollte ein Skript nicht raten, was beispielsweise P1 bei einem beliebigen Event bedeutet.

    READ ONLY – Wait-Definition
    SELECT name,
           wait_class,
           parameter1,
           parameter2,
           parameter3
    FROM v$event_name
    WHERE name = '&WAIT_EVENT';

    Fiktive Beispielausgabe:

    NAMEWAIT_CLASSPARAMETER1PARAMETER2PARAMETER3
    db file sequential readUser I/Ofile#block#blocks

    Was sehe ich hier? Für &WAIT_EVENT=db file sequential read erklärt diese Zeile die Parameterbezeichnungen. Sie enthält keine aktuelle Messung einer Session.

    13. Instanzweite Top-Waits

    Top Non-Idle System Events
    SELECT *
    FROM (
        SELECT
            event,
            wait_class,
            total_waits,
            ROUND(time_waited_micro / 1000000, 2) AS waited_seconds
        FROM v$system_event
        WHERE wait_class <> 'Idle'
        ORDER BY time_waited_micro DESC
    )
    WHERE ROWNUM <= 30;

    Fiktive Beispielausgabe:

    EVENTWAIT_CLASSTOTAL_WAITSWAITED_SECONDS
    log file syncCommit1000050
    db file sequential readUser I/O100020

    Was sehe ich hier? Ausschnitt kumulierter Instanzwerte. 50 Sekunden können über viele Sessions und einen langen Zeitraum zusammenkommen; für aktuelle Engpässe Differenzen innerhalb eines bekannten Zeitfensters verwenden.

    Foreground und Background trennen: Die obige Gesamtliste enthält auch Hintergrundarbeit. Für einen Anteil an DB Time die Foreground-Felder und dasselbe Messintervall verwenden; Hintergrund-Waits nicht durch DB Time dividieren. DB Time ist über Sessions summierte Zeit und kann größer als die verstrichene Uhrzeit sein.

    READ ONLY – zwei Messpunkte für Foreground-Waits
    SELECT SYSTIMESTAMP AS measured_at, i.startup_time,
           e.event, e.total_waits_fg, e.time_waited_micro_fg
    FROM v$system_event e CROSS JOIN v$instance i
    WHERE e.wait_class <> 'Idle'
    ORDER BY e.event;
    READ ONLY – zugehörige DB Time und DB CPU
    SELECT SYSTIMESTAMP AS measured_at, i.startup_time,
           t.stat_name, t.value AS time_micro
    FROM v$sys_time_model t CROSS JOIN v$instance i
    WHERE t.stat_name IN ('DB time','DB CPU')
    ORDER BY t.stat_name;

    Fiktive Beispielausgabe:

    MESSPUNKTTOTAL_WAITS_FGTIME_WAITED_MICRO_FGDB_TIME_MICRO
    10:00:001000050000000400000000
    10:01:001100070000000500000000

    Zusammengeführter Ausschnitt für ein Event aus zwei zeitnahen Abfragepaaren mit identischer STARTUP_TIME, Instanz und Containerumfang. Differenz: 1.000 Waits, 20.000.000 µs = 20 s Wartezeit; Mittelwert 20 ms je Wait. DB Time steigt um 100 s; der Eventanteil beträgt in diesem Lernfall 20 %. 100 s DB Time in 60 s Uhrzeit sind wegen mehrerer Sessions möglich. Die Werte sind keine Einzel-SQL-Latenz und kein Beweis für langsames Storage. Bei Neustart, negativem Delta oder gewechseltem Messumfang nicht verrechnen. Abfragen sind keine atomare gemeinsame Momentaufnahme; Zeitmodellwerte können verzögert veröffentlicht werden. Bei Sessionmessungen zusätzlich SID, SERIAL# und Anmeldezeit festhalten.

    14. Waits einer einzelnen Session

    Kumulierte Events einer Session
    SELECT
        sid,
        event,
        total_waits,
        time_waited,
        average_wait
    FROM v$session_event
    WHERE sid = &SID
      AND wait_class <> 'Idle'
    ORDER BY time_waited DESC;

    Fiktive Beispielausgabe:

    SIDEVENTTOTAL_WAITSTIME_WAITEDAVERAGE_WAIT
    142db file sequential read100200.2

    Was sehe ich hier? Für &SID=142: TIME_WAITED und AVERAGE_WAIT sind Hundertstelsekunden. 20 / 100 = 0,2 entspricht im Mittel 2 ms pro Wait. Das ist eine Session-Summe, nicht die Dauer der aktuellen Abfrage. Für aktuelle Ursachen zusätzlich Sessionzustand und aktuelle SQL-Aktivität betrachten.

    15. Wait Event im Session- und SQL-Kontext einordnen

    Bei einer betroffenen Benutzersession hilft die SQL_ID, Wartezeiten einer konkreten Arbeit zuzuordnen. Bei einem Lock-Wait untersuchst du zusätzlich den bestätigten Blocker. Nicht jedes Event besitzt jedoch eine aktuelle SQL-Anweisung: Auch Hintergrundarbeit und Warten auf den nächsten Clientaufruf erzeugen Waits. Eine leere SQL_ID ist deshalb kein Diagnosefehler. Nutze dann Prozessart, Service, Modul, Zeitpunkt und begleitende Meldungen.

    Session, SQL und Wait gemeinsam
    SELECT
        sid,
        serial#,
        username,
        module,
        sql_id,
        status,
        event,
        wait_class,
        state,
        blocking_session_status,
        blocking_session
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    ORDER BY sid;

    Fiktive Beispielausgabe:

    Die Teilansichten gehören über dieselbe Beispielzeile zusammen. „Zeile“ ist eine Darstellungshilfe und keine SQL-Ergebnisspalte.

    ZeileSIDSERIAL#USERNAMEMODULESQL_ID
    11423817APP_USERBestellportal8u3k2m9p4q7r1
    Zusammengehörige Teilansicht: Spalten 1–5
    ZeileSTATUSEVENTWAIT_CLASSSTATE
    1ACTIVEenq: TX - row lock contentionApplicationWAITING
    Zusammengehörige Teilansicht: Spalten 6–7
    BLOCKING_SESSION_STATUSBLOCKING_SESSION
    VALID87

    Was sehe ich hier? Session 142 ist ACTIVE und wartet zugleich. BLOCKING_SESSION sollte zusätzlich über BLOCKING_SESSION_STATUS abgesichert werden; ohne gültigen Status nicht als bewiesene Blockerkennung verwenden.

    16. Viele kurze Waits oder wenige lange Waits?

    TOTAL_WAITS allein kann irreführen. Eine Million sehr kurze Waits können weniger Gesamtzeit verursachen als wenige extrem lange Wartevorgänge.

    Mittelwerte richtig zusammenfassen: Für einen gemeinsamen Mittelwert addierst du die passenden Wartezeitdifferenzen und teilst durch die Summe der zugehörigen Wait-Anzahlen. Ein einfacher Durchschnitt schon berechneter Mittelwerte wäre bei unterschiedlichen Anzahlen falsch gewichtet. Verwende denselben Zeitraum, dieselbe Einheit und denselben Messumfang. Auch ein korrekt gewichteter Mittelwert beschreibt keine einzelnen Spitzen und keine längste Wartezeit; dafür werden zusätzliche, zeitlich passende Beobachtungen benötigt. Oracle 19c.

    Deshalb sollten Anzahl, Gesamtwartezeit, durchschnittliche Latenz und Anteil an der relevanten DB Time zusammen betrachtet werden.

    17. Waits sind workloadabhängig

    Ein OLTP-System kann viele Single-Block-Reads und Commits erzeugen, ein Reporting-System große Scans und TEMP-I/O. Dieselben Waits haben daher je nach Workload eine andere Bedeutung.

    18. Systematische Wait-Diagnose

    19. Typische Fehlannahmen

    AussageBewertungKorrekte Einordnung
    Ein Wait Event ist immer ein Problem.FalschWarten ist normal; Relevanz entsteht durch Zeit und Workload.
    ACTIVE bedeutet ON CPU.FalschEine aktive Session kann innerhalb ihres Calls warten.
    Der höchste Wert in V$SYSTEM_EVENT ist automatisch das aktuelle Problem.FalschDie Werte sind kumuliert und brauchen Zeitraumbezug.
    db file sequential read bedeutet immer langsames Storage.FalschAuch zu viele physische Einzelblock-Lesevorgänge durch SQL können dominieren.
    SQL*Net Wait = Netzwerkdefekt.FalschClientverhalten und Fetch-/Round-Trip-Muster können die Ursache sein.
    Für eine alphabetische Kurzerklärung einzelner Events gibt es das Wait Event Lexikon. Für die Priorisierung der Events innerhalb eines kompletten Performancefalls geht es weiter zu Performance Tuning.
    Praxisbeispiel: Top Wait gefunden – und jetzt?

    db file sequential read steht weit oben in der Wait-Auswertung.

    Was prüfst du?
    Anteil an DB Time, Latenz, betroffene Sessions, SQL und Objekte ergänzen. Der Wait-Name allein reicht nicht.
    Lerneffekt: Ein Wait-Name ist noch keine Diagnose.

    20. Oracle-19c-Dokumentation als fachliche Grundlage

    V$SESSION / V$SESSION_WAIT
    Aktueller oder letzter Wait, STATE, WAIT_TIME_MICRO und TIME_SINCE_LAST_WAIT_MICRO
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-SESSION.html

    V$SESSION_WAIT_HISTORY
    Die letzten zehn Wait Events je aktiver Session
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-SESSION_WAIT_HISTORY.html

    V$EVENT_NAME
    Eventname, Wait Class und eventabhängige P1/P2/P3-Bezeichnungen
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-EVENT_NAME.html
    Oracle-19c-Referenzen zu den Diagnosebeispielen: Foreground-Eventzähler · Zeitmodell · Session-Events

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Ein Wait Event beschreibt, worauf Oracle wartet, und ist noch keine fertige Ursachenanalyse. Idle-Waits sind von Wartezeiten während relevanter Datenbankarbeit zu unterscheiden.
    2. Bei einer Session müssen STATE, EVENT und Zeitangaben zusammen gelesen werden. Ein angezeigter Event kann den letzten statt eines aktuell laufenden Waits beschreiben.
    3. Kumulierte Wait-Zähler benötigen vergleichbare Messpunkte. Erst Differenzen zeigen, wie viel Wartezeit und wie viele Ereignisse im untersuchten Zeitraum hinzugekommen sind.
    4. Viele kurze und wenige lange Waits können dieselbe Gesamtzeit erzeugen. Anzahl, Gesamtzeit und gewichteter Durchschnitt beantworten deshalb unterschiedliche Fragen.
    5. Eine sinnvolle Diagnose verbindet Event, Parameter, Session, SQL und fachliche Auswirkung. Optimiert wird der relevante Zeitverbrauch, nicht bloß der höchste isolierte Zähler.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Warum ist ACTIVE nicht gleichbedeutend mit ON CPU?
    Eine aktive Session befindet sich in einem aktiven Call, kann darin aber auf I/O, Lock, Redo oder andere Events warten.
    Frage 2: Was ist der Unterschied zwischen V$SESSION und V$SYSTEM_EVENT?
    V$SESSION zeigt den aktuellen Sessionkontext; V$SYSTEM_EVENT enthält instanzweit kumulierte Eventstatistiken.
    Frage 3: Warum sind P1, P2 und P3 nicht immer gleich zu interpretieren?
    Ihre Bedeutung ist eventabhängig und wird durch P1TEXT, P2TEXT und P3TEXT beschrieben.
    Frage 4: Was prüfst du bei log file sync zusätzlich?
    Unter anderem log file parallel write, Commit-Frequenz, Redo-Rate und den betroffenen Zeitraum.
    Frage 5: Warum beweist db file sequential read noch kein Storageproblem?
    Die Wartezeit kann auch durch sehr viele Einzelblockzugriffe einer SQL entstehen. SQL-Plan und I/O-Latenz müssen getrennt betrachtet werden.
    Frage 6: Warum sollte ein Wait Event mit SQL_ID und Session verbunden werden?
    Damit aus einer abstrakten Warteklasse ein konkreter Workload und damit eine prüfbare Ursache wird.
    Frage 7: Warum darf man sämtliche Background-Waits nicht als Anteil an DB Time ausgeben?
    DB Time beschreibt Foreground-Arbeit. Zähler und Nenner müssen denselben Umfang und Zeitraum haben.
    Frage 8: 1.000 zusätzliche Waits verbrauchen 20 Sekunden: Wie groß ist der Mittelwert?
    20 Millisekunden je Wait. Vor dem Rechnen identischen Messumfang, unveränderten Instanzstart und gültige Zählerdifferenzen prüfen.

    31. Performance Tuning – systematisch vom Symptom zur Ursache

    Schwerpunkt: verständlich messen, Ursachen eingrenzen, SQL-Arbeit bewerten und Verbesserungen nachweisen.

    Lernkompass
    Einfach gesagt Du suchst die Ursache eines langsamen Vorgangs anhand nachvollziehbarer Messungen.
    Warum ist das wichtig? Ein hoher Einzelwert beweist keinen Engpass. Zeitfenster, Anwendung und technische Wirkung müssen zusammenpassen.
    Nach diesem Kapitel Du kannst Messwerte auswerten, einen Diagnoseweg begründen und eine Verbesserung überprüfen.

    Einführung: Performance Tuning bedeutet, den Aufwand für eine konkrete Arbeitsaufgabe zu verstehen und begründet zu verbessern. Ausgangspunkt ist ein messbares Problem, etwa eine gegenüber dem üblichen Betrieb verlängerte Antwortzeit. Die Ursache kann in der Datenbank oder außerhalb liegen. Deshalb müssen betroffener Vorgang, Zeitraum und Umfang bekannt sein, bevor einzelne Kennzahlen bewertet werden.

    Das Kapitel verbindet die Grundlagen zu SQL, Speicher und Waits zu einem Diagnoseweg. Du gehst von der Gesamtbeobachtung über Instanz und Session bis zur einzelnen SQL-Ausführung und überprüfst anschließend, ob eine Maßnahme das ursprüngliche Problem verbessert. Die Diagnoseabfragen lesen Messwerte. Schreibende Lernreferenzen, insbesondere zur Statspack-Einrichtung und Snapshot-Erfassung, sind als solche gekennzeichnet; der Wiki-Generator führt sie nicht aus.

    Oracle 19c: fachliche Grundlage

    Hinweise zu SQL, Beispielausgaben und Voraussetzungen

    Alle Beispielwerte sind erfunden. Die direkten Ergebnistabellen zeigen sämtliche SELECT-Spalten in ihrer Reihenfolge. In geteilten Tabellen wird die erste Spalte zur Zuordnung ausdrücklich wiederholt. Gekürzte Zeilenmengen sind als Zeilenausschnitt bezeichnet; Delta- und Vergleichstabellen sind gesonderte Auswertungen.

    Die Beispiele verwenden eine einzelne Non-CDB. Für eine CDB/PDB müssen Containerbezug und Leserechte passen; eine instanzweite Summe beschreibt nicht allein die betroffene PDB. Zahlen und Datumswerte sind für das Wiki formatiert. SQL*Plus kann abhängig von seinen Einstellungen anders aussehen. NULL bezeichnet einen fehlenden Wert. Die Diagnoseabfragen lesen Messwerte. Schreibende Statspack-Schritte sind separat gekennzeichnet. Der Wiki-Generator führt keine dieser Datenbankaktionen aus.

    Historische Vergleiche brauchen zuvor gespeicherte Messpunkte. AWR, ASH, ADDM und Real-Time SQL Monitoring werden hier nicht als praktische Diagnosequelle genutzt; die Einordnung steht beim Abschnitt zu Diagnosewerkzeugen.

    Teil A – Performance verstehen und untersuchen

    Leitfrage: Welche Messung hilft, das Problem technisch einzugrenzen?

    Die Reihenfolge führt vom Problem über Messung und Sessionzuordnung zur Auswahl eines Diagnosezweigs. Danach folgen historische Auswertung und Trace-Verständnis. Teil B verbindet die Befunde mit Praxisfällen und der Erfolgskontrolle. Innerhalb jeder Karte stehen Erklärung, Auswertung und nächster Schritt zusammen.

    Problem und Messziel verstehenWas ist langsam, für wen und gegenüber welchem Vergleich?Grundlagen

    Formuliere Zeitraum, betroffenen Vorgang und ein messbares Ziel, bevor du technische Kennzahlen auswählst.

    1. Was bedeutet Performance Tuning eigentlich?

    Performance Tuning bedeutet nicht, möglichst viele Kennzahlen zu sammeln oder einen Parameter zu vergrößern. Ziel ist es, den Teil der Verarbeitung zu finden, der für die beobachtete Verzögerung verantwortlich ist. Dazu wird eine allgemeine Aussage Schritt für Schritt in eine messbare technische Fragestellung umgewandelt.

    Ein Beispiel: „Anwendung ist morgens langsam“ ist noch zu ungenau. Besser ist: „Zwischen 06:30 und 07:00 Uhr steigt die Antwortzeit einer bestimmten Funktion von normalerweise zwei Sekunden auf 20 bis 30 Sekunden; mehrere Benutzer sind betroffen.“ Jetzt existieren Zeitraum, betroffener Workload und Vergleichswert.

    Erst mit diesen Informationen kann ein DBA entscheiden, welche Messwerte relevant sind. Ein seit dem Instanzstart kumulierter Wait-Wert zeigt nicht unmittelbar, welcher Anteil während einer Störung von 20 Minuten entstanden ist. Der Zeitbezug muss zur Datenquelle passen: Instanzweite Wait-Zähler haben einen anderen Lebenszyklus als Statistiken eines einzelnen Cursors. Vergleiche deshalb passende Messpunkte aus dem betroffenen Zeitfenster.

    Symptom Was bemerkt der Benutzer oder Betrieb konkret? Antwortzeit, Durchsatz, Hänger oder Timeout?
    Zeitraum Wann begann und endete die Störung? Ist sie dauerhaft oder wiederkehrend?
    Betroffener Workload Alle Benutzer, ein Service, ein Batch, eine Schnittstelle oder nur einzelne Sessions?
    Baseline Wie sieht derselbe Workload in einem normalen Zeitraum aus?

    2. Baseline – normal muss vergleichbar sein

    Eine Baseline ist ein Vergleichszustand, der denselben oder einen sehr ähnlichen Workload repräsentiert. „Gestern war CPU niedriger“ ist keine gute Baseline, wenn gestern weniger Benutzer aktiv waren oder ein Batch nicht lief.

    Vergleichbar sein sollten nach Möglichkeit Uhrzeit, Wochentag, Benutzerzahl, Batch-Situation, Datenmenge, Anwendungsversion und Systemkonfiguration. Je mehr sich diese Faktoren unterscheiden, desto vorsichtiger muss die Differenz interpretiert werden.

    VergleichGut geeignet?Warum?
    Dienstag 06:30–07:00 gegen vorherigen normalen Dienstag 06:30–07:00Meist gutÄhnlicher Betriebs- und Workloadkontext.
    Montagmorgen gegen SonntagabendSchwachWahrscheinlich deutlich anderer Workload.
    Vor und nach einer Änderung mit gleichem Test/WorkloadSehr gutWirkung lässt sich gezielt vergleichen.

    3. Mehr Last oder mehr Aufwand pro Auftrag?

    Ein Online-Shop bearbeitet heute doppelt so viele Bestellungen wie gestern. Die Datenbank verbraucht mehr CPU und liest mehr Blöcke. Das kann zunächst zum gestiegenen Geschäft passen. Problematisch wird es, wenn zusätzlich jeder vergleichbare Auftrag mehr Arbeit verursacht oder die zugesagte Antwortzeit nicht mehr erreicht wird. Deshalb betrachten wir Gesamtlast und Aufwand pro fachlichem Vorgang getrennt.

    Fiktiver Vergleich – bereits berechnete Intervalldaten: Neutrale Lernwerte, keine Messung einer realen Umgebung.

    Kennzahl je 60 SekundenNormalMehr NachfrageZusätzlicher Aufwand
    Abgeschlossene Bestellungen100200100
    DB Time (Delta, Sekunden)50100150
    DB Time je Bestellung0,5 s0,5 s1,5 s

    Rechenweg: 100 / 200 = 0,5 Sekunden Datenbankarbeit je Bestellung im zweiten Fall. Der dritte Fall benötigt 150 / 100 = 1,5 Sekunden, also den dreifachen Aufwand pro Vorgang. Diese Zuordnung setzt im Lehrmodell voraus, dass die gemessene Datenbankarbeit ausschließlich zu diesem Bestellworkload gehört und keine wesentliche Arbeit über die Intervallgrenzen offen bleibt. Bei gemischter Instanzlast darfst du die gesamte DB Time nicht einfach durch die Bestellzahl teilen.

    Vorgehen: Die fachliche Anzahl kommt aus dem Anwendungsmonitoring. SQL-Ausführungen, Commits und Bestellungen sind keine austauschbaren Einheiten. Eine Bestellung kann viele SQL-Aufrufe erzeugen. Vergleiche denselben Geschäftsvorgang bei ähnlichen Datenmengen und dokumentiere zusätzlich Fehler, abgebrochene Aufträge und wartende Anforderungen. Sinkt nur die Zahl erfolgreich abgeschlossener Aufträge, kann eine scheinbar günstige Gesamtlast ein verschärftes Problem verdecken.

    Lösung des Vergleichs: Im zweiten Fall prüfst du Kapazität und Antwortzeit unter höherer Nachfrage. Im dritten Fall untersuchst du, welche zusätzliche Arbeit pro Bestellung entstanden ist: mehr Aufrufe, mehr verarbeitete Daten oder zusätzliche Wartezeit. Die vorhandenen Praxisfälle in Teil B helfen beim passenden Diagnosezweig.

    4. Netzwerk und Clientzeit nicht mit DB Time verwechseln

    Die vom Benutzer wahrgenommene Antwortzeit kann größer sein als die Zeit, die Oracle innerhalb eines Datenbankaufrufs verbringt. Netzwerk-Round-Trips, große Ergebnismengen, Middleware und clientseitige Verarbeitung können zusätzliche Zeit erzeugen.

    Wenn eine Anwendung 30 Sekunden meldet, Oracle für den zugehörigen Vorgang aber nur einen kleinen Teil davon aktiv arbeitet, muss die Diagnose End-to-End erweitert werden. Nicht jede langsame Anwendung ist automatisch eine langsame Datenbank.

    5. Warum der Durchschnitt langsame Anwender verbergen kann

    Ein Mittelwert beschreibt nicht, wie unterschiedlich einzelne Benutzer ihre Wartezeit erleben. In unserem Lehrbeispiel dauern 90 Aufrufe jeweils eine Sekunde und zehn Aufrufe jeweils zehn Sekunden. Der Durchschnitt liegt bei 1,9 Sekunden. Trotzdem wartet jeder zehnte Aufruf zehn Sekunden. Eine Anforderung „durchschnittlich unter zwei Sekunden“ wäre erfüllt, obwohl eine relevante Gruppe deutlich länger wartet.

    Ein Perzentil beschreibt eine Position in der sortierten Verteilung. Das 95. Perzentil, kurz P95, betrachtet den oberen Teil der Antwortzeiten. Je nach Berechnung wird zwischen Messwerten interpoliert. Im folgenden Beispiel beträgt P95 zehn Sekunden. Ein konkretes Ziel könnte lauten: P95 unter zwei Sekunden bei festgelegter Nachfrage, zusätzlich mit einer eigenen Vorgabe für Fehlerrate und Timeouts. Diese Zahlen sind eine Lehranforderung, keine Oracle-Grenzwerte.

    Vertiefung: das Zahlenbeispiel mit SQL nachvollziehen
    Lesendes Rechenbeispiel mit 100 erfundenen Antwortzeiten
    WITH messwerte AS (
      SELECT CASE WHEN LEVEL <= 90 THEN 1 ELSE 10 END AS sekunden
      FROM dual
      CONNECT BY LEVEL <= 100
    )
    SELECT COUNT(*) AS anzahl,
           ROUND(AVG(sekunden), 2) AS mittel_s,
           PERCENTILE_CONT(0.95) WITHIN GROUP
             (ORDER BY sekunden) AS p95_s,
           MAX(sekunden) AS maximum_s
    FROM messwerte;

    Ausgabe des Rechenbeispiels:

    ANZAHLMITTEL_SP95_SMAXIMUM_S
    1001,91010

    Was sehe ich hier? (90 × 1 + 10 × 10) / 100 = 1,9. P95 liegt hier innerhalb der zehn langsamen Aufrufe. Die Abfrage erzeugt ihre Daten nur als Zwischenergebnis und misst keine echte Anwendung. In der Praxis stammen die Antwortzeiten aus dem betroffenen Aufrufweg, einschließlich vereinbarter Behandlung von Fehlern und Timeouts. Eine SQL-Zählerstatistik liefert diese Einzelverteilung nicht nachträglich.

    Gelöster Diagnosefall: Prüfe, was die zehn langsamen Aufrufe verbindet. Im Lernfall greifen sie alle auf einen externen Versanddienst zu. Das Anwendungsprotokoll zeigt neun zusätzliche Sekunden dort; die Datenbankarbeit ist vergleichbar mit den schnellen Aufrufen. Der zuständige Dienst wird untersucht. Ein Index wäre aus dieser Beobachtung nicht die passende erste Maßnahme. Danach werden dieselben Aufrufgruppen, P95 und Fehlerrate erneut verglichen.

    Oracle 19c: Berechnung von PERCENTILE_CONT

    Nächster Schritt: Messwerte.

    6. Ein Bericht begleitet die Untersuchung

    Unser durchgängiger Lernfall ist ein Bericht, der normalerweise fünf Sekunden benötigt und nun morgens 25 Sekunden dauert. Der Anwender sieht weiterhin 200 Ergebniszeilen. Alle Angaben in diesem Fall sind erfunden. Gleiche Ergebniszeilenzahl bedeutet noch nicht gleiche Arbeit: Eingabewerte, gelesene Datenmenge, Aufrufzahl und gleichzeitige Last können sich geändert haben. Wir sammeln die Informationen deshalb schrittweise, statt schon jetzt einen Index oder mehr Speicher als Lösung festzulegen.

    Der Auftrag lautet: Derselbe Bericht soll mit denselben fachlichen Eingaben wieder im vereinbarten Zeitbereich liegen und weiterhin dieselben korrekten Ergebnisse liefern. Notiere Beginn und Ende aus Sicht des Anwenders. Dazu gehören auch Auswahl, Übertragung und Darstellung. Eine nur im Datenbankclient gemessene SQL-Zeit ersetzt diese Messung nicht.

    Frage an den AnwenderWarum sie wichtig ist
    Welche Funktion und welche Eingaben?Identifiziert den reproduzierbaren Vorgang.
    Seit wann, wie oft und bei wem?Grenzt Zeitfenster und betroffene Gruppe ein.
    Wie wurde die Dauer gemessen?Verhindert den Vergleich unterschiedlicher Messgrenzen.
    Was hat sich geändert?Liefert Hypothesen, aber noch keinen Kausalitätsbeweis.

    Zwischenergebnis: Wir haben eine prüfbare Fragestellung. Die Ursache ist noch offen. Als Nächstes benötigen wir Messwerte aus genau diesem Zeitraum.

    Messwerte und Zeitbezug verstehenZähler, Momentaufnahmen und Intervallwerte sicher auseinanderhalten.Grundlagen

    Diese Karte brauchst du vor jeder Gegenüberstellung zweier Messungen. Beginne mit dem Zeitbezug; bewerte erst danach Zahlen und Verhältnisse.

    1. Die Diagnosekette

    Symptom → Zeitraum → Baseline → DB Time → CPU oder Wait? → Ressource / Session → Ursache → Nachmessung
    Merksatz: Ein auffälliger Wert ist ein Hinweis, noch keine Ursache. Gute Performanceanalyse verbindet Zeit, Workload und technische Wirkung.

    Vom Befund zum nächsten Fachthema:

    Ergebnis aus Kapitel 31Weiter in
    Bestimmtes SQL als Verursacher isoliertSQL-Tuning-Kapitel
    Execution-Plan-Frage erforderlichExecution-Plan-Trainer
    User-I/O / konkretes Wait Event dominantWait-Event-Kapitel / Wait-Lexikon
    Redo-/Commit-Pfad auffälligRedo-Logs-Kapitel
    Blocking / LocksLocks & Blockierungen
    SGA-/PGA-/Workarea-HinweiseSGA-und-PGA-Kapitel
    Session-/ProzessproblemSessions und Prozesse

    2. Drei Arten von Performancewerten unterscheiden

    Bevor ein Wert interpretiert wird, muss klar sein, welchen Zeitbezug er besitzt. Das verhindert einen der häufigsten Diagnosefehler: einen seit Tagen aufsummierten Wert so zu behandeln, als beschreibe er die aktuelle Minute.

    ArtBedeutungBeispielWichtig für die Interpretation
    Kumulativer ZählerWächst typischerweise seit Instance-Start.V$SYSSTAT, V$SYS_TIME_MODEL, V$SYSTEM_EVENTFür einen Zeitraum zwei Messpunkte bilden und die Differenz betrachten.
    IntervallmetrikBeschreibt einen kurzen aktuellen Messzeitraum.V$SYSMETRICBEGIN_TIME, END_TIME und Einheit beachten.
    MomentaufnahmeZeigt den Zustand zum Zeitpunkt der Abfrage.V$SESSIONEine einzelne Momentaufnahme kann kurze Peaks verpassen.

    3. Warum Delta-Werte so wichtig sind

    Oracle weist bei kumulativen Performance-Statistiken darauf hin, dass für einen interessierenden Zeitraum die Änderung zwischen Anfang und Ende betrachtet werden soll. Genau das ist ein Delta. Hat ein Wait Event seit Instance-Start 50.000 Sekunden gesammelt, wissen wir damit noch nicht, ob es während der aktuellen Störung relevant war.

    Ein Delta beantwortet die bessere Frage: Wie viel dieses Wertes ist genau während meines Problemzeitraums neu entstanden? Erst dann lassen sich unterschiedliche Zeitanteile sinnvoll vergleichen.

    Beispiel:
    Messpunkt A: DB Time = 100.000 Sekunden.
    Fünf Minuten später: DB Time = 101.200 Sekunden.

    Das Delta beträgt 1.200 Sekunden DB Time in fünf Minuten realer Zeit. Das ist möglich, weil mehrere Foreground Sessions gleichzeitig DB Time erzeugen können.

    So hältst du deine Messpunkte fest: Lies zuerst Uhrzeit und Instanzstart. Speichere die folgenden Zählerabfragen mit diesem Messpunkt, etwa per SQL*Plus SPOOL. Wiederhole beides nach dem gewählten Intervall. Vergleiche nur dieselbe Instanz ohne zwischenzeitlichen Neustart; verwende die tatsächliche Zeitdifferenz.

    READ ONLY – Messzeit und Instanzstart kontrollieren
    SELECT TO_CHAR(SYSTIMESTAMP,
                   'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM') AS messzeit,
           instance_name,
           TO_CHAR(startup_time, 'YYYY-MM-DD HH24:MI:SS') AS instanzstart
    FROM v$instance;

    Fiktive SQL-Ausgabe:

    MESSZEITINSTANCE_NAMEINSTANZSTART
    2026-10-06 06:45:00.000 +02:00DEMODB2026-10-01 08:00:00

    Was sehe ich hier? Mit dieser Zeile dokumentierst du den Messpunkt. Die zweite Messung muss dieselbe Instanz und denselben Startzeitpunkt betreffen. Uhrzeit und Zeitzone müssen auch zu den Anwendungs- und Hostdaten passen.

    4. DB Time – die zentrale Zeitgröße

    DB Time ist die aufsummierte Zeit, die Foreground Sessions innerhalb von Datenbankaufrufen aktiv verbringen. Dazu gehört CPU-Zeit und nicht-idle Wartezeit. Idle-Waits wie das Warten einer untätigen Session auf die nächste Client-Anfrage gehören nicht zur eigentlichen Arbeitszeit.

    DB Time ist keine Wanduhrzeit. Wenn vier Sessions gleichzeitig jeweils eine Minute aktiv arbeiten, können in einer realen Minute ungefähr vier Minuten DB Time entstehen. Deshalb kann DB Time deutlich größer sein als die verstrichene Zeit.

    Die Größe ist besonders nützlich, weil CPU und unterschiedliche Wait-Arten auf einer gemeinsamen Skala – Zeit – verglichen werden können.

    DB Time und DB CPU – kumulativ seit Instance-Start
    SELECT
        stat_name,
        ROUND(value / 1000000, 2) AS seconds
    FROM v$sys_time_model
    WHERE stat_name IN ('DB time', 'DB CPU')
    ORDER BY stat_name;

    Fiktive SQL-Ausgabe:

    STAT_NAMESECONDS
    DB CPU400
    DB time1000

    Was sehe ich hier? V$SYS_TIME_MODEL liefert Mikrosekunden; die Abfrage rechnet in Sekunden um. DB time erfasst aktive Foreground-Zeit, DB CPU deren CPU-Anteil. Die Werte sind kumuliert. Erst eine zweite Messung grenzt ein Intervall ein. Beispiel nach 60 Sekunden: DB CPU = 460 und DB time = 1.240. Das ergibt 60 CPU-Sekunden und 240 Sekunden DB Time, keine Antwortzeit von 240 Sekunden für einen Benutzer.

    5. DB Time und DB CPU gemeinsam lesen

    Beobachtung im gleichen ZeitraumErste DenkrichtungNoch kein Beweis für
    DB Time steigt stark, DB CPU steigt ebenfalls stark.CPU-Arbeit ist ein wesentlicher Anteil der aktiven Zeit.CPU-Sättigung des Hosts.
    DB Time steigt stark, DB CPU deutlich weniger.Zusätzliche Zeit liegt wahrscheinlich in nicht-idlen Waits.Ein bestimmtes Wait Event als Ursache.
    Host-CPU hoch, DB CPU unauffällig.Andere Prozesse oder Oracle-Background-Aktivität mitprüfen.Dass die Foreground-DB-Last CPU-bound ist.
    DB CPU hoch, Host hat noch freie CPU.Oracle erzeugt viel CPU-Arbeit, aber der Host muss nicht gesättigt sein.CPU-Mangel.

    6. Aktuelle Last mit V$SYSMETRIC einordnen

    V$SYSMETRIC ist für eine aktuelle Diagnose hilfreich, weil die Werte bereits auf kurze Zeitintervalle bezogen sind. Damit kann man erkennen, wie sich CPU, Wait-Anteil, Executions sowie logische und physische Reads aktuell verhalten.

    Auch hier gilt: Ein einzelner Wert besitzt keinen universellen Grenzwert. Die Frage lautet immer, ob er zum aktuellen Workload passt und ob er sich im Problemzeitraum gegenüber dem Normalzustand verändert hat.

    Aktuelle Systemmetriken
    SELECT
        begin_time,
        end_time,
        metric_name,
        ROUND(value, 2) AS value,
        metric_unit
    FROM v$sysmetric
    WHERE group_id = 2
      AND metric_name IN (
            'Host CPU Utilization (%)',
            'CPU Usage Per Sec',
            'Database CPU Time Ratio',
            'Database Wait Time Ratio',
            'Executions Per Sec',
            'Logical Reads Per Sec',
            'Physical Reads Per Sec',
            'Physical Writes Per Sec',
            'Redo Generated Per Sec'
          )
    ORDER BY metric_name;

    Fiktive SQL-Ausgabe:

    BEGIN_TIMEEND_TIMEMETRIC_NAMEVALUEMETRIC_UNIT
    2026-10-06 10:00:002026-10-06 10:01:00CPU Usage Per Sec100CentiSeconds Per Second
    2026-10-06 10:00:002026-10-06 10:01:00Database CPU Time Ratio25% Cpu/DB_Time
    2026-10-06 10:00:002026-10-06 10:01:00Database Wait Time Ratio75% Wait/DB_Time
    2026-10-06 10:00:002026-10-06 10:01:00Executions Per Sec50Executions Per Second
    2026-10-06 10:00:002026-10-06 10:01:00Host CPU Utilization (%)35% Busy/(Idle+Busy)
    2026-10-06 10:00:002026-10-06 10:01:00Logical Reads Per Sec12000Blocks Per Second
    2026-10-06 10:00:002026-10-06 10:01:00Physical Reads Per Sec200Blocks Per Second
    2026-10-06 10:00:002026-10-06 10:01:00Physical Writes Per Sec80Blocks Per Second
    2026-10-06 10:00:002026-10-06 10:01:00Redo Generated Per Sec1048576Bytes Per Second

    Was sehe ich hier? Alle neun Metriken stammen im Beispiel aus demselben Messfenster, 10:00 bis 10:01 Uhr; BEGIN_TIME und END_TIME stehen in der SQL-Ausgabe. 100 Hundertstelsekunden CPU je Sekunde entsprechen im Mittel einer CPU-Ausführungseinheit. Die 35 Prozent beziehen sich auf den Host. Vergleiche die Einheit, nicht nur die Zahl.

    7. Beobachtung, Hypothese und Beleg strikt trennen

    Eine saubere Performanceanalyse unterscheidet drei Ebenen. Das verhindert, dass eine Vermutung unbemerkt zur vermeintlichen Tatsache wird.

    EbeneBeispiel
    BeobachtungZwischen 06:30 und 06:45 Uhr stieg das DB-Time-Delta deutlich an.
    HypotheseDie zusätzliche DB Time könnte hauptsächlich durch User-I/O entstanden sein.
    BelegIm selben Intervall dominiert User-I/O die zusätzliche Wait-Zeit; betroffene Sessions zeigen passende I/O-Waits und der Host zeigt gleichzeitig erhöhte I/O-Latenz.
    Merksatz: Korrelation ist noch keine Kausalität. Zwei gleichzeitig auffällige Werte müssen technisch zusammenpassen, bevor einer als Ursache bezeichnet wird.

    8. Ratios sind Indikatoren, keine Beweise

    Oracle weist ausdrücklich darauf hin, dass Ratios wie Buffer Cache Hit Ratio, Soft-Parse Ratio oder Latch Hit Ratio nicht als alleiniger Beweis für einen Bottleneck verwendet werden sollen. Sie können Hinweise liefern, müssen aber mit anderen Performanceinformationen kombiniert werden.

    Eine Buffer Cache Hit Ratio von 99 % kann beispielsweise gut aussehen und trotzdem kann eine Anwendung zu viele logische Reads erzeugen oder einzelne notwendige physische I/Os können langsam sein. Umgekehrt kann eine niedrigere Ratio bei einem scanlastigen Workload völlig plausibel sein.

    9. AWR, ASH, ADDM und Statspack im Kontext dieses Wikis

    Oracle bietet mit AWR, ASH und ADDM umfangreiche historische beziehungsweise automatische Performanceanalyse. ADDM arbeitet top-down vom Symptom zur Root Cause und verwendet DB Time als zentrale Größe. Diese Methodik ist für das Verständnis sehr wertvoll.

    Dieses Wiki ist jedoch auf Oracle 19c Standard Edition 2 und eine lizenzbewusste read-only Diagnose ausgerichtet. Deshalb werden AWR-/ASH-/ADDM-Abfragen hier nicht als praktische Diagnosequelle verwendet. Für eigene historische Vergleiche können bewusst erhobene Snapshots erlaubter dynamischer Views oder ein passend betriebener Statspack-Ansatz verwendet werden. Der Abschnitt Statspack – historische Performance erfassen und verstehen erklärt Sammlung, Intervallbericht und Auswertung; schreibende Schritte sind dort ausdrücklich als Lernreferenz gekennzeichnet.

    Management-Pack-Parameter nur anzeigen
    SELECT
        name,
        value
    FROM v$parameter
    WHERE name = 'control_management_pack_access';

    Fiktive SQL-Ausgabe:

    NAMEVALUE
    control_management_pack_accessNONE

    Was sehe ich hier? Das ist eine technische Parametereinstellung, kein Lizenznachweis. Der Diagnoseweg hier verwendet weiterhin keine AWR-/ASH-/ADDM- oder SQL-Monitoring-Abfragen. Bei anderer Ausgabe darf daraus keine automatische Nutzungsberechtigung abgeleitet werden.

    Lizenzhinweis: Kapitel 31 verwendet keine praktischen Abfragen gegen V$ACTIVE_SESSION_HISTORY, DBA_HIST_* oder ADDM-Funktionen. Die jeweilige Oracle-Lizenzierung muss für die konkrete Umgebung separat geprüft werden.

    Nächster Schritt: Sessions.

    10. Einen Messpunkt vollständig dokumentieren

    Ein Wert ohne Herkunft ist später schwer verwendbar. Speichere Datenbank, Instanz, Startzeit, Container, Erfassungszeit, Quelle und Einheit gemeinsam. Bei einer Session gehören SID und SERIAL# dazu. Die Erfassung mehrerer Views ist nicht automatisch eine einzige konsistente Momentaufnahme; bei kurzen Vorgängen können zeitliche Abstände die Zuordnung erschweren.

    Zwei kumulierte Zähler dürfen nur dann sinnvoll subtrahiert werden, wenn sie denselben Gegenstand ohne Reset dazwischen beschreiben. Bei einem Neustart oder einer wiederverwendeten Sessionkennung beginnt eine andere Messreihe. Einen negativen Unterschied nicht einfach auf null setzen: Ursache und Vergleichbarkeit prüfen. Auch positive Differenzen können ungültig sein, wenn die Identität gewechselt hat.

    11. Rechenbeispiel: Gesamtlast und Aufwand je Auftrag

    Fiktives 60-Sekunden-IntervallNormalAuffällig
    Erfolgreiche vergleichbare Berichte2040
    Zusätzliche DB Time40 s80 s
    DB Time je Bericht2 s2 s

    Die gesamte aktive Datenbankzeit hat sich verdoppelt, die Arbeit pro Bericht in diesem vereinfachten Beispiel nicht. Das erklärt noch keine individuelle Antwortzeit: Gleichzeitigkeit und Warteschlangen können einzelne Berichte verzögern. DB Time geteilt durch Intervalllänge ergibt hier rund 0,67 beziehungsweise 1,33 durchschnittlich aktive Sessions. Das ist eine Zeitmittelgröße, keine Zählung angemeldeter Benutzer und kein Prozentwert der Host-CPU.

    Nächster Schritt: Für unseren 25-Sekunden-Bericht die betroffene Session oder eindeutig markierte Anwendungsarbeit untersuchen. Instanzweite Summen allein können dessen Anteil nicht belegen.

    Oracle 19c: Time Model
    Sessions und AnwendungskontextVom betroffenen Vorgang zu Verbindung, Service und SQL.Sessions

    Prüfe zuerst den Zustand einer Session. Ordne danach Service, Modul und Anweisung zu; ein Event ohne STATE kann ein vergangenes Warten beschreiben.

    1. Session-Zustände richtig lesen

    BeobachtungBedeutungTypischer nächster Schritt
    ACTIVE + STATE = WAITINGSession wartet aktuell auf das angezeigte Event.Wait Class/Event und Dauer einordnen.
    ACTIVE + nicht WAITINGSession kann aktuell CPU verbrauchen.Mit DB CPU und Host-CPU korrelieren.
    INACTIVESession verarbeitet aktuell keinen User Call.Nicht allein wegen langer Existenz als Performanceproblem werten.
    BLOCKING_SESSION_STATUS = 'VALID'Oracle hat eine blockierende Session zugeordnet.In das Lock-/Blocking-Kapitel wechseln.

    2. Aktive Sessions – wer ist im Moment beteiligt?

    Systemweite Kennzahlen zeigen, dass Last vorhanden ist. Eine Session-Sicht hilft zu erkennen, wer aktuell beteiligt ist. Dabei ist STATUS='ACTIVE' kein Synonym für „Problem“. Eine aktive Session kann gerade CPU verwenden oder auf ein nicht-idles Event warten.

    Wichtig ist außerdem der Unterschied zwischen STATE='WAITING' und dem letzten Wait einer Session. Oracle dokumentiert V$SESSION.EVENT als aktuelles Event, wenn die Session wartet, beziehungsweise als zuletzt beobachtetes Event, wenn sie gerade nicht wartet. Deshalb darf ein Event-Name ohne den Sessionzustand nicht blind als aktueller Wait interpretiert werden.

    Aktive User-Sessions
    SELECT
        sid,
        serial#,
        username,
        service_name,
        module,
        action,
        status,
        sql_id,
        state,
        wait_class,
        event,
        last_call_et,
        blocking_session
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    ORDER BY service_name, sid;

    Fiktive SQL-Ausgabe: Zeilenausschnitt; weitere Treffer sind möglich.

    Erste Spalten des Ergebnisses.

    SIDSERIAL#USERNAMESERVICE_NAMEMODULE
    1423817APP_USERAPP_SERVICEBestellungen
    1433818APP_USERAPP_SERVICEArtikelsuche

    Weitere Spalten – SID zur Zuordnung wiederholt.

    SIDACTIONSTATUSSQL_IDSTATEWAIT_CLASS
    142SpeichernACTIVE7a1b2c3d4f5g6WAITINGApplication
    143LesenACTIVE8a1b2c3d4f5g6WAITED KNOWN TIMEUser I/O

    Weitere Spalten – SID zur Zuordnung wiederholt.

    SIDEVENTLAST_CALL_ETBLOCKING_SESSION
    142enq: TX - row lock contention2087
    143db file sequential read2NULL

    Was sehe ich hier? Nur die erste Zeile zeigt aktuelles Warten auf das genannte Event. In Zeile zwei beschreibt EVENT den letzten Wait. Service, Modul und SQL_ID in den weiteren Spaltenblöcken helfen bei der Zuordnung. LAST_CALL_ET ist nicht automatisch die Laufzeit einer einzelnen SQL-Ausführung. Die SQL_ID führt zur weiteren Untersuchung im Lernblock „SQL gezielt untersuchen“; ausführliche Planmechanik erklärt das Plan-Kapitel.

    3. Service und Anwendungskontext erhalten

    Eine Datenbank kann mehrere Anwendungen oder Services gleichzeitig bedienen. Eine globale Kennzahl kann deshalb ein lokales Problem verdecken. Wenn die Anwendung MODULE, ACTION oder CLIENT_IDENTIFIER setzt, helfen diese Angaben, den betroffenen Workload zu isolieren.

    Das ist besonders wichtig, wenn beispielsweise nur Webanwendung oder ein Batch betroffen ist, während andere Services normal arbeiten. Performanceanalyse soll den tatsächlich betroffenen Workload erklären und nicht nur den Durchschnitt der gesamten Instance.

    Aktive Sessions nach Service und Modul
    SELECT
        service_name,
        module,
        action,
        client_identifier,
        COUNT(*) AS active_sessions
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    GROUP BY
        service_name,
        module,
        action,
        client_identifier
    ORDER BY active_sessions DESC;

    Fiktive SQL-Ausgabe: Zeilenausschnitt; weitere Treffer sind möglich.

    SERVICE_NAMEMODULEACTIONCLIENT_IDENTIFIERACTIVE_SESSIONS
    APP_SERVICEBestellungenSpeichernBATCH_DEMO6
    REPORT_SERVICEUmsatzberichtLesenREPORT_DEMO2

    Was sehe ich hier? CLIENT_IDENTIFIER ist Teil der Gruppierung und wird deshalb mit angezeigt. Sechs aktive Sessions bedeuten weder sechs CPUs noch sechs Fehler. Die folgenden Prüfungen bleiben auf den betroffenen Service und Vorgang eingegrenzt.

    Nächster Schritt: Waits oder CPU.

    4. Eine Geschäftsaktion ist nicht automatisch eine Session

    Ein Connection Pool kann eine Anfrage über verschiedene Verbindungen bearbeiten. Umgekehrt kann eine Verbindung nacheinander viele Anfragen bedienen. PROGRAM oder USERNAME allein identifizieren deshalb selten einen einzelnen Bericht. MODULE, ACTION und CLIENT_IDENTIFIER helfen nur, wenn die Anwendung sie passend setzt und bei Wiederverwendung aktualisiert. Leere Felder sind keine Einladung, den Zusammenhang zu erfinden.

    Für den Lernfall bestätigt das Anwendungsteam ein Zeitfenster und die tatsächlich verwendete Verbindung. Wir erfassen SID, SERIAL#, Service und den SQL-Kontext während der Verzögerung. Eine später ausgelesene SQL_ID kann bereits zu einer anderen Anweisung gehören. Halte Beobachtungszeit und Unsicherheit fest. Wenn die Zuordnung nicht gelingt, ist gezielte zusätzliche Erfassung der nächste Schritt; ein zufällig teures SQL einer anderen Session erklärt den Bericht nicht.

    Oracle 19c: Sessionkontext
    Den nächsten Diagnoseweg auswählenAus Beobachtungen eine prüfbare Hypothese ableiten.Grundlagen

    1. Zuerst die offene Frage benennen

    Nach den ersten Messungen entscheidest du, welche Information als Nächstes fehlt. Du musst nicht bei jeder Störung alle folgenden Karten vollständig abarbeiten. Wähle den Zweig, der den betroffenen Vorgang im passenden Zeitraum am besten erklärt. Mehrere Ursachen können gleichzeitig wirken; nach einer Verbesserung kann ein anderer Anteil sichtbar werden.

    BeobachtungArbeitshypotheseGeeignete Gegenprobe
    Hohe Host-CPU, wenig zugeordnete DB CPUAndere Prozesse oder andere Datenbanken tragen zur Last bei.Prozessverbrauch zeitgleich prüfen.
    Betroffene Session wartet auf eine andere SessionOffene Transaktion verzögert den Vorgang.Blockeridentität, Transaktion und Anwendungskontext zusammenführen.
    Mehr Reads bei ähnlicher Zeit je ReadDer Vorgang erzeugt mehr I/O-Arbeit.Datenmenge, Ausführungszahl und SQL-Aufwand vergleichen.
    Ähnliche Read-Anzahl bei höherer WartezeitI/O-Pfad oder Konkurrenz beeinflusst die Dauer.Passende OS-/Storage-Messung im gleichen Zeitfenster.
    Hohe Anzahl kleiner SQL-AufrufeWiederholte Arbeit summiert sich.Aufrufzahl je Geschäftsaktion bestimmen.
    Viel Anwenderzeit, wenig zugeordnete DB-ArbeitEin anderer Anteil des Ablaufs ist relevant.Client-/Anwendungszeit und Zuordnung der DB-Messung prüfen.

    2. Den Bericht noch nicht vorschnell erklären

    Im Lernfall sehen wir mehr kleine SQL-Aufrufe während des Berichts. Das ist zunächst eine Beobachtung. Ob die Abfragen zusätzliche Zeit verursachen und ob sie fachlich vermeidbar sind, muss noch geklärt werden. Der SQL-Zweig ist daher sinnvoller als eine pauschale Speicheränderung. Bleibt die Zuordnung zum Bericht ungesichert, kehren wir zur Sessionkarte zurück.

    3. Einen Untersuchungszweig begründet beenden

    Notiere: Welche Vermutung wurde geprüft? Welcher Befund spricht dafür oder dagegen? Was bleibt offen? „Keine Blockierung zum Messzeitpunkt“ widerlegt keine Blockierung zehn Minuten zuvor. Ein ausgeschlossener aktueller Befund und eine nicht messbare Vergangenheit sind verschiedene Ergebnisse.

    CPU, Host und ergänzende KontrollenHostlast und Datenbankarbeit unterscheiden, Fortschritt und Grenzen einordnen.CPU

    Nutze diese Karte bei CPU-Verdacht oder wenn die Zeitbilanz durch Hostzustand, Ressourcenlimits und Protokolle ergänzt werden muss.

    1. CPU – Datenbank-CPU und Host-CPU auseinanderhalten

    DB CPU beschreibt CPU-Zeit innerhalb von User Calls. Die CPU-Auslastung des Hosts umfasst dagegen die gesamte Maschine: Oracle-Foreground-Prozesse, Background-Prozesse und alle anderen Betriebssystemprozesse.

    Darum ist „DB CPU hoch“ nicht gleichbedeutend mit „CPU ist voll“. Ebenso kann ein Host CPU-seitig belastet sein, obwohl die Foreground-DB-CPU nicht der Hauptverursacher ist.

    Für eine Oracle-19c-SE2-Umgebung ist diese Trennung besonders wichtig: Die technische CPU-/Thread-Begrenzung der Edition muss bei der Bewertung des tatsächlich nutzbaren Datenbankdurchsatzes mitgedacht werden. Ein großer Host bedeutet nicht automatisch, dass eine einzelne SE2-Datenbank beliebig viele CPU-Threads gleichzeitig nutzen kann.

    Aktuelle CPU-Metriken aus Oracle
    SELECT
        metric_name,
        ROUND(value, 2) AS value,
        metric_unit,
        begin_time,
        end_time
    FROM v$sysmetric
    WHERE group_id = 2
      AND metric_name IN (
            'Host CPU Utilization (%)',
            'CPU Usage Per Sec',
            'Database CPU Time Ratio'
          )
    ORDER BY metric_name;

    Fiktive SQL-Ausgabe:

    METRIC_NAMEVALUEMETRIC_UNITBEGIN_TIMEEND_TIME
    CPU Usage Per Sec200CentiSeconds Per Second2026-10-06 11:00:002026-10-06 11:01:00
    Database CPU Time Ratio80% Cpu/DB_Time2026-10-06 11:00:002026-10-06 11:01:00
    Host CPU Utilization (%)40% Busy/(Idle+Busy)2026-10-06 11:00:002026-10-06 11:01:00

    Was sehe ich hier? Diese drei Zahlen haben verschiedene Bezugsgrößen: etwa zwei CPU-Ausführungseinheiten, 80 Prozent CPU-Anteil an DB Time und 40 Prozent Hostauslastung. 80 Prozent DB-CPU-Anteil bedeuten nicht, dass der Host zu 80 Prozent ausgelastet ist. Die tatsächlichen Einheiten und Messfenster stehen in der View.

    2. Hostzustand unter Solaris gegenprüfen

    Oracle-Metriken allein beschreiben nicht den gesamten Host. Deshalb gehört bei CPU-, Memory- oder I/O-Verdacht immer eine Betriebssystemsicht dazu. Entscheidend ist die zeitliche Korrelation: Hostdaten müssen aus demselben Zeitraum stammen wie die Datenbankauffälligkeit.

    Solaris – read-only Host-Check
    /usr/bin/uptime
    
    /usr/bin/vmstat 1 5
    
    /usr/sbin/swap -s
    
    /usr/bin/iostat -xn 1 5
    
    /usr/bin/ps -eo pcpu,pid,args | /usr/bin/sort -nr | /usr/bin/head -20
    Was sehe ich hier?
    vmstat hilft CPU- und Speicherzustand einzuordnen, swap -s zeigt Swap-Nutzung, iostat -xn liefert eine Storage-Sicht und ps zeigt CPU-starke Prozesse. Einzelne Samples sind Momentaufnahmen und sollten bei kurzen Peaks mehrfach erhoben werden.

    3. Ressourcenlimits – Nähe zum Limit erkennen

    Ein Performanceproblem kann durch knappe Ressourcen begleitet werden. V$RESOURCE_LIMIT zeigt unter anderem aktuelle und maximale Nutzung von Prozessen und Sessions. Dabei ist MAX_UTILIZATION ein Peak seit Instance-Start und nicht die aktuelle Belegung.

    Processes und Sessions
    SELECT
        resource_name,
        current_utilization,
        max_utilization,
        limit_value
    FROM v$resource_limit
    WHERE resource_name IN ('processes', 'sessions')
    ORDER BY resource_name;

    Fiktive SQL-Ausgabe:

    RESOURCE_NAMECURRENT_UTILIZATIONMAX_UTILIZATIONLIMIT_VALUE
    processes180290300
    sessions210360472

    Was sehe ich hier? Aktuell werden 180 von 300 Prozessen verwendet, also 60 Prozent. Der Höchststand von 290 entspricht rund 96,7 Prozent und kann aus einem früheren Zeitraum stammen. Das ist ein Anlass zur Verlaufskontrolle, kein Beleg für eine jetzige Erschöpfung.

    4. Long Operations – Fortschritt langer Vorgänge erkennen

    V$SESSION_LONGOPS kann für bestimmte länger laufende Operationen Fortschrittsinformationen bereitstellen. Dazu gehören beispielsweise bestimmte Scans, Sortierungen oder Backupvorgänge.

    Nicht jede lange Datenbankoperation erscheint dort. Eine leere Abfrage bedeutet daher nicht, dass keine lange oder langsame Arbeit existiert. Die View ist eine zusätzliche Diagnosequelle.

    Aktuell laufende Long Operations
    SELECT
        sid,
        serial#,
        opname,
        target,
        sofar,
        totalwork,
        units,
        ROUND(sofar / NULLIF(totalwork, 0) * 100, 2) AS pct_done,
        elapsed_seconds,
        time_remaining
    FROM v$session_longops
    WHERE totalwork > 0
      AND sofar < totalwork
    ORDER BY elapsed_seconds DESC;

    Fiktive SQL-Ausgabe: Zeilenausschnitt; weitere Treffer sind möglich.

    Erste Spalten des Ergebnisses.

    SIDSERIAL#OPNAMETARGETSOFAR
    2104410Table ScanAPP_USER.BESTELLUNGEN25000

    Weitere Spalten – SID zur Zuordnung wiederholt.

    SIDTOTALWORKUNITSPCT_DONEELAPSED_SECONDSTIME_REMAINING
    210100000Blocks253090

    Was sehe ich hier? Die angezeigte Operation ist nach ihrer gemeldeten Arbeitseinheit zu einem Viertel fertig. UNITS könnte beispielsweise Blocks enthalten. TIME_REMAINING ist eine Schätzung für diese Operation, keine Zusage für das Ende eines ganzen Berichts oder Backups.

    5. Alert Log als zeitliche Zusatzquelle

    Performancewerte erklären nicht jedes Ereignis. Das Alert Log kann zum selben Zeitpunkt Hinweise auf Checkpoint-Probleme, Archiver-Störungen, Speicherfehler, interne Fehler oder Neustarts liefern.

    Auch hier gilt das Kausalitätsprinzip: Eine Meldung ist nicht deshalb Ursache, weil sie auffällig aussieht. Sie muss zeitlich und technisch zur beobachteten Wirkung passen.

    Die detaillierte Alert-Log-Auswertung bleibt im entsprechenden Diagnosekapitel. Kapitel 31 verwendet das Alert Log nur als Teil der gemeinsamen Zeitachse.

    Nächster Schritt: Passender Praxisfall.

    6. Von hoher Auslastung zur verantwortlichen Arbeit

    Hohe Auslastung kann nützliche zusätzliche Arbeit bedeuten. Die entscheidende Frage lautet, ob das vereinbarte Ziel verletzt wird und welche Arbeit dazu beiträgt. Vergleiche deshalb Auftragsmenge und Antwortzeit mit dem CPU-Verbrauch. Ein Hostwert umfasst auch andere Instanzen, Sicherungsprozesse und Betriebssystemarbeit. Ein hoher Oracle-Prozesswert muss erst der passenden Session zugeordnet werden.

    Im Berichtfall wäre die Hypothese „CPU ist schuld“ erst dann tragfähig, wenn zeitgleiche Messungen den verantwortlichen Anteil zeigen. Geringe CPU im späteren Morning Check sagt nichts Sicheres über die frühere Spitze aus. Die nächste Messung soll diese zeitliche Lücke schließen; eine Parameteränderung würde sie nicht schließen.

    Waits und Blocking einordnenVon der Warteklasse zum konkreten Event und zur Sperrkette.Waits

    Priorisiere die im Problemfenster hinzugekommene Wartezeit. Prüfe anschließend das Event und die betroffenen Verbindungen.

    1. Waits – Zeit, in der eine Session auf etwas wartet

    Eine Datenbanksession kann nicht nur CPU verbrauchen. Sie kann auch darauf warten, dass eine benötigte Ressource oder ein Ereignis abgeschlossen wird. Oracle fasst solche Wartezustände als Wait Events zusammen.

    Ein Wait Event ist zunächst eine Beschreibung dessen, worauf Oracle wartet. Es ist nicht automatisch die Root Cause. Ein I/O-Wait kann beispielsweise entstehen, weil sehr viele Blöcke angefordert werden, weil einzelne I/Os langsam sind oder weil beides gleichzeitig passiert.

    Darum beginnt die Analyse meist nicht mit einem einzelnen Event, sondern mit der Frage, welche Wait Class einen relevanten Anteil der Zeit ausmacht.

    2. Wait Classes als erste Sortierung

    Wait ClassEinfach erklärtTypische Denkrichtung
    User I/OForeground-Arbeit wartet auf Daten-I/O.I/O-Menge, Latenz, betroffene Files und Workload vergleichen.
    System I/OOracle-interne beziehungsweise Background-I/O-Aktivität.Checkpoint, DBWR, Controlfile- oder andere System-I/O-Vorgänge einordnen.
    CommitForeground wartet im Commit-Pfad.Redo, LGWR, Commit-Frequenz und Redo-I/O betrachten.
    ConcurrencyMehrere Prozesse konkurrieren um interne Ressourcen.Konkretes Event bestimmen; nicht automatisch Row Locks annehmen.
    ApplicationWartezeit entsteht durch anwendungsnahe Synchronisation.Locks und Anwendungsmuster untersuchen.
    ConfigurationWartezeit steht mit Konfiguration/Ressourcenbereitstellung in Verbindung.Konkretes Event und Systemzustand prüfen.
    NetworkKommunikation zwischen Client und Datenbank ist beteiligt.Round Trips, Ergebnismengen und End-to-End-Zeit einordnen.
    IdleSession wartet auf neue Arbeit.Normalerweise keine Performancearbeit; bei DB-Time-Analyse ausblenden.
    Wait Classes – kumulativ seit Instance-Start
    SELECT
        wait_class,
        total_waits,
        ROUND(time_waited / 100, 2) AS waited_seconds,
        total_waits_fg,
        ROUND(time_waited_fg / 100, 2) AS foreground_waited_seconds
    FROM v$system_wait_class
    WHERE wait_class <> 'Idle'
    ORDER BY time_waited_fg DESC;

    Fiktive SQL-Ausgabe: Zeilenausschnitt; weitere Treffer sind möglich.

    WAIT_CLASSTOTAL_WAITSWAITED_SECONDSTOTAL_WAITS_FGFOREGROUND_WAITED_SECONDS
    Application10001701000170
    User I/O420022400020
    Commit2000420004

    Was sehe ich hier? Application hat im sichtbaren Zählerstand die größte Foreground-Zeit. Ob diese Klasse gerade zunimmt, zeigt erst das Delta. Die SQL-Ausgabe enthält zusätzlich Gesamtzähler; diese enthalten auch Hintergrundarbeit und werden nicht zur Foreground-Zeit addiert.

    3. Wait Events – Anzahl und Zeit nicht verwechseln

    Ein Event mit sehr vielen Waits muss nicht automatisch wichtig sein. Eine Million extrem kurzer Waits kann weniger Einfluss haben als wenige sehr lange Waits. Oracle empfiehlt deshalb, die gesamte Wartezeit im betrachteten Zeitraum zu bewerten und nicht nur die Anzahl.

    Auch die durchschnittliche Wait-Zeit allein reicht nicht. Ein seltenes Ereignis mit hoher Durchschnittszeit kann für den Gesamtworkload unbedeutend sein. Relevant wird ein Wait, wenn sein Zeitanteil die beobachtete Verzögerung plausibel erklären kann.

    Systemweite Wait Events – Foreground-Sicht
    SELECT
        event,
        wait_class,
        total_waits_fg,
        ROUND(time_waited_micro_fg / 1000000, 2) AS waited_seconds_fg,
        CASE
            WHEN total_waits_fg > 0
            THEN ROUND(time_waited_micro_fg / total_waits_fg / 1000, 3)
        END AS avg_wait_ms_fg
    FROM v$system_event
    WHERE wait_class <> 'Idle'
    ORDER BY time_waited_micro_fg DESC;

    Fiktive SQL-Ausgabe: Zeilenausschnitt; weitere Treffer sind möglich.

    EVENTWAIT_CLASSTOTAL_WAITS_FGWAITED_SECONDS_FGAVG_WAIT_MS_FG
    enq: TX - row lock contentionApplication10020200
    db file sequential readUser I/O100055

    Was sehe ich hier? Beim ersten Event ergeben 20 Sekunden / 100 Waits = 0,2 Sekunden beziehungsweise 200 ms. Der SQL-Mittelwert gilt für den kumulierten Zeitraum. Für die aktuelle Störung werden Zeit und Anzahl zuerst als Deltas ermittelt; Mittelwerte zweier Messungen voneinander abzuziehen wäre falsch.

    Wichtig: Diese Abfrage zeigt seit Instance-Start aufsummierte Werte. Sie beantwortet nicht automatisch die Frage, welches Event jetzt oder in einem bestimmten 20-Minuten-Fenster dominant war. Dafür werden Delta-Messungen benötigt.
    Einzelne Wait Events und deren technische Bedeutung werden im Kapitel Wait Events und im Wait Event Lexikon vertieft. Kapitel 31 zeigt nur, wie Waits in die Gesamtanalyse eingeordnet werden.

    4. Concurrency – Konkurrenz ist nicht automatisch Blocking

    Concurrency bedeutet, dass mehrere Prozesse gleichzeitig auf gemeinsame interne Ressourcen zugreifen. Eine hohe Concurrency-Wait-Zeit beweist daher noch keine klassische Row-Lock-Blockierung. Je nach Event können beispielsweise Buffer-, Library-Cache-, Mutex- oder andere Konkurrenzmechanismen beteiligt sein.

    Der richtige Weg lautet: erst die Wait Class erkennen, dann das konkrete Event bestimmen und erst danach in den passenden Diagnosezweig wechseln.

    Aktuelle Sessions mit Blocking-Bezug
    SELECT
        sid,
        serial#,
        username,
        status,
        event,
        wait_class,
        blocking_session_status,
        blocking_session,
        final_blocking_session_status,
        final_blocking_session
    FROM v$session
    WHERE type = 'USER'
      AND (
            blocking_session_status = 'VALID'
            OR final_blocking_session_status = 'VALID'
          )
    ORDER BY sid;

    Fiktive SQL-Ausgabe: Zeilenausschnitt; weitere Treffer sind möglich.

    Erste Spalten des Ergebnisses.

    SIDSERIAL#USERNAMESTATUSEVENT
    1423817APP_USERACTIVEenq: TX - row lock contention

    Weitere Spalten – SID zur Zuordnung wiederholt.

    SIDWAIT_CLASSBLOCKING_SESSION_STATUSBLOCKING_SESSIONFINAL_BLOCKING_SESSION_STATUSFINAL_BLOCKING_SESSION
    142ApplicationVALID87VALID42

    Was sehe ich hier? Der unmittelbare Blocker ist hier 87; die gemeldete Kette endet bei 42. Für eine Aktion reicht die Nummer nicht: Instanz, Identität, aktuelle Sperrkette und Anwendungsvorgang müssen geprüft werden. Die Abfrage beendet keine Verbindung.

    Die eigentliche Blocker-/Waiter-Analyse steht im Kapitel Locks & Blockierungen.

    Nächster Schritt: Passender Praxisfall.

    5. Eine Wartezeit richtig gewichten

    Ein einzelner langer Wait und sehr viele kurze Waits können dieselbe Gesamtzeit ergeben. Für den Anwender haben sie möglicherweise unterschiedliche Folgen. Betrachte deshalb zusätzliche Zeit, zusätzliche Anzahl und den konkreten Vorgang zusammen. Der Durchschnitt aus diesen Differenzen beschreibt das Intervall; er verrät nicht die schlechteste Einzelwartezeit.

    Bei einer bestätigten Blockierung ist der wartende SQL-Aufruf häufig das Opfer. Der Blocker kann inzwischen INACTIVE sein und trotzdem eine offene Transaktion halten. Untersuche den Verantwortungszusammenhang, bevor eine Maßnahme vorgeschlagen wird. Die vollständige Sperrdiagnose steht in Kapitel 20.

    I/O und Redo untersuchenArbeitsmenge, Latenz und Commit-Verhalten getrennt bewerten.I/O und Redo

    Verwende denselben Zeitraum für Datenbank- und Hostmessung. Rechne bei kumulierten Werten mit Deltas und achte auf deren Einheit.

    1. I/O – Menge und Latenz getrennt betrachten

    Hohe I/O-Aktivität ist nicht automatisch schlecht. Eine Datenbank kann sehr viele Reads ausführen und trotzdem gute Antwortzeiten liefern. Umgekehrt können wenige, aber sehr langsame I/Os einen kritischen Pfad verzögern.

    Darum werden mindestens zwei Fragen getrennt: Wie viel I/O entsteht? und wie lange wartet Oracle darauf? Erst die Verbindung aus Arbeitsmenge, Wait-Zeit und Storage-Sicht erlaubt eine belastbare Bewertung.

    Datafile-I/O – kumulativ
    SELECT
        df.tablespace_name,
        df.file_name,
        fs.phyrds,
        fs.phywrts,
        fs.readtim,
        fs.writetim,
        ROUND(fs.readtim / NULLIF(fs.phyrds, 0), 3) AS avg_read_cs,
        ROUND(fs.writetim / NULLIF(fs.phywrts, 0), 3) AS avg_write_cs
    FROM v$filestat fs
    JOIN dba_data_files df
      ON df.file_id = fs.file#
    ORDER BY (fs.phyrds + fs.phywrts) DESC;

    Fiktive SQL-Ausgabe – erster Messpunkt: Zeilenausschnitt; weitere Treffer sind möglich.

    Erste Spalten des Ergebnisses.

    TABLESPACE_NAMEFILE_NAMEPHYRDSPHYWRTS
    APP_DATA/oradata/DEMODB/app_data01.dbf10000020000

    Weitere Spalten – TABLESPACE_NAME zur Zuordnung wiederholt.

    TABLESPACE_NAMEREADTIMWRITETIMAVG_READ_CSAVG_WRITE_CS
    APP_DATA50000160000,50,8

    Was sehe ich hier? 0,5 Hundertstelsekunden entsprechen 5 ms, 0,8 entsprechen 8 ms. Das sind kumulierte Datenfile-Werte, keine aktuelle Storage-Messung. Diese Abfrage im passenden Datenbank-/PDB-Kontext verwenden; der Dateipfad steht in FILE_NAME. Die zusätzlich ausgegebenen READTIM und WRITETIM sind kumulierte Hundertstelsekunden. Intervallmittelwert Lesen in ms = ΔREADTIM / ΔPHYRDS × 10; Schreiben entsprechend mit ΔWRITETIM und ΔPHYWRTS. Bei null zusätzlichen Vorgängen ist kein Mittelwert definiert. Bei TIMED_STATISTICS=FALSE können Zeitwerte null sein. Die View enthält auch RMAN-Leseaktivität; Dateilast ist deshalb nicht automatisch Anwendungslast.

    Nicht vorschnell urteilen: Ein hoher I/O-Zähler beweist kein Storageproblem. Ein hoher Durchschnitt seit Instance-Start beschreibt außerdem nicht zwingend die aktuelle Störung. Datenbank-Delta, Wait-Zeit und iostat müssen zeitlich zusammenpassen.

    Fiktive SQL-Ausgabe – zweiter Messpunkt, 60 Sekunden später: Zeilenausschnitt; weitere Treffer sind möglich.

    Erste Spalten des Ergebnisses.

    TABLESPACE_NAMEFILE_NAMEPHYRDSPHYWRTS
    APP_DATA/oradata/DEMODB/app_data01.dbf11000022000

    Weitere Spalten – TABLESPACE_NAME zur Zuordnung wiederholt.

    TABLESPACE_NAMEREADTIMWRITETIMAVG_READ_CSAVG_WRITE_CS
    APP_DATA60000180000,5450,818

    Auswertung beider Messpunkte: Lesen: (60000 − 50000) / (110000 − 100000) × 10 = 10 ms je zusätzlichem Lesevorgang. Schreiben: (18000 − 16000) / (22000 − 20000) × 10 = 10 ms je zusätzlichem Schreibvorgang. Die Differenz der beiden gerundeten AVG-Spalten wäre dagegen keine korrekte Intervallrechnung. Für diese Beispielrechnung bleiben Datei und Instanz unverändert.

    2. Redo und COMMIT als eigener Performancepfad

    Beim üblichen synchronen COMMIT muss Oracle die für die Transaktion erforderlichen Redo-Informationen dauerhaft absichern. Wenn dieser Pfad langsam wird, kann die Benutzerantwortzeit direkt betroffen sein. Zwei Events werden dabei häufig gemeinsam betrachtet: log file sync aus Sicht der Foreground Session und log file parallel write aus Sicht des Log Writers.

    Steigen beide im gleichen Problemzeitraum, wird Redo-I/O als Erklärung plausibler. Ist hauptsächlich log file sync auffällig, müssen auch Commit-Frequenz, CPU-Scheduling und weitere Teile des Commit-Pfads berücksichtigt werden.

    Redo-/Commit-Waits – kumulativ
    SELECT event, measured_waits,
        ROUND(measured_micro / 1000000, 2) AS waited_seconds,
        ROUND(measured_micro / NULLIF(measured_waits, 0) / 1000, 3) AS avg_wait_ms,
        counter_scope
    FROM (
        SELECT event,
            CASE WHEN event = 'log file sync' THEN total_waits_fg
                 ELSE total_waits END AS measured_waits,
            CASE WHEN event = 'log file sync' THEN time_waited_micro_fg
                 ELSE time_waited_micro END AS measured_micro,
            CASE WHEN event = 'log file sync' THEN 'FOREGROUND'
                 ELSE 'TOTAL' END AS counter_scope
        FROM v$system_event
        WHERE event IN ('log file sync', 'log file parallel write')
    )
    ORDER BY event;

    Fiktive SQL-Ausgabe:

    EVENTMEASURED_WAITSWAITED_SECONDSAVG_WAIT_MSCOUNTER_SCOPE
    log file parallel write100011TOTAL
    log file sync200042FOREGROUND

    Was sehe ich hier? log file sync zeigt Foreground-Wartezeit; log file parallel write verwendet Gesamtzähler, damit die LGWR-Hintergrundarbeit enthalten ist. Im Beispiel ergeben sich eine beziehungsweise vier Sekunden. Beide Events betrachten verschiedene Beteiligte und sind keine addierbaren Anteile der DB Time. Für die aktuelle Störung müssen Zeit und Anzahl jeweils als Delta erfasst werden; die Zahl der Waits muss zwischen beiden Events nicht übereinstimmen.

    Oracle-19c-Referenz: V$SYSTEM_EVENT.

    LGWR, COMMIT, Redo-Gruppen, Log Switches und Checkpoints werden im Kapitel Redo Logs technisch vertieft.

    3. Log Switches nicht mit pauschalen Grenzwerten bewerten

    Es gibt keine universelle Zahl von Log Switches pro Stunde, die für jede Datenbank optimal ist. Die Bedeutung hängt von Redo-Rate, Loggröße, Checkpoint-Verhalten, Archivierung, Recovery-Anforderungen und konkreten Waits beziehungsweise Alert-Log-Meldungen ab.

    Ein Tuningkapitel sollte deshalb keine starre Regel wie „mehr als X Switches pro Stunde ist schlecht“ verwenden. Entscheidend ist, ob das gemessene Verhalten im konkreten System einen relevanten Anteil der Problemzeit erklärt.

    Nächster Schritt: I/O- oder Commit-Praxisfall.

    4. Menge und Geschwindigkeit am selben Beispiel rechnen

    Fiktive IntervallwerteNormalFall AFall B
    Zusätzliche Read-Waits1.00010.0001.000
    Zusätzliche Wartezeit2 s20 s20 s
    Mittlere Zeit je Wait2 ms2 ms20 ms

    Fall A erzeugt zehnmal so viele Waits bei gleichem Mittelwert. Fall B hat bei gleicher Anzahl einen zehnmal höheren Mittelwert. Beide summieren sich auf 20 Sekunden, verlangen aber unterschiedliche Gegenproben. Diese Werte sind eine Rechenübung, keine allgemeine Bewertung des Storage. Event, Größe der I/O-Anforderung, Zugriffsmuster und betroffene Session müssen vergleichbar sein.

    Rechne TIME_WAITED_MICRO durch 1.000.000 in Sekunden um. TIME_WAITED ist dagegen in Hundertstelsekunden angegeben. Anzahl und Zeit müssen aus denselben Messpunkten und demselben Zählertyp stammen; Foreground- und Gesamtzähler nicht beliebig mischen.

    Speicher und TEMP bewertenHinweise auf Speicherarbeit einer konkreten Operation zuordnen.Speicher

    TEMP-Nutzung allein ist keine Diagnose. Verbinde den Speicherbefund mit SQL, Operation und gemessenem Zeitverlust.

    1. Memory – erst dann vertiefen, wenn Messwerte darauf zeigen

    SGA und PGA sind wichtige Performancebereiche, aber „mehr Memory“ ist keine allgemeine Tuningstrategie. Zusätzlicher Buffer Cache hilft nur, wenn dadurch relevante physische I/O vermieden wird. Mehr PGA hilft nur, wenn der Workload tatsächlich von unzureichenden Workareas oder PGA-Druck betroffen ist.

    Memory wird in Kapitel 31 deshalb als Diagnosedimension behandelt: Gibt es Hinweise auf Paging, PGA-Druck, TEMP-Spills, Shared-Pool-Probleme oder einen ungünstigen Memory-Verbrauch? Die eigentliche SGA-/PGA-Dimensionierung bleibt im Memory-Fachkapitel.

    PGA-Gesamtzustand – read-only
    SELECT
        name,
        CASE
            WHEN LOWER(unit) = 'bytes'
            THEN ROUND(value / 1024 / 1024, 2)
            ELSE value
        END AS value,
        CASE
            WHEN LOWER(unit) = 'bytes' THEN 'MiB'
            WHEN name = 'over allocation count' THEN 'Anzahl'
            ELSE unit
        END AS unit
    FROM v$pgastat
    WHERE name IN (
            'total PGA allocated',
            'maximum PGA allocated',
            'total PGA inuse',
            'over allocation count',
            'cache hit percentage'
          )
    ORDER BY name;

    Fiktive SQL-Ausgabe:

    NAMEVALUEUNIT
    cache hit percentage98percent
    maximum PGA allocated3072MiB
    over allocation count4Anzahl
    total PGA allocated2048MiB
    total PGA inuse1536MiB

    Was sehe ich hier? Aktuelle Nutzung, Allokation und historischer Höchstwert sind unterschiedliche Größen. Die SQL-Abfrage setzt die Anzeigeeinheit für over allocation count ausdrücklich auf „Anzahl“. Vier Überallokationen können alt sein; die Zunahme im Problemfenster ist entscheidend. Eine hohe Trefferquote schließt einzelne teure TEMP-Auslagerungen nicht aus.

    SGA, PGA, Buffer Cache, Shared Pool, Workareas und Advisor-Views werden im Kapitel SGA und PGA ausführlich behandelt.

    2. TEMP-Auslagerung einer konkreten Operation zuordnen

    Eine Sortierung oder ein Hash Join benötigt einen Arbeitsbereich. Reicht der dafür verfügbare Speicher nicht für die Verarbeitung im Speicher, kann die Operation TEMP verwenden. Das ist zunächst eine Arbeitsweise, kein automatischer Fehler. Relevant wird sie, wenn sie einen wesentlichen Teil der Verzögerung erklärt. Der nächste Schritt lautet deshalb: Welche Operation gehört zu welchem langsamen Vorgang?

    Aktive Arbeitsbereiche mit TEMP-Segment
    SELECT sid, con_id, sql_id, operation_id, operation_type,
           ROUND(actual_mem_used / 1024 / 1024, 1) AS pga_mib,
           ROUND(tempseg_size / 1024 / 1024, 1) AS temp_mib,
           number_passes
    FROM v$sql_workarea_active
    WHERE tempseg_size > 0
    ORDER BY tempseg_size DESC
    FETCH FIRST 10 ROWS ONLY;

    Fiktive SQL-Ausgabe:

    Erste Spalten des Ergebnisses.

    SIDCON_IDSQL_IDOPERATION_ID
    20507a1b2c3d4f5g64

    Weitere Spalten – SID zur Zuordnung wiederholt.

    SIDOPERATION_TYPEPGA_MIBTEMP_MIBNUMBER_PASSES
    205SORT645121

    Was sehe ich hier? Die Sortieroperation 4 verwendet in dieser Momentaufnahme 64 MiB allokierten PGA-Arbeitsbereich und ein 512-MiB-TEMP-Segment. Die angezeigte SQL_ID führt zur betroffenen Anweisung; OPERATION_ID zum passenden Planschritt. TEMP_MIB ist keine Datenübertragungsrate und keine Summe aller bisher geschriebenen Bytes. Eine leere Liste schließt frühere oder zwischen zwei Messungen liegende Auslagerungen nicht aus.

    Gelöster Fall: Ein Tagesbericht sortiert laut bestätigtem SQL-Text zunächst einen viel größeren Datenbestand als fachlich benötigt. Zusammen mit Plan und Anwendungsanforderung wird geprüft, wie die Auswahl auf den verlangten Zeitraum begrenzt werden kann. Nach getesteter Korrektur bleiben die Tagesergebnisse vollständig, während Laufzeit und TEMP-Verbrauch sinken. Falls die große Ergebnismenge gewollt ist, bleibt sie erhalten; dann untersucht man den Arbeitsbereich und die gleichzeitige Speicherbeanspruchung im Memory-Kapitel.

    Die Momentaufnahme beweist keine zu klein konfigurierte PGA. Mehrere gleichzeitige große Operationen und tatsächlich verfügbarer Hostspeicher gehören zur Bewertung. Es wird hier kein Speicherparameter geändert. Im Plan-Trainer lernst du, die Operation im vorhandenen Plan wiederzufinden.

    Oracle 19c: aktive Workareas

    Nächster Schritt: SQL untersuchen.

    3. Eine Auslagerung ist ein Befund, noch keine Empfehlung

    Eine große Datenmenge kann auch bei sinnvoller Speicherkonfiguration temporären Arbeitsraum benötigen. Prüfe zuerst, welche Operation wie viele Zeilen verarbeitet, ob die Schätzung dazu passt und ob gleichzeitig weitere speicherintensive Arbeit läuft. Weniger unnötige Eingabedaten können den Aufwand senken, ohne das Speicherbudget zu verändern.

    Für den Bericht ist deshalb zu fragen: Verursacht die betroffene Operation tatsächlich den beobachteten TEMP-Verbrauch? Passt der Zeitpunkt? Wird das Ergebnis nach einer möglichen SQL-Änderung vollständig und fachlich korrekt geliefert? Ein niedrigerer TEMP-Wert allein ist keine erfolgreiche Optimierung. Speichermechanismen und Grenzen werden in Kapitel 22 vertieft.

    SQL-Aufwand und PlanvergleichEine teure Anweisung von vielen kleinen Aufrufen unterscheiden.SQL

    Identifiziere zuerst Session und Cursor. Vergleiche dann zwei gültige Messpunkte; Planfragen werden im verlinkten Fachkapitel vertieft.

    1. Ein langsamer Aufruf oder sehr viele kleine Aufrufe?

    Eine Abfrage benötigt nur fünf Millisekunden. Das klingt günstig, wird aber bei 100.000 Wiederholungen zu insgesamt 500 Sekunden Datenbankarbeit. Eine andere Abfrage läuft einmal zehn Sekunden. Für den wartenden Benutzer kann der zweite Fall dringender sein; für den Gesamtdurchsatz kann die erste Abfrage mehr Verbesserungspotenzial besitzen. Deshalb betrachten wir Häufigkeit, Aufwand je Ausführung und fachliche Dringlichkeit gemeinsam.

    Vom Vorgang zur Anweisung: Ermittle Service und beobachtetes Event im Session-Thema. Die folgende Abfrage verwendet als konkretes Beispiel einen Bericht mit User-I/O-Wartezeit. Passe Service und Event an deinen Befund an; bei einem CPU-Problem verwendest du die allgemeine Sessionabfrage ohne diesen Wait-Filter. Notiere SQL_ID, SQL_CHILD_NUMBER und CON_ID.

    READ ONLY – Aktuelle Leser des Berichtservices
    SELECT sid, serial#, con_id, module, sql_id, sql_child_number
    FROM v$session
    WHERE type = 'USER'
      AND state = 'WAITING'
      AND event = 'db file sequential read'
      AND service_name = 'REPORT_SERVICE'
    ORDER BY sid;

    Fiktive SQL-Ausgabe: Zeilenausschnitt; weitere Treffer sind möglich.

    SIDSERIAL#CON_IDMODULESQL_IDSQL_CHILD_NUMBER
    20544120Umsatzbericht7a1b2c3d4f5g60

    Übernimm diese Kennzeichen in die nächste Abfrage. Alle Kennzeichen sind Lehrwerte. Die 0 steht hier für die Non-CDB. Halte Messzeit und Instanzstart wie in Warum Delta-Werte so wichtig sind fest und lies die Cursorwerte an beiden Messpunkten.

    SQL-Aufwand eines bestimmten Child Cursors zweimal erfassen
    SELECT sql_id, child_number, con_id,
           RAWTOHEX(child_address) AS cursor_adresse,
           last_load_time, executions, end_of_fetch_count,
           elapsed_time AS zeit_us, buffer_gets
    FROM v$sql
    WHERE sql_id = '7a1b2c3d4f5g6'
      AND child_number = 0
      AND con_id = 0;

    Fiktive SQL-Ausgabe – Messpunkt 10:00:

    Erste Spalten des Ergebnisses.

    SQL_IDCHILD_NUMBERCON_IDCURSOR_ADRESSELAST_LOAD_TIME
    7a1b2c3d4f5g60000000000ABCDEF102026-10-06/09:00:00

    Weitere Spalten – SQL_ID zur Zuordnung wiederholt.

    SQL_IDEXECUTIONSEND_OF_FETCH_COUNTZEIT_USBUFFER_GETS
    7a1b2c3d4f5g61000100020000000500000

    Fiktive SQL-Ausgabe – Messpunkt 10:01:

    Erste Spalten des Ergebnisses.

    SQL_IDCHILD_NUMBERCON_IDCURSOR_ADRESSELAST_LOAD_TIME
    7a1b2c3d4f5g60000000000ABCDEF102026-10-06/09:00:00

    Weitere Spalten – SQL_ID zur Zuordnung wiederholt.

    SQL_IDEXECUTIONSEND_OF_FETCH_COUNTZEIT_USBUFFER_GETS
    7a1b2c3d4f5g61100110023000000560000

    Was sehe ich hier? 100 zusätzliche Ausführungen, drei zusätzliche Sekunden und 60.000 zusätzliche Buffer Gets. Unter den Beispielannahmen ergibt das 30 ms und 600 Buffer Gets je Ausführung. SQL_ID, CHILD_NUMBER, CON_ID, CURSOR_ADRESSE und LAST_LOAD_TIME bleiben hier gleich; END_OF_FETCH_COUNT steigt ebenfalls um 100. Im Lehrmodell liegen alle betrachteten Ausführungen vollständig innerhalb des Messintervalls und werden vollständig abgerufen.

    V$SQL enthält kumulierte Werte je Child Cursor. ELAPSED_TIME ist Datenbankzeit in Mikrosekunden, kein verlässlicher Ersatz für die vom Client gemessene Antwortzeit; bei paralleler Ausführung kann zusätzliche Prozesszeit eingehen. Buffer Gets beschreiben logische Zugriffe, nicht automatisch unterschiedliche Blöcke oder physische I/O-Vorgänge. Fehlt der Cursor, wurde er neu geladen, sind Zähler rückläufig oder laufen Ausführungen über die Messgrenzen, ist die einfache Pro-Ausführung-Rechnung nicht belastbar. Cursorstatistiken können zudem zeitversetzt aktualisiert werden.

    Gelöster Fall: Ein Artikelfenster führt dieselbe Stammdatenabfrage je angezeigter Zeile erneut aus. Bei 100 Zeilen sind das 100 ähnliche Aufrufe. Die Ablaufanalyse bestätigt die Wiederholung; die Entwicklung prüft eine gemeinsame mengenorientierte Abfrage. Nach einer getesteten Anpassung muss die Anzeige weiterhin dieselben Artikel und Berechtigungen berücksichtigen. Erst weniger Aufrufe, geringerer Gesamtaufwand und bessere End-to-End-Zeit bestätigen die Verbesserung. Der Einzelaufruf muss dabei nicht schneller werden.

    Oracle 19c: Cursorstatistiken und Einheiten

    2. Sessionarbeit messen: Reads, Parsing und Clientaufrufe

    Manchmal verteilt sich die Arbeit eines Vorgangs auf viele SQL-Anweisungen. Dann reicht eine einzelne SQL_ID nicht. Eine gezielt ausgewählte Session kann ergänzend zeigen, ob viele logische Reads, Parse-Aufrufe oder Client-Roundtrips entstehen. Ein Roundtrip ist hier eine Hin-und-zurück-Kommunikation zwischen Client und Datenbank. Viele solcher Wege können einen Vorgang bremsen, selbst wenn jede einzelne Abfrage kurz dauert.

    Ermittle SID und SERIAL# im Sessionkapitel. Die Zahlen unten sind Platzhalter eines Lehrfalls. Die Abfrage wird aus einer eigenen Diagnosesession vor und nach dem beobachteten Vorgang ausgeführt. Bei Connection Pools muss die Anwendung bestätigen, welche Session den Auftrag bearbeitet und ob in diesem Zeitraum weitere Aufträge darüber liefen. Andernfalls sind die Zähler nur der Session, nicht eindeutig einem Benutzerauftrag zuzuordnen.

    Ausgewählte kumulierte Sessionstatistiken
    SELECT s.sid, s.serial#, s.con_id, n.name, st.value
    FROM v$session s
    JOIN v$sesstat st ON st.sid = s.sid
    JOIN v$statname n ON n.statistic# = st.statistic#
    WHERE s.sid = 205
      AND s.serial# = 4412
      AND s.con_id = 0
      AND n.name IN ('session logical reads',
                     'parse count (total)',
                     'parse count (hard)',
                     'SQL*Net roundtrips to/from client')
    ORDER BY n.name;

    Fiktive SQL-Ausgabe – vor dem Vorgang:

    SIDSERIAL#CON_IDNAMEVALUE
    20544120SQL*Net roundtrips to/from client2000
    20544120parse count (hard)10
    20544120parse count (total)1000
    20544120session logical reads100000

    Fiktive SQL-Ausgabe – nach dem Vorgang:

    SIDSERIAL#CON_IDNAMEVALUE
    20544120SQL*Net roundtrips to/from client2500
    20544120parse count (hard)10
    20544120parse count (total)1001
    20544120session logical reads130000

    Auswertung aus beiden Ausgaben – keine unmittelbare SQL-Ausgabe: Delta = VALUE nachher − VALUE vorher.

    NAMEVALUE vorherVALUE nachherBerechnetes Delta
    SQL*Net roundtrips to/from client20002500500
    parse count (hard)10100
    parse count (total)100010011
    session logical reads10000013000030000

    Was sehe ich hier? Die Spalte „Berechnetes Delta“ der obigen Auswertung entsteht aus den beiden VALUE-Spalten; die SQL-Abfrage berechnet sie nicht. Der Vorgang erzeugt im Lernfall 500 Roundtrips, aber nur einen zusätzlichen Parse-Aufruf und keinen Hard Parse. Viele Kommunikationsvorgänge bedeuten also nicht ebenso viele neue SQL-Ausführungen oder Geschäftsaufträge. Auch das Nachladen von Ergebnissen kann Kommunikation verursachen. Die Grundlagen zu Hard und Soft Parse stehen im SQL-Ablauf.

    Vorgehen und Lösung: Vergleiche den Ablauf der Anwendung mit der Zahl der Aufrufe. Im Lehrfall holt der Client jeweils nur eine Ergebniszeile pro Nachladeaufruf. Die Entwicklung prüft eine geeignete Abrufgröße für diesen Treiber und dieses Ergebnis. Danach sinken im kontrollierten Test die Roundtrips bei identischer Zeilenzahl; Antwortzeit und Client-Speicherverbrauch werden gemeinsam kontrolliert. Eine feste Abrufgröße für alle Anwendungen lässt sich daraus nicht ableiten. Hohe Parse-Zahlen würden einen anderen Prüfpfad zur Statement-Wiederverwendung eröffnen.

    Keine Zeile bedeutet beispielsweise, dass die Session beendet wurde, SERIAL# nicht mehr passt oder der Container falsch ist. Ein Sessionwechsel verwirft den Vergleich. Statistiken anhand ihres Namens auswählen; ihre internen Nummern sind kein dauerhaft stabiler Vertrag.

    Oracle 19c: Sessionstatistiken

    3. Plötzlich langsamer: Planwechsel als Hypothese prüfen

    Eine Berichtsabfrage war gestern schnell und ist heute langsam. Ein geänderter Plan ist eine mögliche Erklärung, aber auch mehr Daten, andere Filterwerte, zusätzliche Konkurrenz oder ein geänderter Clientabruf kommen infrage. Bewahre deshalb den alten Befund auf: SQL-Text, zugehöriger Child Cursor, Plan, repräsentative Eingabewerte, Datenumfang und gemessene Laufzeit. Ohne gesicherte frühere Messung lässt sich „gestern“ nicht aus dem heutigen Cursorcache vollständig rekonstruieren.

    Konkreter Arbeitsweg: Ordne den langsamen Aufruf zuerst der aktuellen Session zu. Vergleiche seinen SQL-Aufwand mit Ein langsamer Aufruf oder sehr viele kleine Aufrufe?. Lies anschließend den vorhandenen Cursorplan mit der im Plan-Kapitel erklärten DISPLAY_CURSOR-Abfrage. Prüfe im Trainer Prädikate, tatsächliche Arbeit und Schätzungen. Fehlen Laufzeitstatistiken, wird diese Lücke ausdrücklich dokumentiert; eine geschätzte Zeilenzahl ersetzt keine gemessene.

    Fiktive Befunde zur Einordnung: Neutrale Lernwerte, keine Messung einer realen Umgebung.

    BeobachtungDaraus folgt noch nichtPassende Gegenprüfung
    Anderer PlanDer neue Plan ist schlechterGleicher fachlicher Auftrag und vergleichbarer Datenumfang
    Gleicher PlanDie Arbeit ist unverändertEingabewerte, Zeilenmenge und Waits vergleichen
    Ältere StatistikenStatistiken sind unbrauchbarDatenänderungen und Schätzfehler untersuchen

    Lösung eines Lehrfalls: Zwei Aufrufe verwenden denselben Plan, aber einmal wird ein einzelner Artikel und einmal die vollständige Jahresübersicht verlangt. Der größere Aufwand ist durch unterschiedliche Anforderungen erklärbar. Die Entscheidung betrifft das vereinbarte Laufzeitziel des großen Berichts, nicht die erzwungene Rückkehr zu einem vermeintlich früheren Plan. Ein anderer Fall mit gleichem Auftrag, erheblichen Schätzfehlern und belegter Datenänderung führt dagegen zur Untersuchung der Optimizer-Statistiken. Statistiken oder Indizes werden nicht pauschal geändert.

    Oracle 19c: Ziele und Ursachen der SQL-Optimierung

    Nächster Schritt: Verbesserung nachweisen.

    4. Vergleichbare Cursorwerte bilden

    V$SQL zeigt Child Cursor und kumulierte Statistiken. Halte SQL_ID, CHILD_NUMBER und den relevanten Kontext zusammen. Ein aus dem Shared Pool verschwundener oder neu geladener Cursor lässt sich nicht wie eine unveränderte fortlaufende Messreihe behandeln. Teile nicht blind alte Gesamtsummen durch aktuelle Ausführungszahlen. Bei einem Delta von null Ausführungen ist ein Quotient pro Ausführung nicht definiert; laufende Ausführungen können trotzdem Arbeit erzeugen.

    Beachte außerdem vollständiges Fetching und die Art der Anweisung. Ein abgebrochener Bericht und ein vollständig gelieferter Bericht sind keine gleichwertigen Versuche. Gleicher Plan Hash Value beweist keine gleiche Datenmenge oder Laufzeit. A-Rows, Starts und Prädikate helfen bei der Vertiefung; ihre genaue Interpretation bleibt in Kapitel 10 und 32.

    5. Der Bericht zeigt viele kleine Aufrufe

    Im Lernfall bestätigt sich eine große Zahl wiederholter Nachschlageabfragen. Keine einzelne Ausführung dauert lange. Trotzdem kann ihre Summe den Großteil der Datenbankarbeit ausmachen. Wir benötigen nun eine auf den Bericht begrenzte Auswertung der Aufrufzahlen und Zeiten. Die folgende Trace-Karte erklärt, wie eine bereits vorhandene Aufzeichnung dabei hilft.

    Oracle 19c: Cursorstatistiken
    Statspack – historische Performance erfassen und verstehenVon Snapshots und Erfassungsumfang zum Intervallbericht und belastbaren Vergleich.Grundlagen

    1. Aufgabe: einen vergangenen Zeitraum untersuchen

    Statspack sammelt Performancewerte und speichert sie für spätere Auswertungen in der Datenbank. Das ist hilfreich, wenn eine Anwendung morgens langsam war, die aktuellen Sessions aber längst verschwunden sind. Ein vorhandener Bericht kann zeigen, welche Arbeit und Wartezeiten im aufgezeichneten Zeitraum angefallen sind. Er rekonstruiert jedoch nicht nachträglich jede Session und jeden einzelnen Anwendungsaufruf.

    Heute messen ersetzt keine gestrige Messung. Ohne passende gespeicherte Messpunkte bleibt die Ursache eines vergangenen Vorfalls möglicherweise offen. Statspack muss deshalb vor dem zu untersuchenden Zeitraum eingerichtet sein und Daten sammeln. Oracle nennt es im Performance Tuning Guide für 19c als Möglichkeit zur Sammlung von Instanzstatistiken, wenn AWR und ADDM nicht verfügbar sind. Statspack ist keine andere Oberfläche für AWR und keine ASH-Sessionchronik.

    2. Wie aus zwei Snapshots ein Bericht entsteht

    Das Schema PERFSTAT enthält die Tabellen und das Paket STATSPACK. Ein Aufruf von STATSPACK.SNAP liest Performanceinformationen und speichert einen Snapshot. Snapshot-Nummer, Datenbank-ID und Instanznummer identifizieren gemeinsam die Sammlung. Erfassung und Berichtserzeugung sind getrennte Schritte: Ein später erzeugter Bericht verwendet die bereits gespeicherten Daten.

    Für kumulative Zähler wird vereinfacht der Endwert minus Anfangswert ausgewertet. Das Ergebnis beschreibt die im Intervall hinzugekommene Arbeit. Nicht jede Berichtsspalte ist ein solcher Zähler: Konfigurationswerte, Speichergrößen und Bestandszahlen müssen entsprechend ihrer Bedeutung gelesen werden. Ein einzelner Snapshot liefert noch keinen vollständigen Intervallvergleich.

    Der Unterschied zur read-only Diagnose: Das Lesen eines vorhandenen Berichts verändert keine Datenbank. Einrichtung, Snapshot-Erfassung, Änderung der Sammlung und Bereinigung sind dagegen schreibende Betriebsmaßnahmen. Der Wiki-Generator führt keine davon aus. Die folgenden Befehle sind ausdrücklich gekennzeichnete Lernreferenzen.

    3. Voraussetzungen, Installation und Containerbezug

    Verwende die Skripte aus dem tatsächlich eingesetzten Oracle Home und prüfe dort $ORACLE_HOME/rdbms/admin/spdoc.txt. Die zugrunde gelegte Datei enthält noch den historischen Kopftext „Release 12.1“, aber auch einen Änderungsabschnitt für 19.x/21.x. Deshalb werden Dateistand und konkrete Funktionsbeschreibung berücksichtigt, nicht allein die erste Versionszeile.

    Die mitgelieferte Dokumentation unterstützt Installation und Berichterstellung auf PDB-Ebene, ausdrücklich jedoch nicht in CDB$ROOT. Manche Datenquellen bleiben auch in einer PDB instanzweit. Ein PDB-Bericht darf daher nicht pauschal als ausschließlich dieser PDB zurechenbare Last interpretiert werden. Vor einer Einrichtung müssen Ziel-Datenbank, Container und Verbindungsdienst eindeutig sein; eine lokale SYSDBA-Verbindung in einer CDB kann sonst im falschen Container landen.

    spcreate.sql wird in SQL*Plus mit SYSDBA-Berechtigung im vorgesehenen, unterstützten Datenbankkontext gestartet. Es legt PERFSTAT samt Objekten an und fragt Kennwort, Default-Tablespace und temporären Tablespace ab. Die Dokumentation empfiehlt SYSAUX als Default und erlaubt einen geeigneten alternativen Tablespace; SYSTEM darf weder als Default- noch als temporärer Tablespace gewählt werden. Die Installationsprotokolle spcusr.lis, spctab.lis und spcpkg.lis sind anschließend auf Fehler zu prüfen.

    Schreibende Lernreferenz – Installation: Nur zur Erklärung des Ablaufs, nicht als automatisch auszuführender Check. Vorher Ziel und Container prüfen; eine vorhandene PERFSTAT-Installation nicht ungeprüft neu anlegen.
    SQL*Plus – Installation im zuvor geprüften Kontext mit SYSDBA
    @?/rdbms/admin/spcreate.sql

    Das Fragezeichen steht in SQL*Plus für das Oracle Home. Kennwörter werden hier nicht in Aufrufzeilen oder Beispieldateien hinterlegt. Für Sammlung und Berichte wird anschließend PERFSTAT verwendet, nicht dauerhaft SYSDBA. Der Platzbedarf hängt von Intervall, Erfassungsumfang und Aufbewahrung ab; eine minimale Installationsgröße ist keine verlässliche Dauerbetriebsplanung.

    4. Snapshots planen und erfassen

    Ein Messplan nennt Normalbetrieb, relevante Lastfenster und die gewünschte zeitliche Auflösung. Kürzere Intervalle können Spitzen besser eingrenzen, erhöhen aber Erfassungsaufwand und Datenmenge. Ein langes Intervall glättet kurze Störungen. Eine allgemeingültige optimale Snapshot-Frequenz gibt es deshalb nicht. Auch die Dauer der Sammlung selbst gehört zur Beobachtung.

    Schreibende Lernreferenz – Sammlung: Der folgende Aufruf speichert Performancewerte im PERFSTAT-Schema. Für einen Intervallbericht sind mindestens zwei geeignete Messpunkte zu unterschiedlichen Zeiten erforderlich.
    SQL*Plus als PERFSTAT – einen Snapshot mit dem eingestellten Umfang erzeugen
    EXECUTE STATSPACK.SNAP;

    Die Dokumentation beschreibt regelmäßige Erfassung über DBMS_JOB oder ein Betriebssystemwerkzeug wie cron. Das mitgelieferte spauto.sql richtet einen stündlichen Job zur vollen Stunde ein; hierfür muss JOB_QUEUE_PROCESSES größer als null sein. Dies ist eine dokumentierte Automatisierung, keine Aufforderung, einen bestehenden Job oder Parameter ungeprüft zu ändern. Jobausführung, fehlgeschlagene Läufe und verfügbare Snapshot-Zeitpunkte müssen kontrolliert werden.

    Für aussagekräftige Zeitmessungen ist außerdem TIMED_STATISTICS zu prüfen. Die Dokumentation empfiehlt die Aktivierung auf Instanzebene. Fehlende oder nur für einzelne Sessions erhobene Zeitwerte können ein widersprüchliches Bild ergeben. Sammlung ersetzt keine Prüfung, ob die benötigten Messwerte tatsächlich vorhanden sind.

    5. Snapshot-Level und Auswahlgrenzen verstehen

    Level und Schwellenwerte bestimmen gemeinsam, welche Daten erfasst werden. Ein höherer Level enthält die niedrigeren Stufen und ergänzt weitere Informationen. Die Standardstufe ist 5. Höher bedeutet mehr Umfang und möglicherweise mehr Aufwand, nicht automatisch eine bessere Diagnose.

    LevelErfassungsumfangEinordnung
    0Allgemeine Performanceinformationen, unter anderem Systemstatistiken, Waits und Ressourceninformationen.Grundlage für den Blick auf die Instanz.
    5Zusätzlich SQL-Statistiken für Anweisungen, die die Erfassungsschwellen überschreiten.Dokumentierter Standard für typische Nutzung; keine vollständige Liste aller SQL-Ausführungen.
    6Zusätzlich Pläne und Plannutzungsinformationen der erfassten SQL-Anweisungen.Hilfreich bei Baselines und der Untersuchung möglicher Planänderungen.
    7Zusätzlich Statistiken stark genutzter oder umkämpfter Segmente nach Schwellenwerten.Vertiefung auf betroffene Tabellen oder Indizes.
    10Zusätzlich detaillierte Parent-/Child-Latch-Informationen.Laut Dokumentation möglicherweise ressourcenintensiv und nur auf Empfehlung von Oracle-Personal einzusetzen.

    SQL kann beispielsweise wegen hoher Ausführungszahl, Buffer Gets, Disk Reads, Parse Calls, Shared-Memory-Belegung oder Version Count ausgewählt werden. Das Überschreiten einer der beschriebenen SQL-Schwellen genügt. Die Einstellungen stehen in STATS$STATSPACK_PARAMETER. Ein fehlendes Statement kann unterhalb der Schwellen gelegen haben oder zum Erfassungszeitpunkt nicht mehr verfügbar gewesen sein. Für Planerfassung muss es im Shared Pool vorhanden sein und die SQL-Auswahlbedingungen erfüllen; Level 6 erzeugt keine lückenlose Planhistorie.

    Schreibende Lernreferenz als PERFSTAT – einmalig Level 6
    EXECUTE STATSPACK.SNAP(i_snap_level => 6);

    Dieser Aufruf ändert nur den Umfang dieses Snapshots. Eine dauerhafte Änderung erfolgt über MODIFY_STATSPACK_PARAMETER oder einen SNAP-Aufruf mit i_modify_parameter. Beides schreibt Konfiguration. Ein später höher gewählter Level ergänzt keine Informationen in bereits vorhandenen Snapshots.

    6. Ein gültiges Berichtsintervall auswählen

    Prüfe Datenbank, Instanz, Containerbezug, Startzeit und Begin-/End-Snapshot. Beide Messpunkte müssen zur selben Instanzlaufzeit gehören: Zwischen ihnen darf kein Shutdown/Startup stattgefunden haben. Sonst würden zurückgesetzte Zähler miteinander verrechnet; der dokumentierte Bericht bricht bei dieser Auswahl ab. Auch gleiche Snapshot-Nummern allein reichen ohne Datenbank- und Instanzbezug nicht aus.

    Ein Bericht kann mehrere vorhandene Sammelintervalle umfassen. Das erzeugt eine größere gemeinsame Betrachtung, keine zusätzliche zeitliche Auflösung. Für einen Vergleich zwischen Normal- und Störungsbetrieb müssen Arbeitsart, Arbeitsmenge, Zeitraum und Konfiguration dokumentiert werden. Raten helfen bei unterschiedlichen Zeitspannen, ersetzen aber keine vergleichbare Workload.

    SQL*Plus als PERFSTAT – vorhandene Snapshots auswerten und lokale Reportdatei schreiben
    @?/rdbms/admin/spreport.sql

    Das Skript fragt Anfangs-Snapshot, End-Snapshot und Dateiname ab. Der Ausgabepfad muss beschreibbar sein; vorhandene Dateien sind zu beachten. spreport.sql setzt Datenbank und Instanz anhand der Verbindung voraus. sprepins.sql erlaubt deren ausdrückliche Auswahl, etwa bei mehreren gespeicherten Instanzen. Ein neu erzeugter Bericht sammelt keine aktuellen Snapshots nach.

    Vom Snapshot-Paar zur lesbaren Datei

    Öffne SQL*Plus auf dem Datenbankserver aus einem Verzeichnis, in dem du die Reportdatei schreiben darfst. Verbinde dich als PERFSTAT mit dem Dienst der zuvor geprüften Datenbank beziehungsweise PDB. Das Kennwort wird interaktiv abgefragt. Im folgenden Aufruf ist ZIELDIENST durch den passenden Oracle-Net-Service zu ersetzen.

    Shell – Verbindung zur Auswertung herstellen
    sqlplus perfstat@ZIELDIENST

    Starte anschließend in SQL*Plus @?/rdbms/admin/spreport.sql. Die angezeigte Snapshot-Liste enthält Messzeitpunkte und Snapshot-IDs. Wähle zuerst die ID vor dem untersuchten Zeitraum und dann die ID danach. Beide müssen derselben Instanzlaufzeit angehören. Existieren keine geeigneten Snapshots, kann der Bericht den vergangenen Zeitraum nicht nachträglich erfassen.

    Fiktiver Dialog: Die IDs 100 und 101 sind Platzhalter für zwei tatsächlich vorhandene, passende Snapshots; sie sind keine vorgegebenen IDs deiner Datenbank.

    SQL*Plus – beispielhafte Eingaben bei der Berichtserstellung
    Enter value for begin_snap: 100
    Enter value for end_snap: 101
    Enter value for report_name: statspack_100_101.lst

    Der Bericht erscheint in SQL*Plus und wird zusätzlich in die angegebene Datei geschrieben. Ohne absoluten Pfad liegt sie im Arbeitsverzeichnis des SQL*Plus-Prozesses, normalerweise dort, wo SQL*Plus gestartet wurde. Notiere den vollständigen Pfad. Das ist eine Textdatei, keine HTML-Seite und kein automatisch geöffneter Browserbericht.

    Den erzeugten Bericht öffnen

    Beende SQL*Plus mit EXIT. Im gleichen Shell-Verzeichnis kannst du die Datei prüfen und mit dem auf Solaris üblichen Pager öffnen:

    Shell – vorhandene Reportdatei lesen
    ls -l statspack_100_101.lst
    more statspack_100_101.lst

    Mit der Leertaste blätterst du eine Seite weiter, mit Enter eine Zeile und mit q beendest du die Anzeige. Über /SQL und Enter suchst du nach dem nächsten passenden Text. Alternativ überträgst du die Datei über den freigegebenen Dateiübertragungsweg auf deinen Arbeitsplatz und öffnest sie in einem Texteditor mit Festbreitenschrift. Zeilenumbruch möglichst ausschalten, damit die Berichtsspalten ausgerichtet bleiben. SQL-Texte können sensible Inhalte enthalten; die Datei entsprechend geschützt behandeln.

    7. Den Bericht in einer sinnvollen Reihenfolge lesen

    SchrittWas prüfen?Welche Frage wird beantwortet?
    Identität und ZeitraumDatenbank, Instanz, Startzeit, Snapshots und tatsächliche Dauer.Beschreibt dieser Bericht überhaupt den gesuchten Vorfall?
    LastprofilArbeit pro Sekunde, Transaktionen, Reads, Redo und Ausführungen, soweit ausgewiesen.Ist mehr Arbeit angefallen oder ist vergleichbare Arbeit aufwendiger geworden?
    ZeitverbrauchCPU-Zeit und zeitlich dominante Non-Idle-Waits; Vordergrund und Hintergrund unterscheiden.Wo wurde Zeit verbraucht, die weiter untersucht werden sollte?
    Wait-DetailsGesamtzeit, Anzahl und mittlere Dauer eines Ereignisses zusammen lesen.Viele Vorgänge oder langsame Vorgänge – welche Erklärung passt?
    SQLGesamtaufwand, Ausführungszahl und Aufwand je Ausführung verbinden.Einzelne teure SQLs oder sehr viele kleine Aufrufe?
    VertiefungPassende I/O-, Speicher-, Parsing-, Segment- und Planinformationen untersuchen.Welche zusätzlichen Befunde stützen die Hypothese?
    GegenprobeAnwendung, OS-Messung, Wartungsfenster und Vergleichsbericht heranziehen.Passt die technische Erklärung zum beobachteten Problem?

    Die Reihenfolge ist eine Lesearbeitshilfe; Abschnittsüberschriften und verfügbare Daten hängen vom Bericht und Erfassungsumfang ab. Eine gute Cache Hit Ratio entkräftet beispielsweise nicht den Befund unnötig vieler logischer Reads. Eine hohe Gesamtwartezeit beweist wiederum keine hohe Latenz je Zugriff.

    Was lese ich auf den ersten Seiten?

    Reportkopf: Begin Snap, End Snap und Elapsed müssen den gesuchten Zeitraum abdecken. Prüfe DB Name, DB Id, Instance und Startup Time. Ein fachlich interessanter Bericht der falschen Instanz ist kein Beleg für deinen Vorfall.

    Load Profile: Lies zuerst die Spaltenüberschriften, insbesondere Werte pro Sekunde und pro Transaktion. Vergleiche Reads, Ausführungen, Parsing und Redo mit einem passenden Normalzeitraum. Mehr Reads pro Sekunde können durch mehr Arbeit entstehen; sie beweisen allein keinen schlechteren SQL-Plan.

    Top Timed Events und Wait-Abschnitte: Suche die größten Zeitverbraucher. Betrachte bei einem Wait anschließend Anzahl und durchschnittliche Dauer. Viele schnelle Waits und wenige langsame Waits verlangen unterschiedliche Gegenprüfungen. CPU-Zeit ist Arbeit auf der CPU und kein Warteereignis. Prüfe stets, auf welche Gesamtzeit sich eine Prozentspalte bezieht.

    SQL ordered by …: Wähle die Rangliste passend zum Befund: CPU für CPU-Aufwand, Elapsed für Laufzeit, Gets für logische Blockzugriffe und Reads für physische Lesezugriffe, soweit diese Abschnitte im Bericht vorhanden sind. Lies Ausführungszahl und Aufwand je Ausführung neben dem Gesamtwert. Ein Statement an erster Stelle ist ein Untersuchungskandidat, noch keine bewiesene Ursache. Notiere seinen Hashwert für den SQL-Detailbericht.

    Vertiefende Abschnitte: Erst danach prüfst du zum Befund passende I/O-, Speicher-, Parsing- oder Segmentwerte. Formuliere zum Abschluss, welche Auffälligkeit in welchem Zeitraum gemessen wurde, welche Erklärung dazu passt und welcher Beleg noch fehlt. So wird aus dem Lesen eines Reports ein nachvollziehbarer Diagnoseweg.

    8. Zeitgrößen, Einheiten und SQL-Ranglisten richtig deuten

    DB time beschreibt Non-Idle-Zeit der Vordergrundprozesse; DB CPU deren CPU-Zeit. Die Statspack-Größe Total Call Time ist dagegen eine berechnete Näherung, die auch Hintergrundarbeit umfasst. Sie darf nicht ungeprüft mit DB Time gleichgesetzt werden. Auch „CPU time“ unter zeitlich dominanten Ereignissen ist kein Wait Event. Prozentwerte sind nur mit ihrem jeweiligen Bezugswert sinnvoll vergleichbar.

    Lies die Einheiten jeder Spalte: s bedeutet Sekunden, cs Hundertstelsekunden, ms Millisekunden und us Mikrosekunden. Summierte Prozesszeiten können die verstrichene Uhrzeit übersteigen. Der Mittelwert einer Wartezeit zeigt außerdem nicht deren Verteilung und kann einzelne lange Wartevorgänge verdecken.

    Bei SQL-Ranglisten beantwortet Gesamtaufwand die Frage nach dem Beitrag zur Last; Aufwand je Ausführung beschreibt die mittlere Arbeit eines Aufrufs. Beides gehört zusammen. Ausführungen eines Statements sind nicht automatisch Geschäftsaufträge, und ein Mittelwert ist nicht die Laufzeit jedes einzelnen Aufrufs.

    Zur Vertiefung einer bereits erfassten Anweisung dient sprepsql.sql. Die mitgelieferte Dokumentation beschreibt die Auswahl über den SQL-Hashwert sowie Begin-/End-Snapshot. Den erwarteten Hashwert aus dem Statspack-Bericht übernehmen, nicht ungeprüft eine SQL_ID einsetzen. Plandetails setzen passende Level-6-Erfassung und verfügbare Plandaten voraus.

    SQL*Plus als PERFSTAT – gespeicherten SQL-Bericht erzeugen
    @?/rdbms/admin/sprepsql.sql

    9. Den vorhandenen Vergleich fachlich vertiefen

    Eigene Auswertung, fiktive Werte: Im bereits betrachteten normalen 15-Minuten-Zeitraum wurden laut Anwendung 100 Berichte ausgeführt, im Störungszeitraum 300. Steigt der gesamte Leseaufwand ebenfalls um Faktor drei, bleibt der mittlere Leseaufwand je Bericht rechnerisch gleich. Das spricht zunächst für mehr Arbeitsmenge, nicht für einen verschlechterten Zugriffspfad. Voraussetzung ist, dass die verglichene Datenbankarbeit diesen Berichten hinreichend zugeordnet werden kann und andere Last nicht das Ergebnis verfälscht.

    Eine trotzdem gestiegene Antwortzeit verlangt weitere Prüfung: War die gleichzeitige Last höher? Zeigt das Intervall passende Wartezeiten? War der Host ausgelastet? Das sind Hypothesen, keine bereits bewiesenen Ursachen. Für den konkreten 25-Sekunden-Bericht reicht eine instanzweite Aggregation nicht; dafür werden eine passende Sessionzuordnung oder die im nächsten Abschnitt erläuterten Trace-Informationen benötigt.

    10. Aufbewahrung, Baselines und Grenzen

    Zur Sammlung gehört ein Betriebskonzept: freien Tablespace-Platz, Snapshot-Laufzeit, Erfassungsfehler und Aufbewahrungsdauer beobachten. Repräsentative Zeiträume können mit den Statspack-Baseline-Funktionen vor dem regulären Purge geschützt werden. Eine Baseline ist gespeichertes Vergleichsmaterial, keine Aussage, dass jede spätere Abweichung ein Fehler ist. Ein exportiertes Schema und eine lesbare Reportdatei erfüllen unterschiedliche Zwecke.

    sppurge.sql entfernt ausgewählte Snapshot-Bereiche über die Purge-Funktion. Laut mitgelieferter Dokumentation wird die Bereinigung automatisch bestätigt und lässt sich nicht mit ROLLBACK zurücknehmen. sptrunc.sql entfernt dagegen sämtliche Statistikdaten einschließlich Baselines und ist keine normale Aufbewahrungsregel. Diese schreibenden Werkzeuge werden hier erklärt, aber nicht als beiläufig auszuführende Diagnosebefehle angeboten.

    Statspack erfasst keine vollständige Session-Zeitleiste. Kurze Spitzen, SQL unterhalb der Schwellen und vor dem Snapshot verdrängte Cursor können fehlen. Ein nachträglich erzeugter Bericht holt sie nicht zurück. SQL-Texte können sensible Literale enthalten; Repository und exportierte Berichte benötigen geeignete Zugriffsrechte. Die Oracle-Sammel- und Berichtsskripte werden nicht verändert; Umfang und Schwellen werden über die vorgesehenen Schnittstellen eingestellt.

    11. Statspack und Maintenance Suite zusammen nutzen

    Das Performance-Dashboard zeigt Instanzkennzahlen, aktuelle Sessions und verfügbare Cursor-Pläne. Der Wait-Events-Report verbindet kumulierte Wartewerte mit einer aktuellen Sessionaufnahme. Ein passender Statspack-Bericht ergänzt diese Sicht um ein vorher aufgezeichnetes Intervall. Datenbank, Instanz, Zeitraum und Einheiten müssen bei einem Vergleich zusammenpassen. Die Maintenance Suite sammelt durch diese Wiki-Erweiterung keine Statspack-Snapshots und erhält keine neue Datenbank-Schreibfunktion.

    Ein belastbares Ergebnis nennt den Befund, den Zeitraum, die Datengrundlage, eine prüfbare Hypothese und die noch erforderliche Gegenprobe. Ist die Erfassung unvollständig, wird diese Grenze ausdrücklich dokumentiert. Anschließend kann eine gezielte Trace-Auswertung helfen, die Arbeit eines einzelnen Anwendungsvorgangs zu verstehen.

    Quellen: Mitgelieferte Oracle-Dokumentation spdoc.txt, Copyright 2025, insbesondere Abschnitte 0, 2–8, Änderungen für 12.1 und 19.x/21.x sowie 14–15; im Oracle Home unter $ORACLE_HOME/rdbms/admin/spdoc.txt. Ergänzend: Oracle 19c – Instance Tuning Using Performance Views und Oracle 19c – Licensing Information.
    SQL-Trace und TKPROF verstehenEinen vorhandenen Trace auswerten und viele kleine Aufrufe erkennen.SQL

    1. Welche zusätzliche Frage beantwortet ein Trace?

    Wir wollen die SQL-Arbeit eines begrenzten Anwendungsvorgangs genauer verstehen. Ein Trace zeichnet Ausführungsinformationen auf; TKPROF bereitet eine vorhandene Datei lesbar auf. Die Aktivierung einer Erfassung ist eine eigene Betriebsmaßnahme. Sie erzeugt Dateien und zusätzlichen Aufwand. Hier arbeiten wir mit bereitgestellten, datenschutzgerecht behandelten Laborinformationen; es wird kein Tracing eingeschaltet.

    Vor der Auswertung sind Herkunft, Zeitraum, Session beziehungsweise Anwendungskontext und Vollständigkeit zu klären. Bei über mehrere Verbindungen verteilter Arbeit kann eine einzelne Datei unvollständig sein. Ein SQL-Text kann sensible Literale enthalten, auch wenn Bind-Werte nicht gesondert aufgezeichnet wurden. Zugriff und Weitergabe gehören deshalb zur Vorbereitung.

    2. Eine kleine Ausgabe gemeinsam lesen

    Fiktive Beispielausgabe: Vereinfachter TKPROF-Ausschnitt für eine SELECT-Anweisung, keine Messung. CPU und elapsed sind Sekunden; disk, query und current sind Zugriffszähler, keine Bytewerte.

    callcountcpuelapseddiskquerycurrentrows
    Parse10.010.020000
    Execute10000.200.300000
    Fetch20002.008.0010002000001000

    Parse bereitet die Anweisung vor, Execute führt sie aus und Fetch liefert Ergebniszeilen. In diesem Lernbeispiel wurde die Anweisung einmal geparst und tausendmal ausgeführt. Die Fetch-Aufrufe liefern zusammen tausend Zeilen; ein zusätzlicher Fetch kann beispielsweise das Ende eines Ergebnisses feststellen. Aus zweitausend Fetch-Aufrufen folgen weder zweitausend Ergebniszeilen noch zweitausend Geschäftsaufträge.

    Die ausgewiesene elapsed-Summe beträgt 0,02 + 0,30 + 8,00 = 8,32 Sekunden. Bezogen auf die tausend hier vollständig erfassten Ausführungen sind das durchschnittlich 8,32 Millisekunden einschließlich des anteiligen Parse-Aufwands. Einzelne Ausführungen können abweichen. CPU beträgt insgesamt 2,21 Sekunden. Die Differenz ist keine vollständige Liste bestimmter Wait-Ursachen; dafür müssen die passenden Warteinformationen untersucht werden.

    3. Die Summe in den Anwendungsvorgang einordnen

    Wenn diese tausend Aufrufe zu genau einem Bericht gehören, kann die Gesamtzeit wichtig sein, obwohl jeder Aufruf klein erscheint. Prüfe mit dem Anwendungsteam, ob dieselben Daten wiederholt gelesen werden oder ob eine fachlich gleichwertige gebündelte Verarbeitung möglich ist. Gleiche Ergebniszahl allein beweist keine Gleichwertigkeit: Werte, Reihenfolge soweit erforderlich und Fehlerverhalten gehören zur Prüfung.

    Die Gesamtdauer des Berichts kann größer sein als die gezeigte SQL-Zeit. Andere SQL-Anweisungen, Anwendungscode und Übertragung fehlen im Ausschnitt. Rekursive beziehungsweise verschachtelte Arbeit darf nicht durch wahlloses Addieren doppelt gezählt werden. Eine später neu erzeugte EXPLAIN-PLAN-Ausgabe ist außerdem kein sicherer Nachweis des ursprünglich ausgeführten Plans.

    4. Vorhandene Datei ohne Datenbankänderung formatieren

    Shell – vorhandene Labor-Trace-Datei lesen; neue lokale Textdatei schreiben
    tkprof bericht.trc bericht_tkprof.txt waits=yes sort=exeela,fchela

    Eingabedatei und ein noch nicht belegter Ausgabepfad müssen stimmen; das Werkzeug benötigt Leserechte und Platz für die Ausgabe. Das Beispiel verbindet sich nicht über EXPLAIN mit der Datenbank und schaltet keinen Trace ein. Die Sortierung unterstützt die Auswahl auffälliger SQL-Anweisungen; sie ersetzt weder Kontext noch die vollständige Betrachtung der Parse-Zeit. Die Ausgabedatei ist ebenfalls geschützt aufzubewahren.

    5. Wenn noch keine passende Aufzeichnung existiert

    Formuliere einen Erfassungsauftrag: welcher Vorgang, welche Identität, welches kurze Zeitfenster, welche benötigten Daten, wer beendet die Erfassung und wie wird das Ende geprüft? Das zuständige Team wählt ein dafür geeignetes Verfahren. Ohne passende Aufzeichnung bleibt die konkrete Trace-Frage offen. Eine produktive instanzweite Daueraufzeichnung ist kein notwendiger Schritt dieses Lernkapitels.

    Teil B – Praxisfälle und Verbesserungsnachweis

    Leitfrage: Wie führt ein Befund zu einer belegten Ursache und einer überprüften Verbesserung?

    Alle folgenden Fälle führen von der Ausgangslage über SQL und fiktive Ergebnisse zur begründeten Lösung und Nachkontrolle. Die Zahlen gelten jeweils nur für den betreffenden Lehrfall.

    Praxisfall: Speichern wird langsamEine offene Transaktion mit Sperrkette, Anwendungsbefund und Nachmessung erkennen.Praxis

    1. Praxisfall – morgens wird die Datenbank langsam

    Vollständiger Diagnose- und Lösungsweg

    Ausgangslage: Zwischen 06:40 und 07:05 Uhr benötigt das Speichern einer Bestellung etwa 20 statt 2 Sekunden. Eine einfache Artikelsuche bleibt schnell. Wir untersuchen diesen konkreten Unterschied und arbeiten den Fall bis zur überprüften Lösung durch. Alle Namen, Messwerte und die abschließende Fehlerursache sind erfundene Lernbeispiele.

    1. Den betroffenen Vorgang und seine Verbindung finden

    Notiere Uhrzeit mit Zeitzone, betroffene Funktion, Service und Benutzer sowie die normale und die beobachtete Antwortzeit. Den Service liest du aus der Verbindungskonfiguration der Anwendung. Im Beispiel lautet er APP_SERVICE. Führe die folgende Abfrage während der Verzögerung mehrmals aus, etwa im Abstand von fünf Sekunden. Die Session der eigenen Diagnoseverbindung wird ausgeschlossen.

    READ ONLY – Aktive Arbeit des betroffenen Services
    SELECT con_id, module,
           CASE WHEN state = 'WAITING' THEN event
                ELSE 'AKTIV, NICHT ALS WAITING GEMELDET' END AS zustand,
           COUNT(*) AS sessions
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
      AND service_name = 'APP_SERVICE'
      AND sid <> TO_NUMBER(SYS_CONTEXT('USERENV', 'SID'))
    GROUP BY con_id, module,
             CASE WHEN state = 'WAITING' THEN event
                  ELSE 'AKTIV, NICHT ALS WAITING GEMELDET' END
    ORDER BY sessions DESC;

    Fiktiver Auszug einer Stichprobe:

    Fiktive SQL-Ausgabe:

    CON_IDMODULEZUSTANDSESSIONS
    0ORDER_EDITenq: TX - row lock contention3
    0ARTICLE_SEARCHAKTIV, NICHT ALS WAITING GEMELDET1

    Drei Verbindungen des Bestellmoduls warten auf Transaktionssperren. Die Suche ist in dieser Stichprobe aktiv, aber nicht als wartend gemeldet. Das ist kein exakter CPU-Nachweis. MODULE muss von der Anwendung sinnvoll gesetzt werden; bei fehlendem Wert ordnest du die Verbindung über Benutzer und Anwendung zu. Eine leere Ausgabe kann bedeuten, dass der Vorgang bereits vorbei ist oder der Servicefilter nicht passt.

    2. Zwei Messpunkte erfassen und die zusätzliche Zeit berechnen

    Lies die folgenden Abfragen einmal um 06:45 Uhr und erneut ungefähr 60 Sekunden später. Speichere beide Ausgaben mit ihren Zeitstempeln, beispielsweise mit der Spool-Funktion von SQL*Plus. Verwende für die Rechnung die tatsächliche Zeitdifferenz. Eine spätere Einzelabfrage kann dieses vergangene Minutenintervall nicht rekonstruieren. Wurde damals nichts erfasst, planst du die Messung für das nächste Auftreten.

    Halte Messzeit und Instanzstart mit der Abfrage aus Warum Delta-Werte so wichtig sind fest. Die folgenden Messpunkte liegen im Beispiel 60 Sekunden auseinander.

    READ ONLY – Kumulative Zeitwerte an beiden Messpunkten
    SELECT stat_name, value AS zeit_us
    FROM v$sys_time_model
    WHERE stat_name IN ('DB time', 'DB CPU')
      AND con_id = 0
    ORDER BY stat_name;

    Fiktive SQL-Ausgabe – 06:45:00:

    STAT_NAMEZEIT_US
    DB CPU400000000
    DB time1000000000

    Fiktive SQL-Ausgabe – 06:46:00:

    STAT_NAMEZEIT_US
    DB CPU460000000
    DB time1240000000

    So rechnest du: Ziehe den ersten Wert vom zweiten ab und teile durch 1.000.000. DB Time: (1.240.000.000 − 1.000.000.000) / 1.000.000 = 240 Sekunden. DB CPU: (460.000.000 − 400.000.000) / 1.000.000 = 60 Sekunden. Die DB Time summiert Arbeit mehrerer Verbindungen; 240 Sekunden in einer Minute sind deshalb möglich. 240 / 60 ergibt im Intervall durchschnittlich vier aktive Sessions als Zeitmaß, nicht vier gleichzeitig angemeldete Benutzer.

    Die Differenz von etwa 180 Sekunden lenkt die Untersuchung auf Wartezeit. Sie identifiziert noch keinen Verursacher. Zeitstatistiken werden teilweise verzögert veröffentlicht, und getrennte Abfragen liefern keine atomare Momentaufnahme. Bei verändertem Instanzstart, negativen Deltas oder fehlenden Vergleichswerten verwirfst du den Vergleich und beginnst neu. Für die normale Baseline erfasst du ebenfalls zwei Messpunkte bei vergleichbarer Zahl und Art der Aufträge.

    3. Den Wartegrund im gleichen Intervall bestätigen

    READ ONLY – Kumulative Foreground-Wartezeit je Klasse
    SELECT wait_class,
           SUM(time_waited_micro_fg) AS wartezeit_us
    FROM v$system_event
    WHERE wait_class <> 'Idle'
      AND con_id = 0
    GROUP BY wait_class
    ORDER BY wait_class;

    Auch diese Ausgabe wird an beiden Messpunkten gelesen. Die Sortierung erfolgt nach Namen; für die Priorität berechnest du anschließend je Klasse das Delta. Foreground bedeutet hier Arbeit der Benutzerverbindungen. Hintergrund-Wartezeit wird nicht zur DB Time der Benutzer addiert.

    Fiktive SQL-Ausgabe – 06:45:00: Zeilenausschnitt; weitere Treffer sind möglich.

    WAIT_CLASSWARTEZEIT_US
    Application100000000
    Commit10020000
    User I/O200000000

    Fiktive SQL-Ausgabe – 06:46:00: Zeilenausschnitt; weitere Treffer sind möglich.

    WAIT_CLASSWARTEZEIT_US
    Application270000000
    Commit12000000
    User I/O208000000

    Application hat um 170 Sekunden zugenommen, User I/O um 8 und Commit um 1,98 Sekunden (gerundet zwei Sekunden). Zusammen mit den wiederholten Session-Stichproben spricht das im Beispiel für eine Sperrsituation. Aus der instanzweiten Summe allein folgt keine Zuordnung zum Bestellservice; diese liefern erst die beobachteten Verbindungen und ihr Blocker.

    4. Die wartende und die blockierende Verbindung zusammen anzeigen

    READ ONLY – Wartende Sessions und ihr aktueller Blocker
    SELECT w.con_id,
           w.sid || '/' || w.serial# AS wartet,
           b.sid || '/' || b.serial# AS blockiert_durch,
           b.status AS blocker_status,
           b.module AS blocker_modul,
           CASE WHEN b.taddr IS NOT NULL THEN 'JA'
                ELSE 'NEIN' END AS transaktion
    FROM v$session w
    JOIN v$session b
      ON b.sid = w.blocking_session
    WHERE w.type = 'USER'
      AND w.state = 'WAITING'
      AND w.event = 'enq: TX - row lock contention'
      AND w.blocking_session_status = 'VALID'
      AND w.blocking_instance =
          (SELECT instance_number FROM v$instance)
      AND w.service_name = 'APP_SERVICE'
    ORDER BY w.sid;

    Fiktiver Auszug; alle Zeilen gehören hier zu CON_ID 0:

    Fiktive SQL-Ausgabe:

    CON_IDWARTETBLOCKIERT_DURCHBLOCKER_STATUSBLOCKER_MODULTRANSAKTION
    087/120142/917INACTIVEORDER_EDITJA
    088/120242/917INACTIVEORDER_EDITJA
    089/120342/917INACTIVEORDER_EDITJA

    Alle drei warten auf dieselbe Verbindung 42/917. Diese ist momentan INACTIVE, besitzt aber einen Transaktionszustand. Inaktiv bedeutet nicht, dass alle Änderungen abgeschlossen und Sperren freigegeben sind. SID und SERIAL# zusammen verhindern, dass eine später wiederverwendete SID mit dieser Verbindung verwechselt wird. Kontrolliere die Zuordnung erneut, bevor du sie weitergibst. Keine Zeile kann bedeuten, dass die Sperre inzwischen verschwunden ist; das widerlegt die zuvor gespeicherte Beobachtung nicht.

    5. Die Ursache und die passende Lösung ermitteln

    Gib dem Anwendungsverantwortlichen Zeitpunkt, Service, Modul und Verbindung 42/917. Gemeinsam wird der zugehörige Speichervorgang im Anwendungsprotokoll verfolgt. Im Lernfall zeigt das Protokoll: Nach einer Änderung wartet die Anwendung auf einen externen Dienst; beim anschließenden Timeout bleibt die Transaktion offen. Diese zusätzliche Information erklärt den Fehlerpfad. Die Datenbankabfragen allein hätten weder den externen Dienst noch den fehlenden Abschluss bewiesen.

    Lösung im Beispiel: Der Verantwortliche beendet den betroffenen Vorgang über das vorgesehene Anwendungsverfahren. Dabei wird fachlich entschieden, ob die Änderung abgeschlossen oder verworfen werden muss. Die Entwicklung korrigiert anschließend den Timeout-Pfad, sodass offene Transaktionen zuverlässig beendet werden, und verlegt die lange externe Wartephase soweit fachlich möglich außerhalb der Transaktion. Diese Änderung wird zuerst getestet und kontrolliert ausgeliefert. Das Wiki führt weder COMMIT noch ROLLBACK oder einen Session-Abbruch aus.

    6. Durch Nachmessung zeigen, dass die Lösung wirkt

    Wiederhole dieselben Abfragen und den betroffenen Speichervorgang bei vergleichbarem Auftragsvolumen. Die folgende Tabelle zeigt fiktive, bereits berechnete Werte aus jeweils 60 Sekunden. Eine verschwundene Sperre ohne erneuten Anwendungstest genügt nicht.

    KennzahlStörungNach Korrektur
    Antwortzeit Speichern20 s2 s
    DB Time / DB CPU240 s / 60 s80 s / 55 s
    Application-Wartezeit170 s5 s
    Gemeinsamer Blocker in Stichproben42/917keiner gefunden

    Nachvollziehbares Ergebnis: Eine offen gebliebene Anwendungstransaktion verzögerte das Speichern. Die Zuordnung beruht auf Sperrkette, Anwendungsprotokoll und erfolgreicher Nachprüfung. Mehr Speicher hätte den fehlenden Transaktionsabschluss nicht behoben. Für weitere Sperrketten verweist das Locks-Kapitel auf die vertiefte Diagnose.

    Nächster Schritt: Verbesserung nachweisen.

    Praxisfall: Ein Bericht liest zu vielMehr Lesevorgänge von langsamerem I/O unterscheiden.Praxis

    1. Praxisfall – DB Time steigt, DB CPU bleibt weitgehend stabil

    Eigenständiger Lernfall: Ein Bericht benötigt länger. Mit derselben Messmethode wie im Sperrfall erhalten wir in diesem eigenständigen Beispiel im Problemfenster 360 Sekunden DB Time und 60 Sekunden DB CPU. In der normalen Vergleichsminute waren es 90 und 55 Sekunden. Die Warteklassenmessung zeigt diesmal überwiegend User I/O. Jetzt wird konkret unterschieden, ob mehr Lesevorgänge anfallen oder einzelne Vorgänge länger dauern.

    1. Anzahl und Zeit des auffälligen Events zweimal lesen

    READ ONLY – Foreground-Lesewartezeit messen
    SELECT event, total_waits_fg AS waits,
           time_waited_micro_fg AS zeit_us
    FROM v$system_event
    WHERE event = 'db file sequential read'
      AND con_id = 0;

    Fiktive SQL-Ausgabe – Beginn der Problemminute:

    EVENTWAITSZEIT_US
    db file sequential read100000500000000

    Fiktive SQL-Ausgabe – Ende der Problemminute:

    EVENTWAITSZEIT_US
    db file sequential read150000750000000

    Erfasse wieder zwei Werte pro Vergleichsintervall. Berechne mittlere Wait-Dauer = Delta Zeit in µs / Delta Waits / 1.000. Bei null zusätzlichen Waits ist kein Mittelwert definiert. Diese Dauer beschreibt Oracle-Warteereignisse und ist keine isolierte Messung der Speicherhardware.

    Auswertung zweier Messintervalle – keine direkte SQL-Ausgabe: Die kumulierten Zähler werden je Intervall voneinander abgezogen, ZEIT_US wird in Sekunden umgerechnet und die mittlere Wartezeit daraus berechnet.

    Je 60 SekundenZusätzliche Waits / ZeitØ Wait-Dauer
    Normal5.000 / 25 s5 ms
    Problem50.000 / 250 s5 ms

    Auswertung: Die Anzahl ist zehnmal so hoch, die mittlere Dauer gleich geblieben. Der erste Ansatz ist deshalb die zusätzliche Lesearbeit. Das Ergebnis belegt keinen plötzlich langsameren Storage. Durchschnittswerte können einzelne Ausreißer verdecken.

    2. Das betroffene SQL finden und dessen Auswahl prüfen

    Verwende die Sessionabfrage aus Ein langsamer Aufruf oder sehr viele kleine Aufrufe? mit REPORT_SERVICE und dem beobachteten I/O-Event. Im Beispiel erhältst du SID 205, SERIAL# 4412, CON_ID 0 und SQL_ID 7a1b2c3d4f5g6 mit Child 0.

    Im fiktiven Ergebnis erscheint wiederholt dieselbe Berichtssession und SQL_ID. Übernimm deren SQL_ID und Child-Nummer in die folgende Abfrage; die Zeichenfolge ist ein Platzhalter. Eine erneut gelesene Session kann inzwischen eine andere SQL_ID anzeigen. Die folgende V$SQL-Abfrage mit der fest eingesetzten SQL_ID sucht dagegen weiterhin genau diesen Cursor; wurde er aus dem Cache entfernt, kann der Treffer fehlen. Übernimm auch CON_ID aus dem vorherigen Ergebnis; die 0 steht hier für die Non-CDB. Für einen langen SQL-Text kannst du in SQL*Plus vorher SET LONG 100000 eingeben. Das ändert nur die Ausgabegrenze des Clients; ein noch längerer Text kann weiterhin abgeschnitten sein.

    READ ONLY – Gefundenen SQL-Text lesen
    SELECT con_id, sql_id, child_number, sql_fulltext
    FROM v$sql
    WHERE sql_id = '7a1b2c3d4f5g6'
      AND child_number = 0
      AND con_id = 0;

    Fiktive SQL-Ausgabe:

    CON_IDSQL_IDCHILD_NUMBERSQL_FULLTEXT
    07a1b2c3d4f5g60SELECT bestellnummer, betrag FROM bestellungen

    Was sehe ich hier? Der Lehrtext zeigt keinen Zeitraumfilter. Das wird erst dann zum Fehler, wenn der Auftrag tatsächlich nur einen bestimmten Tag verlangt. Die angezeigte Anweisung ist im Lehrfall vollständig. Ob eine Einschränkung fehlt, beurteilst du anhand des fachlichen Auftrags und des Anwendungskontexts.

    Feststellung im Beispiel: Der SQL-Text enthält keinen Zeitraumfilter mehr; der Bericht liest mehrere Jahre statt des angeforderten Tages. Der Anwendungsverantwortliche bestätigt anhand der Berichtsanforderung, dass dies unbeabsichtigt ist. Erst diese Prüfung macht aus der hohen I/O-Menge einen konkreten Fehler. Das Event allein hätte den fehlenden Filter nicht bewiesen.

    3. Lösung und Gegenprobe

    Die Entwicklung stellt den fachlich vorgesehenen Zeitraumfilter wieder her und prüft die Ergebniszeilen auf Vollständigkeit. Nach getesteter Auslieferung ergeben die gleichen Messungen etwa 5.000 Waits und 25 Sekunden Event-Wartezeit je Minute; der Bericht erreicht wieder seine übliche Antwortzeit. Wird tatsächlich die vollständige Historie benötigt, wäre das Weglassen der Daten keine Lösung. Dann müssen Abfrage und Zugriffsplan für genau diesen Umfang untersucht werden – siehe Ausführungspläne.

    Nächster Schritt: Verbesserung nachweisen.

    Praxisfall: Hohe Host-CPUDen tatsächlichen Verbraucher mit Datenbank- und Prozesssicht eingrenzen.Praxis

    1. Praxisfall – Host-CPU ist hoch

    Eigenständiger Lernfall: Die Hostüberwachung meldet über mehrere Minuten 95 % CPU-Auslastung. Im gleichen 60-Sekunden-Intervall steigt DB CPU der untersuchten Instanz nur um 12 Sekunden. Das entspricht durchschnittlich 0,2 CPU-Ausführungseinheiten. Es ist keine Prozentangabe für den ganzen Host und umfasst nicht sämtliche Oracle-Hintergrundarbeit oder andere Instanzen.

    1. Den tatsächlichen Prozessverbrauch im selben Zeitraum ansehen

    Lies zuerst die DB-CPU-Differenz wie in Praxisfall – morgens wird die Datenbank langsam. Prüfe parallel die vorhandene Hostüberwachung. Unter Solaris kann die folgende reine Beobachtung mehrere Prozessstichproben im Sekundenabstand liefern. Führe sie auf dem Datenbankhost aus, nicht auf deinem Arbeitsplatz. Die Ausgabe und CPU-Prozentnormierung hängen vom Betriebssystem ab; die ersten Werte dienen zunächst der Orientierung.

    READ ONLY – Solaris-Prozesse beobachten
    prstat -c 1 5

    Fiktiver, zusammengefasster Befund:

    BeobachtungErgebnis
    Hostüberwachung95 % CPU über mehrere Messintervalle
    DB CPU dieser Instanz12 CPU-Sekunden in 60 Sekunden
    Wiederholte ProzessstichprobenMehrere Komprimierungsprozesse führen die CPU-Liste an

    2. Bei einem Oracle-Prozess die Verbindung zuordnen

    Falls stattdessen ein Oracle-Prozess auffällt, übernimm seine OS-Prozess-ID in diese Abfrage. Die Beispielnummer 12345 wird ersetzt. Eine Zuordnung ist noch kein Nachweis, dass genau dieser Prozess die gesamte Hostlast erklärt.

    READ ONLY – OS-Prozess zur Session zuordnen
    SELECT p.spid, p.stid, p.pname,
           s.sid, s.serial#, s.con_id, s.module, s.sql_id
    FROM v$process p
    LEFT JOIN v$session s ON s.paddr = p.addr
    WHERE p.spid = '12345';

    Fiktive SQL-Ausgabe:

    Erste Spalten des Ergebnisses.

    SPIDSTIDPNAMESID
    123451NULL205

    Weitere Spalten – SPID zur Zuordnung wiederholt.

    SPIDSERIAL#CON_IDMODULESQL_ID
    1234544120Umsatzbericht7a1b2c3d4f5g6

    Was sehe ich hier? Der Betriebssystemprozess ist in dieser Stichprobe einer Berichtssession zugeordnet. STID und PNAME stehen zusätzlich in der echten Ausgabe. Die Zuordnung beweist allein noch nicht die Ursache seiner CPU-Nutzung.

    Keine Session zu einem Prozess kann etwa auf Hintergrundarbeit hindeuten. Bei Threaded Execution ist SPID allein nicht eindeutig; berücksichtige zusätzlich Thread- und Ausführungskontext. Bei Shared Server ist die Prozesszuordnung ebenfalls keine dauerhafte Eins-zu-eins-Beziehung. Prüfe außerdem weitere Instanzen und andere Prozesse auf dem Host.

    3. Lösung des Beispiels und Nachkontrolle

    Im Lernfall bestätigt der OS-Verantwortliche, dass mehrere Komprimierungsjobs gleichzeitig im Hauptnutzungsfenster gestartet werden. Er begrenzt deren Gleichzeitigkeit oder verlegt sie in ein geeignetes Zeitfenster. Nach der kontrollierten Anpassung sinkt die Hostlast bei vergleichbarer Anwendungslast von 95 auf 40 %, und die Antwortzeiten normalisieren sich. DB CPU bleibt mit etwa 12 Sekunden je Minute ähnlich. Damit stützen Prozessmessung, Jobplan und Nachmessung die Diagnose. Ist stattdessen Oracle der Verbraucher, wird das zugeordnete SQL untersucht; ein bloßer Ausbau der SGA folgt daraus nicht.

    Nächster Schritt: Verbesserung nachweisen.

    Praxisfall: Commit-Latenz steigtRedo-Schreibpfad, Arbeitsmenge und Gegenprobe verbinden.Praxis

    1. Praxisfall – Commit-Latenz steigt

    Eigenständiger Lernfall: Das Bestätigen von Änderungen dauert länger. Prüfe log file sync als Wartezeit der Benutzerverbindungen zusammen mit log file parallel write aus dem Redo-Schreibpfad. Lies beide Zähler zu Anfang und Ende desselben Intervalls.

    READ ONLY – Commit- und Redo-Schreibwartezeit
    SELECT event,
           CASE WHEN event = 'log file sync'
                THEN total_waits_fg ELSE total_waits END AS waits,
           CASE WHEN event = 'log file sync'
                THEN time_waited_micro_fg
                ELSE time_waited_micro END AS zeit_us
    FROM v$system_event
    WHERE event IN ('log file sync', 'log file parallel write')
      AND con_id = 0
    ORDER BY event;

    Fiktive SQL-Ausgabe – Beginn der Problemminute:

    EVENTWAITSZEIT_US
    log file parallel write50005000000
    log file sync1000020000000

    Fiktive SQL-Ausgabe – Ende der Problemminute:

    EVENTWAITSZEIT_US
    log file parallel write550012500000
    log file sync1100040000000

    1. Deltas statt Startsummen vergleichen

    Für jedes Event gilt: mittlere Wait-Dauer in ms = Delta Zeit in µs / Delta Waits / 1.000. Die beiden Events sind keine eins-zu-eins gepaarten Messungen: Mehrere Commits können sich einen Schreibvorgang teilen. Ihre Zeiten werden deshalb nicht addiert oder einfach voneinander abgezogen.

    Auswertung zweier Messintervalle – keine direkte SQL-Ausgabe: Die Tabelle zeigt bereits berechnete Deltas; die SQL-Abfrage darüber liefert EVENT, WAITS und ZEIT_US als kumulierte Zähler.

    EventNormale Minute: Waits / ZeitProblemminute: Waits / Zeit
    log file sync1.000 / 2 s1.000 / 20 s
    log file parallel write500 / 0,5 s500 / 7,5 s

    Damit steigt log file sync von 2 auf 20 ms je Wait und log file parallel write von 1 auf 15 ms. Beide Sichtweisen werden langsamer, obwohl die Anzahl in diesem Beispiel gleich bleibt. Das macht den Redo-Schreibpfad zu einem begründeten Kandidaten, aber noch nicht die Hardware zur bewiesenen Ursache.

    2. Redo-Menge und den betroffenen Pfad gegenprüfen

    READ ONLY – Zusätzliche Lastzähler an beiden Messpunkten
    SELECT name, value
    FROM v$sysstat
    WHERE name IN ('user commits', 'redo size')
      AND con_id = 0
    ORDER BY name;

    Fiktive SQL-Ausgabe:

    NAMEVALUE
    redo size104857600
    user commits5000

    Was sehe ich hier? Zählerstand zum ersten Messpunkt: 100 MiB erzeugtes Redo und 5.000 Commits. Bei 125.829.120 Bytes und 6.000 Commits nach 60 Sekunden ergeben sich 20 MiB zusätzliches Redo und 1.000 zusätzliche Commits. Die zweite Abfrage zeigt die Dateipfade der Redo-Member, siehe folgende Tabelle.

    READ ONLY – Redo-Member und Dateipfade
    SELECT group#, member
    FROM v$logfile
    ORDER BY group#, member;

    Fiktive SQL-Ausgabe: Zeilenausschnitt; weitere Treffer sind möglich.

    GROUP#MEMBER
    1/redo_a/DEMODB/redo01.log
    1/redo_b/DEMODB/redo01.log

    Zwei Member derselben Gruppe liegen im Lehrmodell auf zwei Pfaden. Daraus allein folgt noch keine physische Unabhängigkeit der Storage-Ziele.

    user commits zählt Commits, redo size die erzeugten Redo-Bytes. Die Deltas werden mit dem Normalintervall verglichen; eine hohe Redo-Menge kann selbst mehr Schreibarbeit verursachen. Ordne die aufgeführten Redo-Dateien den tatsächlich verwendeten Mounts beziehungsweise Storage-Zielen zu. Lasse für genau diese Ziele die vorhandenen I/O-Messungen im gleichen Zeitfenster prüfen.

    3. Konkrete Lösung im Lernfall

    Hier sind Commit- und Redo-Rate vergleichbar geblieben. Die Storage-Messung zeigt zeitgleich höhere Schreiblatenzen auf dem Redo-Ziel; der Betriebsplan belegt einen konkurrierenden Kopierjob auf demselben Storage. Nach abgestimmter Verlagerung dieses Jobs werden erneut beide Event-Deltas, Redo-Menge und Benutzerantwortzeiten gemessen. Die mittleren Waits liegen wieder bei ungefähr 2 beziehungsweise 1 ms. Das ist die Gegenprobe für diese Beispielursache.

    Bleibt log file parallel write dagegen unauffällig, reicht dieses Lösungsmuster nicht. Dann werden unter anderem CPU-Scheduling, Commit-Häufigkeit und der Benachrichtigungsweg untersucht. Größere Redo-Logs oder abgeschwächte Commit-Dauerhaftigkeit sind keine aus diesem Befund ableitbare Standardlösung. Vertiefung: Redo-Logs.

    Nächster Schritt: Verbesserung nachweisen.

    Praxisfall: Viele aktive SessionsAktive Verbindungen nach Zuständen einordnen und eine Ursache prüfen.Praxis

    1. Praxisfall – viele aktive Sessions

    Eigenständiger Lernfall: Ein Dashboard meldet 40 aktive Benutzerverbindungen. Zunächst unterscheidest du tatsächliche Wartezustände von sonstiger aktiver Arbeit. Die Anzahl allein beweist keinen CPU-Engpass und ist auch kein Zähler gleichzeitig belegter CPU-Threads.

    1. Die aktiven Verbindungen nach Zustand aufteilen

    READ ONLY – Aktive Sessions einordnen
    SELECT CASE
             WHEN state = 'WAITING' AND wait_class <> 'Idle'
               THEN 'WARTET: ' || wait_class
             WHEN state = 'WAITING'
               THEN 'WARTET: Idle'
             ELSE 'AKTIV, NICHT ALS WAITING GEMELDET'
           END AS zustand,
           COUNT(*) AS anzahl
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
      AND sid <> TO_NUMBER(SYS_CONTEXT('USERENV', 'SID'))
    GROUP BY CASE
             WHEN state = 'WAITING' AND wait_class <> 'Idle'
               THEN 'WARTET: ' || wait_class
             WHEN state = 'WAITING'
               THEN 'WARTET: Idle'
             ELSE 'AKTIV, NICHT ALS WAITING GEMELDET'
           END
    ORDER BY anzahl DESC;

    Fiktive SQL-Ausgabe:

    ZUSTANDANZAHL
    WARTET: Application30
    WARTET: User I/O6
    AKTIV, NICHT ALS WAITING GEMELDET4

    Die Summe ergibt 40. Davon sind 36 in dieser Stichprobe als wartend gemeldet. Die übrigen vier sind nicht automatisch vier gleichzeitig auf der CPU laufende Threads. Wiederhole die Abfrage; einzelne Momentaufnahmen können kurze Zustandswechsel verpassen.

    2. Aus der größten Gruppe eine konkrete Ursache ableiten

    Untersuche für die Application-Gruppe die einzelnen Events und Services mit der Sessionabfrage aus Praxisfall – morgens wird die Datenbank langsam. Im Lernfall warten die 30 Verbindungen auf enq: TX - row lock contention. Die Blockerabfrage aus Praxisfall – morgens wird die Datenbank langsam zeigt denselben Blocker; ihr Servicefilter wird auf den hier betroffenen Service gesetzt. Der Anwendungsverantwortliche ordnet ihn einem noch offenen Bearbeitungsvorgang zu.

    3. Lösung und erwartetes Ergebnis

    Der Bearbeitungsvorgang wird über den vorgesehenen Anwendungsablauf fachlich korrekt abgeschlossen. Anschließend müssen die wartenden Vorgänge weiterlaufen und die Antwortzeiten sinken. In der wiederholten Stichprobe verschwinden die 30 Sperr-Waiter; die Zahl aktiver Sessions fällt bei vergleichbarer Nachfrage deutlich. Dauerhaft wird der Ablauf so gestaltet, dass er während längerer Benutzerpausen keine unnötigen Transaktionssperren hält. Eine Erhöhung des Connection-Pools hätte in diesem Fall möglicherweise nur weitere wartende Verbindungen zugelassen.

    Zeigen die Stichproben keine Sperrkette und wächst stattdessen DB CPU zusammen mit belegter Host-CPU, folgst du Praxisfall – Host-CPU ist hoch. Bei überwiegendem User I/O folgst du Praxisfall – DB Time steigt, DB CPU bleibt weitgehend stabil. Die Musterlösung hängt damit vom gemessenen Zustand ab; „viele aktive Sessions“ allein legt keine Maßnahme fest.

    Quellen für den Lösungsweg: Oracle 19c: Performanceanalyse mit Views · Solaris: prstat. Oracle-19c-Referenzen zu den Praxisabfragen: V$SYS_TIME_MODEL · V$SYSTEM_EVENT · V$SESSION · V$SYSSTAT · V$PROCESS.

    Nächster Schritt: Verbesserung nachweisen.

    Praxisfall: Gestern langsam, heute unauffälligEine historische Behauptung anhand vorhandener Daten bewerten.Praxis

    1. Ausgangslage und Auftrag

    Gestern um 06:45 Uhr dauerte unser Bericht 25 Sekunden. Heute ist er wieder schnell. Vorhanden sind ein Anwendungslog mit Dauer und Eingaben sowie ein instanzweiter Bericht von 06:00 bis 07:00 Uhr. Eine Aussage lautet: „Der höchste Wait im Stundenbericht ist die Ursache.“ Prüfe diese Aussage.

    2. Schrittweise Eingrenzung

    Zuerst prüfen wir Identität und Uhrzeiten einschließlich Zeitzone. Dann fragen wir, ob das lange Intervall den konkreten Vorgang überhaupt isolieren kann. Es enthält auch Backups und andere Arbeit. Der höchste Wait beschreibt damit einen Untersuchungsansatz, aber noch keine Zuordnung zum Bericht. Ein heute gemessener Normalzustand schließt eine gestrige Störung nicht aus.

    Musterlösung und Abnahmekriterien

    Belastbar ist: Die Anwendung hat den langsamen Vorgang protokolliert; die Datenbankauswertung deckt ein größeres Zeitfenster und andere Arbeit mit ab. Die konkrete Ursache bleibt offen. Für eine Wiederholung werden enger passende Messpunkte und eine Zuordnung zur Anwendungsarbeit vorbereitet. Keine willkürliche Einstellung ändern, um eine nicht belegte Ursache zu behandeln.

    Praxisfall: Kleine Abfragen, langsamer BerichtDen durchgängigen Berichtfall anhand mehrerer SQL-Anteile abschließen.Praxis

    1. Befunde zusammenführen

    Der Bericht liefert nach Prüfung dieselben 200 fachlichen Ergebniszeilen. In einem passend abgegrenzten Versuch gehören tausend Nachschlageaufrufe zu einem Bericht. Der TKPROF-Lernausschnitt weist dafür 8,32 Sekunden aus. Weitere Anweisungen und Anwendungsanteile erklären den restlichen Zeitraum; wir behaupten nicht, die ganzen 25 Sekunden allein erklärt zu haben.

    2. Hypothese und Gegenprobe

    Die Hypothese lautet: Wiederholte Nachschlagearbeit ist ein vermeidbarer Anteil. Das Anwendungsteam entwickelt in der Testumgebung eine fachlich gleichwertige Variante mit weniger Aufrufen. Verglichen werden gleiche Eingaben, vollständige Ausgabe, vergleichbare Last und mehrere Wiederholungen. Das Wiki führt keine SQL-Umschreibung oder Datenänderung aus.

    Fiktiver VergleichVorherNachher
    Nachschlageaufrufe je Bericht100010
    Zeit dieser Arbeit im abgegrenzten Versuch8,32 s0,40 s
    Gesamte Anwenderdauer25,00 s17,08 s

    Für dieses vereinfachte serielle Rechenbeispiel bleiben alle übrigen Anteile gleich: 25 − 8,32 + 0,40 = 17,08 Sekunden. Die Einsparung beträgt 7,92 Sekunden beziehungsweise 31,68 Prozent. In einer realen Anwendung mit Überlappung und schwankender Last muss die Gesamtzeit gemessen werden.

    Musterlösung und Abnahmekriterien

    Die Maßnahme verbessert den nachgewiesenen Teil deutlich, erreicht aber noch nicht die ursprünglichen fünf Sekunden. Das ist ein Teilerfolg mit weiterem Untersuchungsbedarf. Der nächste Schritt richtet sich nach den verbleibenden gemessenen Anteilen. Eine einzige schnelle Wiederholung würde weder Stabilität noch fachliche Korrektheit beweisen.

    Praxisfall: Schneller – aber ist der Vergleich gültig?Ergebnisqualität und Versuchsbedingungen vor dem Erfolgsurteil prüfen.Praxis

    1. Verführerische Erfolgsmeldung

    Eine neue Variante benötigt nur drei Sekunden. Im alten Versuch wurden 200 Zeilen vollständig übertragen; im neuen Versuch wurde nach zehn Zeilen abgebrochen. Außerdem lief der alte Versuch während eines Batches, der neue allein. Darf die Variante jetzt als Verbesserung freigegeben werden?

    2. Die fehlende Gegenprobe planen

    Zuerst denselben Arbeitsumfang herstellen: gleiche fachliche Eingaben, vollständige Ausgabe und Prüfung der Werte. Danach vergleichbare Last und dokumentierte Cachebedingungen wählen. Wiederholungen zeigen Schwankungen. Ein niedrigerer Mittelwert kann weiterhin einzelne sehr langsame Aufrufe enthalten; Verteilung und Ausreißer passend zum Ziel untersuchen.

    Musterlösung und Abnahmekriterien

    Die bisherige Messung ist kein gültiger Verbesserungsnachweis. Sie vergleicht verschiedene Aufgaben und Bedingungen. Ein kontrollierter neuer Vergleich ist nötig. Bleiben Bedingungen unvermeidbar unterschiedlich, muss der Bericht die Einschränkung ausdrücklich nennen.

    Verbesserung nachweisen und dokumentierenZiele, Gegenprobe, Nebenwirkungen und Übergabe zusammenführen.Nachweis

    Bewerte dieselben fachlichen Aufträge unter vergleichbarer Last. Halte sowohl erreichte Ziele als auch offene Prüfungen ausdrücklich fest.

    1. Die wirksamste Verbesserung auswählen

    Nicht jede technisch mögliche Beschleunigung bringt dem Benutzer gleich viel. Zerlege einen konkreten Aufruf in aufeinanderfolgende Zeitanteile, soweit die Messung das erlaubt. Verändert eine Maßnahme nur einen kleinen Anteil, bleibt ihre Wirkung auf die Gesamtzeit begrenzt. Das folgende Beispiel ist eine einfache serielle Modellrechnung; überlappende oder parallele Arbeit würde eine andere Auswertung verlangen.

    Fiktiver Ablauf mit nicht überlappenden Zeitanteilen: Neutrale Lernwerte, keine Messung einer realen Umgebung.

    Anteil eines AufrufsVorherNach halbierter SQL-Zeit
    Poolwartezeit6 s6 s
    SQL-Arbeit im Aufruf3 s1,5 s
    Darstellung beim Client1 s1 s
    Gesamte Antwortzeit10 s8,5 s

    Rechenweg: Die SQL-Laufzeit halbiert sich, aber die Antwortzeit sinkt nur um 1,5 / 10 = 15 Prozent. Selbst eine vollständig verschwundene SQL-Zeit würde im Modell sieben Sekunden übrig lassen. Der größte beobachtete Zeitanteil liegt vor der SQL-Ausführung. Untersuche dafür das Connection-Pool-Kapitel und die Besitzer der ausgeliehenen Verbindungen.

    Entscheidung: Formuliere vor der Änderung eine prüfbare Erwartung. Beispiel: „Wenn die Verbindung nicht mehr während des externen Aufrufs gehalten wird, sinkt die Poolwartezeit bei gleicher Nachfrage.“ Danach prüfst du genau diesen Zeitanteil und zusätzlich die Gesamtzeit. Bewerte das zuvor vereinbarte Ziel: geringere Antwortzeit, höherer Durchsatz oder weniger Ressourcen pro vergleichbarem Auftrag. Weniger CPU-Verbrauch kann auch bei gleicher Antwortzeit ein Erfolg sein, wenn Ressourceneffizienz das Ziel war und Ergebnisqualität sowie Belastbarkeit erhalten bleiben. Fachliche Korrektheit, Datenaktualität und Rechte bleiben Abnahmekriterien.

    2. Ein vollständiger Vorher-/Nachher-Nachweis

    Ein belastbarer Nachweis beschreibt denselben Vorgang vor und nach einer gezielten Änderung. Verwende repräsentative Eingabewerte und dokumentiere Datenstand, Parallelität, Messfenster und Fehlerbehandlung. Wiederhole den Test mehrmals. Trenne den ersten Abruf von späteren Abrufen, weil vorhandene Cache-Inhalte das Ergebnis beeinflussen können. Der Diagnoseweg leert weder Cache noch Shared Pool.

    Fiktive Abnahme einer gebündelten Artikelabfrage: Neutrale Lernwerte, keine Messung einer realen Umgebung.

    KriteriumVorherNachher
    Identische erfolgreiche Testaufträge100100
    P95 Antwortzeit8 s2 s
    SQL-Aufrufe je Auftrag1002
    Fachliches ErgebnisReferenz geprüftStimmt mit Referenz überein

    Nachvollziehbare Lösung: Im Lehrfall ersetzt eine geprüfte gemeinsame Artikelauskunft viele Einzelaufrufe. Der Nachweis besteht aus übereinstimmenden Ergebnissen, weniger Aufrufen und einer günstigeren Antwortzeitverteilung bei gleicher Testlast. Zusätzlich werden Fehlerrate, Client-Speicher und die Belastung anderer Vorgänge betrachtet. Aus der Tabelle allein folgt noch keine Zusage für jede künftige Datenmenge.

    Wenn die Erwartung nicht eintritt: Dokumentiere das Ergebnis als nicht bestätigt. Prüfe, ob die Messung den richtigen Vorgang erfasst, ob andere Belastung hinzukam und ob die vermutete Ursache tatsächlich verändert wurde. Mehrere gleichzeitige Änderungen verhindern oft eine eindeutige Zuordnung. Der nächste Versuch benötigt eine überarbeitete Hypothese, nicht automatisch weitere Parameteränderungen.

    Praktische Übergabe: Ein guter Befund enthält Symptom, Zeitraum, betroffenen Service, Messwerte mit Einheiten, Rechenweg, belegte Ursache, getestete Maßnahme und Abnahmeergebnis. So kann eine andere Person deine Schlussfolgerung nachvollziehen. Für produktive Änderungen gelten die vorgesehenen Betriebsverfahren; die hier gezeigten Diagnoseabfragen lesen ausschließlich.

    Abnahmekriterien für denselben Workload:

    Vorher/Nachher vergleichenFrage
    BenutzerantwortzeitIst das ursprüngliche Symptom tatsächlich besser?
    DB TimeBenötigt derselbe Workload weniger aktive Datenbankzeit?
    DB CPUHat sich CPU-Arbeit verändert?
    Wait-ZeitIst der relevante Warteanteil kleiner geworden?
    I/O / RedoWurde Arbeit reduziert oder nur verschoben?
    Andere ServicesSind neue Nebenwirkungen entstanden?

    3. Wann ist die Performanceanalyse fertig?

    Eine Analyse ist nicht fertig, sobald irgendein hoher Wert gefunden wurde. Sie ist fertig, wenn die Ursache den beobachteten Zeitverlust plausibel erklärt, die Messwerte aus demselben Zeitraum stammen und eine Gegenprobe die Hypothese stützt.

    Kapitel 31 verbindet die Diagnosezweige bis zum Wirksamkeitsnachweis. Für die technische Vertiefung werden die vorhandenen Fachkapitel genutzt; die Befunde fließen anschließend in die gemeinsame Bewertung zurück.

    4. Was sollte dokumentiert werden?

    DokumentationInhalt
    SymptomWas war für Benutzer oder Betrieb konkret auffällig?
    ProblemzeitraumExakter Beginn und Ende.
    BaselineWelcher Normalzeitraum wurde verwendet und warum ist er vergleichbar?
    ZeitbilanzDB Time, DB CPU und relevante Wait-Zeit als Delta.
    HostCPU, Memory/Swap und I/O im selben Zeitraum.
    WorkloadBetroffene Services, Module, Sessions und gegebenenfalls SQL_ID als Zuordnung.
    HypotheseWelche technische Erklärung wurde geprüft?
    BelegWelche Messwerte stützen die Ursache?
    NachmessungWelche Kennzahlen wurden vor und nach der Maßnahme gemessen? Wurde das festgelegte Ziel erreicht? Noch ausstehende Tests ausdrücklich als geplant kennzeichnen.
    Performance Tuning ist kein Ratespiel. Eine gute Diagnose macht aus „die Datenbank ist langsam“ eine belegbare Aussage: welcher Workload war wann betroffen, wo wurde die zusätzliche Zeit verbracht und welche technische Ursache erklärt genau diese Zeit?

    5. Typische Fehlannahmen

    AussageBewertungKorrekte Einordnung
    Hohe CPU bedeutet CPU-Mangel.FalschErst DB CPU, Host-Sättigung und Workload gemeinsam betrachten.
    Das Wait Event mit den meisten Waits ist die Ursache.FalschZeitanteil im Problemfenster und technische Wirkung sind entscheidend.
    Ein User-I/O-Wait beweist langsamen Storage.FalschI/O-Menge und I/O-Latenz müssen getrennt geprüft werden.
    ACTIVE bedeutet problematische Session.FalschACTIVE bedeutet, dass die Session einen User Call verarbeitet.
    INACTIVE Sessions verbrauchen automatisch viel CPU.FalschINACTIVE beschreibt gerade fehlende User-Call-Aktivität.
    Mehr SGA macht jede Datenbank schneller.FalschNutzen hängt vom konkreten Workload und Engpass ab.
    TEMP-Nutzung beweist zu kleine PGA.FalschGroße Workareas können TEMP auch bei sinnvoller Konfiguration verwenden.
    Viele Log Switches sind immer schlecht.FalschRedo-Rate, Loggröße, Checkpoints, Archivierung und Waits bestimmen die Relevanz.
    Eine hohe Ratio beweist gute Performance.FalschRatios sind nur Indikatoren und brauchen Kontext.
    Ein kumulierter Wert beschreibt die aktuelle Last.FalschFür einen Zeitraum wird das Delta benötigt.

    6. Performance-Checkliste – read-only und in sinnvoller Reihenfolge

    Die folgende Checkliste ist als Arbeitsablauf gedacht. Sie beginnt bewusst nicht mit Memory, I/O oder einem bestimmten Wait Event, sondern mit dem Symptom. Erst wenn die übergeordnete Zeitbilanz eine Richtung zeigt, wird in den passenden Fachbereich verzweigt.

    7. Oracle-19c-Dokumentation als fachliche Grundlage

    Die Methodik dieses Kapitels orientiert sich an der Oracle Database 19c Performance Tuning Guide und den zugehörigen Beschreibungen der Dynamic Performance Views. Besonders wichtig sind die Oracle-Grundsätze zu DB Time, Delta-Betrachtung kumulativer Statistiken, Wait Events und der zeitbezogenen Performanceanalyse.

    Nächster Schritt: Lernzielkontrolle.

    8. Ein vollständiges Ergebnisprotokoll

    EintragBeispiel aus dem durchgängigen Lernfall
    AuftragBericht mit festen Eingaben; bisher 25 s, früher etwa 5 s.
    MessumfangAbgegrenzter Versuch, vollständige 200-Zeilen-Ausgabe, Zeit und Umgebung dokumentiert.
    Befund1000 Nachschlageaufrufe, zusammen 8,32 s im bereitgestellten Ausschnitt.
    Geprüfte VerbesserungFachlich gleichwertige Variante mit 10 Aufrufen im Test.
    NachweisIm vereinfachten Beispiel 17,08 s Gesamtzeit; Ergebniswerte geprüft.
    Offene FrageRestzeit erklärt das verfehlte Gesamtziel noch nicht vollständig.
    EntscheidungTeilerfolg dokumentieren, nächsten gemessenen Anteil untersuchen.

    Ein guter Abschluss nennt auch verworfene Hypothesen und verbleibende Unsicherheit. Belege müssen zum angegebenen Zeitraum und zur betroffenen Arbeit passen. Wer später den Fall übernimmt, soll die Schlussfolgerung aus den Messungen nachvollziehen können. Eine Sammlung von Screenshots ohne Identität und Zeitbezug ist dafür nicht ausreichend.

    Bei V$SESSION_LONGOPS auch LAST_UPDATE_TIME beachten: Ein vorhandener Fortschrittseintrag ist ohne Aktualitätsprüfung kein Beweis eines jetzt laufenden Vorgangs.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Performance wird an einer konkreten Geschäftsaktion und ihrem Zeitbedarf beurteilt. Eine passende Baseline macht sichtbar, ob mehr Last oder mehr Aufwand je Auftrag vorliegt.
    2. DB Time, DB CPU, Wait-Zeit und Hostauslastung beschreiben verschiedene Ebenen. Client- und Netzwerkzeit dürfen nicht pauschal der Datenbank zugerechnet werden.
    3. Messzeitraum, Einheit und Art des Wertes müssen feststehen. Momentaufnahme, Intervallwert und kumulierter Zähler lassen sich nicht ungeprüft miteinander vergleichen. Statspack benötigt zuvor gespeicherte Snapshots; ein Berichtsintervall darf keinen Instanzneustart überspannen.
    4. Die Untersuchung führt vom Symptom über beteiligte Sessions und SQL zum belegten Engpass. Planarbeit, I/O, Redo, Speicher und Konkurrenz werden passend zur beobachteten Zeit untersucht.
    5. Eine Änderung braucht eine begründete Hypothese und einen vergleichbaren Vorher-Nachher-Befund. Erfolg bedeutet eine nachgewiesene Verbesserung der relevanten Arbeit ohne unvertretbare Nebenwirkungen.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen. Die Fragen prüfen bewusst den Diagnoseweg und nicht das Auswendiglernen einzelner Grenzwerte.
    Frage 1: Warum ist „die Datenbank ist langsam“ noch keine ausreichende Performance-Fragestellung?
    Weil Zeitraum, betroffener Workload, erwartetes Verhalten und Vergleichszustand fehlen. Ohne diese Angaben können Messwerte nicht sauber zugeordnet werden.
    Frage 2: Was ist DB Time?
    DB Time ist die aufsummierte aktive Zeit der nicht-idlen Foreground-Datenbankarbeit. Sie umfasst vereinfacht CPU-Zeit und nicht-idle Wait-Zeit.
    Frage 3: Warum kann in einer realen Minute mehr als eine Minute DB Time entstehen?
    Weil mehrere Foreground Sessions gleichzeitig aktiv sein können. Ihre Zeiten werden aufsummiert.
    Frage 4: Warum ist bei V$SYS_TIME_MODEL und V$SYSTEM_EVENT für eine Störung das Delta wichtiger als der absolute Wert?
    Weil die Werte kumulativ seit Instance-Start wachsen. Erst die Differenz zwischen zwei Messpunkten zeigt, was im interessierenden Zeitraum neu entstanden ist.
    Frage 5: DB Time steigt stark, DB CPU deutlich weniger. Welche Richtung prüfst du zuerst?
    Die zusätzliche aktive Zeit liegt wahrscheinlich eher in nicht-idlen Waits. Deshalb werden zunächst Wait Classes und danach die relevanten Events betrachtet.
    Frage 6: Beweist ein User-I/O-Wait, dass der Storage zu langsam ist?
    Nein. Es muss getrennt werden, ob sehr viel I/O erzeugt wird, einzelne I/Os langsam sind oder beides zusammenkommt. Datenbank- und Hostmessung müssen zeitlich korrelieren.
    Frage 7: Warum ist die Anzahl der Waits allein kein gutes Priorisierungskriterium?
    Viele sehr kurze Waits können weniger relevant sein als wenige lange Waits. Entscheidend ist vor allem der Zeitanteil im betrachteten Problemfenster.
    Frage 8: Was bedeutet ACTIVE bei einer Session?
    Die Session verarbeitet aktuell einen User Call. Sie kann dabei CPU verwenden oder auf ein nicht-idles Event warten. ACTIVE bedeutet nicht automatisch problematisch.
    Frage 9: Warum sind DB CPU und Host-CPU nicht dasselbe?
    DB CPU misst CPU-Zeit in Datenbank-User-Calls. Host-CPU umfasst die gesamte Maschine inklusive Oracle-Background-Prozessen und anderer Betriebssystemprozesse.
    Frage 10: Welche beiden Events werden bei Commit-Latenz häufig gemeinsam betrachtet?
    log file sync aus Foreground-Sicht und log file parallel write aus LGWR-Sicht. Die Interpretation erfolgt zusammen mit Redo-Rate und Zeitraum.
    Frage 11: Warum ist eine hohe Buffer Cache Hit Ratio kein Beweis für gute Performance?
    Ratios sind nur Indikatoren. Sie zeigen beispielsweise nicht, ob unnötig viele logische Reads entstehen oder ob die tatsächliche Benutzerantwortzeit gut ist.
    Frage 12: Wie verbindest du Kapitel 31 mit den technischen Fachkapiteln?
    Kapitel 31 führt vom messbaren Problem bis zur Nachkontrolle. Planmechanik, Wait-Details und Speicherdimensionierung werden in den verlinkten Fachkapiteln untersucht; ihre Ergebnisse begründen anschließend die Tuningentscheidung.
    Frage 13: Was unterscheidet Beobachtung, Hypothese und Beleg?
    Die Beobachtung beschreibt den gemessenen Zustand. Die Hypothese ist eine prüfbare Erklärung. Der Beleg besteht aus Messwerten, die diese Erklärung im gleichen Zeitraum technisch stützen.
    Frage 14: Wann ist eine Performanceanalyse belastbar abgeschlossen?
    Wenn die technische Ursache den beobachteten Zeitverlust plausibel erklärt, durch passende Messwerte aus demselben Zeitraum gestützt wird und nach einer späteren Maßnahme mit denselben Kriterien erneut gemessen werden kann.
    Frage 15: DB Time verdoppelt sich bei doppelt so vielen vergleichbaren Aufträgen. Ist die Verarbeitung je Auftrag schlechter?
    Im einfachen Modell bleibt der Aufwand je Auftrag gleich. Antwortzeit, Nachfrage, Fehler und verbleibende Kapazität müssen trotzdem geprüft werden. Bei gemischter Instanzlast ist diese direkte Zuordnung unzulässig.
    Frage 16: 90 Aufrufe dauern eine Sekunde, zehn dauern zehn Sekunden. Was zeigen Mittelwert und P95?
    Der Mittelwert beträgt 1,9 Sekunden, P95 im gezeigten Beispiel zehn Sekunden. Der Mittelwert allein verdeckt die langsame Gruppe.
    Frage 17: 100 zusätzliche vollständige SQL-Ausführungen benötigen drei Sekunden und 60.000 Buffer Gets. Wie lauten die Mittelwerte?
    30 ms und 600 Buffer Gets pro Ausführung, sofern derselbe Cursor vergleichbar blieb und die Ausführungen vollständig im Messfenster liegen.
    Frage 18: Eine Session erzeugt 500 Roundtrips. Sind das 500 Geschäftsaufträge?
    Nein. Kommunikation kann auch beim Nachladen von Zeilen entstehen. Die Zuordnung zum Auftrag braucht den Anwendungsablauf und bei Pooling die konkrete Sessionnutzung.
    Frage 19: Eine Sortierung verwendet 512 MiB TEMP. Muss die PGA erhöht werden?
    Das folgt nicht daraus. Zuerst SQL, Operation, benötigte Datenmenge, Gleichzeitigkeit und gemessenen Zeitverlust zuordnen. TEMP-Größe ist keine I/O-Rate.
    Frage 20: Gleicher Ausführungsplan, längere Laufzeit: Ist der Plan damit als Ursache ausgeschlossen?
    Nein. Andere Eingabewerte, Datenmengen oder Konkurrenz können bei gleichem Plan andere Arbeit verursachen. Der Vergleich braucht einen passenden fachlichen Kontext.
    Frage 21: SQL benötigt drei von zehn Sekunden und wird doppelt so schnell. Wie viel sinkt die Gesamtzeit im seriellen Beispiel?
    Von zehn auf 8,5 Sekunden, also um 15 Prozent. Die anderen sieben Sekunden bleiben unverändert.
    Frage 22: Welche Gegenprobe braucht eine Optimierung mit weniger SQL-Aufrufen?
    Identische fachliche Ergebnisse, vergleichbare Last und Eingabewerte, erneute Antwortzeitmessung sowie Kontrolle von Fehlern und Nebenwirkungen. Weniger Aufrufe allein sind noch keine erfolgreiche Abnahme.
    Frage 23: Wann ist ein Zählerdelta nicht belastbar?
    Wenn Identität oder Zählerbasis wechseln, etwa nach einem Neustart, Sessionwechsel oder Cursor-Neuladen. Auch gleiche Zeitfenster und Einheiten sind erforderlich. Bei Statspack müssen Datenbank, Instanz und Instanzlaufzeit zum Snapshot-Paar passen. Ein Shutdown/Startup zwischen Begin- und End-Snapshot macht den Vergleich ungültig.
    Frage 24: Kann ein Stundenbericht einen einzelnen langsamen Aufruf beweisen?
    Er liefert Kontext, ordnet die aggregierte Last aber nicht automatisch dem konkreten Vorgang zu. Ein Statspack-Bericht ist keine vollständige Sessionchronik. Kurze Spitzen können im Intervall verborgen bleiben; Level, Schwellenwerte und Cursor-Verfügbarkeit begrenzen die erfassten SQL-Informationen. Ein fehlender Eintrag beweist daher keine unauffällige Ausführung.
    Frage 25: Bedeuten 2000 Fetch-Aufrufe 2000 Ergebniszeilen?
    Nein. Fetch-Aufrufe und gelieferte Zeilen sind unterschiedliche Größen; Aufrufe können auch das Ergebnisende feststellen.
    Frage 26: Was ist vor einer Trace-Auswertung zu prüfen?
    Herkunft, Zeitraum, Zuordnung, Vollständigkeit und Schutz der enthaltenen Informationen.
    Frage 27: Warum erreicht der Beispielbericht trotz weniger Aufrufen nicht fünf Sekunden?
    Die Verbesserung betrifft nur einen Zeitanteil. Im vereinfachten Beispiel verbleiben 17,08 Sekunden Gesamtzeit und weiterer Untersuchungsbedarf.
    Frage 28: Warum ist eine abgebrochene Ausgabe keine gültige Gegenprobe?
    Der Arbeitsumfang unterscheidet sich von einer vollständig gelieferten Ausgabe; die Zeiten messen nicht dieselbe Aufgabe.

    32. Execution-Plan-Trainer – Ausführungspläne Schritt für Schritt lesen

    Sechs Lernstufen: Plan zuerst selbst lesen, Fragen beantworten und erst danach die ausführliche Musteranalyse aufklappen.

    Lernkompass
    Einfach gesagt Ein Execution Plan zeigt, wie Oracle eine SQL-Anweisung ausführen möchte oder ausgeführt hat.
    Warum ist das wichtig? Die Einrückung ist dabei wichtiger als bloß die oberste Kosten-Zahl: Sie zeigt die Baumstruktur der Operationen.
    Nach diesem Kapitel Du kannst Full Scan, Indexzugriff, Joinmethoden und Zeilenschätzungen schrittweise lesen.

    Einführung: Ein Ausführungsplan lässt sich als Baum von Operationen lesen: Untergeordnete Schritte liefern Daten, die andere Schritte weiterverarbeiten. Die gedruckten Zeilen sind deshalb keine einfache Liste nacheinander abzuarbeitender Befehle. Für die Beurteilung müssen Struktur, Filter und die Bedeutung der angezeigten Zahlen zusammenpassen.

    Der Trainer wendet die Planbegriffe aus Kapitel 10 auf die vorhandenen Beispiele an. Du verfolgst zunächst den Datenfluss und vergleichst anschließend Schätzungen mit verfügbaren Laufzeitinformationen. Ziel ist, den Ort unnötiger Arbeit zu erkennen und die Schlussfolgerung zu begründen. Eine einzelne Operation wird nicht allein wegen ihres Namens als gut oder schlecht eingestuft.

    Oracle 19c: fachliche Grundlage

    Ein Plan ist kein Geschwindigkeitswert. Erst mit Zeilenmengen, Prädikaten und verfügbaren Laufzeitdaten lässt sich beurteilen, wo die Arbeit entsteht.

    Wichtig für die Praxis: Ein Full Table Scan ist nicht automatisch schlecht und ein Indexzugriff nicht automatisch gut. Entscheidend sind Datenmenge, Selektivität, Statistiken, Join-Reihenfolge und die tatsächlich verarbeiteten Zeilen. Der Trainer soll deshalb das Lesen von Plänen vermitteln und keine einfachen „gut/schlecht“-Regeln einprägen.

    Die zusammenhängende Erklärung der Planentscheidungen findest du in Kapitel 10 – Optimizer und Ausführungspläne verstehen.

    Was sehe ich in einem Ausführungsplan?

    Lies zuerst die Einrückung und die Parent-/Child-Beziehung. Danach vergleichst du – wenn Laufzeitdaten vorhanden sind – E-Rows (geschätzte Zeilen) mit A-Rows (tatsächliche Zeilen), außerdem Starts, Buffers und physische Reads. Cost ist keine Laufzeit in Millisekunden.

    Abgrenzung: Dieses Kapitel erklärt, wie du einen Execution Plan liest. Indexarten und Indexaufbau werden hier nicht erneut gelehrt; dafür gibt es das zentrale Fachkapitel Indizes & Constraints.

    1. Estimated Plan und tatsächlich ausgeführter Cursor sind nicht dasselbe

    Für die Diagnose muss zuerst geklärt werden, welche Art von Plan vorliegt.

    EXPLAIN PLAN erzeugt einen geschätzten Plan, ohne die SQL-Anweisung auszuführen. Ein Plan aus V$SQL_PLAN gehört dagegen zu einem Cursor, der bereits im Shared Pool vorhanden ist. Laufzeitstatistiken wie A-Rows oder Buffers sind nochmals eine andere Informationsebene und stehen nur zur Verfügung, wenn sie für die Ausführung gesammelt wurden.

    Wichtig: Ein EXPLAIN PLAN beweist nicht, dass genau dieser Plan bei einer realen Ausführung verwendet wurde. Für eine konkrete Performanceanalyse ist der tatsächliche Cursorplan vorzuziehen.

    2. DBMS_XPLAN.DISPLAY_CURSOR: vorhandenen Cursor read-only anzeigen

    DBMS_XPLAN.DISPLAY_CURSOR kann den Plan eines im Cursor Cache vorhandenen SQL-Cursors anzeigen. Das ist für dieses Wiki besonders geeignet, weil das Anzeigen selbst keine DML/DDL-Änderung an der Anwendung erzeugt.

    Mit ALLSTATS LAST können vorhandene Laufzeitstatistiken der letzten Ausführung angezeigt werden. Sind diese Statistiken nicht gesammelt worden, kann DBMS_XPLAN sie nicht nachträglich erfinden.

    READ ONLY – vorhandenen Cursorplan anzeigen
    SELECT *
    FROM TABLE(
      DBMS_XPLAN.DISPLAY_CURSOR(
        sql_id          => '&SQL_ID',
        cursor_child_no => &CHILD_NUMBER,
        format          => 'ALLSTATS LAST +PREDICATE'
      )
    );

    3. Planbaum lesen: Parent, Child und Einrückung

    Ein Plan wird nicht einfach Zeile für Zeile von oben nach unten als Ablaufplan gelesen. Die Einrückung bildet einen Baum. Child-Operationen liefern Zeilen an ihre Parent-Operation. Deshalb muss zuerst erkannt werden, welche Operation zu welcher übergeordneten Operation gehört.

    Eine auffällige Operation wird anschließend nicht isoliert bewertet. Man betrachtet ihre Eingabemenge, Filter, Starts und die Operation, an die sie ihr Ergebnis weitergibt.

    4. E-Rows und A-Rows: Schätzung gegen Realität

    E-Rows sind die vom Optimizer geschätzten Zeilenmengen. A-Rows sind tatsächlich ausgegebene Zeilen aus vorhandenen Runtime Statistics. Gelesene und anschließend herausgefilterte Zeilen sind damit nicht gleichzusetzen. Große Abweichungen sind ein Diagnosehinweis darauf, dass der Optimizer an einer Stelle mit einer anderen Datenmenge gerechnet hat als tatsächlich auftrat.

    Zuerst den tatsächlich angeforderten Umfang klären. A-Rows kann unter einer Vollmengen-Schätzung liegen, wenn der Client nur einen Teil abgeholt hat oder eine übergeordnete Begrenzung weitere Zeilen nicht mehr anfordert. Das ist nicht automatisch ein Statistikfehler. Der Vergleich in den folgenden Lernplänen setzt den jeweils beschriebenen Abrufumfang voraus. Prüfe daher zuerst vollständige Verarbeitung und Starts und suche erst danach nach einer falschen Kardinalitätsschätzung. Die Fetch-Erklärung in Kapitel 3 liefert den Zusammenhang. Oracle 19c.

    Die Abweichung ist noch keine fertige Ursachenanalyse. Danach werden Statistiken, Datenverteilung, Korrelationen, Prädikate, Bind-Werte und die betroffene Planoperation untersucht.

    5. Starts: wie oft wurde eine Operation wirklich aufgerufen?

    Starts ist besonders bei Nested Loops wichtig. Eine Operation kann pro Aufruf nur wenige Zeilen lesen und trotzdem teuer werden, wenn sie tausend- oder millionenfach gestartet wird. Deshalb werden A-Rows, Starts und Buffers gemeinsam gelesen.

    Die Frage lautet nicht nur „Wie teuer ist ein einzelner Zugriff?“, sondern auch „Wie oft wird dieser Zugriff ausgeführt?“.

    6. Buffers und Reads: logische Arbeit von physischem I/O unterscheiden

    Buffers beschreibt Buffer-Cache-Zugriffe und damit logische I/O-Arbeit. Physische Reads bedeuten dagegen, dass benötigte Daten nicht allein aus dem Buffer Cache bedient wurden. Eine hohe Bufferzahl kann deshalb auch dann viel Datenbankarbeit anzeigen, wenn das Storage kaum physische Reads sieht.

    Ein Plan wird folglich nicht allein anhand von Laufzeit oder Cost bewertet. Zeilenmengen, Starts, Buffers, Reads und der fachliche Zweck der SQL-Anweisung gehören zusammen.

    7. Predicates: ACCESS und FILTER beantworten unterschiedliche Fragen

    Die Predicate Information zeigt, an welcher Operation Bedingungen angewendet werden. Ein ACCESS Predicate hilft einer Zugriffsoperation, die relevanten Einträge beziehungsweise Joinpartner zu bestimmen. Ein FILTER Predicate verwirft Zeilen an der jeweiligen Operation.

    Gerade bei einem Index ist daher nicht nur wichtig, dass ein Index verwendet wird. Entscheidend ist, welche Prädikate tatsächlich als Access-Bedingung genutzt werden und welche erst später filtern.

    8. Cost ist eine Optimizer-Schätzung und keine Millisekundenangabe

    Die Cost ist eine interne Vergleichsgröße des Cost Based Optimizers. Sie ist keine gemessene Laufzeit und kann nicht als Millisekundenwert interpretiert werden. Ein Plan mit Cost 100 ist daher nicht automatisch doppelt so schnell wie ein Plan mit Cost 200.

    Für eine reale Diagnose haben tatsächliche Laufzeitstatistiken und gemessener Ressourcenverbrauch eine andere Aussagekraft als die reine Optimizer-Cost.

    9. Plan Hash Value: Planform identifizieren, nicht Qualität bewerten

    Der Plan Hash Value hilft, unterschiedliche Planformen eines SQL-Statements zu erkennen und zeitlich miteinander zu vergleichen. Ein anderer Hashwert ist zunächst ein Hinweis auf einen anderen Plan, aber noch kein Beweis für eine Verschlechterung.

    Umgekehrt ist ein gleicher Plan Hash Value kein vollständiger Performancebeweis. Workload, Datenmenge, Bind-Werte, Cachezustand und Systemlast können sich verändern.

    10. Read-only Plan-Diagnose: sinnvolle Reihenfolge

    Diagnosekette:

    1. SQL_ID und Child Cursor eindeutig bestimmen.
    2. Tatsächlichen Cursorplan anzeigen.
    3. Planbaum und Parent-/Child-Beziehungen lesen.
    4. E-Rows gegen A-Rows vergleichen, sofern Runtime Statistics vorhanden sind.
    5. Starts und A-Rows gemeinsam lesen.
    6. Buffers und physische Reads einordnen.
    7. Predicate Information prüfen.
    8. Joinreihenfolge und Joinmethode erst mit den Datenmengen bewerten.
    9. TEMP-/Workarea-Hinweise einordnen.
    10. Erst danach Hypothesen zu Statistik, Index, SQL-Formulierung oder Memory an das zuständige Fachkapitel übergeben.

    11. Bevor die Level starten: Einen Execution Plan gemeinsam lesen

    Bevor einzelne Zugriffspfade trainiert werden, ist es sinnvoll, zuerst einen kompletten Plan als Ganzes zu lesen. Ein Execution Plan zeigt nicht einfach nur eine Liste von Operationen, sondern eine Baumstruktur: Oracle zerlegt eine SQL-Anweisung in einzelne Schritte und ordnet diese hierarchisch an. Entscheidend ist deshalb nicht nur, welche Operationen vorkommen, sondern auch, wie sie zusammenhängen.

    Das folgende Beispiel ist bewusst klein gehalten. Es zeigt einen typischen Indexzugriff auf eine Tabelle. Danach werden die wichtigsten Spalten und die sinnvolle Lesereihenfolge erklärt.

    Beispielplan
    --------------------------------------------------------------------------------
    | Id | Operation                    | Name       | Rows | Bytes | Cost (%CPU) |
    --------------------------------------------------------------------------------
    |  0 | SELECT STATEMENT             |            |    1 |    30 |     3   (0) |
    |  1 |  TABLE ACCESS BY INDEX ROWID | EMPLOYEES  |    1 |    30 |     3   (0) |
    |* 2 |   INDEX RANGE SCAN           | EMP_NAME_I |    1 |       |     2   (0) |
    --------------------------------------------------------------------------------
    
    Predicate Information:
    ---------------------------------------------------
    2 - access("LAST_NAME"='KING')
    Id
    Nummer der Operation. Sie hilft dabei, Predicate Information und einzelne Planzeilen eindeutig zuzuordnen.
    Operation
    Beschreibt, was Oracle an dieser Stelle tun will, zum Beispiel INDEX RANGE SCAN, TABLE ACCESS oder HASH JOIN.
    Name
    Zeigt das betroffene Objekt, zum Beispiel Tabelle oder Index.
    Rows / Cardinality
    Geschätzte Zeilenmenge des Optimizers. Bei einem normalen EXPLAIN PLAN sind das keine tatsächlich gemessenen Zeilen.
    Cost
    Relative Optimizer-Kosten zur Planwahl. Cost ist keine Zeitangabe und keine direkte Aussage über Sekunden.
    Predicate Information
    Zeigt, wo Oracle Daten über access- oder filter-Prädikate einschränkt.
    So liest du einen Plan Schritt für Schritt:
    1. Welche Tabellen und Indizes werden angesprochen? → 2. Welche Access Paths verwendet Oracle? → 3. Wie werden Tabellen verbunden? → 4. Welche Zeilenmengen erwartet der Optimizer? → 5. Wo liegen Access- und Filter-Prädikate? → 6. Gibt es auffällige Operationen? → 7. Erst danach Cost und später echte Laufzeitdaten beurteilen.
    Wichtig: Ein Execution Plan ist keine Schulnote für SQL. Ein Full Table Scan ist nicht automatisch schlecht, ein Indexzugriff nicht automatisch gut und ein niedriger Cost-Wert garantiert keine schnelle SQL-Anweisung.

    E-Rows und A-Rows – was ist der Unterschied?

    E-Rows bedeutet Estimated Rows. Das ist die Zeilenanzahl, die der Optimizer für eine Planoperation schätzt. Die Schätzung entsteht unter anderem aus Optimizer-Statistiken, Selektivität, Prädikaten und der angenommenen Datenverteilung.

    A-Rows bedeutet Actual Rows. Das ist die Zeilenanzahl, die bei einer tatsächlichen Ausführung an einer Planoperation wirklich beobachtet wurde. A-Rows gehört deshalb nicht zu einem reinen EXPLAIN PLAN; dafür werden Laufzeitstatistiken eines ausgeführten Cursors benötigt.

    Buffers zeigt bei Laufzeitstatistiken die Anzahl der logischen Blockzugriffe (Buffer Gets) einer Planoperation. Vereinfacht gesagt: Oracle musste Datenblöcke im Buffer Cache betrachten beziehungsweise verarbeiten. Ein hoher Buffer-Wert bedeutet deshalb viel logische Arbeit, auch wenn die Blöcke bereits im Speicher vorhanden waren. Buffers sind weder Bytes noch automatisch unterschiedliche Blöcke; derselbe Block kann im Verlauf mehrfach angefasst werden.

    Reads zeigt die physischen Lesezugriffe, die während der Ausführung für die Operation angefallen sind. Ein physischer Read entsteht, wenn für die Ausführung physisches I/O notwendig ist. Deshalb kann ein Plan sehr viele Buffers, aber deutlich weniger Reads besitzen.

    Einfach gesagt: Buffers = logische Blockarbeit, Reads = physisches Lesen. Liefert eine Abfrage nur eine einzige Zeile, benötigt dafür aber sehr viele Buffers, ist das ein Hinweis darauf, dass Oracle für dieses kleine Ergebnis sehr viele Blockzugriffe ausführen musste. Sind zusätzlich viele Reads vorhanden, musste ein Teil der Arbeit auch als physisches I/O erfolgen.
    Einfaches Beispiel
    Operation                         E-Rows    A-Rows
    -------------------------------  --------  --------
    INDEX RANGE SCAN                       10     8.500
    TABLE ACCESS BY INDEX ROWID            10     8.500
    Interpretation: Oracle hat ungefähr 10 Zeilen erwartet, tatsächlich wurden aber 8.500 Zeilen beobachtet. Der Optimizer hat die Ergebnismenge an dieser Stelle also deutlich unterschätzt. Jetzt ist interessant, warum die Schätzung so weit danebenliegt und ob dadurch Access Path, Join-Reihenfolge oder Join-Methode ungünstig gewählt wurden.
    Wichtig: Eine Abweichung zwischen E-Rows und A-Rows ist nicht automatisch ein Fehler. Relevant wird sie vor allem dann, wenn sie deutlich ist und sich auf nachfolgende Planentscheidungen auswirkt. Für A-Rows werden Laufzeitstatistiken benötigt, zum Beispiel bei einem tatsächlich ausgeführten Cursor mit geeigneter Statistik-Erfassung und anschließender Anzeige über DBMS_XPLAN.DISPLAY_CURSOR.
    EXPLAIN PLAN ist nicht gleich tatsächliche Ausführung: Ein geschätzter Plan zeigt, was der Optimizer plant. Laufzeitstatistiken eines tatsächlich ausgeführten Cursors können zusätzlich reale Zeilenzahlen liefern. Der Vergleich von E-Rows und A-Rows wird in den späteren Leveln wichtig.
    Arbeitsweise: Lies zuerst SQL und Plan ohne die Musteranalyse. Konzentriere dich nicht nur auf COST. Frage dich: Welche Zeilenmenge wird erwartet und tatsächlich verarbeitet? Wie oft startet ein Schritt? Wie hoch sind Buffers und Reads? Passen Zugriffspfad und Joinmethode zur Ergebnismenge? Die Pläne und Laufzeitwerte sind didaktische Praxisbeispiele.

    12. Einzelzeilensuche: Full Scan oder Index?

    Grundlagen: Selektivität, Access Path, Buffers.

    SQL
    SELECT kunde_id, nachname, vorname
    FROM kunde
    WHERE kunde_id = 47110815;
    IdOperationNameE-RowsA-RowsBuffersReadsA-Time
    0SELECT STATEMENT11845321542000:00:04.82
    * 1 TABLE ACCESS FULLKUNDE111845321542000:00:04.82
    Predicate Information:
    1 - filter("KUNDE_ID"=47110815)
    1. Was fällt zuerst auf?
    2. Welche Struktur wäre bei eindeutiger KUNDE_ID typischerweise interessant?
    Musteranalyse anzeigen

    Die Kardinalitätsschätzung passt hier: 1 erwartet, 1 geliefert. Auffällig ist die große Lese- und Buffer-Arbeit für einen Treffer. Ein geeigneter Index ist eine zu prüfende Alternative; erst ein Vergleich bei gleichem Ergebnis und vergleichbarem Messumfang belegt den Vorteil.

    184.532 Buffers für eine Ergebniszeile sind der zentrale Hinweis. Bei einer eindeutigen, hochselektiven ID wäre ein passender Indexzugriff typischerweise wesentlich gezielter.

    Der Full Table Scan ist nicht allgemein falsch; er passt nur nicht gut zu diesem angenommenen Workload.

    13. Kardinalität massiv falsch geschätzt

    Schwerpunkt: E-Rows, A-Rows, Datenverteilung und Histogramme.

    SQL
    SELECT kunde_id, region, status
    FROM kunde
    WHERE status = 'AKTIV';
    IdOperationNameE-RowsA-RowsBuffersStartsA-Time
    0SELECT STATEMENT8200001650000100:00:13.40
    1 TABLE ACCESS BY INDEX ROWIDKUNDE108200001650000100:00:13.40
    * 2 INDEX RANGE SCANIX_KUN_ST10820000830000100:00:03.12
    Predicate Information:
    2 - access("STATUS"='AKTIV')
    1. Welcher Wert ist am auffälligsten?
    2. Welche Diagnose ist als Nächstes plausibel?
    Musteranalyse anzeigen

    Oracle erwartet nur 10 Zeilen, verarbeitet aber 820.000. Damit basiert der Indexzugriff auf einer völlig anderen Mengenerwartung als der Realität.

    Prüfe Datenverteilung, Spaltenstatistik und gegebenenfalls Histogramm. Bei angenommenen 1.000.000 Tabellenzeilen entsprechen 820.000 Treffern einem Anteil von 82 %. Dann kann ein Full Scan wirtschaftlicher sein als hunderttausende ROWID-Lookups.

    14. Nested Loops: der unscheinbare Starts-Multiplikator

    Schwerpunkt: Starts, innere Schleife, Gesamtarbeitsmenge.

    SQL
    SELECT b.bestellung_id,
           p.kunde_id,
           p.nachname
    FROM bestellung b
    JOIN kunde p
      ON p.kunde_id = b.kunde_id
    WHERE b.datum >= DATE '2026-08-01';
    IdOperationNameE-RowsA-RowsStartsBuffersA-Time
    0SELECT STATEMENT4100001220000000:00:18.90
    1 NESTED LOOPS120004100001220000000:00:18.90
    * 2 TABLE ACCESS FULLBESTELLUNG12000410000118000000:00:02.70
    3 TABLE ACCESS BY INDEX ROWIDKUNDE1410000410000202000000:00:16.20
    * 4 INDEX UNIQUE SCANPK_KUNDE141000041000082000000:00:06.10
    1. Warum kann der Indexzugriff hier teuer werden?
    2. Welche Alternative sollte der Optimizer bei großen Mengen bewerten?
    Musteranalyse anzeigen

    Der einzelne PK-Lookup ist billig. Das Problem ist seine Wiederholung: 410.000 Starts. Die innere Seite des Nested Loops wird für sehr viele Zeilen erneut aufgerufen.

    Beim Planlesen niemals nur Operationen betrachten. Viele Starts können die Gesamtarbeit erhöhen. A-Rows und Buffers sind in dieser Anzeige bereits über die Starts summiert; sie werden nicht nochmals multipliziert. Hier bedeuten A-Rows 410.000 bei 410.000 Starts im Mittel eine Zeile je Start. Für den Schätzvergleich ist deshalb E-Rows 1 mit A-Rows / Starts zu vergleichen. Ein billiger Schritt kann durch hunderttausende Starts zum Hauptverbraucher werden.

    15. Hash Join und TEMP: Schätzung oder tatsächlicher Spill?

    Schwerpunkt: Plan kann logisch richtig sein und trotzdem Memory-/TEMP-Kosten haben.

    SQL
    SELECT k.region_id,
           COUNT(*) AS anzahl
    FROM bestellung b
    JOIN region k
      ON k.region_id = b.region_id
    GROUP BY k.region_id;
    IdOperationNameE-RowsA-RowsBuffersTempSpcA-Time
    0SELECT STATEMENT12091000000:00:21.30
    1 HASH GROUP BY120120910000900M00:00:21.30
    * 2 HASH JOIN3.8M3.9M9100001.6G00:00:16.80
    3 TABLE ACCESS FULLREGION12012012000:00:00.01
    4 TABLE ACCESS FULLBESTELLUNG3.8M3.9M90988000:00:06.40
    1. Ist HASH JOIN hier automatisch der falsche Join?
    2. Welche Daten würdest du ergänzend prüfen?
    Musteranalyse anzeigen

    Die Kardinalität liegt nah an der Realität. Der Hash Join ist für die große Menge plausibel. TempSpc stammt aus der Optimizer-Schätzung TEMP_SPACE; die angezeigten 1,6 GB belegen noch keinen tatsächlichen Spill. Für diese Ausführung sind passende Workarea-Werte wie LAST_EXECUTION und LAST_TEMPSEG_SIZE beziehungsweise vorhandene Memory-Statistiken zu prüfen. OPTIMAL, ONE PASS und MULTI-PASS beschreiben dabei unterschiedliche Ausführungsarten.

    Nicht den Join reflexartig austauschen. Erst Workarea-Verhalten, PGA-Druck und TEMP-I/O untersuchen. Ein logisch geeigneter Plan kann durch knappen Workarea-Speicher teurer werden.

    16. Partitionierte Tabelle: Pruning oder unnötiger Vollzugriff?

    Schwerpunkt: Pstart/Pstop, Datumsprädikat, Zugriffsumfang.

    SQL
    SELECT SUM(betrag)
    FROM abrechnung
    WHERE buchungsdatum >= DATE '2026-08-01'
      AND buchungsdatum <  DATE '2026-09-01';
    IdOperationNamePstartPstopE-RowsA-RowsBuffers
    0SELECT STATEMENT111800000
    1 SORT AGGREGATE111800000
    * 2 PARTITION RANGE ALL1482.1M2.0M1800000
    * 3 TABLE ACCESS FULLABRECHNUNG1482.1M2.0M1800000
    1. Was ist hier der wichtigste Hinweis?
    2. Was würdest du untersuchen?
    Musteranalyse anzeigen

    Bei passender Range-Partitionierung auf BUCHUNGSDATUM sollte ein Monatsfilter typischerweise nur relevante Partitionen betreffen. PARTITION RANGE ALL ist daher der erste Verdacht.

    Prüfe Partitionierung, Datentyp und Predicate Information. Funktionen oder implizite Konvertierungen auf dem Partition Key können Pruning verhindern.

    17. Komplexer Plan: mehrere Probleme gleichzeitig erkennen

    Zum markierten Hash Join gehört das Prädikat 4 - access("B"."KUNDE_ID"="P"."KUNDE_ID").

    Modellannahme: IX_POS_BEST enthält BESTELLUNG_ID und ARTIKEL_CODE; IX_AUDIT_KUN enthält KUNDE_ID und AENDERUNGSDATUM. Diese abdeckenden Indizes erklären die dargestellten Indexzweige ohne zusätzlichen Tabellenzugriff. Dies ist keine allgemeine Indexempfehlung.

    Vertiefung: Kardinalität, Starts, Joinmethode, Filter und Gesamtarbeitsmenge.

    SQL
    SELECT p.kunde_id,
           p.nachname,
           b.bestellung_id,
           l.artikel_code,
           (SELECT MAX(a.aenderungsdatum)
              FROM audit_kunde a
             WHERE a.kunde_id = p.kunde_id) AS letzte_aenderung
    FROM kunde p
    JOIN bestellung b
      ON b.kunde_id = p.kunde_id
    JOIN position l
      ON l.bestellung_id = b.bestellung_id
    WHERE p.status = 'AKTIV'
      AND b.datum >= DATE '2026-01-01';

    Geteilte Beispielausgabe: Gleiche Beispielzeile gehört in beiden Teilansichten zusammen. „Beispielzeile“ dient nur der Darstellung und ist keine zusätzliche SQL-Ergebnisspalte.

    Spalten 1–6
    BeispielzeileIdOperationNameE-RowsA-RowsStarts
    10SELECT STATEMENT6200001
    21 SORT AGGREGATE1620000620000
    3* 2 INDEX RANGE SCANIX_AUDIT_KUN311160000620000
    43 NESTED LOOPS50006200001
    5* 4 HASH JOIN50006200001
    6* 5 TABLE ACCESS FULLKUNDE5003100001
    7* 6 TABLE ACCESS FULLBESTELLUNG450008900001
    8* 7 INDEX RANGE SCANIX_POS_BEST1620000620000
    Spalten 7–9
    BeispielzeileBuffersReadsA-Time
    11480000062000000:01:42.80
    2420000011000000:00:31.50
    3420000011000000:00:29.90
    41060000051000000:01:11.20
    5520000031000000:00:36.40
    64200006000000:00:08.10
    7478000025000000:00:25.70
    8540000020000000:00:34.30
    Predicate Information:
    5 - filter("P"."STATUS"='AKTIV')
    6 - filter("B"."DATUM">=DATE '2026-01-01')
    7 - access("L"."BESTELLUNG_ID"="B"."BESTELLUNG_ID")
    2 - access("A"."KUNDE_ID"=:B1)
    1. Welche Kombination ist am wichtigsten?
    2. Was verursacht der skalare Subquery wahrscheinlich?
    3. Was wäre eine belastbare nächste Analyse?
    Ausführliche Musteranalyse anzeigen

    Die skalare MAX-Aggregation ohne GROUP BY liefert je vollständig bearbeitetem Aufruf eine Ergebniszeile, gegebenenfalls mit NULL. Deshalb ergeben 620.000 Starts hier insgesamt 620.000 A-Rows. Das Lehrmodell zeigt eine vollständig abgearbeitete Ausführung; A-Rows sind nicht als Wert je Start dargestellt.

    Problem 1 – Kardinalität: KUNDE wird mit 500 Zeilen geschätzt, liefert aber 310.000. BESTELLUNG wird mit 45.000 geschätzt, liefert 890.000. Schon die Eingangsmengen sind damit erheblich falsch eingeschätzt. Für KUNDE beträgt die Abweichung 310.000 / 500 = 620.

    Problem 2 – Starts: IX_POS_BEST wird 620.000-mal gestartet. Der einzelne Indexzugriff kann billig sein, die Summe erzeugt aber 5,4 Millionen Buffers.

    Im Indexschritt 2 sind 11.160.000 A-Rows über 620.000 Starts aufsummiert: durchschnittlich 18 Zeilen je Start. Die Schätzung von 3 Zeilen gilt je Start. Für diesen Vergleich werden deshalb 3 und 18 gegenübergestellt, nicht 3 und die Gesamtsumme. Das erklärt gleichzeitig, warum die Unterabfrage viel Arbeit verursacht.

    Problem 3 – skalare Subquery: Auch IX_AUDIT_KUN wird 620.000-mal gestartet und erzeugt weitere 4,2 Millionen Buffers. Die korrelierte Unterabfrage wird praktisch je Ergebniszeile erneut ausgewertet.

    Problem 4 – Full Scans: Die Full Scans sind nicht automatisch falsch. Bei 310.000 bzw. 890.000 realen Zeilen können mengenorientierte Scans sogar sinnvoll sein. Der größere Verdacht liegt hier in falschen Kardinalitäten und der nachfolgenden Starts-Multiplikation.

    DBA-Denkweg: Erst Statistiken/Datenverteilung prüfen, dann bewerten, ob Joinreihenfolge und Nested-Loops-Zweig nach korrekter Kardinalität noch sinnvoll sind. Danach untersuchen, ob die skalare Unterabfrage fachlich in einen voraggregierten Join umformuliert werden könnte. Keine Änderung ohne Vorher-/Nachher-Messung.
    Weiterlernen: Der Trainer zeigt, wie man Plansignale liest. Die vollständige Performanceanalyse bleibt in Kapitel 31 Performance Tuning. Grundlagen zu Kardinalität, Cost und Optimizer stehen in Kapitel 10.
    Praxisbeispiel: E-Rows 10, A-Rows 500000

    Im Runtime-Plan weichen geschätzte und tatsächliche Zeilen stark voneinander ab.

    Was prüfst du?
    Prädikat, Datenverteilung, Statistiken und nachfolgende Join-Entscheidungen betrachten.
    Lerneffekt: Execution Plans nicht nur lesen, sondern Schätzungen mit der Realität vergleichen.

    18. Oracle-19c-Dokumentation als fachliche Grundlage

    SQL Tuning Guide – Explaining and Displaying Execution Plans
    Planaufbau, DBMS_XPLAN, V$SQL_PLAN und Laufzeitstatistiken
    https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/generating-and-displaying-execution-plans.html

    Introduction to SQL Tuning
    EXPLAIN PLAN, DBMS_XPLAN und Cursor-Planinformationen
    https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/introduction-to-sql-tuning.html

    Zum Partitionierungsbeispiel in Abschnitt 16: Es dient der Planinterpretation und ist keine unmittelbar ausführbare SE2-Übung. Verfügbarkeit und Lizenzierung der Partitionierung sind getrennt zu prüfen. Bei vereinfachten E-Rows-/A-Rows-Vergleichen müssen Starts und vollständige Verarbeitung berücksichtigt werden.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Ein geschätzter Plan und der Plan eines tatsächlich ausgeführten Cursors sind nicht dasselbe. Die Analyse beginnt mit dem richtigen SQL, Child Cursor und Messkontext.
    2. Der Plan ist ein Baum zusammenarbeitender Operationen. Einrückung, Parent-Child-Beziehung und Prädikate erklären, wie Zeilen verarbeitet werden.
    3. E-Rows und A-Rows vergleichen Schätzung und Messung; Starts zeigt die Wiederholungen. Ein teilweise abgeholtes Ergebnis oder fehlende Statistiken begrenzt diesen Vergleich.
    4. Buffers messen logische Zugriffe, Reads physische Lesezugriffe. Cost und Plan Hash Value sind weder Laufzeitmessung noch Qualitätsurteil.
    5. Entscheidend ist, wo sich unnötige Zeilenmengen, Wiederholungen oder I/O aufbauen. Eine einzelne auffällige Planzeile wird deshalb immer im Zusammenhang mit ihren Eingaben und Folgeoperationen bewertet.

    Lernzielkontrolle

    Beantworte die Fragen zunächst ohne einen konkreten Praxisfall anzusehen.
    Frage 1: Warum ist Starts beim Planlesen so wichtig?
    Weil ein innerer Schritt sehr oft ausgeführt werden kann. Auch geringer Aufwand pro Start kann sich dadurch stark summieren. E-Rows und A-Rows müssen mit passendem Bezug auf Starts verglichen werden; die Optimizer-Kosten sind keine gemessenen Laufzeiten.
    Frage 2: Warum sind Full Table Scans nicht automatisch schlecht?
    Bei großen Ergebnismengen kann sequentieller Mengendurchsatz effizienter sein als sehr viele einzelne Index-/ROWID-Zugriffe.
    Frage 3: Was ist bei Starts=1, vollständig erfasster Ausführung, E-Rows 10 und A-Rows 800.000 die erste Schlussfolgerung?
    Die Kardinalität wurde massiv unterschätzt; Statistik, Datenverteilung und Prädikate müssen untersucht werden.

    33. DBA Troubleshooting & Notfallhandbuch

    Operatives Diagnosehandbuch: erst eingrenzen, dann messen, dann interpretieren. Alle Diagnose-SQLs in diesem Kapitel sind read-only.

    Lernkompass
    Einfach gesagt Troubleshooting ist kein Raten. Du formulierst zuerst das Symptom, sammelst Belege und grenzt die Ursache Schritt für Schritt ein.
    Warum ist das wichtig? Eine feste Diagnosekette verhindert Aktionismus und macht Ergebnisse reproduzierbar.
    Nach diesem Kapitel Du kannst typische Störungen mit Prüffragen, read-only Checks und Interpretation bearbeiten.

    Einführung: Troubleshooting ist die systematische Eingrenzung einer Störung. Eine Meldung beschreibt zunächst, was ein Benutzer oder ein System beobachtet hat; sie nennt nicht zwingend die Ursache. Im Notfall kommt hinzu, dass Auswirkungen begrenzt und diagnostische Informationen rechtzeitig gesichert werden müssen. Ungezielte Änderungen können die Lage verschärfen oder wichtige Spuren beseitigen.

    Dieses Kapitel dient als Orientierung zwischen den Fachgebieten. Du wählst den Einstieg nach dem beobachteten Problem und folgst den passenden Prüfungen. Die vorhandenen Fälle zeigen, wie aus einem Symptom ein belegbarer Befund und daraus der nächste Schritt wird. Fachliche Details bleiben in den verlinkten Kapiteln, damit der Ablauf auch unter Zeitdruck nachvollziehbar bleibt.

    Oracle 19c: fachliche Grundlage

    Vor der ersten Abfrage: Beschreibe Symptom, betroffenen Dienst und Zeitraum. Stelle danach Instanz, Container und Sichtbarkeit fest. Wähle erst dann den passenden Diagnoseweg. Ein leerer Befund kann auch durch einen falschen Kontext oder einen inzwischen beendeten Vorgang entstehen.

    Einstieg nach Problem: Wo beginne ich?

    Wähle die Beobachtung, die zur Meldung passt. Die Wege führen zu bestehenden Prüfungen; sie stellen noch keine Diagnose. Notiere vorab Zeitpunkt, betroffene Datenbank oder PDB, Anwendung und die genaue Fehlermeldung. Fehlt eine Fehlermeldung, beschreibe den Vorgang und ob das Problem noch besteht.

    BeobachtungErster SchrittWie geht es weiter?
    Anmeldung funktioniert nichtFehlermeldung und betroffenen Service festhalten.Netzwerk-/Listenerfehler: Verbindungsweg untersuchen. Bei einer Konto- oder Passwortmeldung zunächst Benutzer und Rechte prüfen.
    Verbindung prüfen · Benutzer und Rechte
    Speichern wird nicht fertigBetroffene Session identifizieren und aktuellen Zustand lesen.Ein gültiger Blocker führt zur Sperrkette. Ein anderer aktueller Wait führt zum passenden Wartegrund.
    Session-Übung · Sperrkette
    Anwendung insgesamt langsamUmfang und Beginn eingrenzen: alle Benutzer oder ein bestimmter Vorgang?Aktive Arbeit, Wartezustände und Hostbild zeitlich zusammenführen; einzelne hohe Werte sind noch keine Ursache.
    Diagnoseablauf · Zwei Messungen
    Tablespace wird knappAktuelle Belegung und mögliche Dateivergrößerung getrennt betrachten.Freie Extents, Autoextend-Grenzen und tatsächlich verfügbaren Storage prüfen; für Dringlichkeit zusätzlich Wachstum betrachten.
    Belegungsübung · Diagnoseablauf
    TEMP-Nutzung auffälligBetroffene Vorgänge und genaue Meldung festhalten.Aktuelle TEMP-Belegung den ausführenden Sessions zuordnen; aus einer großen Tempfile-Größe folgt keine aktuelle Nutzung.
    TEMP prüfen · Speicher einordnen
    Backup mit Fehlern oder WarnungenJob, Zeitpunkt und genaue RMAN-Ausgabe zuordnen.Zuerst die Meldung erklären, danach die betroffene Sicherungskette prüfen. Ein erfolgreicher Job alleine beantwortet die Recovery-Frage nicht.
    Statusübung · Recovery-Prüfung

    Wenn sich der Verdacht nicht bestätigt: Kehre zur konkreten Meldung zurück und prüfe die nächste passende Spur. Keine Zeile in einer Abfrage kann auch an einer inzwischen beendeten Session, fehlender Sichtbarkeit oder dem falschen Container liegen. Halte Beobachtung und vermutete Ursache getrennt fest.

    Mit Beispielausgaben üben: Die geführten Übungen zeigen, wie du aus einer Ausgabe den nächsten Prüfschritt ableitest: wartende Session, Tablespace-Belegung und Backupstatus. Aufgaben und Musterlösungen stehen direkt in den jeweiligen Fachkapiteln.
    Abgrenzung: Troubleshooting wendet Fachwissen an. Die Grundlagen zu Redo, Locks, Sessions, Waits, Memory usw. bleiben in ihren Fachkapiteln.

    Dieses Kapitel ist die zentrale Stelle für konkrete Störungsdiagnosen. Es ersetzt keine Fachkapitel, sondern verbindet deren Wissen zu nachvollziehbaren Arbeitsabläufen. Ein DBA beginnt nicht mit einer vermuteten Lösung, sondern mit einem klar beschriebenen Symptom, einem Zeitraum und belastbaren Messpunkten. Jeder Schritt beantwortet deshalb eine konkrete Frage und führt erst danach zum nächsten Schritt.

    Die Checkboxen markieren lediglich, welche Diagnoseschritte bereits durchgeführt wurden. Sie bedeuten nicht, dass ein Ergebnis gut oder schlecht war. Der Zustand wird nur lokal im Browser gespeichert. Administrative Eingriffe wie Session-Abbruch, Parameteränderungen, Tablespace-Erweiterungen oder Neustarts sind bewusst nicht Bestandteil dieser Checklisten.

    Grundregel jeder Diagnose
    Symptom → Zeitraum → betroffene Ebene → Messwert → Korrelation → Hypothese. Eine einzelne Kennzahl ist noch keine Ursache.
    Datenbank ist langsam
    Diagnosefortschritt
    0 von 8 erledigt
    Zeitraum, Umfang und Auswirkung klären, bevor Messwerte interpretiert werden.
    Prüffragen
    • Seit wann besteht das Problem?
    • Sind alle Benutzer, nur eine Anwendung oder nur eine Funktion betroffen?
    • Ist das Problem dauerhaft oder sporadisch?
    • Gab es unmittelbar davor Deployment, Batchlauf, Lastspitze oder Infrastrukturänderung?
    Interpretation
    Ohne Zeitraum und Betroffenheit lässt sich eine aktuelle Störung nicht sauber von historischer oder normaler Last trennen.
    Unerwarteten Neustart oder nicht normalen Instanzzustand ausschließen.
    Instanzzustand
    SELECT instance_name,
           host_name,
           status,
           database_status,
           startup_time
    FROM v$instance;
    Was sehe ich hier?
    • STATUS beschreibt den Instanzzustand.
    • DATABASE_STATUS zeigt, ob die Datenbank für normale Aktivität bereit ist.
    • STARTUP_TIME zeigt, seit wann die Instanz läuft.
    Nächste Entscheidung
    Unerwarteter Neustart? Dann zuerst Alertlog und Startup-/Shutdown-Ereignisse untersuchen. Sonst weiter zu den Sessions.
    Ermitteln, welche User-Sessions gerade arbeiten oder warten und ob sich ein gemeinsames Muster zeigt.
    Prüffragen
    • Wie viele User-Sessions sind aktuell ACTIVE?
    • Tritt dieselbe SQL_ID oder dasselbe Wait Event mehrfach auf?
    • Gibt es einen Blocker?
    Aktive User-Sessions
    SELECT sid,
           serial#,
           username,
           status,
           sql_id,
           event,
           wait_class,
           state,
           CASE WHEN state = 'WAITING' THEN ROUND(wait_time_micro/1000000,3) END AS current_wait_seconds,
           blocking_session
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    ORDER BY wait_class, event, username, sid;

    CURRENT_WAIT_SECONDS beschreibt nur einen aktuell beobachteten Wait. NULL bedeutet hier keine gemessene Wartezeit. Bei nicht wartenden Sessions kann EVENT das letzte Ereignis beschreiben.

    Was sehe ich hier?
    • SID und SERIAL# identifizieren eine Session für ihren aktuellen Lebenszyklus.
    • SQL_ID verbindet die Session mit der aktuell ausgeführten SQL-Anweisung, sofern vorhanden.
    • EVENT, WAIT_CLASS und STATE helfen einzuordnen, ob und worauf eine Session wartet.
    • BLOCKING_SESSION kann auf eine blockierende Session hinweisen.
    Nicht vorschnell interpretieren
    ACTIVE bedeutet nicht automatisch problematisch. Eine aktive Session kann CPU verbrauchen oder auf ein nicht-idle Wait Event warten. Auch ein einzelnes Wait Event beweist noch keinen Engpass.
    Nächste Entscheidung
    Viele Sessions mit demselben nicht-idle Event? Dann Waits vertiefen. Blocker sichtbar? Dann Blocking-Kette untersuchen. Auffällige gemeinsame SQL_ID? Dann SQL gezielt analysieren.
    Prüfen, ob aktive Sessions auf dieselbe Ressource oder Wait-Klasse konzentriert sind.
    Aktuelle nicht-idle Waits
    SELECT wait_class,
           event,
           COUNT(*) AS sessions
    FROM v$session
    WHERE state = 'WAITING'
      AND type = 'USER'
      AND status = 'ACTIVE'
      AND wait_class <> 'Idle'
    GROUP BY wait_class, event
    ORDER BY sessions DESC, wait_class, event;
    Was sehe ich hier?

    Die Abfrage ist eine Momentaufnahme. Sie zeigt, welche Wait Events gerade mehrere aktive User-Sessions betreffen. Sie ersetzt keine zeitliche Betrachtung und darf nicht als historische Lastverteilung gelesen werden.

    Nächste Entscheidung
    Dominantes Event vorhanden? Im Wait-Event-Fachkapitel Bedeutung und zugehörige Messpunkte prüfen. Kein klares Muster? Weiter zu Blocking und SQL.
    Wartende und blockierende Sessions zusammenführen.
    Blocking-Beziehungen
    SELECT sid,
           serial#,
           username,
           sql_id,
           event,
           blocking_session,
           final_blocking_session
    FROM v$session
    WHERE type = 'USER'
      AND (blocking_session_status = 'VALID'
           OR final_blocking_session_status = 'VALID')
    ORDER BY final_blocking_session, blocking_session, sid;
    Was sehe ich hier?

    BLOCKING_SESSION nennt den unmittelbaren Blocker, FINAL_BLOCKING_SESSION kann den finalen Blocker einer Kette zeigen. Vor jeder administrativen Maßnahme müssen SQL, Transaktion, Benutzer und fachlicher Kontext verstanden werden.

    SQL-Metriken nur für bereits verdächtige SQL_IDs betrachten.
    SQL-Kennzahlen aus Shared Pool
    SELECT sql_id,
           plan_hash_value,
           executions,
           elapsed_time,
           cpu_time,
           buffer_gets,
           disk_reads,
           rows_processed
    FROM v$sql
    WHERE sql_id = '&SQL_ID';
    Was sehe ich hier?

    Die Werte in V$SQL sind kumulierte Cursor-Statistiken. Gesamtwerte müssen deshalb zusammen mit EXECUTIONS, Cursoralter und Zeitraum interpretiert werden. Ein hoher Gesamtwert allein beweist keine aktuell langsame Ausführung.

    Erst jetzt prüfen, ob CPU, I/O oder Speicher zur Datenbanksicht passen.
    Prüffragen
    • Ist der Host tatsächlich CPU-gesättigt?
    • Gibt es auffällige I/O-Latenzen?
    • Passt die OS-Beobachtung zeitlich zu den betroffenen Sessions und SQLs?
    Interpretation
    Eine Datenbank kann langsam sein, obwohl Host-CPU niedrig ist, und hohe Host-CPU muss nicht von Oracle stammen. DB- und OS-Sicht müssen zeitlich zusammenpassen.
    Beobachtung, Beleg und Hypothese voneinander trennen.
    Abschlussfragen
    • Welche Messwerte belegen die vermutete Ursache?
    • Welche Alternativerklärungen wurden ausgeschlossen?
    • Welche Information fehlt noch?
    Blocking / Anwendung wartet
    Diagnosefortschritt
    0 von 5 erledigt
    Nicht jede langsame Session ist blockiert.
    Blockierte Sessions
    SELECT sid, serial#, username, sql_id, event,
           blocking_session, final_blocking_session
    FROM v$session
    WHERE blocking_session_status = 'VALID'
    ORDER BY final_blocking_session, blocking_session, sid;
    Was sehe ich hier?

    Die wartende Session bleibt die Zeile der Abfrage; BLOCKING_SESSION verweist auf ihren unmittelbaren Blocker.

    Benutzer, Programm, SQL_ID und Transaktionszustand des Blockers bestimmen.
    Achtung
    Ein Blocker ist nicht automatisch fehlerhaft. Eine legitime, noch nicht abgeschlossene Transaktion kann andere Sessions erwartungsgemäß warten lassen.
    V$LOCK nur im Kontext von Sessions und Transaktionen lesen.
    Locks mit Requests
    SELECT sid, type, id1, id2, lmode, request, block
    FROM v$lock
    WHERE block <> 0 OR request <> 0
    ORDER BY type, id1, id2, sid;
    Was sehe ich hier?

    LMODE ist der gehaltene Lock-Modus, REQUEST der angeforderte Modus. Die IDs sind locktypabhängig und dürfen nicht ohne Kenntnis des Lock-Typs pauschal als Objekt-ID interpretiert werden.

    Fachlichen Transaktionsablauf verstehen.
    Prüffragen
    • Warum ist die Transaktion noch offen?
    • Ist das Warten fachlich erwartbar?
    • Gibt es einen Fehler im Commit-/Rollback-Ablauf der Anwendung?
    Blocker, Waiter, SQL und Anwendungskontext zusammenfassen.
    Tablespace wird knapp
    Diagnosefortschritt
    0 von 5 erledigt
    Allocated und frei nicht mit maximal möglicher Größe verwechseln.
    Prüffragen
    • Welcher Tablespace ist betroffen?
    • Wie viel ist aktuell allokiert?
    • Wie viel ist innerhalb der vorhandenen Datafiles noch frei?
    MAXBYTES und AUTOEXTENSIBLE mit einbeziehen.
    Datafile-Kapazität
    SELECT tablespace_name,
           file_name,
           bytes,
           autoextensible,
           maxbytes
    FROM dba_data_files
    ORDER BY tablespace_name, file_id;
    Was sehe ich hier?

    BYTES ist die aktuell allokierte Dateigröße. MAXBYTES ist bei Autoextend die konfigurierte Obergrenze; das bedeutet nicht, dass dieser Platz im Filesystem tatsächlich verfügbar ist.

    Große Segmente und fachliches Wachstum einordnen.
    Größte Segmente
    SELECT owner, segment_name, segment_type,
           ROUND(bytes/1024/1024,2) AS mb
    FROM dba_segments
    WHERE tablespace_name = UPPER('&TABLESPACE_NAME')
    ORDER BY bytes DESC
    FETCH FIRST 30 ROWS ONLY;
    Oracle-Maxsize ist keine Storage-Garantie.
    Achtung
    Eine mögliche Datafile-Erweiterung ist nur sinnvoll, wenn das darunterliegende Filesystem beziehungsweise Storage ausreichend Kapazität besitzt.
    Kapazität, Wachstum und Ursache zusammenfassen.
    TEMP-Nutzung auffällig
    Diagnosefortschritt
    0 von 4 erledigt
    Session und SQL_ID der aktuellen TEMP-Nutzung zuordnen.
    Aktuelle TEMP-Segmentnutzung
    SELECT s.con_id, s.sid, s.serial#, s.username,
           s.sql_id AS current_sql_id,
           u.sql_id_tempseg AS temp_sql_id,
           u.tablespace, u.segtype, u.blocks
    FROM v$tempseg_usage u
    JOIN v$session s
      ON s.saddr = u.session_addr
     AND s.serial# = u.session_num
     AND s.con_id = u.con_id
    ORDER BY u.blocks DESC, s.sid;

    CURRENT_SQL_ID gehört zum aktuellen Sessionkontext; TEMP_SQL_ID bezeichnet das SQL, das das temporäre Segment erzeugt hat. BLOCKS zeigt zugewiesene Blöcke, keine Nutzdatenmenge. Die Abfrage ist instanzlokal und eine veränderliche Momentaufnahme.

    Was sehe ich hier?

    Die Zeilen zeigen aktuell belegte temporäre Segmente. Hohe TEMP-Nutzung ist nicht automatisch ein Fehler; Sort-, Hash- und andere Workarea-Operationen können TEMP legitim verwenden.

    SQL_ID und fachliche Operation der größten Verbraucher verstehen.
    Prüffragen
    • Ist die Datenmenge plausibel?
    • Ist ein großer Sort/Hash fachlich erwartbar?
    • Ist die SQL neu oder hat sich ihr Plan geändert?
    Tempfiles und Maxsize gegen aktuelle Nutzung halten.
    Tempfiles
    SELECT tablespace_name, file_name, bytes,
           autoextensible, maxbytes
    FROM dba_temp_files
    ORDER BY tablespace_name, file_id;
    Verbraucher, SQL und Kapazität gemeinsam bewerten.
    Datenbank nicht erreichbar / Listener oder Service
    Diagnosefortschritt
    0 von 5 erledigt
    ORA-/TNS-Code und verwendeten Connect-String sichern.
    Achtung
    „Nicht erreichbar“ kann DNS, Netzwerk, Listener, Service-Registrierung, Datenbankzustand oder Authentifizierung bedeuten. Diese Ebenen nicht vermischen.
    Datenbankzustand und registrierte Services read-only aus der DB-Sicht prüfen.
    Services aus DB-Sicht
    SELECT name, network_name
    FROM v$services
    ORDER BY name;
    Was sehe ich hier?

    Die View zeigt Services, die der Instanz bekannt sind. Das allein beweist noch nicht, dass ein bestimmter Listener den Service aktuell anbietet.

    Namensauflösung, Host/Port und Listener-Service getrennt testen.
    Interpretation
    tnsping prüft die Oracle-Net-Erreichbarkeit des konfigurierten Zieles, aber weder eine erfolgreiche Datenbankanmeldung noch die fachliche Verfügbarkeit einer Anwendung.
    TNS-/ORA-Meldung der richtigen Ebene zuweisen.
    Prüffragen
    • Ist der Host erreichbar?
    • Antwortet der Listener?
    • Ist der gewünschte Service registriert?
    • Ist die Datenbank OPEN?
    • Scheitert erst die Authentifizierung?
    Genau festhalten, an welcher Stufe die Verbindungskette scheitert.
    ORA-01555 – Snapshot too old
    Diagnosefortschritt
    0 von 5 erledigt
    ORA-01555 ohne Zeitraum und betroffene SQL nicht pauschal als „UNDO zu klein“ bewerten.
    Achtung
    ORA-01555 kann unterschiedliche Ursachenbilder haben. Querydauer, Undo-Verbrauch und Wiederverwendung müssen gemeinsam betrachtet werden.
    SSOLDERRCNT, MAXQUERYLEN und TUNED_UNDORETENTION zeitlich einordnen.
    Undo-Statistik
    SELECT begin_time,
           end_time,
           tuned_undoretention,
           ssolderrcnt,
           undoblks,
           txncount,
           maxquerylen
    FROM v$undostat
    ORDER BY begin_time DESC;
    Was sehe ich hier?

    V$UNDOSTAT fasst Undo-Statistiken in Zeitintervallen zusammen. SSOLDERRCNT zählt ORA-01555-Ereignisse im Intervall; MAXQUERYLEN und TUNED_UNDORETENTION helfen bei der zeitlichen Einordnung.

    Lange aktive Aufrufe als möglichen Kontext identifizieren.
    Aktive User-Sessions nach Aufrufdauer
    SELECT sid, serial#, username, sql_id,
           last_call_et, event
    FROM v$session
    WHERE status = 'ACTIVE'
      AND type = 'USER'
    ORDER BY last_call_et DESC;
    Was sehe ich hier?

    LAST_CALL_ET ist bei ACTIVE die verstrichene Zeit seit dem Wechsel der Session in diesen Status; sie ist nicht automatisch identisch mit der Laufzeit genau eines SQL-Statements.

    Querydauer, Undo-Druck und DML-Last gemeinsam bewerten.
    Achtung
    Nicht automatisch UNDO vergrößern. Erst Ursache und Zeitraum belegen.
    Querydauer, Undo-Historie und DML-Kontext zusammenfassen.
    ORA-04031 / ORA-04036
    Diagnosefortschritt
    0 von 5 erledigt
    ORA-04031 betrifft eine Allokation in Shared Memory; ORA-04036 das PGA_AGGREGATE_LIMIT.
    Achtung
    Beide Meldungen sind Speicherprobleme, aber nicht dieselbe Fehlerklasse. Die Diagnose darf deshalb nicht mit denselben Kennzahlen beginnen.
    Betroffenen Pool und Speicherbelegung untersuchen.
    SGA-Verteilung
    SELECT pool, name, bytes
    FROM v$sgastat
    ORDER BY bytes DESC;
    Was sehe ich hier?

    V$SGASTAT zeigt Speicherbelegung innerhalb der SGA. Eine große Komponente allein beweist noch keine Fragmentierung oder die konkrete Ursache einer ORA-04031-Allokationsanforderung.

    Instanzweiten PGA-Verbrauch und Over-Allocation einordnen.
    PGA-Statistik
    SELECT name, value, unit
    FROM v$pgastat
    ORDER BY name;
    Was sehe ich hier?

    Die View zeigt instanzweite PGA-Kennzahlen. Sie identifiziert noch nicht automatisch den Prozess oder die Session, die den entscheidenden Speicherverbrauch ausgelöst hat.

    Zeitpunkt, angeforderte Bytes und betroffene Komponente sichern.
    Interpretation
    Der vollständige Fehlertext ist bei Speicherfehlern wichtiger als nur die ORA-Nummer, weil er den betroffenen Speicherbereich und weitere Kontextinformationen enthalten kann.
    Fehlerart, Speicherbereich, Zeitpunkt und Lastkontext festhalten.
    RMAN-Backup fehlgeschlagen oder Recovery-Fähigkeit unklar
    Diagnosefortschritt
    0 von 5 erledigt
    Full/Level 0, Level 1, Archivelog und Controlfile nicht vermischen.
    Prüffragen
    • Welche Sicherungsart sollte laufen?
    • Welcher Recovery-Zeitraum muss abgedeckt sein?
    • Welche Fehlermeldungen nennt RMAN vollständig?
    Status, Start, Ende, Typ und Output-Bytes aus der Controlfile-/Catalog-Sicht lesen.
    RMAN-Jobhistorie
    SELECT session_key,
           input_type,
           status,
           start_time,
           end_time,
           output_bytes
    FROM v$rman_backup_job_details
    ORDER BY start_time DESC
    FETCH FIRST 30 ROWS ONLY;
    Was sehe ich hier?

    STATUS beschreibt den RMAN-Jobstatus. INPUT_TYPE hilft die Sicherungsart einzuordnen. Ein Status COMPLETED allein beweist aber noch nicht, dass jede gewünschte Recovery-Situation abgedeckt ist.

    Level-0-/Full-, Incremental-, Archivelog- und Controlfile-Sicherungen zeitlich zusammen betrachten.
    Interpretation
    Recovery-Fähigkeit ist eine Kette. Je nach Ziel werden Datenfile-Backups, benötigte Archivelogs und Controlfile-/SPFILE-Informationen benötigt.
    Retention Policy und Repository-Status nicht mit physischer Verfügbarkeit gleichsetzen.
    Achtung
    CROSSCHECK, DELETE und andere RMAN-Maintenance-Kommandos verändern Repository-Status beziehungsweise können Dateien löschen. Sie sind deshalb nicht Bestandteil dieser read-only Checkliste.
    Fehler, letzte erfolgreiche Bestandteile und Recovery-Lücke festhalten.

    1. Störung zuerst klassifizieren: Erreichbarkeit, Funktion, Performance oder Kapazität?

    Eine belastbare Diagnose beginnt mit einer präzisen Symptomklasse. Erreichbarkeit bedeutet beispielsweise, dass Client, Listener, Service oder Datenbank nicht erreichbar sind. Funktion bedeutet, dass die Verbindung möglich ist, aber eine Datenbankfunktion fehlschlägt. Performance bedeutet, dass der Betrieb funktioniert, aber ungewöhnlich langsam ist. Kapazität betrifft Grenzen wie Filesystem, Tablespace, TEMP, UNDO, Archive-Ziel, Prozesse oder Sessions.

    Diese Einteilung verhindert, dass bei einem Listenerproblem Performance-SQL ausgeführt oder bei einem vollen Archive-Ziel zuerst ein Execution Plan untersucht wird.

    2. Zeitfenster und Auswirkung festhalten, bevor Details verloren gehen

    Vor der technischen Detailanalyse werden Beginn, Ende beziehungsweise aktueller Zustand, betroffene Benutzer/Services, Fehlermeldungen und beobachtete Auswirkungen dokumentiert. Bei sporadischen Fehlern ist der genaue Zeitpunkt besonders wichtig, weil Alert Log, Listener Log, VCS-/OS-Logs und Datenbankstatistiken später über die Zeitachse korreliert werden.

    Auch ein scheinbar kleiner Unterschied wie „seit 06:47 Uhr keine Anmeldung“ statt „heute Morgen ging es nicht“ kann entscheiden, ob ein korrespondierender Failover-, Archive-, Storage- oder Ressourcenfehler gefunden wird.

    3. ADR und Alert Log als primäre Beweisquellen

    Oracle legt Diagnoseinformationen im Automatic Diagnostic Repository (ADR) ab. V$DIAG_INFO zeigt unter anderem ADR Base, ADR Home, Trace-Verzeichnisse, Default Trace File sowie aktive Problem-/Incident-Zähler. Damit muss ein Diagnose-Skript keine ADR-Pfade erraten.

    V$DIAG_ALERT_EXT stellt den XML-basierten Alert Log über eine dynamische View bereit. Für eine Störung werden Zeitstempel, Message Type/Level, Problem Key und Meldung gemeinsam betrachtet. Ein einzelnes ORA-Fragment ohne zeitlichen Kontext reicht nicht als Ursachenbeweis.

    READ ONLY – ADR-Informationen
    SELECT name,
           value,
           con_id
    FROM v$diag_info
    ORDER BY name;
    READ ONLY – aktuelle Alert-Log-Meldungen
    SELECT originating_timestamp,
           message_type,
           message_level,
           problem_key,
           message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '2' HOUR
    ORDER BY originating_timestamp DESC;

    4. Instanz, Datenbank, Container und Service getrennt prüfen

    „Die Datenbank ist down“ kann mehrere technisch unterschiedliche Zustände meinen. Deshalb werden Instance-Status, Database Open Mode, Container/PDB-Zustand und Service getrennt geprüft. Eine laufende Instance beweist nicht, dass die benötigte PDB offen oder der Anwendungsservice erreichbar ist.

    Die Detaildiagnose zu Oracle Net bleibt in Kapitel 4 und zu Multitenant in Kapitel 13; hier geht es nur um die richtige Triage-Reihenfolge.

    5. Space- und Archiver-Störungen haben Vorrang vor Tuning

    ORA-00257, volle Archive-Ziele, kritische Filesystembelegung oder fehlender Tablespace-Spielraum sind betriebliche Störungen und keine SQL-Tuning-Aufgabe. Zuerst wird read-only festgestellt, welches Ziel beziehungsweise welcher Speicherbereich betroffen ist und seit wann.

    Dieses Kapitel führt keine Lösch-, Resize- oder Archive-Aktionen aus. Maßnahmen werden erst nach gesicherter Ursache und nach dem zuständigen Betriebsverfahren durchgeführt.

    6. Blocking von allgemeiner Performance unterscheiden

    Viele aktive Sessions bedeuten nicht automatisch Blocking. Für Blocking muss eine konkrete Waiter-/Blocker-Beziehung nachweisbar sein. Die Triage prüft deshalb zuerst BLOCKING_SESSION_STATUS, BLOCKING_SESSION und relevante Enqueue-Waits. Die tiefe Lockanalyse bleibt Kapitel 20.

    7. Performance-Störung: erst Zeitverbrauch klassifizieren

    Bei „Datenbank langsam“ wird nicht mit einem Parameter begonnen. Zuerst wird unterschieden, ob DB CPU, Non-Idle-Waits, I/O, Redo/Commit, Concurrency oder eine andere Ressource den untersuchten Zeitraum prägt. Kapitel 31 enthält dafür die systematische Performancekette; Kapitel 30 die Wait-Mechanik und Kapitel 32 die Plananalyse.

    8. Backup- und Recovery-Störung: Readiness vor Aktion

    Bei fehlgeschlagenen Backups oder einem Recovery-Fall wird zunächst der Zustand dokumentiert: Datenbankmodus, vorhandene Backups, Archivelog-Kette, Controlfile-/Catalog-Metadaten und konkrete RMAN-Fehler. Ein Recovery wird nicht improvisiert. Die vollständigen Runbooks und die Unterscheidung zwischen Preview, Validate, Restore und Recover bleiben Kapitel 25.

    9. VCS/Failover: Datenbankfehler und Clusterreaktion zeitlich korrelieren

    In einer VCS-Umgebung kann ein Datenbankproblem eine Clusterreaktion auslösen – oder ein Infrastrukturproblem kann zuerst auftreten und danach die Oracle-Ressource beeinflussen. Deshalb werden Oracle Alert Log, VCS-Ressourcenstatus, Engine-/Agent-Logs und Hostereignisse über denselben Zeitraum verglichen.

    Das Wiki bleibt read-only: keine Ressource wird online/offline geschaltet und kein Failover ausgelöst.

    10. Eskalationspaket: welche Fakten vor Übergabe vorhanden sein sollten

    Vor einer Eskalation sollten mindestens Problemzeitraum, Host/SID/Service, Oracle-Version, betroffene Benutzer oder Anwendung, genaue ORA-/TNS-/RMAN-Meldung, relevante Alert-/Trace-Ausschnitte, aktueller Datenbankzustand und die bereits durchgeführten read-only Prüfungen dokumentiert sein.

    Bei internen Incidents oder Oracle Support ist eine solche Faktenbasis wesentlich wertvoller als die Beschreibung „Datenbank war langsam“.

    11. DBA Notfallhandbuch – wenn der Betrieb akut gestört ist

    Wofür ist dieser Bereich gedacht? Die geführten Diagnoseketten oben helfen bei der systematischen Ursachenanalyse. Das Notfallhandbuch ist der zweite Teil desselben Kapitels und ist für Situationen gedacht, in denen eine Datenbank, ein Service, Backup, Storage oder eine zentrale Oracle-Komponente akut ausgefallen oder stark beeinträchtigt ist. Unter Zeitdruck ist die wichtigste Regel nicht, möglichst schnell etwas zu ändern, sondern zuerst den Fehlerzustand zu sichern und die betroffene Ebene eindeutig zu bestimmen.

    Jede Notfallkarte folgt deshalb derselben Reihenfolge: Symptom sichern → Reichweite bestimmen → read-only prüfen → Ergebnis einordnen → mögliche Maßnahme planen. Die SQL-Beispiele sind ausschließlich lesend. Betriebssystembefehle dienen nur der Anzeige. Befehle, die einen Zustand verändern würden, stehen ausschließlich als rot gekennzeichnete Dokumentation und werden von diesem Wiki niemals ausgeführt.

    Notfall-Grundregel
    Erst Beweise sichern, dann Ursache eingrenzen, erst danach eine Maßnahme freigeben. Ein Neustart, Session-Abbruch, Löschen von Archivelogs oder Vergrößern eines Tablespaces kann Symptome verdecken oder die Recovery-Situation verschlechtern.
    Monitoring-Benutzer Monitoring-/Read-only-Benutzer
    Die Oracle-Abfragen in diesem Bereich sind für read-only Diagnose gedacht und können mit dem Monitoring-Benutzer ausgeführt werden, sofern dieser das jeweilige SELECT-Recht auf die verwendete View besitzt. Es wird kein SYS-/SYSDBA-Zugang vorausgesetzt. Reicht ein Recht nicht aus, ist das ein Berechtigungsthema – das Wiki umgeht die Sicherheitsvorgaben nicht.
    1. Datenbank ist nicht erreichbar
    Was bedeutet das?
    „Nicht erreichbar“ ist noch keine Ursache. Der Fehler kann vor Oracle liegen (DNS/Netzwerk), am Listener, an der Service-Registrierung, an der Instanz oder erst bei der Anmeldung entstehen.
    1. Fehler
    ORA-/TNS-Code, Host, Port, Service sichern.
    →
    2. Host
    PMON und Listener-Prozess nur anzeigen.
    →
    3. Oracle Net
    tnsping / lsnrctl status.
    →
    4. DB
    Instanz, Open Mode, Service lesen.
    Solaris – nur anzeigen
    ps -eo pid,args | grep "[o]ra_pmon_"
    ps -eo pid,args | grep "[t]nslsnr"
    lsnrctl status
    Oracle-Zustand – read-only
    SELECT instance_name, host_name, status, database_status, startup_time
    FROM v$instance;
    
    SELECT name, open_mode, database_role
    FROM v$database;
    
    SELECT name, network_name
    FROM v$services
    ORDER BY name;
    Was sehe ich hier?

    Fehlt bereits PMON, ist die Instanz auf diesem Host nicht als laufender Oracle-Prozess sichtbar. Antwortet der Listener, aber der gewünschte Service fehlt, liegt die Störung zwischen Service/Instanz und Listener. Sind Instanz und Service vorhanden, muss die konkrete TNS-/ORA-Meldung weiterverfolgt werden.

    Entscheidung
    Nicht den Listener oder die Datenbank reflexartig neu starten. Zuerst exakt dokumentieren, an welcher Stufe die Verbindungskette scheitert.
    2. Datenbank startet nicht / bleibt in NOMOUNT oder MOUNT
    Einfach erklärt
    Oracle durchläuft beim Start mehrere Stufen. NOMOUNT benötigt Parameterdatei und Speicher. MOUNT benötigt die Controlfiles. OPEN benötigt konsistente Datafiles und Redo/Recovery. Die Stufe, an der der Start stoppt, grenzt die Fehlerklasse stark ein.
    Wenn eine normale read-only Verbindung noch möglich ist
    SELECT instance_name, status, database_status, startup_time
    FROM v$instance;
    
    SELECT name, open_mode, database_role
    FROM v$database;
    
    SELECT name, value
    FROM v$parameter
    WHERE name IN ('spfile','control_files','db_name','db_unique_name')
    ORDER BY name;
    Alertlog-Datei am OS nur lesen
    tail -200 /PFAD/ZUM/alert_SID.log
    Was sehe ich hier?

    Ein Fehler vor MOUNT deutet eher auf Parameter/Umgebung hin. Fehler beim MOUNT lenken den Blick auf Controlfiles. Fehler beim OPEN müssen zusammen mit ORA-Code, Datafile-/Redo-Meldungen und Recovery-Anforderung gelesen werden.

    ADMINISTRATIVE MASSNAHME – NICHT AUSFÜHREN
    STARTUP-, MOUNT-, OPEN-, RECOVER- oder Parameterbefehle gehören nicht zur read-only Diagnose. Erst wenn Ursache, Recovery-Ziel und Freigabe geklärt sind, wird die passende administrative Vorgehensweise außerhalb dieser Monitoring-Suite geplant.
    3. Datenbank hängt oder reagiert extrem langsam
    Aktive Sessions und gemeinsame Muster
    SELECT sid, serial#, username, sql_id, event, wait_class,
           state, CASE WHEN state = 'WAITING' THEN ROUND(wait_time_micro/1000000,3) END AS current_wait_seconds, blocking_session
    FROM v$session
    WHERE type='USER'
      AND status='ACTIVE'
    ORDER BY wait_class, event, current_wait_seconds DESC NULLS LAST;

    CURRENT_WAIT_SECONDS beschreibt nur einen aktuell beobachteten Wait. NULL bedeutet hier keine gemessene Wartezeit. Bei nicht wartenden Sessions kann EVENT das letzte Ereignis beschreiben.

    Solaris Momentaufnahme
    prstat 1 5
    vmstat 1 5
    iostat -xn 1 5
    Was sehe ich hier?

    Viele Sessions mit demselben nicht-idle Wait Event sind ein Hinweis auf eine gemeinsame Engpassrichtung. Hohe Host-CPU ohne passende DB-Aktivität kann auf andere Prozesse zeigen. Hohe Oracle-Waits und gleichzeitig auffällige I/O-Latenz ergeben erst zusammen einen belastbareren Storage-Hinweis.

    Nicht sofort
    Keine Session beenden, keinen Parameter ändern und keinen Neustart auslösen. Erst Blocker, SQL, Waits und Hostbild sichern.
    4. Tablespace kritisch / voll
    Die entscheidende Frage
    Nicht nur „wie voll ist der aktuell allokierte Tablespace?“, sondern: Wie viel ist wirklich belegt, wie viel ist aktuell frei, wie weit dürfen vorhandene Datafiles noch wachsen und ist dieser Platz im Filesystem real vorhanden?
    Datafiles und Autoextend
    SELECT tablespace_name, file_id, file_name,
           ROUND(bytes/1024/1024/1024,2) AS current_gb,
           autoextensible,
           ROUND(maxbytes/1024/1024/1024,2) AS max_gb
    FROM dba_data_files
    WHERE tablespace_name=UPPER('&TABLESPACE_NAME')
    ORDER BY file_id;
    Aktuell freier Platz im Tablespace
    SELECT tablespace_name,
           ROUND(SUM(bytes)/1024/1024/1024,2) AS free_gb,
           ROUND(MAX(bytes)/1024/1024/1024,2) AS largest_free_extent_gb
    FROM dba_free_space
    WHERE tablespace_name=UPPER('&TABLESPACE_NAME')
    GROUP BY tablespace_name;
    Filesystem nur anzeigen
    df -k /PFAD/ZUM/DATAFILE
    Entscheidung
    Ein weiteres Datafile ist erst dann fachlich zu planen, wenn reale Belegung, verbleibende Autoextend-Reserve, Datafile-Maxima, Wachstum und Filesystem-Kapazität gemeinsam zeigen, dass die vorhandene Reserve nicht ausreicht.
    MÖGLICHE MASSNAHME – NUR DOKUMENTATION
    Ein ALTER TABLESPACE ... ADD DATAFILE oder ALTER DATABASE DATAFILE ... AUTOEXTEND würde die Datenbank verändern und wird hier bewusst nicht als ausführbarer Diagnosebefehl angeboten.
    5. TEMP voll / ORA-01652
    Einfach erklärt
    TEMP wird unter anderem für Sortierungen und Hash-Operationen verwendet. Ein voller TEMP-Bereich kann durch eine einzelne große SQL, viele parallele Verbraucher oder zu wenig Kapazität entstehen. Die verursachende SQL ist deshalb genauso wichtig wie die Dateigröße.
    Aktuelle TEMP-Verbraucher
    SELECT s.con_id, s.sid, s.serial#, s.username,
           s.sql_id AS current_sql_id,
           u.sql_id_tempseg AS temp_sql_id,
           u.tablespace, u.segtype, u.blocks
    FROM v$tempseg_usage u
    JOIN v$session s
      ON s.saddr = u.session_addr
     AND s.serial# = u.session_num
     AND s.con_id = u.con_id
    ORDER BY u.blocks DESC, s.sid;

    CURRENT_SQL_ID gehört zum aktuellen Sessionkontext; TEMP_SQL_ID bezeichnet das SQL, das das temporäre Segment erzeugt hat. BLOCKS zeigt zugewiesene Blöcke, keine Nutzdatenmenge. Die Abfrage ist instanzlokal und eine veränderliche Momentaufnahme.

    Tempfiles
    SELECT tablespace_name, file_id, file_name, bytes,
           autoextensible, maxbytes
    FROM dba_temp_files
    ORDER BY tablespace_name, file_id;
    Entscheidung
    Erst feststellen, ob die Nutzung fachlich plausibel und temporär ist oder ob wiederkehrend Kapazität fehlt. Nicht automatisch TEMP erweitern.
    6. UNDO-Probleme / ORA-01555
    Wichtig
    ORA-01555 bedeutet nicht automatisch „UNDO ist zu klein“. Entscheidend ist, ob benötigte Undo-Informationen für eine lange konsistente Abfrage nicht mehr verfügbar waren und wie Querydauer, Undo-Verbrauch und Wiederverwendung zusammenpassen.
    UNDO-Historie
    SELECT begin_time, end_time, tuned_undoretention,
           ssolderrcnt, nospaceerrcnt, undoblks, txncount, maxquerylen
    FROM v$undostat
    ORDER BY begin_time DESC;
    Was sehe ich hier?

    SSOLDERRCNT zeigt ORA-01555-Ereignisse je Intervall. MAXQUERYLEN hilft, lange Queries zeitlich einzuordnen. NOSPACEERRCNT ist ein separater Hinweis auf fehlenden Undo-Space.

    Nicht sofort
    UNDO nicht pauschal vergrößern oder Retention ändern. Erst Fehlerzeitpunkt und Workload belegen.
    7. Archiver stuck / ORA-00257
    Warum ist das kritisch?
    Kann ARCn gefüllte Redo Logs nicht archivieren, kann Oracle irgendwann keine Redo-Gruppe mehr wiederverwenden. Dann werden schreibende Vorgänge blockiert. Deshalb muss zuerst geklärt werden, welches Archive-Ziel betroffen ist und warum.
    Archive-Ziele
    SELECT dest_id, status, target, destination, error
    FROM v$archive_dest
    WHERE status <> 'INACTIVE'
    ORDER BY dest_id;
    Letzte archivierte Logs
    SELECT * FROM (
      SELECT thread#, sequence#, first_time, next_time, archived, deleted, name
      FROM v$archived_log
      ORDER BY first_time DESC
    )
    WHERE ROWNUM <= 30;
    Filesystem nur anzeigen
    df -k /PFAD/ZUM/ARCHIVEZIEL
    Recovery-Sicherheit
    Archivelogs niemals unkontrolliert löschen, nur um Platz zu schaffen. Vor einer Löschung müssen Backupstatus, Recovery-Anforderung und Retention geklärt sein.
    SCHREIBENDE MASSNAHMEN – NICHT AUSFÜHREN
    RMAN DELETE, manuelles rm, Änderungen an LOG_ARCHIVE_DEST_n oder andere Eingriffe sind keine Diagnose. Sie benötigen eine gesonderte Freigabe und einen geprüften Recovery-Kontext.
    8. Datafile fehlt / ORA-01110 / ORA-01157
    Einfach erklärt
    ORA-01110 nennt häufig nur das betroffene Datafile und muss zusammen mit der eigentlichen Fehlermeldung gelesen werden. ORA-01157 bedeutet, dass Oracle ein Datafile nicht identifizieren oder sperren kann. Ursache kann Datei, Mount, Berechtigung oder Storage sein.
    Datafiles aus Controlfile-Sicht
    SELECT file#, name, status, enabled
    FROM v$datafile
    ORDER BY file#;
    
    SELECT file#, error, online_status, change#, time
    FROM v$recover_file
    ORDER BY file#;
    OS-Pfad nur prüfen
    ls -l /PFAD/ZUM/BETROFFENEN/DATAFILE
    df -k /PFAD/ZUM/BETROFFENEN/DATAFILE
    mount
    Entscheidung
    Datei fehlt physisch? Mount fehlt? Berechtigung unpassend? Recovery angefordert? Erst diese Fragen beantworten. Restore/Recover ist eine separate administrative Aktion.
    9. Controlfile-Problem
    Warum besonders sensibel?
    Das Controlfile beschreibt die physische Struktur der Datenbank und enthält wichtige Checkpoint-/Redo-Metadaten. Ohne verwendbares Controlfile kann die Datenbank nicht normal gemountet werden.
    Konfiguration lesen, sofern Verbindung möglich
    SELECT name, value
    FROM v$parameter
    WHERE name='control_files';
    
    SELECT name, status
    FROM v$controlfile
    ORDER BY name;
    Konfigurierte Pfade am OS nur prüfen
    ls -l /PFAD/ZUM/CONTROLFILE
    RECOVERY / CONTROLFILE – NUR PLANEN
    Controlfile kopieren, neu erzeugen, aus RMAN restaurieren oder Parameter ändern sind schreibende Recovery-Aktionen. Das Notfallhandbuch zeigt hier bewusst nur die Diagnose und die Entscheidungsgrundlage.
    10. RMAN-Backup fehlgeschlagen / Restore-Fähigkeit unklar
    Zuerst trennen
    Ein fehlgeschlagener Backupjob und eine tatsächlich fehlende Recovery-Fähigkeit sind nicht dasselbe. Entscheidend ist, welche Datenfile-, Archivelog-, Controlfile- und SPFILE-Sicherungen für das Recovery-Ziel vorhanden und verwendbar sind.
    RMAN-Historie aus Oracle-Sicht
    SELECT session_key, input_type, status,
           start_time, end_time, output_bytes
    FROM v$rman_backup_job_details
    ORDER BY start_time DESC
    FETCH FIRST 30 ROWS ONLY;
    RMAN-Kommandos zur reinen Bestandsanzeige
    SHOW ALL;
    LIST BACKUP SUMMARY;
    LIST BACKUP OF DATABASE;
    LIST BACKUP OF ARCHIVELOG ALL;
    Was sehe ich hier?

    LIST zeigt Repository-Informationen zum Backupbestand. Das ist etwas anderes als ein physischer Restore-Test. SHOW ALL zeigt die RMAN-Konfiguration.

    Wichtig
    CROSSCHECK, DELETE und Repository-Änderungen gehören nicht in die read-only Suite. VALIDATE kann I/O-Last erzeugen und wird deshalb nicht automatisch durch dieses Wiki gestartet.
    11. NFS / Backup-Storage / Filesystem nicht verfügbar
    Diagnoseziel
    Unterscheiden, ob der Mount fehlt, das Filesystem voll ist, I/O auffällig ist oder nur Oracle/RMAN auf einen bestimmten Pfad nicht zugreifen kann.
    Solaris – read-only OS-Prüfung
    df -k
    mount
    iostat -xn 1 5
    ls -ld /PFAD/ZUM/MOUNTPOINT
    ls -l /PFAD/ZUM/BACKUPVERZEICHNIS
    Was sehe ich hier?

    df -k zeigt Kapazität gemounteter Filesysteme. mount zeigt die aktive Mount-Konfiguration. iostat -xn hilft, I/O-Latenz und Auslastung einzuordnen. ls prüft nur Sichtbarkeit und Metadaten; es schreibt keine Testdatei.

    Read-only bleibt read-only
    Keine Testdatei mit touch erzeugen und keinen Mount automatisch neu einhängen. Das wären Änderungen am Betriebssystem.
    12. Nach Serverabsturz oder VCS-Failover
    Oracle-Prozesse am aktuellen Host
    uname -n
    ps -eo pid,args | grep "[o]ra_pmon_"
    ps -eo pid,args | grep "[t]nslsnr"
    df -k
    mount
    Instanz nach Failover einordnen
    SELECT instance_name, host_name, status,
           database_status, startup_time
    FROM v$instance;
    
    SELECT name, open_mode, database_role
    FROM v$database;
    
    SELECT name, network_name
    FROM v$services
    ORDER BY name;
    Danach prüfen
    • Passt HOST_NAME zum erwarteten VCS-Knoten?
    • Ist STARTUP_TIME plausibel zum Failover-Zeitpunkt?
    • Sind Datafile-, Archive- und Backup-Mounts vorhanden?
    • Sind die erwarteten Services sichtbar?
    • Welche Meldungen stehen unmittelbar vor und nach dem Ereignis im Alertlog und in den VCS-/OS-Logs?
    Abschluss
    Erst wenn Datenbankzustand, Storage, Services und Ereigniszeitlinie zusammenpassen, ist der technische Failover-Befund belastbar.

    12. Oracle-19c-Dokumentation als fachliche Grundlage

    V$DIAG_INFO
    ADR Base/Home, Trace-Pfade sowie aktive Problem- und Incident-Zähler
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-DIAG_INFO.html

    V$DIAG_ALERT_EXT
    XML-basierter Alert Log mit Zeitstempel, Meldung, Problem Key und Containerkontext
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/V-DIAG_ALERT_EXT.html

    Oracle Net Services – Troubleshooting
    ADR/ADRCI und Net-Diagnose
    https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/troubleshooting-oracle-net-services.html

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Eine Störung wird zuerst nach Erreichbarkeit, Funktion, Performance oder Kapazität eingeordnet. Betroffene Systeme, Beginn und fachliche Auswirkungen bestimmen die Priorität.
    2. Instanz, Datenbank, Container und Service müssen eindeutig identifiziert werden. Ein Fehler auf einer Ebene beweist keinen Ausfall aller anderen Ebenen.
    3. Alert Log, ADR, Trace- und weitere Betriebsprotokolle liefern zeitbezogene Belege. Meldung, Ursache und nachfolgende Reaktion werden in einer gemeinsamen Chronologie getrennt.
    4. Blockierungen, Archiver-Probleme, Platzmangel und allgemeine Performance verlangen unterschiedliche Diagnosewege. Eine pauschale Tuning-Maßnahme ersetzt diese Eingrenzung nicht.
    5. Vor einer Eskalation werden Zeitfenster, Fehlerstack, Kontext und bereits erhobene Befunde gesichert. Eingriffe benötigen einen begründeten Ablauf und eine anschließende Kontrolle.

    Lernzielkontrolle

    Im Notfall ist die Reihenfolge wichtiger als Aktionismus.
    Frage 1: Warum wird bei ORA-00257 nicht sofort ein Archivelog gelöscht?
    Weil zuerst Backup- und Recovery-Kette, betroffenes Archive-Ziel und Ursache des Platz-/Zielproblems geklärt werden müssen.
    Frage 2: Warum beweist MAXBYTES nicht, dass ein Datafile wirklich bis dorthin wachsen kann?
    MAXBYTES ist die Oracle-Obergrenze. Der reale Platz im darunterliegenden Filesystem oder Storage muss separat vorhanden sein.
    Frage 3: Was ist nach einem Failover zuerst zu beweisen?
    Auf welchem Host die Instanz läuft, seit wann sie läuft und ob Datenbankzustand, Services sowie benötigte Storage-/Backup-Pfade konsistent verfügbar sind.

    34. DBA Diagnosekarten – vom Symptom zum ersten belastbaren Check

    Kompakte Einstiegskarten: zuerst messen, typische Fehlinterpretationen vermeiden und danach gezielt ins Fachkapitel wechseln.

    Lernkompass
    Einfach gesagt Diagnosekarten sind Kurzwege für den Ernstfall: Symptom erkennen, ersten sicheren Check wählen, Ergebnis einordnen.
    Warum ist das wichtig? Sie ersetzen kein Fachwissen, helfen aber unter Zeitdruck den Einstieg zu finden.
    Nach diesem Kapitel Du kannst von einem Symptom zur passenden ersten Datenquelle springen.

    Einführung: Diagnosekarten bieten einen kurzen Zugang von einer konkreten Betriebsfrage zur ersten geeigneten Prüfung. Sie bündeln nicht die gesamte Theorie, sondern helfen bei der Auswahl: Welche Information brauche ich jetzt, wo finde ich sie und was lässt sich daraus ableiten? Das ist besonders nützlich, wenn der passende View-Name noch nicht bekannt ist.

    Lies zunächst die Karte zum beobachteten Symptom und prüfe, ob ihr Kontext auf deinen Fall passt. Die vorgeschlagenen Abfragen liefern erste Hinweise; ihre Interpretation führt anschließend in das zuständige Fachkapitel. So bleibt der Unterschied zwischen einer möglichen Erklärung und einer nachgewiesenen Ursache sichtbar. Eine Karte ersetzt weder die vollständige Diagnose noch einen geprüften Änderungsablauf.

    Oracle 19c: fachliche Grundlage

    Abgrenzung: Diagnosekarten sind Schnellzugriffe. Sie ersetzen die zugehörigen Fachkapitel nicht.

    1. Datenbank allgemein langsam

    Typische Hinweise: Antwortzeiten steigen, mehrere Anwendungen betroffen.

    Zuerst: Zeitraum, Host, DB Time/DB CPU, Wait Classes und Top SQL korrelieren.
    Nicht sofort: SGA/PGA erhöhen oder einzelne Parameter ändern.
    Read-only Diagnose anzeigen
    DB Time / DB CPU
    SELECT stat_name,
           ROUND(value/1000000,2) AS seconds
    FROM v$sys_time_model
    WHERE stat_name IN ('DB time','DB CPU')
    ORDER BY stat_name;

    Für kurze Störungen Differenzen zweier Messpunkte oder historische Daten verwenden.

    2. CPU hoch

    Typische Hinweise: Host-CPU und DB CPU steigen, aktive Sessions nehmen zu.

    Zuerst: Host-Sättigung von DB CPU trennen und Top SQL nach CPU_TIME untersuchen.
    Nicht sofort: „Mehr CPU“ als Ursache oder Lösung annehmen.
    Read-only Diagnose anzeigen

    Diese Liste zeigt kumulierte CPU-Zeit der aktuell im Shared Pool vorhandenen Child Cursor auf dieser Instanz. Sie ist eine Kandidatenliste, kein Ranking für das aktuelle Störungsintervall. Mehrere Child Cursor können dieselbe SQL_ID haben. Für die aktuelle Last sind vergleichbare Messpunkte und die Delta-Auswertung in Kapitel 31 erforderlich; neu geladene oder verschwundene Cursor gesondert behandeln.

    Top SQL nach CPU
    SELECT *
    FROM (
        SELECT con_id,
               sql_id,
               child_number,
               executions,
               ROUND(cpu_time/1000000,2) AS cpu_s,
               buffer_gets,
               parse_calls
        FROM v$sql
        WHERE executions > 0
        ORDER BY cpu_time DESC
    )
    WHERE ROWNUM <= 20;

    3. User I/O hoch

    Typische Hinweise: User-I/O-Wait-Class, viele Physical Reads.

    Zuerst: konkretes Event, SQL_ID, Reads/Execution und Execution Plan ermitteln.
    Nicht sofort: Storage verantwortlich machen oder Buffer Cache vergrößern.
    Read-only Diagnose anzeigen
    Aktive User-I/O-Sessions
    SELECT sid,
           serial#,
           username,
           sql_id,
           event,
           CASE WHEN state = 'WAITING' THEN ROUND(wait_time_micro/1000000,3) END AS current_wait_seconds
    FROM v$session
    WHERE type='USER'
      AND status='ACTIVE'
      AND state='WAITING'
      AND wait_class='User I/O'
    ORDER BY wait_time_micro DESC;

    CURRENT_WAIT_SECONDS beschreibt nur einen aktuell beobachteten Wait. NULL bedeutet hier keine gemessene Wartezeit. Bei nicht wartenden Sessions kann EVENT das letzte Ereignis beschreiben.

    4. Commit langsam

    Typische Hinweise: log file sync steigt.

    Zuerst: log file sync mit log file parallel write, Commit-Rate und Redo-Rate vergleichen.
    Nicht sofort: Redo Logs vergrößern. Log-Größe und Commit-Latenz sind unterschiedliche Themen.
    Read-only Diagnose anzeigen
    Commit-Waits
    SELECT event,
           total_waits,
           ROUND(time_waited_micro/1000000,2) AS waited_s,
           average_wait
    FROM v$system_event
    WHERE event IN ('log file sync','log file parallel write')
    ORDER BY event;

    5. Blockierte Sessions

    Typische Hinweise: Application-Waits, TX-Enqueue, BLOCKING_SESSION gesetzt.

    Zuerst: Blocker, Waiter, offene Transaktion, SQL und Anwendungskontext sichern.
    Nicht sofort: Blocker beenden. Erst fachliche Ursache und Transaktionszustand verstehen.
    Read-only Diagnose anzeigen
    Blockierte Sessions
    SELECT sid,
           serial#,
           username,
           sql_id,
           event,
           blocking_session,
           CASE WHEN state = 'WAITING' THEN ROUND(wait_time_micro/1000000,3) END AS current_wait_seconds,
           module
    FROM v$session
    WHERE blocking_session_status = 'VALID'
    ORDER BY current_wait_seconds DESC NULLS LAST;

    CURRENT_WAIT_SECONDS beschreibt nur einen aktuell beobachteten Wait. NULL bedeutet hier keine gemessene Wartezeit. Bei nicht wartenden Sessions kann EVENT das letzte Ereignis beschreiben.

    6. PGA wächst stark

    Typische Hinweise: Host-RAM sinkt, einzelne Oracle-Prozesse wachsen.

    Zuerst: PGA-Peak, Over Allocation, Workareas und Top-PGA-Prozesse korrelieren.
    Nicht sofort: PGA_AGGREGATE_TARGET blind erhöhen.
    Read-only Diagnose anzeigen
    PGA-Kennzahlen
    SELECT name,
           value,
           unit
    FROM v$pgastat
    ORDER BY name;

    7. TEMP stark genutzt

    Typische Hinweise: große Sort-/Hash-Operationen, TEMP-I/O.

    Zuerst: Aktuelle TEMP-Belegung und zugehörige Sessions mit der TEMP-Segmentanalyse in Kapitel 33 bestimmen. Danach die Workarea-Verteilung ergänzend untersuchen.
    Nicht sofort: TEMP-Nutzung als Fehler werten. Große analytische SQL darf TEMP nutzen.
    Read-only Diagnose anzeigen

    Das folgende Histogramm summiert Workarea-Ausführungen seit dem Instanzstart nach Größenklassen. Es enthält keine Session- oder SQL-Zuordnung und identifiziert keinen aktuellen TEMP-Verursacher. Onepass-/Multipass-Zähler erklären die bisherige Verteilung; für ein Zeitfenster sind Differenzen vergleichbarer Messpunkte nötig.

    Workarea-Histogramm
    SELECT low_optimal_size,
           high_optimal_size,
           optimal_executions,
           onepass_executions,
           multipasses_executions
    FROM v$sql_workarea_histogram
    WHERE total_executions > 0
    ORDER BY low_optimal_size;

    8. Hard Parses hoch

    Typische Hinweise: Parse CPU, viele neue Cursor, hohe Parse Calls.

    Zuerst: Hard Parse Rate, Literal-SQL, Child Cursor, Loads und Invalidations untersuchen.
    Nicht sofort: Shared Pool vergrößern.
    Read-only Diagnose anzeigen
    Parse-Zähler
    SELECT name,
           value
    FROM v$sysstat
    WHERE name IN ('execute count',
                   'parse count (total)',
                   'parse count (hard)',
                   'parse time cpu',
                   'parse time elapsed')
    ORDER BY name;

    9. Viele Child Cursor

    Typische Hinweise: hohe VERSION_COUNT oder viele CHILD_NUMBER je SQL_ID.

    Zuerst: V$SQL_SHARED_CURSOR lesen und Nicht-Sharing-Gründe bestimmen.
    Nicht sofort: alle Child Cursor als Fehler bewerten. Mehrere Varianten können technisch legitim sein.
    Read-only Diagnose anzeigen
    Child Cursor
    SELECT sql_id,
           child_number,
           plan_hash_value,
           executions,
           parse_calls,
           loads,
           invalidations
    FROM v$sql
    WHERE sql_id='&SQL_ID'
    ORDER BY child_number;

    10. Log Switches sehr häufig

    Typische Hinweise: viele Switches pro Stunde, Checkpoint-/Archiver-Druck.

    Zuerst: Redo-Größe, Redo-Rate, Switchrate und Alert Log zusammen betrachten.
    Nicht sofort: nur anhand einer festen Minutenregel Redo Logs vergrößern.
    Read-only Diagnose anzeigen
    Switches pro Stunde
    SELECT TO_CHAR(first_time,'DD.MM.YYYY HH24') AS hour,
           COUNT(*) AS sequenzanfaenge
    FROM v$log_history
    WHERE first_time >= SYSDATE-1
    GROUP BY TO_CHAR(first_time,'DD.MM.YYYY HH24')
    ORDER BY hour DESC;

    Gezählt werden historisch erfasste Sequenzanfänge nach FIRST_TIME, keine lückenlos gemessenen Switch-Abschlusszeitpunkte. Die verfügbare Historie und eine noch laufende Sequenz begrenzen die Aussage; Stunden ohne Treffer erscheinen nicht als Nullzeilen. Einordnung: Kapitel 18.

    11. PROCESSES / SESSIONS nahe Limit

    Typische Hinweise: Verbindungsprobleme, Current Utilization hoch.

    Zuerst: Current und Max Utilization sowie Verbindungsverteilung nach Anwendung untersuchen.
    Nicht sofort: Prozesslimit erhöhen, ohne Connection Pool oder Leak zu verstehen.
    Read-only Diagnose anzeigen
    Ressourcenlimits
    SELECT resource_name,
           current_utilization,
           max_utilization,
           limit_value
    FROM v$resource_limit
    WHERE resource_name IN ('processes','sessions')
    ORDER BY resource_name;

    12. ORA-00257 / Archiver blockiert

    Typische Hinweise: neue DML eingeschränkt, Archive-Ziel problematisch.

    Zuerst: Fehlerzeit, Archive Destination, freien Platz und Archivierungsstatus lesen.
    Nicht sofort: Archive Logs unkontrolliert löschen. Backup-/Recovery-Kette beachten.
    Read-only Diagnose anzeigen
    Archive Destinations
    SELECT dest_id,
           status,
           target,
           destination,
           error
    FROM v$archive_dest
    WHERE status <> 'INACTIVE'
    ORDER BY dest_id;

    13. Datenbank oder Service nicht erreichbar

    Erster Check: Instanzstatus, Database Open Mode, PDB-Status und benötigten Service getrennt prüfen. Danach Listener-/Oracle-Net-Diagnose aus Kapitel 4 verwenden.

    Nicht vorschnell schließen: Ein laufender PMON bedeutet nicht automatisch, dass die Anwendung ihren Service erreichen kann.

    14. ORA-01555 / Snapshot too old

    Erster Check: Problemzeitpunkt mit V$UNDOSTAT, MAXQUERYLEN, TUNED_UNDORETENTION und SSOLDERRCNT abgleichen.

    Nicht vorschnell schließen: ORA-01555 bedeutet nicht automatisch „UNDO Tablespace zu klein“. Query-Laufzeit, Undo-Erzeugungsrate und tatsächlich erreichbare Retention gehören zusammen. Vertiefung: Kapitel 23.

    15. ORA-04031 / Shared-Pool-Allokation

    Erster Check: genaue ORA-04031-Meldung und Alert-/Trace-Kontext sichern, SGA-/Shared-Pool-Zustand und Fragmentierungs-/Allokationskontext read-only untersuchen.

    Nicht vorschnell schließen: Die Meldung beweist nicht, dass eine pauschale Erhöhung von SHARED_POOL_SIZE die richtige Lösung ist. Vertiefung: Kapitel 22.

    16. RMAN Backup fehlgeschlagen

    Erster Check: RMAN-Fehlerstack vollständig lesen, letzten erfolgreichen Backupstatus und Archivelog-Status prüfen sowie Ziel/Medium und Repository-Kontext feststellen.

    Nicht vorschnell handeln: Keine Backups löschen oder Catalog-Metadaten ändern, bevor Ursache und Recovery Readiness geklärt sind. Vertiefung: Kapitel 25.

    17. Data Pump Job scheint zu hängen

    Erster Check: DBA_DATAPUMP_JOBS und DBA_DATAPUMP_SESSIONS prüfen und die beteiligten Sessions mit V$SESSION verbinden.

    Nicht vorschnell schließen: Ein nicht mehr sichtbarer Clientprozess bedeutet nicht automatisch, dass der serverseitige Data-Pump-Job beendet ist. Vertiefung: Kapitel 24.

    18. Alert Log meldet ORA-/WARNING-Ereignis

    Erster Check: Ereigniszeit, Meldungskette davor/danach, Problem Key und zugehörige Trace-/Incident-Informationen bestimmen. V$DIAG_INFO und V$DIAG_ALERT_EXT helfen bei der read-only Einordnung.

    Nicht vorschnell schließen: Die einzelne sichtbare ORA-Meldung kann Folgefehler statt Primärursache sein. Vertiefung: Kapitel 33 und 29.

    19. SQL_ID auffällig – erster Diagnosepfad für SE2

    Erster Check: Cursorinformationen aus V$SQL/V$SQLSTATS und bei Bedarf den vorhandenen Cursorplan mit DBMS_XPLAN.DISPLAY_CURSOR betrachten. Die SQL_ID dient als Übergabe von der Systemdiagnose zur SQL-/Plananalyse.

    SE2-Hinweis: SQL Tuning Advisor, Real-Time SQL Monitoring, V$SQL_MONITOR und DBMS_SQL_MONITOR gehören laut Oracle zum Tuning Pack und sind deshalb nicht Bestandteil dieser SE2-Diagnosekarten.

    20. Diagnosekarte beendet die Analyse nicht

    Eine Diagnosekarte liefert bewusst nur den ersten belastbaren Check. Sobald der Pfad feststeht, wird in das zuständige Fachkapitel gewechselt. Dadurch bleiben die Karten im Incident schnell nutzbar und die technischen Erklärungen müssen nicht an mehreren Stellen gepflegt werden.

    21. Oracle-19c-Dokumentation und Lizenzgrenze

    Oracle Database 19c Licensing Information
    Diagnostics Pack/Tuning Pack, SQL Tuning Advisor, Real-Time SQL Monitoring, V$SQL_MONITOR und DBMS_SQL_MONITOR
    https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/Licensing-Information.html

    CONTROL_MANAGEMENT_PACK_ACCESS
    Für Nicht-Enterprise-Editionen ist der dokumentierte Default NONE.
    https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/CONTROL_MANAGEMENT_PACK_ACCESS.html

    Oracle Database 19c SQL Tuning Guide
    SQL-Diagnose und Plananalyse
    https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/

    35. Betriebssystem, DBA-Werkzeuge & Loganalyse

    Solaris und Oracle Linux verstehen, mit Bash, vi und SQL*Plus arbeiten und Diagnoseausgaben gezielt auswerten.

    Lernkompass
    Einfach gesagt Oracle läuft auf einem Betriebssystem. Deshalb gehören Datenbank-, Listener-, RMAN- und OS-Logs bei Störungen zeitlich zusammen betrachtet.
    Warum ist das wichtig? Ein einzelner Logeintrag ist oft nur ein Hinweis; die Korrelation mehrerer Quellen macht den Befund belastbar.
    Nach diesem Kapitel Du kannst Solaris und Oracle Linux-Werkzeuge einsetzen, eigene Bash-Skripte mit vi bearbeiten, SQL*Plus-Ausgaben prüfen und die passenden Logs zu einer Diagnose verbinden.

    Einführung: Eine Oracle-Datenbank nutzt Ressourcen und Dienste ihres Betriebssystems. CPU, Speicher, Dateisysteme und Prozesse gehören deshalb ebenso zur DBA-Diagnose wie Datenbankmeldungen. Logdateien halten Ereignisse fest; Messwerkzeuge zeigen Zustände oder Veränderungen. Beide Arten von Informationen müssen zeitlich und zum betroffenen System zusammenpassen.

    Das Kapitel verbindet diese Hostsicht mit den Werkzeugen für den DBA-Alltag: Shell, Texteditor, SQL*Plus und Oracle-Diagnoseablage. Du lernst zuerst, Befehle und Ausgaben einzuordnen, und führst sie danach im bestehenden Berichtsablauf zusammen. Solaris 11.4 und Oracle Linux werden getrennt gekennzeichnet; gleiche Befehlsnamen garantieren weder gleiche Optionen noch gleiche Einheiten. Die Linux-Beispiele orientieren sich an Oracle Linux 8/9 mit systemd.

    Oracle 19c: fachliche Grundlage

    Loganalyse in drei Schritten

    1. Zeitpunkt: Wann begann die Störung? 2. Quelle: Kam die erste Auffälligkeit aus Oracle, Listener, Betriebssystem, Storage oder Cluster? 3. Reihenfolge: Welche Meldung kam zuerst? Spätere ORA- oder Prozessfehler können Folgefehler sein. Deshalb nie nur nach einem einzelnen Wort wie ERROR suchen, sondern immer einige Zeilen davor und danach lesen.

    1. Solaris und Oracle Linux im direkten DBA-Vergleich

    AufgabeSolaris 11.4Oracle Linux
    Betriebssystem erkennenuname -s
    cat /etc/release
    uname -s
    cat /etc/os-release
    Prozesse anzeigenps -eo pid,args; interaktiv prstatps -eo pid,args; interaktiv top
    CPU beobachtenmpstat 5 6; CPUs: psrinfompstat -P ALL 5 6; CPUs: lscpu
    Speicheraktivitätvmstat 5 6vmstat 5 6
    RAM / Swap einordnenprtconf
    swap -s
    free -h
    swapon --show
    I/O beobachteniostat -xn 5 6iostat -x 5 6
    Platz am Zielpfaddf -k "$DIAG_DIR"df -k "$DIAG_DIR"; lesbare Einheiten auch mit df -h "$DIAG_DIR"
    Mounts anzeigenmountfindmnt
    Dienste anzeigensvcs -a; Probleme: svcs -xvsystemctl --type=service --all --no-pager
    systemctl --failed --no-pager
    Systemmeldungen lesentail -n 100 /var/adm/messagesjournalctl -n 100 --no-pager
    Eigene Crontab lesencrontab -lcrontab -l
    Erweiterte Textsuche/usr/xpg4/bin/grep -Ein 'ORA-' "$ALERT_FILE"/usr/bin/grep -Ein 'ORA-' "$ALERT_FILE"

    2. Laufende Oracle-Instanzen finden

    Solaris und Oracle Linux – Bash / Terminal
    ps -eo pid,args | grep "[o]ra_pmon_"
    Was sehe ich hier?
    PMON-Prozesse weisen auf laufende Oracle-Instanzen hin; der Suffix hinter ora_pmon_ entspricht typischerweise der SID.
    Fiktive Beispielausgabe:
    PIDARGS
    1842ora_pmon_TESTA
    2451ora_pmon_TESTB

    Die Prozesssuche ist ein Hinweis auf laufende Datenbankinstanzen. Sie zeigt weder PDB-Status noch Service-Registrierung oder Erreichbarkeit. ASM-Prozesse heißen anders und werden vom gewählten Filter nicht erfasst. In Zonen oder Containern kann die Prozesssicht eingeschränkt sein.

    Gemeinsame Werkzeuge bewusst verwenden

    ps -eo pid,args, crontab -l, ls -ld, sed -n, tail -n und die gezeigten Bash-Grundlagen sind für Solaris und Oracle Linux geeignet. Auch die SQL-Abfragen laufen in Oracle und ändern ihre Syntax nicht allein wegen des Host-Betriebssystems. Die SQL*Plus- und ADRCI-Version muss zu den gezeigten Befehlen passen.

    Unter Oracle Linux stammen iostat und mpstat üblicherweise aus sysstat. Für aktuelle Intervallmessungen muss das Werkzeug vorhanden sein; rückblickende sar-Auswertungen benötigen bereits aufgezeichnete Daten. Die Einrichtung einer Datensammlung ist eine eigene Administrationsaufgabe.

    Bei iostat heißen Kenngrößen und Gerätespalten je nach Plattform und Werkzeugversion anders. Eine Solaris-Spalte wie asvc_t darf nicht ungeprüft mit Linux await gleichgesetzt werden. Erkläre zuerst Messgröße, Einheit und Zeitfenster, bevor du Zahlen vergleichst.

    3. CPU, RAM und I/O zusammen betrachten

    Hohe CPU ist nicht automatisch ein Oracle-Fehler, und niedrige CPU schließt ein Performanceproblem nicht aus. Waits, Run Queue, Paging und I/O-Latenz müssen im gleichen Zeitraum verglichen werden.

    Oracle-Waits wie log file parallel write oder db file sequential read werden erst dann zu einem belastbaren Storage-Hinweis, wenn Host-/Storage-Messwerte dieselbe Richtung zeigen.

    Messwerte immer als Zeitfenster lesen: Ein einzelner CPU- oder I/O-Wert erklärt noch keine Datenbankstörung. Auf UNIX-Systemen liefern Werkzeuge wie vmstat, sar und iostat unterschiedliche Perspektiven. Oracle nennt diese Werkzeuge ausdrücklich für die Beurteilung von CPU, Paging/Swapping und I/O. Auf Solaris kann mpstat zusätzlich die Aktivität einzelner Prozessoren zeigen.

    Memory: Wenig freier Speicher allein ist noch kein Beweis für Memory Pressure. Auf Solaris sind insbesondere Paging/Swapping und die Page-Scanner-Aktivität relevant. Oracle empfiehlt, bei niedriger freier Memory-Menge unter anderem die sr-Spalte von vmstat sowie Paging-/Swap-Aktivität zu betrachten. Die DB-Sicht kann mit V$OSSTAT ergänzt werden.

    I/O: Ein Oracle-Wait ist keine direkte Messung der Storage-Latenz des Betriebssystems. Erst die zeitliche Korrelation aus Oracle-Waits, I/O-Statistik und gegebenenfalls Storage-Metriken macht die Aussage belastbar.

    Read-only Hostdiagnose – Beispiele

    Solaris 11.4 – Hostmessung – Bash / Terminal

    # Solaris 11.4 – im Terminal einzeln ausführen
    vmstat 5 6
    iostat -xn 5 6
    mpstat 5 6
    swap -s
    Oracle Linux – Hostmessung – Bash / Terminal
    # Oracle Linux – mpstat und iostat gehören üblicherweise zum Paket sysstat
    vmstat 5 6
    iostat -x 5 6
    mpstat -P ALL 5 6

    Die Werkzeuge laufen hier nacheinander. Für eine gemeinsame Messung starte sie in getrennten Terminals und notiere Beginn, Ende und Zeitzone. Der erste Bericht von vmstat beziehungsweise iostat enthält häufig seit dem Systemstart gemittelte Aktivitätswerte; die folgenden Berichte beziehen sich auf das Intervall. Nicht jede Spalte hat dieselbe Zeitbasis.

    Fiktive Auswertung zweier unterschiedlicher Systeme
    SYSTEMMESSFENSTERBEOBACHTUNG
    Solaris08:45:00–08:45:05 +02:00vmstat: sr bleibt über mehrere Intervalle erhöht
    Oracle Linux08:45:00–08:45:05 +02:00vmstat: si/so wiederholt größer 0

    Die Beispiele liefern Anlass, Speicherdruck genauer zu untersuchen. Die Solaris-Spalte sr und Oracle Linux si/so sind unterschiedliche Messgrößen und nicht direkt vergleichbar. Auf Oracle Linux sind Cache und verfügbarer Speicher mitzulesen; auf Solaris Scanner-, Paging- und Swap-Aktivität gemeinsam. Es gibt keinen universellen Grenzwert, der aus einer einzelnen Spalte einen Oracle-Fehler macht.

    4. Alert Log

    Das Alert Log ist die zentrale chronologische Oracle-Diagnosequelle für Start/Stop, administrative Operationen, ORA-Fehler, Archivierung, Checkpoints und viele interne Warnungen. Seit ADR wird es strukturiert als XML-Diagnosedaten geführt; zusätzlich existiert eine textformatierte Alert-Datei zur Kompatibilität. Oracle empfiehlt für automatisches Parsing die strukturierte ADR-/XML-Quelle, weil das Textformat unstrukturiert ist und sich ändern kann. Den tatsächlichen Diagnosepfad sollte man nicht aus einem angenommenen Verzeichnis ableiten, sondern über V$DIAG_INFO oder ADRCI bestimmen.

    ADR statt Pfade raten: Das Automatic Diagnostic Repository (ADR) sammelt Alert-, Trace-, Incident- und weitere Diagnosedaten. V$DIAG_INFO liefert unter anderem ADR Base, ADR Home, Diag Trace, Diag Alert und das Default Trace File. Damit kann ein DBA den tatsächlichen Pfad read-only ermitteln.

    Read-only SQL – Diagnosepfade

    Solaris und Oracle Linux – in SQL*Plus

    SELECT name, value
    FROM   v$diag_info
    ORDER  BY name;

    Alert Log per SQL: V$DIAG_ALERT_EXT stellt den XML-basierten Alert-Log-Inhalt für den aktuellen Container bereit. Besonders nützlich sind ORIGINATING_TIMESTAMP, MESSAGE_TYPE, MESSAGE_LEVEL, MESSAGE_ID und MESSAGE_TEXT. In einer CDB/PDB-Umgebung muss die Container-Sicht berücksichtigt werden.

    Read-only SQL – aktuelle Fehler und Warnungen

    Solaris und Oracle Linux – in SQL*Plus

    SELECT TO_CHAR(originating_timestamp,
                   'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS zeit,
           message_type, message_level,
           SUBSTR(message_text,1,160) AS meldung
    FROM   v$diag_alert_ext
    WHERE  originating_timestamp >= SYSTIMESTAMP - INTERVAL '2' HOUR
    AND    message_type IN (2,3,4)
    ORDER  BY originating_timestamp DESC
    FETCH FIRST 100 ROWS ONLY;
    Einordnung: In V$DIAG_ALERT_EXT steht MESSAGE_TYPE=2 für Incident Error, 3 für Error und 4 für Warning. MESSAGE_LEVEL ist eine separate Severity-Einstufung; kleinere Werte bedeuten dort höhere Schweregrade. Die beiden Spalten dürfen nicht miteinander verwechselt werden.

    5. Trace-Dateien

    Trace-Dateien liefern Prozess- und Sessiondetails zu Fehlern, internen Ereignissen und Diagnosen. Server- und Hintergrundprozesse besitzen eigene Trace-Dateien; bei kritischen Fehlern werden dort häufig zusätzliche Informationen abgelegt. Wenn das Alert Log auf eine Trace-Datei verweist, sollten Zeitstempel, Prozessname/PID, Fehlerstack, Incident-ID und der zugehörige Trace gemeinsam korreliert werden.

    Incident und Problem unterscheiden: ADR kann bei kritischen internen Fehlern Incidents erzeugen. Mehrere Incidents mit derselben zugrunde liegenden Ursache können einem Problem zugeordnet sein. Ein Incident ist daher nicht einfach ein Synonym für jede ORA-Meldung. Für Supportfälle kann ADRCI die zugehörigen Diagnosedaten mit dem Incident Packaging Service (IPS) paketieren.

    ADRCI read-only nutzen: Für die reine Diagnose sind insbesondere SHOW HOMES, SHOW ALERT, SHOW INCIDENT, SHOW PROBLEM und SHOW TRACEFILE relevant. Vor der Analyse sollte das richtige ADR Home gewählt werden, wenn mehrere Homes existieren.

    ADRCI – Diagnosebeispiele

    Solaris und Oracle Linux – im ADRCI-Prompt

    SHOW BASE
    SHOW HOMES
    SET HOMEPATH diag/rdbms/DB_UNIQUE_NAME/INSTANCE_NAME
    SHOW ALERT -TAIL 100
    SHOW INCIDENT
    SHOW PROBLEM
    SHOW TRACEFILE
    Wichtig: ADRCI kann neben reinen Anzeigeoperationen auch Daten bereinigen oder Pakete erzeugen. In diesem Kapitel werden ausschließlich Diagnose-/Anzeigeoperationen verwendet. Purge-, Delete- oder andere verändernde Aktionen gehören nicht in einen read-only Diagnoseablauf.

    Start im Betriebssystemterminal: "$ORACLE_HOME/bin/adrci". Erst am ADRCI-Prompt die oben gezeigten SHOW-/SET-Befehle eingeben. Übernimm den HOMEPATH aus SHOW HOMES; DB_UNIQUE_NAME und INSTANCE_NAME sind Platzhalter. Datenbank und Listener können verschiedene ADR Homes und Basispfade besitzen. Diese Namen nie aus einem Beispiel ungeprüft übernehmen.

    6. Listener Log

    Das Listener-Log beziehungsweise die Oracle-Net-Diagnose zeigt Verbindungsereignisse und TNS-/Listener-Fehler. Bei ADR-aktivierter Oracle-Net-Diagnose liegen Log- und Trace-Daten ebenfalls in einer ADR-Struktur. Ein erreichbarer Listener beweist weder einen erfolgreichen Datenbank-Login noch, dass der gewünschte Service beziehungsweise PDB-Service korrekt registriert und nutzbar ist.

    7. RMAN-Logs

    RMAN-Logs sollten Start/Ende, Backup-Typ, RMAN-/ORA-Fehler, Ziel, Laufzeit und relevante Piece-/Set-Informationen nachvollziehbar machen. Ein erfolgreich beendeter Backupjob belegt die Jobausführung, aber nicht automatisch die Wiederherstellbarkeit. Für Recovery Readiness sind zusätzlich Repository-/Medienstatus sowie je nach Ziel RESTORE ... PREVIEW und RESTORE ... VALIDATE relevant.

    Eigene Betriebs-, Monitoring- und Backupskripte schreiben ihre Logs nicht in einen weltweit festen Oracle-Pfad. Der Speicherort wird vom jeweiligen Betriebskonzept beziehungsweise im Skript selbst festgelegt. Deshalb sollte ein DBA zuerst im aufgerufenen Skript nach Variablen wie LOGFILE, LOG_DIR oder nach einer Shell-Umleitung suchen.

    Wichtig ist die Trennung: Oracle ADR enthält Oracle-eigene Diagnoseinformationen, während selbst definierte RMAN-, Monitoring- oder Wartungslogs an frei gewählten Pfaden liegen können. Ein allgemeines DBA-Wiki sollte deshalb keinen kundenspezifischen Pfad als Standard darstellen.

    Solaris und Oracle Linux – Bash / Terminal
    LOGFILE=/path/to/rman_backup.log
    rman target / >> "$LOGFILE" 2>&1

    8. Audit- und OS-Logs

    QuelleSolarisOracle Linux
    System/var/adm/messages, SMF-Logsjournalctl, distributionsabhängig /var/log/messages
    Oracle AuditPfad abhängig von Oracle-Audit-Konfiguration; für Login-/Auditereignisse.

    Ein DBA sollte Logdateien nicht nur anhand ihres Namens kennen, sondern anhand der Frage, die sie beantworten. Das Alert Log liefert die Datenbankzeitlinie, Trace-Dateien die technischen Details eines konkreten Prozesses, das Listener-Log den Netzwerk-/Servicezugang, RMAN-Logs die Backuplaufzeit und das Betriebssystem die Hostperspektive.

    Log / QuelleTypischer PfadWas kann ich daraus ablesen?
    Oracle Alert Log$ORACLE_BASE/diag/rdbms/<db_unique_name>/<sid>/trace/alert_<sid>.logStartup/Shutdown, ORA-Fehler, Redo/Checkpoint, Archive, Speicherwarnungen, Incident-/Trace-Hinweise.
    Oracle Trace$ORACLE_BASE/diag/rdbms/<db_unique_name>/<sid>/trace/Prozess-/Sessiondetails, Error Stack, Dumps, Deadlocks, interne Diagnose.
    Listener Log$ORACLE_BASE/diag/tnslsnr/<host>/<listener>/trace/listener.logConnect-Versuche, Service, Client, TNS-/Listener-Fehler.
    Listener ADR XML$ORACLE_BASE/diag/tnslsnr/<host>/<listener>/alert/log.xmlADR-formatierte Listener-Ereignisse.
    RMAN JoblogUmgebungsabhängigRMAN-/ORA-Fehler, Input Type, Start/Ende, Laufzeit, Piece-/Channel-Ausgaben.
    Oracle Auditabhängig von audit_file_dest / Audit-KonfigurationLogin-/Auditereignisse und auditierten Zugriff.
    QuelleWas steht dort?Typischer DBA-Anwendungsfall
    /var/adm/messagesSystem-, Device-, Treiber-, Netzwerk- und Hardwaremeldungen.I/O-Fehler, NIC-/Disk-/Filesystem-Probleme zeitlich mit Oracle korrelieren.
    /var/svc/log/SMF-Service-Logs.Warum ein Solaris-Service nicht startet oder in maintenance geht.
    /var/cron/logcron-Aktivität.Prüfen, ob ein geplanter Job gestartet wurde.
    /var/audit/Solaris Audit-Trails, sofern auditd entsprechend konfiguriert ist.OS-Auditereignisse und Benutzeraktivität nachvollziehen.
    QuelleWas steht dort?
    journalctlsystemd-/Kernel-/Service-Ereignisse.
    journalctl -u <service>Log eines bestimmten systemd-Service.
    /var/log/messagesJe nach Distribution allgemeine Systemmeldungen.
    /var/log/secureJe nach Distribution Auth-/Security-Meldungen.

    Logrotation und Zeitbasis beachten: Ein fehlender Treffer in der aktuell sichtbaren Datei beweist nicht, dass das Ereignis nicht stattgefunden hat. Rotierte/archivierte Logs, unterschiedliche Zeitzonen, Sommerzeit, Host-Zeitabweichungen und ein Neustart können die Korrelation erschweren. Vor einer Incident-Timeline sollten daher Hostzeit, Datenbankzeit und die Zeitstempel der beteiligten Quellen plausibilisiert werden.

    Textsuche ist nur ein Einstieg: Ein grep auf ORA-, WARNING oder ERROR ist praktisch, aber nicht vollständig. Nicht jede relevante Meldung enthält diese Wörter. Für das Oracle Alert Log ist eine strukturierte Abfrage über ADR beziehungsweise V$DIAG_ALERT_EXT robuster als ein Parser, der dauerhaft vom Textformat abhängt.

    Audit ist keine einzige Datei: Traditionelles OS/XML-Auditing kann AUDIT_FILE_DEST verwenden. Unified Auditing schreibt regulär in den Audit Trail im AUDSYS-Kontext und kann OS-Spillover-Dateien verwenden. Die Audit-Konfiguration bestimmt die Quelle; für Aufbewahrung und Auswertung siehe das Security-Kapitel. Die oben genannten ADR-Verzeichnisse sind Strukturbeispiele, keine garantierten Installationspfade.

    Dienstprobleme: passende Befehle je Plattform

    Die folgenden Befehle lesen Status und Logs. Unter Solaris heißen verwaltete Dienste SMF-Services, unter Oracle Linux sind es systemd-Units. Zuerst den tatsächlichen Namen ermitteln; ein Oracle-Dienst heißt nicht auf jedem Host gleich.

    Solaris 11.4 – SMF-Status und Logpfad
    svcs -a
    svcs -xv
    # Den tatsächlichen FMRI aus svcs -a einsetzen.
    DIAG_SERVICE='svc:/system/cron:default'
    svcs -l "$DIAG_SERVICE"
    svcs -L "$DIAG_SERVICE"
    Oracle Linux – systemd-Status und Journal
    systemctl --failed --no-pager
    systemctl --type=service --all --no-pager
    # crond.service ist ein Beispiel; den installierten Dienst prüfen.
    systemctl status crond.service --no-pager
    journalctl -u crond.service --since "1 hour ago" --no-pager

    Fiktiver Befund: Solaris meldet maintenance, Oracle Linux meldet failed. Beide Zustände verlangen die Prüfung des zugehörigen Logs. Sie haben unterschiedliche Zustandsmodelle und beweisen für sich noch keinen Oracle-Datenbankfehler. svcs -L nennt den SMF-Logpfad; journalctl -u liest die Meldungen einer Unit. Fehlende Zugriffsrechte können die Ausgabe einschränken.

    Oracle-Instanzen können außerdem durch Oracle Restart oder Clusterware verwaltet werden. Ein laufender systemd- oder SMF-Dienst allein beschreibt dann nicht den Zustand jeder Datenbankressource. Die Rolle der Grid Infrastructure erklärt Kapitel 52.

    9. Die richtige Diagnosequelle auswählen

    QuelleBeantwortet primärBeweist nicht automatisch
    Alert Log / V$DIAG_ALERT_EXTWas meldete die Oracle-Instanz wann?Dass die erste Meldung die Root Cause ist.
    Trace-DateiWas sah ein konkreter Oracle-Prozess im Detail?Dass das Problem ausschließlich in Oracle entstand.
    Listener-/Net-DiagnoseWas geschah beim Netzwerk-/Servicezugang?Dass ein DB-Login oder SQL erfolgreich war.
    RMAN-/JoblogWas tat ein Job und welchen Status meldete er?Recovery Readiness oder die Ursache paralleler DB-Probleme.
    OS-Metriken/-LogsWas geschah auf Hostebene?Welches SQL oder welcher DB-Vorgang allein ursächlich war.

    Beginne mit der betroffenen Ebene. Bei einem Loginfehler zuerst vollständigen Clientfehler, Zielhost, Port und Service erfassen. Bei einem Backupfehler zuerst den zugehörigen RMAN-Lauf. Bei Performanceproblemen gehören aktuelle Session-/Wait-Messungen zur Logzeitlinie.

    10. Read-only Logsuche: nicht nur ORA- suchen

    Bei der Alertlog-Analyse sollten neben ORA- auch WARNING, ERROR, checkpoint, cannot allocate new log, Private strand flush, Archiver, Deadlock, Corrupt, Shutdown und Starting ORACLE instance betrachtet werden.

    Solaris und Oracle Linux – Bash / Terminal
    # ALERT_FILE auf die zuvor ermittelte, lesbare Datei setzen.
    ALERT_FILE='/u01/app/oracle/diag/rdbms/testa/TESTA/trace/alert_TESTA.log'
    if [ -x /usr/xpg4/bin/grep ]; then
      DIAG_GREP=/usr/xpg4/bin/grep
    else
      DIAG_GREP=/usr/bin/grep
    fi
    "$DIAG_GREP" -Ein 'ORA-|WARNING|ERROR|checkpoint|cannot allocate new log|Archiver|Deadlock|Corrupt|Shutdown|Starting ORACLE instance' "$ALERT_FILE"

    Treffer mit Umgebung lesen

    Solaris und Oracle Linux – Bash / Terminal
    # Beispiel: ein Treffer wurde in Zeile 125 gefunden.
    sed -n '120,135p' "$ALERT_FILE"

    Die Zahlen stammen aus deinem konkreten Suchergebnis. Zeilennummern können sich durch Logrotation ändern; arbeite bei Bedarf mit einer gezielt gesicherten Kopie. Der Marker <SID> darf nicht ungequotet in einem Shellbefehl stehen, weil < und > Umleitungen bedeuten. Die Suche oben verwendet deshalb einen gequoteten Variablenwert.

    Ein grep-Status 1 bedeutet „kein Treffer“, nicht automatisch einen Lesefehler. Status größer 1 bedeutet einen Fehler. Rotierte Dateien, andere ADR Homes, Containerfilter und abweichende Zeitfenster können relevante Meldungen verbergen.

    11. Dateisystemplatz und Dateizugriff gezielt prüfen

    Solaris und Oracle Linux – Bash / Terminal
    # Beispielpfad durch den im Fehler genannten Zielordner ersetzen.
    DIAG_DIR='/u01/app/oracle/diag'
    df -k "$DIAG_DIR"
    ls -ld "$DIAG_DIR"
    Fiktive df-Ausgabe, Spaltenbezeichnungen plattformabhängig
    Filesystem1024-blocksUsedAvailableCapacityMounted on
    /dev/demo10485760104857600100%/u01

    df beschreibt das Dateisystem, das den angegebenen Pfad enthält. Die Ausgabe ist keine Größe des einzelnen Verzeichnisses. 10485760 Blöcke zu 1024 Bytes entsprechen 10 GiB. 0 verfügbare Blöcke stützen im Beispiel den Platzbefund; Quoten, Reserven und Dateisystemtyp können die Bewertung zusätzlich beeinflussen.

    ls -ld zeigt die Metadaten des Verzeichnisses selbst. Leserecht auf einer Datei allein genügt nicht: Die übergeordneten Verzeichnisse müssen für den Benutzer durchsuchbar sein. ACLs können zusätzliche Regeln setzen. Ein Permission-denied-Fehler wird deshalb nicht pauschal durch chmod 777 behoben. Die Diagnose ändert keine Rechte.

    du zählt belegten Platz erreichbarer Dateien und ist daher kein gleichwertiger Ersatz für df. Eine rekursive Größenanalyse kann viele Dateien lesen; begrenze sie auf den tatsächlich betroffenen Bereich. Unter Oracle Linux kann bei passenden Dateisystemen auch die Inode-Belegung relevant sein. Die genaue Option und Aussage prüfst du für das installierte Werkzeug und Dateisystem.

    12. cron / crontab – Oracle-Jobs auf Solaris und Oracle Linux sicher verstehen

    cron ist ein zeitgesteuerter Jobstarter. Für einen DBA ist wichtig zu verstehen, dass ein Cronjob nicht mit derselben Shell-Umgebung startet wie ein interaktiver Login. Variablen, Aliase, Profile und PATH-Einträge, die in .profile, .bash_profile oder einer interaktiven Shell vorhanden sind, können im Cronjob fehlen.

    Genau deshalb sollte ein Oracle-Cronjob die wirklich benötigte Umgebung selbst setzen: insbesondere ORACLE_HOME, ORACLE_SID, PATH und gegebenenfalls NLS_LANG. Ein Job, der am Terminal funktioniert, kann sonst aus cron mit „command not found“, TNS-/Oracle-Fehlern oder falschem ORACLE_HOME scheitern.

    FeldBedeutungBeispiel
    Minute0–590,15,30,45
    Stunde0–232 = 02 Uhr
    Tag im Monat1–31* = jeden Tag
    Monat1–12* = jeden Monat
    Wochentag0–60 = Sonntag
    Solaris-Hinweis:
    Für Viertelstundenjobs verwenden wir portabel 0,15,30,45 * * * *. Das ist auf Solaris robuster als sich auf nicht überall identische Cron-Erweiterungen wie */15 zu verlassen.
    Solaris und Oracle Linux – Beispiel für eine Benutzer-Crontab
    0,15,30,45 * * * * /u01/app/ora19/backup/scripts/rman_archivelog_DBNAME.sh >> /backup/rman/DB_NAME/log/arch_cron.log 2>&1

    Die Ausgabe nach /dev/null zu schicken ist nur dann sinnvoll, wenn das aufgerufene Skript selbst ein belastbares Logfile schreibt. Sonst verschwinden Fehlermeldungen vollständig. Für produktive Oracle-Jobs sollte es deshalb immer ein eigenes Joblog mit Startzeit, Ende, Status und Fehlerstack geben.

    Warum ein gestarteter Job trotzdem scheitern kann

    cron startet den Befehl; es prüft nicht den fachlichen Erfolg und verhindert grundsätzlich keine überlappenden Läufe. Ein 20-minütiger Lauf kann bei einem 15-Minuten-Plan mit seinem Nachfolger zusammentreffen. Laufzeit und Betriebszweck prüfen, bevor eine plattformspezifische Sperrlösung geplant wird. Den Cron-Start im Dienstlog und das Ergebnis im eigenen Joblog getrennt beurteilen.

    Die fünf Zeitfelder gehören zur Benutzer-Crontab. Systemweite Oracle Linux-Crontabs können zusätzlich ein Benutzerfeld besitzen. Zeitzone und Sommerzeitverhalten hängen von der eingesetzten cron-Implementierung ab. Ein Beispiel um 02:00 Uhr ist deshalb keine Garantie für genau einen täglichen Lauf an Zeitumstellungstagen.

    13. Wo finde ich cron-Informationen?

    PlattformQuelleWas finde ich dort?
    Solaris/var/cron/logcron-Aktivität und gestartete Jobs, soweit Logging aktiviert/konfiguriert ist.
    Solariscrontab -lAktuelle Crontab des angemeldeten Benutzers.
    Oracle Linuxjournalctl bzw. distributionsabhängige cron-Logssystemd-/cron-Dienstmeldungen und Jobstarts.
    Solaris und Oracle Linux – Bash / Terminal
    crontab -l

    14. vi: eine Datei öffnen, bearbeiten und wieder verlassen

    vi ist ein Texteditor. Er bearbeitet Dateien, führt deren Inhalt aber nicht als Skript aus. Öffnest du eine noch nicht vorhandene Datei mit vi diagnose_basis.sh, entsteht zunächst ein Bearbeitungspuffer. Erst beim Speichern wird die Datei geschrieben. Für diese Übung verwendest du eine eigene neue Datei in einem Arbeitsverzeichnis.

    Die wichtigste Besonderheit sind die Modi. Im Befehlsmodus bewegen Tasten den Cursor oder bearbeiten Text. Nach i bist du im Eingabemodus und kannst Text tippen. Esc bringt dich zurück. Befehle wie :w werden anschließend in der unteren Befehlszeile eingegeben und mit Enter bestätigt.

    Merke dir zuerst diese kleine Folge: Datei öffnen, i drücken, Text eingeben, Esc drücken, :wq eingeben und Enter drücken. Ist etwas schiefgegangen und noch nicht gespeichert, verlässt :q! die Datei ohne diese Änderungen zu speichern. Bereits zuvor gespeicherte Änderungen werden dadurch nicht rückgängig gemacht.

    Taste / BefehlBedeutung
    i / aText vor / nach dem Cursor eingeben
    EscZum Befehlsmodus zurückkehren
    h j k lLinks, unten, oben, rechts
    /ORA- + EnterVorwärts suchen; n nächster, N vorheriger Treffer
    1G / GDateianfang / Dateiende
    :123 + EnterZu Zeile 123 springen
    yy / pZeile kopieren / hinter dem Cursor einfügen
    dd / uZeile löschen / letzte Änderung rückgängig machen
    :w / :wqSpeichern / speichern und beenden
    :q / :q!Beenden / ungespeicherte Änderungen verwerfen
    Vertiefung: Zeilennummern, Ersetzen und vi gegenüber vim

    :set number zeigt Zeilennummern an; :set nonumber blendet sie aus. Für einen gezielten Austausch kann :s/alt/neu/ den ersten passenden Treffer der aktuellen Zeile ersetzen. :%s/alt/neu/gc prüft Treffer in der ganzen Datei und fragt vor jedem Austausch nach. Suchmuster sind reguläre Ausdrücke; ein Punkt steht beispielsweise nicht automatisch für einen wörtlichen Punkt.

    vim erweitert vi. Funktionen wie gg, Syntaxfarben oder bequemes Einfügen hängen vom konkreten Editor ab. Für den Dateianfang nutzen wir deshalb das klassische 1G. Große produktive Logdateien liest du bevorzugt mit den Diagnosewerkzeugen dieses Kapitels; eine Editorübung findet an deiner eigenen Datei statt.

    15. Bash: Befehle zu einem verständlichen Ablauf verbinden

    Die Shell ist das Programm, das deine Terminalbefehle verarbeitet. Bash ist eine bestimmte Shell. Ein Bash-Skript ist eine Textdatei mit Befehlen in der Reihenfolge, in der sie abgearbeitet werden sollen. Kommentare beginnen mit # und erklären den Zweck, ohne selbst ausgeführt zu werden.

    Eine erste Zeile wie #!/usr/bin/bash nennt den Interpreter für den direkten Programmstart. Der tatsächliche Bash-Pfad ist auf dem Host zu prüfen. Bei bash diagnose_basis.sh wählst du Bash ausdrücklich; dafür muss die Datei lesbar sein, aber kein Ausführungsbit besitzen. sh diagnose_basis.sh ist kein gleichwertiger Ersatz, sobald Bash-spezifische Sprachelemente enthalten sind.

    Zum Lernen genügt eine Begrüßung. Erstelle mit vi eine eigene Datei und trage diese drei Zeilen ein:

    #!/usr/bin/bash
    # Erste Übung: nur einen Text ausgeben.
    printf '%s\n' 'Die Diagnose beginnt.' 

    Nach dem Speichern startest du sie mit bash diagnose_basis.sh. Die Beispielausgabe lautet Die Diagnose beginnt. Erst ein gesonderter Start führt den gespeicherten Text aus. Mit bash -n diagnose_basis.sh lässt sich die Bash-Syntax prüfen, ohne die Befehle auszuführen. Eine erfolgreiche Syntaxprüfung beweist noch keine richtigen Pfade, Rechte oder SQL-Abfragen.

    16. Variablen und Anführungszeichen richtig lesen

    Eine Variable gibt einem Wert einen Namen. SID="TESTA" speichert hier den Text TESTA. Um das Gleichheitszeichen stehen bei einer Zuweisung keine Leerzeichen. Mit "$SID" oder "${SID}" wird der Wert eingesetzt; geschweifte Klammern helfen, den Namen gegenüber angrenzendem Text abzugrenzen.

    Doppelte Anführungszeichen erlauben die Variablenauswertung und halten einen Wert als zusammengehöriges Argument fest. Einfache Anführungszeichen bewahren den Text wörtlich. Das ist wichtig bei Leerzeichen in Pfaden und beim Dollarzeichen in Oracle-Viewnamen.

    SID="TESTA"
    printf '%s\n' "Ausgewählte SID: $SID"
    printf '%s\n' 'Wörtlicher Text: $SID' 
    ZeileBeispielausgabe
    Doppelte AnführungszeichenAusgewählte SID: TESTA
    Einfache AnführungszeichenWörtlicher Text: $SID
    Vertiefung: Warum Variablen meist in doppelte Anführungszeichen gehören

    Ein ungeschütztes $DATEI kann nach der Auswertung in mehrere Wörter zerlegt werden; Musterzeichen können außerdem Dateinamen treffen. "$DATEI" übergibt den Inhalt als ein Argument. Für Textausgaben ist printf '%s\n' "$TEXT" gut nachvollziehbar: Das Format ist fest, der Wert wird als Text eingesetzt. Unbekannte Eingaben werden nicht mit eval zu Befehlen gemacht.

    17. Umgebung: Woher kennt Bash die richtige Oracle-Installation?

    ORACLE_HOME beschreibt eine Oracle-Installation, ORACLE_SID die lokal ausgewählte Instanz. PATH bestimmt, wo die Shell nach einem Programmnamen sucht. Eine falsche Umgebung kann deshalb eine andere SQL*Plus-Version starten oder eine andere lokale Instanz ansprechen als erwartet.

    Ein exportierter Wert wird an nachfolgende Programme weitergegeben. Der volle Aufruf "$ORACLE_HOME/bin/sqlplus" macht sichtbar, welches SQL*Plus verwendet wird. Die Zuordnung von laufenden Instanzen und Installationen wird bereits am Anfang dieses Kapitels erklärt. Eine SID in oratab allein beweist nicht, dass diese Instanz läuft.

    Das folgende Praxisbeispiel erwartet eine bewusst vorbereitete Umgebung. Es erkennt keine Instanzen automatisch. Für die abweichende cron-Umgebung und Zeitplanung gelten die vorhandenen cron-Abschnitte dieses Kapitels.

    Verbindung ohne @ ist nicht automatisch lokal: TWO_TASK kann unter Unix ein Standard-Verbindungsziel vorgeben. Das vollständige Lernskript stoppt deshalb bei gesetztem TWO_TASK; kläre das Ziel, statt die Variable ungeprüft zu entfernen. TNS_ADMIN steuert außerdem die Suche nach Oracle-Net-Konfiguration. Die tatsächliche Sitzung sollte nach dem Verbindungsaufbau anhand von Instanz, Service und Container geprüft werden.

    18. Bedingungen, Schleifen und Rückgabecodes

    Eine Bedingung entscheidet, ob ein Schritt ausgeführt werden darf. Beispielsweise prüft [ -x "$ORACLE_HOME/bin/sqlplus" ], ob das Programm am gewählten Pfad ausführbar ist. Innerhalb der eckigen Klammern sind die Leerzeichen Teil der Schreibweise. Ein vollständiger Ablauf kann so aussehen:

    if [ -x "$ORACLE_HOME/bin/sqlplus" ]; then
      printf '%s\n' 'SQL*Plus wurde gefunden.'
    else
      printf '%s\n' 'SQL*Plus fehlt oder ist nicht ausführbar.' >&2
      exit 2
    fi

    >&2 schreibt die Meldung auf den Fehlerkanal. Programme geben außerdem einen Zahlenstatus zurück: 0 bedeutet nach der jeweiligen Programmkonvention Erfolg, ein anderer Wert ein Problem. $? enthält den Status des unmittelbar vorherigen Befehls. Er muss sofort gesichert werden, bevor ein weiteres printf ihn ersetzt.

    for SID in TESTA TESTM; do
      printf 'Geplante Prüfung für %s\n' "$SID"
    done

    Diese Schleife gibt nur zwei Texte aus und verbindet sich mit keiner Datenbank. Bei einer echten Mehrfachdiagnose müsste für jede Instanz auch das passende Oracle Home gewählt werden. Eine Schleife mit SID-Namen allein ist dafür nicht ausreichend.

    Vertiefung: Pipelines und set -e sind keine vollständige Fehlerstrategie

    In sqlplus ... | tee bericht.log ist der Pipeline-Status standardmäßig der Status des letzten Programms. Ein erfolgreicher tee-Aufruf beweist daher keinen erfolgreichen SQL*Plus-Lauf. Bash bietet pipefail, aber auch damit braucht SQL*Plus eine passende Fehlerbehandlung. set -e besitzt kontextabhängige Ausnahmen. Das Lernskript prüft seine wichtigen Rückgabecodes deshalb ausdrücklich.

    Standardausgabe, Fehlerausgabe und Status sind drei verschiedene Dinge

    Reihenfolge der Shell-Umleitungen
    SCHREIBWEISEWIRKUNG
    befehl > datei 2>&1Beide Ausgabeströme gehen in die Datei.
    befehl 2>&1 > dateiFehlerausgabe bleibt am bisherigen Ziel der Standardausgabe.
    befehl >> datei 2>&1Beide Ausgabeströme werden angehängt.

    Bash verarbeitet Umleitungen von links nach rechts. Eine leere Fehlerausgabe beweist keinen erfolgreichen Rückgabestatus, und Status 0 garantiert keinen fachlich vollständigen Bericht. Verzeichnis und Datei müssen schon vor dem Programmstart beschreibbar sein; eine gescheiterte Umleitung kann verhindern, dass SQL*Plus überhaupt startet.

    19. Shell, SQL und SQL*Plus auseinanderhalten

    EbeneBeispielAufgabe
    Bash / Betriebssystempwd oder bash datei.shDateien und Programme verwalten
    SQLSELECT ... FROM dual;Datenbankabfrage ausführen
    SQL*PlusSET LINESIZE 120Abfragewerkzeug und Darstellung steuern

    Ein sichtbares SQL> ist die Eingabeaufforderung von SQL*Plus und wird nicht mitkopiert. SQL-Anweisungen werden gewöhnlich mit einem Semikolon abgeschlossen. SQL*Plus-Befehle wie SET, COLUMN, PROMPT oder SPOOL benötigen dieses SQL-Semikolon nicht.

    Ein Schrägstrich auf einer eigenen Zeile führt den aktuellen SQL- beziehungsweise PL/SQL-Puffer aus. Hinter einer bereits mit Semikolon ausgeführten SELECT-Abfrage kann er diese erneut ausführen. Das ist kein allgemeines Zeichen für „fertig“.

    Die SQL-Sprache selbst wird im SQL-Grundlagenkapitel und die Blockstruktur im PL/SQL-Kapitel erklärt. Hier geht es um die Bedienung des Werkzeugs.

    20. SQL*Plus starten und die Verbindung einordnen

    Auf einem dafür eingerichteten Datenbankhost kann ein autorisierter OS-Benutzer lokal ohne Klartext-Passwort verbinden:

    "$ORACLE_HOME/bin/sqlplus" -L "/ as sysdba"

    Die lokale Anmeldung setzt passende OS-Berechtigungen und die bewusst gewählte Oracle-Umgebung voraus. SYSDBA ist eine weitreichende administrative Berechtigung; sie macht eine Sitzung nicht automatisch read-only. Unsere Beispiele enthalten ausschließlich SELECT-Abfragen. Für dauerhafte Berichte ist ein passend berechtigter Diagnosezugang vorzuziehen, sofern eure Umgebung diesen bereitstellt.

    -L begrenzt erneute Anmeldeversuche nach einem fehlgeschlagenen Login. Es ist kein allgemeines Zeitlimit für eine blockierende Verbindung oder eine lange Abfrage. -s unterdrückt unter anderem Banner und Eingabeaufforderungen und erleichtert Skriptausgaben.

    Vertiefung: Netzwerkzugang und Startprofile

    Eine interaktive Anmeldung mit sqlplus diagnose@TESTSERVICE kann das Passwort separat abfragen. Für unbeaufsichtigte Abläufe eignet sich ein bereits eingerichteter Oracle Wallet-Zugang; Passwörter gehören nicht in Skripttext oder Prozessargumente. Service- und Listenerdiagnose stehen im bestehenden Netzwerk-Kapitel.

    SQL*Plus kann beim Start glogin.sql und login.sql verarbeiten. Solche Profile können Darstellungen verändern und Befehle enthalten. Auch Oracle-Anmeldetrigger gehören zum tatsächlichen Verbindungskontext. Das Lernskript setzt daher eine bekannte Diagnoseumgebung voraus und ist keine technische Schreibsperre für beliebige Startprofile.

    21. Eine Abfrage lesbar ausgeben und mit SPOOL speichern

    Anna möchte erkennen, wohin ihre Sitzung verbunden ist. Die Abfrage liest den Sitzungskontext. Sie braucht keine Anwendungsdaten:

    SET LINESIZE 120
    SET PAGESIZE 50
    SET FEEDBACK ON
    COLUMN db_name FORMAT A15
    COLUMN session_user FORMAT A20
    SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS db_name,
           SYS_CONTEXT('USERENV', 'SESSION_USER') AS session_user
    FROM dual;

    Was sehe ich hier? Die folgende Ausgabe ist fiktiv. DB_NAME bezeichnet den Datenbanknamen und SESSION_USER den angemeldeten Datenbankbenutzer. Die zwei Begriffe werden nicht mit einem Betriebssystemkonto gleichgesetzt.

    DB_NAMESESSION_USER
    TESTASYS

    LINESIZE bestimmt die Ausgabebreite, PAGESIZE die Seiteneinteilung. COLUMN formatiert die Darstellung einer Spalte, ohne die Datenbankspalte zu ändern. FEEDBACK steuert Rückmeldungen wie die Anzahl ausgewählter Zeilen.

    SQL*Plus-Dateien mit @ laden und die Anzeige protokollieren

    Speichere die Abfrage beispielsweise in deiner eigenen Datei diagnose.sql. @diagnose.sql lädt und führt deren Inhalt aus. SQL*Plus prüft dabei nicht automatisch, ob sie ausschließlich lesende Befehle enthält. @@datei.sql sucht bei verschachtelten Aufrufen relativ zur aufrufenden Skriptdatei.

    Solaris und Oracle Linux – in SQL*Plus

    SPOOL diagnose_uebung_01.log CREATE
    @diagnose.sql
    SPOOL OFF

    SPOOL schreibt angezeigte Ausgabe auf die Clientseite, also auf den Rechner, auf dem SQL*Plus läuft. CREATE verlangt eine neue Datei; eine bereits vorhandene Datei führt zu einem Fehler. Ohne ausdrücklich gewählten Modus wäre REPLACE der Standard und könnte vorhandenen Inhalt überschreiben. APPEND hängt Ausgabe an. SPOOL OFF beendet die Protokollierung. Shell-Umleitung im nächsten Beispiel ist eine alternative Ausgabemethode.

    Service und Container mitprüfen

    Solaris und Oracle Linux – in SQL*Plus
    SELECT SYS_CONTEXT('USERENV','INSTANCE_NAME') AS instanz,
           SYS_CONTEXT('USERENV','CON_NAME') AS container,
           SYS_CONTEXT('USERENV','SERVICE_NAME') AS service
    FROM dual;
    Fiktive Beispielausgabe:
    INSTANZCONTAINERSERVICE
    TESTAAPP_PDBAPP_REPORT

    Die Instanz TESTA kann mehrere PDBs bedienen. APP_PDB ist hier der aktuelle Container und APP_REPORT der verwendete Service. Ein passender Datenbankname allein würde eine Verbindung zur falschen PDB nicht ausschließen.

    22. Einen mehrzeiligen SQL-Text an SQL*Plus übergeben

    Ein Here-Document übergibt mehrere Textzeilen an ein Programm. Im Bash-Beispiel startet <<'SQL' den Eingabetext; eine alleinstehende Zeile SQL beendet ihn. Diese Endmarkierung beginnt am Zeilenanfang und enthält keine zusätzlichen Leerzeichen.

    Die einfachen Anführungszeichen an der Anfangsmarkierung verhindern die Bash-Auswertung im Text. So bleibt beispielsweise v$instance unverändert. Ohne diese Anführungszeichen könnte Bash $instance als Shellvariable auswerten und damit den SQL-Text verfälschen. SQL*Plus kann anschließend trotzdem eigene &-Ersetzungen vornehmen; SET DEFINE OFF schaltet diese im festen Lernbeispiel ab.

    23. Praxis: ein vollständiges Bash-Skript für einen Diagnosebericht

    Speichere das folgende Beispiel mit vi als eigene Datei diagnose_basis.sh. Es setzt ORACLE_HOME und ORACLE_SID aus einer vorbereiteten Umgebung voraus. Sein Bericht landet in einem neuen, privaten Verzeichnis unter TMPDIR oder /tmp. Eine existierende Berichtsdatei wird nicht überschrieben. Das Wiki zeigt den Code lediglich an.

    #!/usr/bin/bash
    # Lokales Lernbeispiel: SELECT-Diagnose, keine DB-Aenderungen.
    umask 077
    
    if [ -z "${ORACLE_HOME:-}" ] || [ -z "${ORACLE_SID:-}" ]; then
      printf '%s\n' 'FEHLER: ORACLE_HOME und ORACLE_SID fehlen.' >&2
      exit 2
    fi
    SQLPLUS="$ORACLE_HOME/bin/sqlplus"
    if [ ! -x "$SQLPLUS" ]; then
      printf '%s\n' 'FEHLER: SQL*Plus ist nicht ausfuehrbar.' >&2
      exit 2
    fi
    # Dieses Beispiel ist ausschliesslich fuer eine lokale Verbindung gedacht.
    if [ -n "${TWO_TASK:-}" ]; then
      printf '%s\n' 'FEHLER: TWO_TASK ist gesetzt; lokales Verbindungsziel zuerst klaeren.' >&2
      exit 2
    fi
    export ORACLE_HOME ORACLE_SID
    # Solaris besitzt neben dem klassischen grep die XPG4-Variante mit -E.
    if [ -x /usr/xpg4/bin/grep ]; then
      DIAG_GREP=/usr/xpg4/bin/grep
    else
      DIAG_GREP=/usr/bin/grep
    fi
    if [ ! -x "$DIAG_GREP" ]; then
      printf '%s\n' 'FEHLER: Passendes grep fehlt.' >&2
      exit 2
    fi
    
    REPORT_DIR=$(mktemp -d "${TMPDIR:-/tmp}/dba-grundlagen.XXXXXX")
    RC=$?
    if [ "$RC" -ne 0 ] || [ -z "$REPORT_DIR" ]; then
      printf '%s\n' 'FEHLER: Berichtverzeichnis konnte nicht entstehen.' >&2
      exit 3
    fi
    REPORT_FILE="$REPORT_DIR/diagnose.log"
    
    "$SQLPLUS" -L -s "/ as sysdba" > "$REPORT_FILE" 2>&1 <<'SQL'
    WHENEVER OSERROR EXIT 3 ROLLBACK
    WHENEVER SQLERROR EXIT 4 ROLLBACK
    SET DEFINE OFF
    SET ECHO OFF
    SET VERIFY OFF
    SET FEEDBACK ON
    SET PAGESIZE 50
    SET LINESIZE 120
    COLUMN db_name FORMAT A15
    COLUMN instance_name FORMAT A20
    COLUMN open_mode FORMAT A20
    COLUMN abfragezeit FORMAT A26
    PROMPT READ-ONLY DIAGNOSE
    SELECT name AS db_name,
           SYS_CONTEXT('USERENV', 'INSTANCE_NAME') AS instance_name,
           open_mode,
           TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS abfragezeit
    FROM v$database;
    PROMPT DBA_DIAGNOSE_COMPLETE
    EXIT 0 ROLLBACK
    SQL
    RC=$?
    
    if [ "$RC" -ne 0 ]; then
      printf 'FEHLER: SQL*Plus-Status %s; Bericht: %s\n' "$RC" "$REPORT_FILE" >&2
      exit "$RC"
    fi
    # WHENEVER SQLERROR erfasst keine SQL*Plus-Bedienfehler (SP2-).
    "$DIAG_GREP" -E '^[[:space:]]*(ORA-|SP2-|TNS-)[0-9]+' "$REPORT_FILE" > /dev/null
    CHECK_RC=$?
    if [ "$CHECK_RC" -eq 0 ]; then
      printf 'FEHLER: Fehlermeldung im Bericht: %s\n' "$REPORT_FILE" >&2
      exit 5
    elif [ "$CHECK_RC" -ne 1 ]; then
      printf '%s\n' 'FEHLER: Bericht konnte nicht geprueft werden.' >&2
      exit 6
    fi
    "$DIAG_GREP" '^DBA_DIAGNOSE_COMPLETE$' "$REPORT_FILE" > /dev/null
    if [ "$?" -ne 0 ]; then
      printf 'FEHLER: Abschlussmarkierung fehlt; Bericht: %s\n' "$REPORT_FILE" >&2
      exit 7
    fi
    printf 'OK: Diagnosebericht erstellt: %s\n' "$REPORT_FILE"
    exit 0
    

    Danach zuerst bash -n diagnose_basis.sh prüfen. In der bewusst gewählten Diagnoseumgebung startet bash diagnose_basis.sh den Bericht. printf '%s\n' "$?" zeigt unmittelbar danach den Status. Die Dateien bleiben zur Auswertung erhalten; das Lernskript löscht sie nicht automatisch.

    AusgabeFiktives Beispiel
    TerminalOK: Diagnosebericht erstellt: /tmp/dba-grundlagen.A1b2C3/diagnose.log
    Bericht: DB_NAME / INSTANCE_NAME / OPEN_MODE / ABFRAGEZEITTESTA / TESTA / READ WRITE / 2026-10-08 08:45:00 +02:00
    Bericht: AbschlussDBA_DIAGNOSE_COMPLETE
    Das Praxisbeispiel Schritt für Schritt verstehen

    umask 077 beschränkt Rechte für neu erstellte Dateien und Verzeichnisse. Die Vorprüfungen stoppen bei fehlender Umgebung oder fehlendem Programm. mktemp erzeugt einen eindeutigen privaten Ausgabeordner; sein Ergebnis wird vor Verwendung geprüft. Die Ausgabeumleitung schreibt normale Ausgabe und Fehlerausgabe in dasselbe Log.

    WHENEVER SQLERROR beendet SQL*Plus bei SQL- beziehungsweise PL/SQL-Fehlern mit dem festgelegten Status 4. WHENEVER OSERROR behandelt entsprechende Betriebssystemfehler mit Status 3. ROLLBACK beim Beenden verhindert eine implizite Bestätigung etwaiger noch offener Änderungen in dieser gesonderten Sitzung; die Beispielabfrage selbst ändert keine Daten.

    Die Skriptzeilen zuordnen: Die erste Zeile nennt Bash als Interpreter. Kommentare mit # erklären den Zweck und werden nicht als Befehle ausgeführt. Die Prüfungen mit -z erkennen fehlende Werte; -x prüft, ob SQL*Plus ausführbar ist. export gibt die Oracle-Umgebung an den gestarteten Prozess weiter. REPORT_DIR und REPORT_FILE enthalten die Ausgabepfade. Mit -L versucht SQL*Plus die Anmeldung einmal, statt nach einem Anmeldefehler erneut Zugangsdaten abzufragen; -s reduziert die Startmeldungen. Die Verbindung / as sysdba nutzt lokale Betriebssystemauthentifizierung und setzt entsprechende Berechtigungen voraus. Es steht kein Passwort im Skript.

    Der Eingabeblock: Die zitierte Markierung <<'SQL' schützt v$database vor der Auswertung durch Bash. SET DEFINE OFF verhindert SQL*Plus-Ersetzungen über &. ECHO und VERIFY reduzieren Begleittext, FEEDBACK zeigt die Zeilenanzahl. PAGESIZE und LINESIZE beeinflussen die Anzeige, COLUMN die Spaltenbreiten. PROMPT schreibt eigene Überschriften und die Abschlussmarkierung. Die SELECT-Anweisung liest Datenbankname und Öffnungszustand aus V$DATABASE, den Instanznamen aus dem Sitzungskontext und den Abfragezeitpunkt aus SYSTIMESTAMP. TO_CHAR legt die sichtbare Zeitdarstellung ausdrücklich fest. Die Ausgabe enthält hier einen numerischen Zeitzonenoffset. SYSDATE hätte keine Zeitzonenangabe.

    Nach dem SQL*Plus-Aufruf wird RC sofort gesichert. Anschließend sucht das Lernskript nach typischen Fehlermeldungen und verlangt seine eigene Abschlussmarkierung. Die Textsuche passt zum festen Beispiel, ist aber kein universeller Parser beliebiger Oracle-Ausgaben. Status 0 beweist hier den kontrollierten Ablauf, nicht den fehlerfreien Betrieb der ganzen Datenbank.

    Geführte Praxisübung: mit vi einen SQL*Plus-Bericht erstellen

    Situation: Du möchtest in einer vorbereiteten lokalen Übungsumgebung einen kleinen Bericht erstellen und später wieder lesen können. Verwende dafür ausschließlich das vollständige Skript aus Abschnitt 23. Die Grundlagen und die Erklärung der Skriptzeilen stehen direkt davor; hier verbindest du sie zu einem Ablauf.

    Vorbereitung: Arbeite als der für lokale Oracle-Diagnosen berechtigte Betriebssystembenutzer. ORACLE_HOME und ORACLE_SID müssen zur gewünschten Instanz passen. Übernimm keine Beispielpfade oder SIDs ungeprüft. Die Verbindung nutzt SYSDBA-Rechte, obwohl die enthaltene Abfrage nur liest. Auch lokale SQL*Plus-Startdateien wie glogin.sql und login.sql werden gegebenenfalls ausgeführt; ihre Inhalte müssen zur vorgesehenen Diagnose passen.

    1. Datei anlegen: Wechsle in dein eigenes Übungsverzeichnis und öffne vi diagnose_basis.sh. Ist die Datei bereits vorhanden, wähle einen neuen Übungsnamen, damit du keine vorhandene Arbeit ersetzt.
    2. Text eingeben: Drücke i und übernimm den vollständigen Code aus Abschnitt 23. Danach Esc, dann :wq und Enter. Damit speicherst du und verlässt vi. Die Here-Document-Endzeile SQL muss allein und ohne Einrückung stehen. Speichere mit Unix-Zeilenenden.
    3. Syntax prüfen: Starte bash -n diagnose_basis.sh. Bei korrekter Bash-Syntax erscheint normalerweise kein Text. Prüfe unmittelbar danach mit printf '%s\n' "$?" den Status: 0 steht für eine bestandene Syntaxprüfung. SQL und Datenbankzugriff sind dadurch noch nicht geprüft.
    4. Bericht erzeugen: Starte bash diagnose_basis.sh. Für diesen Aufruf braucht die Datei kein zusätzliches Ausführungsbit. Merke dir den ausgegebenen Berichtspfad und prüfe den Status sofort danach, bevor du einen anderen Befehl ausführst.
    5. Bericht lesen: Öffne mit cat /tmp/dba-grundlagen.A1b2C3/diagnose.log die Ausgabe; ersetze den Beispielpfad durch deinen tatsächlich ausgegebenen Pfad. Der eindeutige Ordnername wird bei jedem Lauf neu erzeugt.

    Was sehe ich hier? Die folgende kompakte Tabelle stellt die Datenzeile eines fiktiven SQL*Plus-Berichts dar. Im echten Textbericht stehen zusätzlich Überschrift, Spaltenüberschriften, die Zeilenanzahl und die Abschlussmarkierung.

    DB_NAMEINSTANCE_NAMEOPEN_MODEABFRAGEZEIT
    TESTATESTAREAD WRITE2026-10-08 08:45:00 +02:00

    Deine Aufgabe: Welche Datenbank wurde abgefragt? Hat READ WRITE etwas an der Datenbank verändert? Ist die Abfragezeit die Startzeit der Instanz? Was bedeutet ein fehlendes OK am Ende?

    Musterlösung: Ausgabe und Fehler einordnen

    Die Datenbank heißt im Beispiel TESTA; die Instanz trägt hier denselben Namen. READ WRITE beschreibt den bereits vorhandenen Öffnungszustand. Der Bericht schaltet die Datenbank nicht in diesen Modus. ABFRAGEZEIT ist der Zeitpunkt der Abfrage, nicht die Startzeit der Instanz und keine Laufzeitmessung. Bei einer CDB beschreibt V$DATABASE die Datenbank; aus dieser Zeile folgt nicht, dass jede PDB geöffnet ist.

    Bei Status 0 und der abschließenden OK-Meldung sind die vorgesehenen Ablaufprüfungen bestanden. Das bestätigt keinen störungsfreien Gesamtbetrieb. Fehlt OK, lies die Fehlermeldung und, sofern erstellt, das Log. Status 2 kommt aus den Vorprüfungen, Status 3 kann aus der Verzeichnisanlage oder der SQL*Plus-Betriebssystemfehlerbehandlung stammen, Status 4 aus einem SQL-Fehler. Status 5 meldet erkannte Oracle-/SQL*Plus-/Netzwerkfehlermeldungen bei ansonsten erfolgreichem Prozessende; 6 einen Fehler bei der Logprüfung und 7 eine fehlende Abschlussmarkierung. Andere Statuswerte können vom Programmstart oder der Anmeldung kommen.

    Ein nicht gefundenes SQL*Plus führt zuerst zur Prüfung von ORACLE_HOME. Bei fehlenden Zugriffsrechten liest du die genaue ORA-Meldung und klärst die vorgesehene Berechtigung. Bei einer nicht verfügbaren Instanz prüfst du die gewählte Umgebung. Diese Übung startet keine Datenbank und vergibt keine Rechte. Weitere Fehlerbilder stehen unmittelbar danach in Abschnitt 24.

    Weiter üben: Kopiere deine eigene Übungsdatei unter einen neuen Namen. Ändere dort nur den Text der PROMPT-Überschrift, prüfe erneut die Bash-Syntax und vergleiche die neue Ausgabe. So übst du vi und den Berichtsablauf, ohne die Abfrage zu erweitern.

    Oracle 19c: WHENEVER SQLERROR · V$DATABASE

    Zusätzliche Ablaufkontrollen: Ein gesetztes TWO_TASK führt vor dem Verbindungsversuch zu Status 2. Auf Solaris wird nach Möglichkeit /usr/xpg4/bin/grep gewählt, weil das klassische /usr/bin/grep die verwendete -E-Option nicht bereitstellt. Die Berichte enthalten nun den Zeitzonenoffset. Ein erhaltenes Log bleibt Diagnosematerial; das Skript löscht oder rotiert es nicht selbst.

    24. Typische Fehler gezielt eingrenzen

    BeobachtungZuerst prüfen
    bad interpreter oder SyntaxfehlerBash-Pfad, richtigen Interpreter und LF-Zeilenenden
    SQL*Plus fehltORACLE_HOME, Programmpfad und Ausführungsrechte
    ORA-01034 bei lokaler VerbindungGewählte Umgebung und tatsächlich laufende Instanz
    SP2-Meldung, aber Status 0SQL*Plus-Befehlssyntax; WHENEVER SQLERROR greift dafür nicht
    Berichtsdatei fehltSchreibrechte, freier Platz und Meldung zur Ausgabeumleitung
    Interaktiv erfolgreich, unter cron FehlerVorhandenen cron-Abschnitt: Umgebung und absolute Pfade

    Windows-Dateien können CRLF statt der auf Unix üblichen LF-Zeilenenden besitzen. Das zusätzliche Wagenrücklaufzeichen kann im Interpreterpfad oder an Befehlen stören. Prüfe die Datei und stelle beim Speichern das passende Format ein. Ein pauschales Bearbeiten fremder produktiver Dateien ist dafür keine gute Übung.

    Bash-Debugausgabe mit -x zeigt ausgeführte Schritte samt expandierten Werten. Das hilft bei einer eigenen bereinigten Übung, kann aber Zugangsdaten und vertrauliche Inhalte offenlegen. Für SQL-Fehler reicht die Bash-Syntaxprüfung nicht: Die konkrete SQL*Plus-Ausgabe bleibt entscheidend.

    Weitere Grundlagen: Bash-Ein- und Ausgabe, vi-Bedienung, SPOOL und WHENEVER SQLERROR.

    Fehler gefahrlos am eigenen Übungsskript nachvollziehen

    1. Erstelle eine Kopie deiner Übungsdatei.
    2. Starte die Kopie einmal mit einer absichtlich leeren ORACLE_HOME-Variablen: ORACLE_HOME= bash diagnose_basis.sh. Die Zuweisung gilt nur für diesen Aufruf.
    3. Sichere unmittelbar danach den Status. Erwartet: 2, keine SQL-Verbindung und kein neuer Bericht.
    4. Stelle die unveränderte Kopie wieder bereit und prüfe mit bash -n. Das testet die Shellsyntax, nicht das Oracle-Verhalten.

    Ein bewusst eingebauter SQL- oder SQL*Plus-Fehler gehört nur in die vorbereitete Übungsumgebung. Erwartet werden Status 4 für einen vom SQLERROR-Handler erfassten SQL-Fehler und Status 5 für eine im Log erkannte SP2-Meldung bei Prozessstatus 0.

    25. Incident-Timeline: einen Fehler vollständig nachvollziehen

    Eine Anwendung meldet um 08:45 Uhr eine Störung. Das Beispiel verwendet ausschließlich erfundene Werte. Zuerst notieren wir Host, Instanz, Container und das Zeitfenster 08:40–08:50 mit Zeitzone. Ohne bereits vorhandene historische Messung kann eine aktuelle Hostabfrage die frühere Last nicht nachträglich rekonstruieren.

    1. Zeitbasis sichtbar machen

    Solaris und Oracle Linux – in SQL*Plus
    SELECT TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS hostzeit,
           TO_CHAR(CURRENT_TIMESTAMP,'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS sessionzeit
    FROM dual;
    Fiktive Beispielausgabe:
    HOSTZEITSESSIONZEIT
    2026-10-08 08:45:00 +02:002026-10-08 06:45:00 +00:00

    Beide Werte bezeichnen im Beispiel denselben Zeitpunkt. SYSTIMESTAMP liefert die Systemzeit samt Zeitzone des Datenbankhosts; CURRENT_TIMESTAMP verwendet die Sessionzeitzone. DBTIMEZONE ist nicht pauschal die Zeitzone jedes Logeintrags. Für den Vergleich normalisieren wir hier auf UTC.

    2. Das feste Fenster abfragen

    Solaris und Oracle Linux – in SQL*Plus
    SELECT TO_CHAR(originating_timestamp AT TIME ZONE 'UTC',
                   'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS zeit_utc,
           SUBSTR(message_text,1,200) AS meldung
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= TO_TIMESTAMP_TZ(
     '2026-10-08 06:40:00 +00:00','YYYY-MM-DD HH24:MI:SS TZH:TZM')
    AND originating_timestamp < TO_TIMESTAMP_TZ(
     '2026-10-08 06:50:00 +00:00','YYYY-MM-DD HH24:MI:SS TZH:TZM')
    ORDER BY originating_timestamp;
    Fiktive Beispielausgabe:
    ZEIT_UTCMELDUNG
    2026-10-08 06:45:02 +00:00ORA-19504: failed to create file …
    2026-10-08 06:45:02 +00:00Linux-x86_64 Error: 28: No space left on device

    Für dieses feste Fenster wird bewusst nicht nach Fehlertyp gefiltert. SUBSTR kürzt nur die Beispielanzeige: Für den vollständigen Fehlerstack die betreffende Originalmeldung und Trace-Datei lesen. Die feste Zeitraumabfrage ist nicht zusätzlich auf eine Zeilenzahl begrenzt; bei großen Ausgaben das Fenster gezielt verkleinern.

    3. Quellen zusammenführen und Schlussfolgerung begrenzen

    Fiktive gemeinsame Zeitlinie
    UTCQUELLEBEFUND
    06:44:58vorhandenes Hostmonitoringbetroffenes Dateisystem: verfügbare Blöcke 0
    06:45:02Alert-/Trace-StackDateierzeugung scheitert; OS-Fehler 28
    06:45:10AnwendungVorgang fehlgeschlagen

    Lösung: Der vollständige Stack und die Hostmessung stützen hier einen fehlgeschlagenen Schreibvorgang wegen erschöpften Dateisystemplatzes. Zuerst den im Stack genannten Dateipfad dem richtigen Mount zuordnen. Freie Datenbank-Tablespace-Extents helfen nicht, wenn ein anderer Mount für Archiv- oder Logdateien voll ist. Die zeitliche Nähe erklärt noch nicht, welcher Prozess das Dateisystem gefüllt hat. Diese zweite Frage benötigt vorhandene Größenverläufe und betroffene Dateien.

    Nächster Schritt: Befund, Pfad, UTC-Fenster und noch offene Verursacherfrage dokumentieren und gezielt mit der zuständigen Betriebsrolle abstimmen. Kein pauschales Löschen von Archivelogs, Trace- oder Auditdateien. Das Ergebnis ist eine belegte Eingrenzung, keine automatische Reparatur.

    Bei mehreren ORA-Meldungen ist nicht automatisch die erste oder letzte Nummer die eigentliche Ursache. Ein Fehlerstack beschreibt mehrere Ebenen eines Vorgangs. Deshalb sollte der gesamte Stack zusammen mit dem auslösenden Prozess und dem zeitlichen Kontext gelesen werden. Folgefehler dürfen nicht isoliert als Root Cause dokumentiert werden.

    Praxisregel: Erst den vollständigen Stack sichern, dann die Meldungen einzeln in der Oracle Error Help beziehungsweise Dokumentation nachschlagen und anschließend wieder im Gesamtkontext bewerten.

    Ausführungsort beachten: Shell, SQL*Plus und RMAN sind unterschiedliche Eingabeumgebungen. Beispielpfade sind keine universell vorgeschriebenen Installationspfade. Betriebssystem- und Shell-Details sind durch die ausschließliche Database-19c-Referenz nicht vollständig abgedeckt.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Zur Datenbankdiagnose gehören Host, laufende Prozesse, Dateisysteme und Betriebssystemprotokolle. Ein Eintrag in oratab allein beweist keine laufende Instanz.
    2. Solaris und Oracle Linux stellen ähnliche Diagnoseaufgaben mit teilweise unterschiedlichen Werkzeugen und Optionen dar. Befehle müssen zur tatsächlich verwendeten Plattform passen.
    3. Alert Log, Trace, Listener-, RMAN-, Audit- und OS-Logs beantworten unterschiedliche Fragen. Erst ein gemeinsamer Zeitbezug macht Zusammenhänge zwischen ihren Meldungen belastbar.
    4. Ein Skript benötigt eine kontrollierte Umgebung, korrekt behandelte Variablen und ausgewertete Rückgabecodes. Ein interaktiv erfolgreicher Aufruf kann unter cron wegen anderer Umgebungswerte scheitern.
    5. Shell, SQL*Plus und SQL sind unterschiedliche Verarbeitungsebenen. Verbindungsziel, Ausgabeverarbeitung und Fehlerbehandlung müssen über diese Ebenen hinweg nachvollziehbar bleiben.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Ein Skript läuft im Terminal, aber nicht in cron. Was prüfst du zuerst?

    Lösung: Vergleiche ORACLE_HOME, ORACLE_SID, PATH und die tatsächlich verwendeten Programme. Cron übernimmt nicht automatisch dieselbe interaktive Umgebung. Sichere die Fehlermeldung, bevor du die Datenbank als Ursache annimmst.

    Frage 2: Beweist die letzte ORA-Meldung die Ursache?

    Lösung: Nein. Sichere den vollständigen Fehlerstack mit Zeitpunkt und Prozess. Eine späte Meldung kann nur ein Folgefehler sein.

    Frage 3: Was unterscheidet vi von SQL*Plus?

    Lösung: vi bearbeitet Textdateien auf dem Betriebssystem. SQL*Plus verbindet sich mit Oracle und verarbeitet SQL sowie eigene Clientbefehle. Ein OPatch-Aufruf gehört in die Shell, nicht an den SQL-Prompt.

    Frage 4: Warum kann dieselbe Uhrzeit in zwei Logs verschiedene Zeitpunkte meinen?

    Lösung: Ohne Zeitzone ist die Uhrzeit mehrdeutig. Quelle, Offset und gegebenenfalls Sommerzeit prüfen und die Werte auf eine gemeinsame Zeitbasis bringen. Hostzeit und Sessionzeit können unterschiedlich dargestellt sein.

    Frage 5: Warum ist /usr/bin/grep -E auf Solaris problematisch?

    Lösung: Das klassische Solaris-grep unterstützt diese Option nicht wie die XPG4-Variante. Das Lernskript wählt /usr/xpg4/bin/grep, wenn vorhanden. Gleiche Programmnamen garantieren keine identischen Optionen.

    Frage 6: Was bedeutet Status 1 nach einer grep-Suche?

    Lösung: Kein Treffer. Das ist von einem Lesefehler zu unterscheiden. Trotzdem können Zeitfenster, Container, ADR Home oder rotierte Dateien falsch gewählt sein.

    Frage 7: Warum stoppt das lokale Berichtsskript bei TWO_TASK?

    Lösung: TWO_TASK kann ein Standard-Verbindungsziel setzen. Das Beispiel setzt eine bewusst lokale Verbindung voraus und verlangt deshalb zuerst die Klärung der Umgebung.

    Frage 8: Belegt ein erfolgreicher SQL*Plus-Prozess bereits einen vollständigen Bericht?

    Lösung: Nein. SQL*Plus-Bedienfehler können trotz SQLERROR-Handler weiterlaufen. Das feste Lernskript prüft zusätzlich Fehlermeldungen und Abschlussmarkierung. Auch danach bedeutet Erfolg nur, dass die vorgesehenen Prüfungen bestanden sind.

    36. SQL-Grundlagen – die Sprache der Oracle-Datenbank verstehen

    Von der ersten SELECT-Abfrage bis zu Joins, Aggregationen, Unterabfragen, NULL-Logik und Transaktionen.

    Lernkompass
    Einfach gesagt SQL beschreibt, welche Daten gelesen oder verarbeitet werden sollen. Du lernst die Bausteine einer Abfrage und setzt sie Schritt für Schritt zusammen.
    Warum ist das wichtig? SQL ist die gemeinsame Sprache von Anwendung, Entwicklung und DBA. Diagnose, Datenprüfung und viele administrative Analysen basieren auf SQL.
    Nach diesem Kapitel Du kannst SELECT-Abfragen lesen und schreiben, filtern, sortieren, gruppieren, Tabellen verbinden und typische SQL-Fehler systematisch einordnen.

    Einführung: SQL ist die Sprache, mit der du Daten abfragst und Datenbankobjekte beziehungsweise Zugriffe steuerst. Eine SELECT-Anweisung beschreibt ein gewünschtes Ergebnis, dessen Zeilen und Spalten sich aus den verwendeten Regeln ergeben. Für einen DBA ist dieses Verständnis wichtig, weil eine syntaktisch gültige Diagnoseabfrage trotzdem eine andere Frage beantworten kann als beabsichtigt.

    Wir beginnen mit einer kleinen Berechnung und bauen darauf Filter, NULL-Behandlung, Gruppierung und Tabellenverknüpfungen auf. Die vorhandenen Beispiele erklären jeweils Eingaben und Ergebnis. Erst danach werden die Bausteine auf Verwaltungsinformationen angewendet. Für Beispiele mit eigenen Lernwerten brauchst du keine Anwendungstabelle; Dictionary- und Performance-Abfragen benötigen zusätzlich passende Leserechte.

    Oracle 19c: fachliche Grundlage

    Dein erster Lernweg

    Lies zunächst SELECT, FROM, WHERE und ORDER BY. Übe danach NULL und COUNT, anschließend GROUP BY und JOIN. Unterabfragen und Mengenoperatoren bauen darauf auf. Du musst die administrativen Views beim ersten Durchgang noch nicht kennen. Eine Ausgabe ist eine Tabelle: Spalten stehen für ausgewählte Angaben, Zeilen für gefundene Kombinationen.

    In SQL*Plus oder einem Oracle-SQL-Arbeitsblatt ist SELECT 2 + 3 AS ergebnis FROM dual; ein vollständiger Einstieg ohne eigene Tabelle. DUAL stellt für diese Rechnung eine Zeile bereit; ERGEBNIS ist der Name der Ausgabespalte.

    READ ONLY – in SQL*Plus oder einem Oracle-SQL-Arbeitsblatt
    SELECT 2 + 3 AS ergebnis FROM dual;
    Fiktive Beispielausgabe:
    ERGEBNIS
    5

    Was sehe ich hier? Eine Zeile mit dem berechneten Wert 5. Es wird keine Tabelle angelegt. Die späteren Beispiele mit DBA_ und V$ benötigen zusätzliche Leserechte. Eine dort verweigerte Abfrage widerlegt nicht deine SQL-Rechnung. Die Werkzeugbedienung erklärt Kapitel 35.

    Für einen Oracle-DBA ist SQL kein Nebenthema. Fast jede Diagnose beginnt mit einer Abfrage: Welche Sessions sind aktiv? Wie groß ist ein Tablespace? Welche Objekte besitzt ein Schema? Welche Wait Events treten auf? Welche SQL-Anweisung verursacht Last? Wer die Sprache sicher lesen kann, versteht deshalb auch viele DBA-Werkzeuge, Dynamic Performance Views und Data-Dictionary-Abfragen wesentlich schneller.

    Wichtig ist die Trennung zwischen Sprache und Ausführung: Eine SQL-Anweisung beschreibt das gewünschte Ergebnis. Wie Oracle die Daten intern findet, entscheidet der Optimizer. Execution Plans und Performance werden später vertieft; hier entsteht zunächst das sprachliche Fundament.

    Wenn dir Tabellen, Views oder Packages noch nicht vertraut sind, beginne mit Benutzer, Schema und Objekttypen in Kapitel 7. Hier geht es anschließend um die Sprache SQL.

    1. Was ist SQL?

    SQL ist eine deklarative Sprache. Du formulierst, welches Ergebnis du benötigst; du programmierst normalerweise nicht Schritt für Schritt, wie Oracle jeden Datenblock lesen soll. Das unterscheidet SQL von prozeduralen Sprachen.

    Grundidee: SELECT beschreibt das gewünschte Resultset. Der Oracle Optimizer ermittelt einen möglichen Ausführungsweg. Deshalb sind SQL-Syntax, Datenmodell und Ausführungsplan drei unterschiedliche Ebenen.

    Ganz einfaches Beispiel: Die Frage „Welche Oracle-Benutzer gibt es?“ wird zu einer SELECT-Abfrage:

    SELECT username
    FROM dba_users;
    Schritt für Schritt: SELECT username bedeutet: Gib USERNAME aus. FROM dba_users bedeutet: Verwende DBA_USERS als Datenquelle. Mehr passiert in diesem ersten Beispiel noch nicht.

    2. SQL-Befehle einordnen: Abfragen, DML, DDL und Transaktionen

    In der Praxis werden SQL-Anweisungen oft nach ihrer Aufgabe gruppiert. Für dieses Wiki ist besonders wichtig, ob eine Anweisung nur liest oder den Datenbankzustand verändert.

    BereichTypische BefehleBedeutung
    AbfrageSELECTDaten lesen und als Resultset zurückgeben.
    DMLINSERT, UPDATE, DELETE, MERGEDaten in bestehenden Objekten verarbeiten bzw. verändern.
    DDLCREATE, ALTER, DROP, TRUNCATEStrukturen und Datenbankobjekte definieren oder verändern.
    TransaktionssteuerungCOMMIT, ROLLBACK, SAVEPOINTTransaktionsgrenzen bzw. Rücksetzpunkte steuern.
    BerechtigungenGRANT, REVOKEPrivilegien vergeben oder entziehen.
    In diesem Wiki: Diagnosebeispiele sind grundsätzlich read-only. Verändernde SQL-Anweisungen werden in diesem Grundlagenkapitel nur erklärt und nicht automatisch ausgeführt.

    Einfach merken: SELECT fragt Daten ab. DML verändert Daten. DDL verändert Strukturen. Transaktionsbefehle steuern, ob Datenänderungen bestätigt oder zurückgenommen werden. Schon das erste Wort eines Statements verrät deshalb meistens seine Grundaufgabe.

    Zum Lernen unterscheiden wir Aufgaben der Anweisungen. In Oracles formaler SQL-Klassifikation zählt SELECT als begrenzte Form von DML; GRANT und REVOKE zählen zu DDL. DQL und DCL sind hier didaktisch gebräuchliche Gruppen, keine zusätzlichen offiziellen Oracle-Kategorien.

    3. SELECT – der wichtigste Einstieg

    Eine einfache Abfrage besteht mindestens aus SELECT und FROM. SELECT legt fest, welche Spalten oder Ausdrücke ausgegeben werden. FROM bestimmt die Datenquelle.

    SELECT username, account_status
    FROM dba_users;
    Was sehe ich hier? Oracle liest Zeilen aus DBA_USERS. Im Ergebnis erscheinen nur die beiden ausgewählten Spalten USERNAME und ACCOUNT_STATUS. Die Abfrage verändert nichts.

    SELECT * ist zum Erkunden bequem, in gezielten Diagnoseabfragen sind explizite Spalten aber meist besser: Das Ergebnis wird kleiner, verständlicher und dokumentiert gleichzeitig, welche Informationen tatsächlich benötigt werden.

    Mini-Beispiel: Wenn eine View 30 Spalten besitzt, du aber nur Benutzername und Status brauchst, ist SELECT username, account_status leichter zu lesen als SELECT *. Gerade bei wiederverwendbaren DBA-Abfragen sollte sichtbar sein, welche Informationen wirklich benötigt werden.

    4. Die logischen Bausteine einer SELECT-Abfrage

    SELECT   spalte, COUNT(*) AS anzahl
    FROM     tabelle
    WHERE    bedingung
    GROUP BY spalte
    HAVING   COUNT(*) > 1
    ORDER BY anzahl DESC;

    Die Klauseln haben unterschiedliche Aufgaben. WHERE filtert Zeilen, GROUP BY bildet Gruppen, HAVING filtert Gruppen und ORDER BY sortiert das fertige Ergebnis. Die Schreibreihenfolge darf nicht mit der internen Verarbeitung verwechselt werden.

    Merksatz: SELECT = was ausgeben? FROM = woher? WHERE = welche Zeilen? GROUP BY = wie gruppieren? HAVING = welche Gruppen? ORDER BY = wie anzeigen?

    Einfaches Leseschema: Frage bei einer unbekannten SELECT-Abfrage zuerst: Was wird ausgegeben? Woher kommen die Daten? Welche Zeilen werden gefiltert? Wird gruppiert? Werden Gruppen gefiltert? Wie wird sortiert? Damit kannst du auch lange Statements in kleine, verständliche Teile zerlegen.

    5. WHERE – Zeilen gezielt filtern

    Ohne WHERE kann eine Abfrage alle passenden Zeilen der Datenquelle zurückgeben. Mit Bedingungen wird das Resultset eingeschränkt.

    SELECT username, account_status
    FROM dba_users
    WHERE account_status = 'OPEN'
      AND username LIKE 'O%';

    Wichtige Vergleichs- und Filteroperatoren sind =, <>, >, <, BETWEEN, IN, LIKE sowie IS NULL. Bedingungen lassen sich mit AND, OR und NOT kombinieren.

    AND/OR: Bei gemischten Bedingungen Klammern bewusst setzen. Eine syntaktisch gültige WHERE-Klausel kann fachlich trotzdem ein anderes Ergebnis liefern als beabsichtigt.

    Sehr einfaches Beispiel: Du willst nur aktive USER-Sessions sehen. Aus zwei fachlichen Aussagen werden zwei Bedingungen:

    SELECT sid, username, status
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE';
    Was passiert? Eine Zeile bleibt nur im Ergebnis, wenn beide Bedingungen TRUE sind: TYPE ist USER und STATUS ist ACTIVE.

    6. NULL verstehen – einer der wichtigsten SQL-Grundsätze

    NULL bedeutet, dass kein Wert vorhanden bzw. bekannt ist. NULL ist nicht die Zahl 0. Für Oracle 19c gilt ausdrücklich: Eine Zeichenfolge der Länge null, etwa '' bei VARCHAR2, wird als NULL behandelt. Ein Leerzeichen ist dagegen ein vorhandenes Zeichen; ein leeres LOB hat seinen eigenen Kontext. Vergleiche wie = NULL sind deshalb nicht die richtige Prüfung.

    SELECT owner, table_name, last_analyzed
    FROM dba_tables
    WHERE last_analyzed IS NULL;

    Für NULL-Prüfungen werden IS NULL und IS NOT NULL verwendet. Funktionen wie NVL oder COALESCE können Ersatzwerte liefern, sollten aber bewusst eingesetzt werden, weil sie die Bedeutung des Resultsets verändern.

    Einfaches Beispiel: Angenommen, drei Zeilen enthalten für LAST_ANALYZED die Werte 01.09.2026, NULL und 15.09.2026. WHERE last_analyzed IS NULL liefert genau die zweite Zeile. WHERE last_analyzed = NULL liefert sie nicht, weil ein normaler Vergleich mit NULL nicht TRUE wird.

    Das führt zur dreiwertigen SQL-Logik: Eine Bedingung kann TRUE, FALSE oder UNKNOWN ergeben. In einer WHERE-Klausel bleiben nur Zeilen übrig, deren Bedingung TRUE ist. Gerade bei NOT, IN und Unterabfragen ist dieses Verständnis wichtig.

    Denkmodell für NULL: 5 = 5 ist TRUE. 5 = 7 ist FALSE. Bei 5 = NULL kennt SQL den zweiten Wert nicht; das Ergebnis ist UNKNOWN. Deshalb verwendet man IS NULL beziehungsweise IS NOT NULL.

    7. ORDER BY – Ergebnis sortieren

    Ohne ORDER BY gibt es keine garantierte Reihenfolge des Resultsets. Eine zufällig stabil wirkende Ausgabe ist deshalb keine zugesicherte Sortierung.

    SELECT username, created
    FROM dba_users
    ORDER BY created DESC, username ASC;
    Was sehe ich hier? Zuerst werden die neuesten Werte von CREATED angezeigt. Bei gleichem Datum wird zusätzlich nach USERNAME aufsteigend sortiert.

    Einfaches Zahlenbeispiel: Aus 3, 1 und 2 wird mit ORDER BY wert ASC die Reihenfolge 1, 2, 3. Mit DESC wird daraus 3, 2, 1. Ohne ORDER BY ist keine bestimmte Reihenfolge zugesichert.

    8. DISTINCT – doppelte Ergebniszeilen reduzieren

    DISTINCT wirkt auf die Kombination aller ausgewählten Ausdrücke. Es ist kein allgemeiner Reparaturbefehl für unerwartete Duplikate.

    SELECT DISTINCT status
    FROM v$session
    ORDER BY status;
    Praxisregel: Wenn ein JOIN unerwartet viele Zeilen erzeugt, nicht reflexartig DISTINCT einsetzen. Zuerst prüfen, ob die Join-Bedingung und die Kardinalität der Beziehung korrekt verstanden wurden.

    9. Aliase – Abfragen lesbarer machen

    Tabellen- und Spaltenaliase verkürzen SQL und helfen besonders bei Joins. Ein Spaltenalias benennt die Ausgabe, ein Tabellenalias qualifiziert Spalten eindeutig.

    SELECT s.sid,
           s.serial#,
           s.username,
           s.status
    FROM v$session s
    WHERE s.type = 'USER';

    Bei mehreren Tabellen sollten Spalten konsequent mit dem Tabellenalias qualifiziert werden. Das verhindert Mehrdeutigkeiten und macht sofort sichtbar, aus welcher Quelle eine Information stammt.

    Alias einfach erklärt: In s.username ist s nur ein Kurzname für die Datenquelle. Der Alias erzeugt keine neue Tabelle und verändert nichts. Er macht lange SQL-Abfragen lediglich besser lesbar.

    10. Funktionen und Ausdrücke

    SQL kann Werte nicht nur ausgeben, sondern im Resultset berechnen und formatieren. Häufige Funktionsgruppen sind Zeichen-, Zahlen-, Datums-, Konvertierungs- und NULL-Funktionen.

    SELECT username,
           LOWER(username) AS username_lower,
           TO_CHAR(created, 'DD.MM.YYYY HH24:MI') AS created_at
    FROM dba_users;

    Datentypen sind dabei wichtig. Implizite Konvertierungen können Abfragen schwerer verständlich machen und zu Fehlern führen. Bei Datum, Zahl und Zeichenketten sind explizite Konvertierungen oft die klarere Variante.

    11. Aggregatfunktionen – viele Zeilen zusammenfassen

    Aggregatfunktionen berechnen ein Ergebnis über mehrere Zeilen. Typische Funktionen sind COUNT, SUM, AVG, MIN und MAX.

    SELECT status, COUNT(*) AS sessions
    FROM v$session
    WHERE type = 'USER'
    GROUP BY status
    ORDER BY status;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    STATUSSESSIONS
    ACTIVE3
    INACTIVE12

    Was sehe ich hier? Es gibt hier 15 Benutzersessions. ACTIVE kann auch einen wartenden Aufruf umfassen. Fehlende Statusgruppen erscheinen nicht als zusätzliche Nullzeilen.

    COUNT(*) zählt Ergebniszeilen. COUNT(spalte) zählt dagegen nur Zeilen, in denen diese Spalte nicht NULL ist. Dieser Unterschied ist bei Diagnosen wichtig.

    Mini-Beispiel zu COUNT: Enthält eine Spalte drei Zeilen mit A, NULL und B, ergibt COUNT(*) den Wert 3. COUNT(spalte) ergibt 2, weil NULL dabei nicht mitgezählt wird.

    12. GROUP BY und HAVING – Gruppen bilden und filtern

    GROUP BY fasst Zeilen anhand gleicher Gruppierungswerte zusammen. HAVING filtert anschließend Gruppen und ist deshalb nicht dasselbe wie WHERE.

    SELECT username, COUNT(*) AS sessions
    FROM v$session
    WHERE type = 'USER'
    GROUP BY username
    HAVING COUNT(*) > 5
    ORDER BY sessions DESC;
    WHERE vs. HAVING: WHERE entscheidet, welche Einzelzeilen in die Verarbeitung eingehen. HAVING entscheidet, welche bereits gebildeten Gruppen im Ergebnis verbleiben.

    Einfach gedacht: WHERE sortiert einzelne Karten aus, bevor Stapel gebildet werden. GROUP BY bildet die Stapel. HAVING entscheidet anschließend, welche fertigen Stapel im Ergebnis bleiben.

    13. JOINs – Informationen aus mehreren Quellen verbinden

    Ein JOIN kombiniert Zeilen aus mehreren Tabellen oder Views anhand einer Beziehung. Für DBA-Abfragen ist das zentral, weil Informationen häufig über mehrere Dynamic Performance Views oder Dictionary Views verteilt sind.

    SELECT s.sid,
           s.serial#,
           s.username,
           p.spid AS os_pid
    FROM v$session s
    JOIN v$process p
      ON p.addr = s.paddr
    WHERE s.type = 'USER';
    Was sehe ich hier? V$SESSION liefert den Session-Kontext. Über S.PADDR = P.ADDR wird die passende Zeile aus V$PROCESS verbunden. Dadurch kann die Oracle-Session dem Oracle-Serverprozess bzw. dessen OS-PID zugeordnet werden.
    Einfach gedacht: Stell dir zwei Listen vor. In der ersten stehen Sessions, in der zweiten Prozesse. Der JOIN braucht ein Merkmal, das zusammengehörige Zeilen verbindet. Bei diesem Oracle-Beispiel ist das S.PADDR = P.ADDR. V$SESSION.PROCESS ist dagegen die Client-Prozessinformation und nicht dasselbe wie V$PROCESS.SPID. V$PROCESS.SPID bezeichnet die Betriebssystem-Prozesskennung des Oracle-Prozesses; bei aktiviertem Multiprocess/Multithread-Modell ist sie laut Oracle nicht zwingend eindeutig.

    Vor jedem JOIN solltest du deshalb drei Fragen beantworten: Welche Zeile ist links? Welche Zeile gehört rechts dazu? Ist die Beziehung 1:1, 1:n oder n:m? Diese drei Fragen verhindern viele typische SQL-Fehler.

    14. INNER JOIN und OUTER JOIN unterscheiden

    Ein INNER JOIN liefert nur Kombinationen, für die die Join-Bedingung erfüllt ist. Ein LEFT OUTER JOIN behält dagegen alle Zeilen der linken Datenquelle; fehlt rechts ein Treffer, sind die rechten Spalten NULL.

    ON und WHERE erfüllen beim LEFT JOIN unterschiedliche Aufgaben. Im vorhandenen Session-/Cursor-Beispiel legt ON fest, welche Cursorzeile zu einer Session passt. Fehlt sie, bleibt die linke Session mit NULL-Werten auf der rechten Seite erhalten. Ein zusätzlicher WHERE-Vergleich auf einen rechten Wert kann gerade diese ergänzten NULL-Zeilen wieder verwerfen, weil der Vergleich nicht TRUE wird. Eine Filterbedingung darf deshalb nicht allein aus optischen Gründen von ON nach WHERE verschoben werden: Zuerst muss klar sein, ob Sessions ohne passenden Cursor erhalten bleiben sollen. Oracle 19c.

    SELECT s.sid,
           s.username,
           q.sql_id,
           q.sql_text
    FROM v$session s
    LEFT JOIN v$sql q
      ON q.sql_id = s.sql_id
     AND q.child_number = s.sql_child_number
     AND q.address = s.sql_address
         AND q.con_id = s.con_id
    WHERE s.type = 'USER';

    Die Wahl des Join-Typs ist eine fachliche Entscheidung. Sie bestimmt, ob Zeilen ohne Gegenstück verschwinden oder sichtbar bleiben.

    Einfaches Bild für JOINs: Links stehen drei Sessions A, B und C. Rechts existiert Zusatzinformation nur für A und B. Ein INNER JOIN liefert A und B. Ein LEFT JOIN liefert A, B und auch C; bei C sind die nicht vorhandenen rechten Werte NULL.

    15. Mehrere Tabellen verbinden und Join-Fehler erkennen

    Bei drei oder mehr Quellen wird jede Beziehung einzeln formuliert. Fehlt eine notwendige Join-Bedingung, kann ein kartesisches Produkt entstehen: Zeilen werden in sehr vielen Kombinationen miteinander verknüpft.

    Diagnose bei „zu vielen Zeilen“: Prüfe zuerst Join-Bedingungen, 1:1-/1:n-Beziehungen und Filter. DISTINCT sollte nicht dazu dienen, einen fachlich falschen JOIN zu verdecken.

    Zahlenbeispiel: Hat Quelle A 10 Zeilen und Quelle B 20 Zeilen, kann eine fehlende Beziehung bis zu 10 × 20 = 200 Kombinationen erzeugen. Liefert ein JOIN viel mehr Zeilen als erwartet, ist die Join-Bedingung deshalb eine der ersten Prüfstellen.

    16. Unterabfragen – eine Abfrage innerhalb einer Abfrage

    Eine Subquery liefert ein Zwischenergebnis, das von einer äußeren Abfrage verwendet wird. Je nach Kontext kann sie einen einzelnen Wert, mehrere Werte oder ein Resultset liefern.

    SELECT username, created
    FROM dba_users
    WHERE created > (
        SELECT MIN(created)
        FROM dba_users
        WHERE account_status = 'OPEN'
    )
    ORDER BY created;

    Wichtig ist die erwartete Kardinalität: Wird mit = verglichen, muss eine skalare Unterabfrage höchstens einen Wert liefern. Für Wertemengen werden beispielsweise IN oder EXISTS verwendet.

    Zum Verständnis kannst du zunächst betrachten, welchen Wert oder welche Zeilen die Unterabfrage liefert und wie die äußere Abfrage diese verwendet. Das ist eine Lesehilfe, keine festgelegte Ausführungsreihenfolge. Oracle kann Unterabfragen beispielsweise in Joins umformen; wie die gesamte Anweisung verarbeitet wird, bestimmt der Ausführungsplan.

    17. EXISTS und IN richtig einordnen

    IN prüft, ob ein Ausdruck in einer Wertemenge enthalten ist. EXISTS prüft, ob eine Unterabfrage mindestens eine Zeile liefert. Beide Konstrukte können fachlich ähnliche Aufgaben lösen, sind aber nicht einfach in jedem Fall austauschbare Schreibweisen.

    SELECT u.username
    FROM dba_users u
    WHERE EXISTS (
        SELECT 1
        FROM dba_objects o
        WHERE o.owner = u.username
    );

    Warum NOT IN mit NULL überrascht

    SELECT 1 AS nr FROM dual WHERE 1 NOT IN (2, NULL);

    Ausgabe: keine Zeile. Der Vergleich mit NULL ist unbekannt; WHERE übernimmt nur TRUE.

    WITH sperrliste (nr) AS (SELECT 2 FROM dual UNION ALL SELECT NULL FROM dual)
    SELECT 1 AS nr FROM dual
    WHERE NOT EXISTS (SELECT 1 FROM sperrliste s WHERE s.nr=1);
    Fiktive Beispielausgabe:
    NR
    1

    NOT EXISTS fragt stattdessen, ob eine passende Zeile existiert. Hier passt keine Zeile. Beide Schreibweisen sind bei NULL nicht allgemein austauschbar: Entscheide ausdrücklich, wie NULL auf beiden Seiten behandelt werden soll.

    18. WITH-Klausel – komplexe Abfragen strukturieren

    Mit einer Common Table Expression (CTE) kann ein Zwischenergebnis benannt und danach wie eine Datenquelle verwendet werden. Das verbessert besonders bei Diagnoseketten die Lesbarkeit.

    WITH active_users AS (
        SELECT username, COUNT(*) AS sessions
        FROM v$session
        WHERE type = 'USER'
          AND status = 'ACTIVE'
        GROUP BY username
    )
    SELECT username, sessions
    FROM active_users
    ORDER BY sessions DESC;

    Ein kleines, vollständig nachvollziehbares Beispiel

    Die WITH-Klausel stellt drei erfundene Bestellungen nur für diese Abfrage bereit. Es wird keine Tabelle angelegt. Führe jede Abfrage einzeln aus.

    WITH bestellungen (nr, kategorie, betrag) AS (
      SELECT 1, 'Buch', 20 FROM dual UNION ALL
      SELECT 2, 'Buch', 30 FROM dual UNION ALL
      SELECT 3, 'Spiel', 40 FROM dual
    )
    SELECT nr, kategorie, betrag
    FROM bestellungen WHERE betrag >= 30 ORDER BY nr;
    Fiktive Beispielausgabe:
    NRKATEGORIEBETRAG
    2Buch30
    3Spiel40

    WHERE lässt die Bestellung über 20 weg. ORDER BY legt die Reihenfolge fest.

    WITH bestellungen (nr, kategorie, betrag) AS (
      SELECT 1, 'Buch', 20 FROM dual UNION ALL
      SELECT 2, 'Buch', 30 FROM dual UNION ALL
      SELECT 3, 'Spiel', 40 FROM dual
    )
    SELECT kategorie, COUNT(*) AS anzahl, SUM(betrag) AS umsatz
    FROM bestellungen GROUP BY kategorie ORDER BY kategorie;
    Fiktive Beispielausgabe:
    KATEGORIEANZAHLUMSATZ
    Buch250
    Spiel140

    Die Gruppierung fasst beide Buchbestellungen zu einer Ergebniszeile zusammen. COUNT(*) zählt Bestellungen; SUM addiert ihre Beträge.

    WITH kunden (id, name) AS (
     SELECT 1, 'Alex' FROM dual UNION ALL SELECT 2, 'Kim' FROM dual
    ), bestellungen (kunde_id, betrag) AS (SELECT 1, 20 FROM dual)
    SELECT k.name, b.betrag FROM kunden k
    LEFT JOIN bestellungen b ON b.kunde_id=k.id ORDER BY k.id;
    Fiktive Beispielausgabe:
    NAMEBETRAG
    Alex20
    KimNULL

    Kim bleibt durch LEFT JOIN sichtbar. Hier entsteht NULL durch den fehlenden Treffer. Allgemein kann eine rechte Spalte auch bei einem vorhandenen Treffer NULL enthalten; als Nachweis eignet sich ein rechter Schlüssel, der selbst nicht NULL sein darf.

    19. Mengenoperatoren: UNION, UNION ALL, INTERSECT und MINUS

    Mengenoperatoren verbinden die Resultsets mehrerer SELECT-Anweisungen. Die beteiligten Abfragen müssen eine kompatible Anzahl und passende Datentypgruppen von Ausgabespalten liefern.

    OperatorBedeutung
    UNIONKombiniert Resultsets und entfernt doppelte Ergebniszeilen.
    UNION ALLKombiniert Resultsets und behält Duplikate.
    INTERSECTLiefert die Schnittmenge.
    MINUSLiefert Zeilen der ersten Abfrage, die in der zweiten nicht vorkommen.

    20. CASE – Bedingungen im Resultset ausdrücken

    CASE erlaubt eine bedingte Klassifizierung innerhalb einer Abfrage und ist für DBA-Reports besonders nützlich.

    SELECT username,
           account_status,
           CASE
               WHEN account_status = 'OPEN' THEN 'Konto offen'
               ELSE 'pruefen'
           END AS bewertung
    FROM dba_users;
    Wichtig: Eine mit CASE erzeugte Bewertung ist nur Logik im Resultset. Sie ändert keinen Benutzer und keinen Datenbankzustand.

    21. Datum und Zeit – in DBA-Abfragen unverzichtbar

    Viele Diagnosefragen beziehen sich auf Zeiträume. Oracle besitzt eigene Datentypen für Datum und Zeit. Bei Vergleichen sollte nicht darauf vertraut werden, dass Zeichenketten aufgrund der aktuellen NLS-Einstellungen zufällig korrekt konvertiert werden.

    SELECT username, created
    FROM dba_users
    WHERE created >= SYSDATE - 30
    ORDER BY created DESC;

    Für feste Werte sind explizite Datums-/Timestamp-Literale oder passende Konvertierungen besser lesbar als NLS-abhängige Zeichenketten.

    SELECT username, created
    FROM dba_users
    WHERE created >= DATE '2026-09-01'
      AND created <  DATE '2026-10-01'
    ORDER BY created;
    Was sehe ich hier? Der Zeitraum wird als halboffenes Intervall formuliert: ab 01.09.2026 einschließlich, aber vor 01.10.2026. Dadurch werden auch DATE-Werte mit Uhrzeit innerhalb des gesamten Septembers erfasst.

    Ein Oracle-DATE enthält neben dem Kalendertag auch eine Uhrzeit. Genau deshalb kann WHERE created = DATE '2026-09-01' Datensätze desselben Tages verpassen, wenn deren Uhrzeit nicht 00:00:00 ist.

    22. Datentypen und implizite Konvertierungen

    Zeichenketten, Zahlen, DATE und TIMESTAMP sind unterschiedliche Datentypen. Oracle kann manche Typen implizit konvertieren, doch eine Abfrage sollte nicht unnötig davon abhängen. Das gilt besonders für Datumswerte und Zahlenformate.

    Praxis: Ein SQL kann in einer Session funktionieren und in einer anderen wegen anderer NLS-Einstellungen anders reagieren. Datentypen deshalb bewusst behandeln.
    -- klar: Zahl wird mit Zahl verglichen
    WHERE object_id = 12345
    
    -- vermeidbar: Oracle muss Datentypen gegeneinander auflösen
    WHERE object_id = '12345'

    Warum ist das mehr als Stil? Implizite Konvertierung kann zu Fehlern wie ORA-01722 führen, von NLS-Einstellungen abhängen und je nach Ausdruck auch die Nutzung vorhandener Zugriffspfade erschweren. Explizite Datentypen machen die Absicht der Abfrage sichtbar.

    23. Zeilen begrenzen – FETCH FIRST

    Bei großen Views oder Tabellen ist es oft sinnvoll, nur einen Teil eines sortierten Ergebnisses anzuzeigen.

    Zeilenzahl und Rang sind verschiedene Ziele. FETCH FIRST begrenzt Ergebniszeilen. Die im SQL-Test verwendete analytische Funktion DENSE_RANK() OVER (...) ergänzt dagegen eine Rangzahl zu den vorhandenen Ergebniszeilen: Gleiche Sortierwerte erhalten denselben Rang, ohne Lücken zwischen den Rangstufen. OVER beschreibt den Auswertungsbereich; PARTITION BY teilt ihn bei Bedarf in Gruppen, ohne wie GROUP BY die Zeilen zusammenzufassen. Die Sortierung innerhalb von OVER garantiert keine Sortierung der Endausgabe. Soll nach dem berechneten Rang gefiltert werden, verwendet man in 19c eine äußere Abfrage. Analytische Funktionen in Oracle 19c. Oracle 19c.

    SELECT sql_id, executions, elapsed_time
    FROM v$sql
    ORDER BY elapsed_time DESC
    FETCH FIRST 10 ROWS ONLY;
    Was sehe ich hier? Nach der Sortierung werden nur zehn Ergebniszeilen zurückgegeben. Ohne eine fachlich passende Sortierung bedeutet „erste 10“ nicht automatisch „wichtigste 10“.

    24. DML verstehen: INSERT, UPDATE, DELETE und MERGE

    DML verarbeitet Daten in bestehenden Schemaobjekten. INSERT fügt Zeilen hinzu, UPDATE ändert bestehende Zeilen, DELETE entfernt Zeilen und MERGE kann abhängig von einer Bedingung unterschiedliche DML-Aktionen zusammenfassen.

    -- Nur Syntaxbeispiel, NICHT automatisch ausfuehren:
    UPDATE beispiel_tabelle
    SET status = 'ARCHIV'
    WHERE id = 100;
    DBA-Sicherheitsprinzip: Vor verändernden Anweisungen muss klar sein, welche Zeilen betroffen sind, welche Transaktion läuft und welche fachlichen Folgen entstehen. Die Maintenance-/Diagnoseskripte dieses Wikis führen solche Befehle nicht aus.

    25. Transaktionen: COMMIT, ROLLBACK und SAVEPOINT

    Mehrere DML-Anweisungen können zu einer Transaktion gehören. COMMIT beendet die aktuelle Transaktion, macht ihre Änderungen dauerhaft, löscht ihre Savepoints und gibt ihre Transaktions-Locks frei. ROLLBACK verwirft noch nicht bestätigte Änderungen; ein bereits ausgeführtes COMMIT wird dadurch nicht zurückgenommen. SAVEPOINT markiert einen Zwischenpunkt innerhalb einer Transaktion.

    Für das Verständnis von Blocking, UNDO, Redo und Recovery ist dieses Transaktionsmodell fundamental: SQL-Änderungen stehen nicht isoliert, sondern besitzen einen Transaktionskontext.

    26. DDL ist nicht dasselbe wie DML

    DDL definiert Strukturen, beispielsweise mit CREATE, ALTER oder DROP. Oracle führt vor einer syntaktisch gültigen DDL-Anweisung ein implizites COMMIT aus und nach einer erfolgreich ausgeführten DDL-Anweisung erneut. DDL darf deshalb transaktional nicht wie normale DML behandelt werden.

    Wichtig: Administrative DDL-Beispiele im Wiki sind Referenzwissen. Die read-only Diagnosewerkzeuge führen kein DDL aus.

    27. Berechtigungen – SQL darf nur, was der Benutzer darf

    Eine syntaktisch korrekte Abfrage kann trotzdem scheitern, wenn Objekt- oder Systemprivilegien fehlen. Umgekehrt bedeutet ein vorhandenes Privileg nicht, dass jede fachlich mögliche Aktion ausgeführt werden sollte. Rollen und Privilegien werden in Kapitel 12 detailliert behandelt.

    28. Typische SQL-Fehler lesen statt raten

    FehlerTypische BedeutungErster Prüfschritt
    ORA-00904Ungültiger BezeichnerSpaltenname, Alias und Sichtbarkeit prüfen.
    ORA-00942Tabelle oder View nicht zugreifbar/gefundenObjektname, Schema und Berechtigungen prüfen.
    ORA-00979GROUP-BY-Ausdruck passt nicht zur SELECT-ListeNicht aggregierte SELECT-Ausdrücke gegen GROUP BY prüfen.
    ORA-01427Skalare Unterabfrage liefert mehr als eine ZeileErwartete Kardinalität der Subquery prüfen.
    ORA-01722Ungültige ZahlDatentypen und explizite/implizite Konvertierungen prüfen.

    29. Eine SQL-Abfrage systematisch lesen

    Bei fremdem SQL nicht sofort jede Funktion einzeln analysieren. Eine feste Reihenfolge macht komplexe Abfragen verständlicher:

    1. Datenquellen: Welche Tabellen, Views oder CTEs stehen in FROM?
    2. Beziehungen: Welche JOINs verbinden diese Quellen?
    3. Filter: Welche Zeilen werden durch WHERE ausgeschlossen?
    4. Gruppierung: Gibt es GROUP BY und Aggregatfunktionen?
    5. Gruppenfilter: Was entfernt HAVING?
    6. Ausgabe: Welche Spalten und berechneten Ausdrücke liefert SELECT?
    7. Sortierung/Begrenzung: Was bewirken ORDER BY und FETCH?

    30. DBA-Praxisbeispiel: aktive Benutzersessions zusammenfassen

    SELECT username,
           COUNT(*) AS active_sessions
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
      AND username IS NOT NULL
    GROUP BY username
    ORDER BY active_sessions DESC;
    Was sehe ich hier? Die Abfrage liest V$SESSION, filtert auf aktive USER-Sessions mit Datenbankbenutzer, gruppiert sie nach USERNAME, zählt die Zeilen pro Benutzer und sortiert das Ergebnis absteigend. Jeder Baustein hat genau eine erkennbare Aufgabe.
    Aber: Viele ACTIVE Sessions bedeuten nicht automatisch hohe CPU-Last oder ein Problem. SQL liefert zunächst Messdaten; die fachliche Bewertung benötigt Kontext.

    31. Von SQL-Grundlagen zur Performance-Diagnose

    Eine fachlich korrekte SQL-Anweisung kann trotzdem teuer sein. Erst wenn das Ergebnis fachlich stimmt, lohnt sich die nächste Ebene: Kardinalitäten, Zugriffspfade, Join-Methoden, E-Rows/A-Rows, Buffers, Reads und Wait Events. Diese Themen werden in den Performance- und Execution-Plan-Kapiteln behandelt.

    Diagnosekette: SQL fachlich verstehen → Resultset prüfen → Datenmenge und Beziehungen verstehen → erst danach Ausführungsplan und Laufzeit bewerten.

    Bind-Variablen: Bei wiederholt ausgeführtem SQL können Bind-Variablen SQL-Sharing und Cursor-Wiederverwendung fördern und dadurch unnötige Hard Parses reduzieren. Sie garantieren jedoch nicht, dass jeder Parse ein Soft Parse ist.

    32. SQL-Spickzettel

    FrageSQL-Baustein
    Welche Werte sollen erscheinen?SELECT
    Aus welcher Quelle?FROM
    Welche Einzelzeilen?WHERE
    Welche Quellen gehören zusammen?JOIN ... ON
    Wie zusammenfassen?GROUP BY + Aggregatfunktion
    Welche Gruppen behalten?HAVING
    Wie sortieren?ORDER BY
    Nur einen Teil anzeigen?FETCH FIRST ... ROWS ONLY
    Zwischenergebnis benennen?WITH
    Existiert mindestens eine passende Zeile?EXISTS

    33. Logische Verarbeitung – warum SQL anders gelesen wird als geschrieben

    SQL wird in einer festen Syntax geschrieben, aber zum fachlichen Verständnis hilft eine andere Denkfolge. Vereinfacht betrachtet musst du zuerst wissen, woher die Zeilen kommen, dann welche Zeilen übrig bleiben, wie sie gruppiert werden und erst danach, was im Resultset sichtbar ist.

    SELECT status, COUNT(*) AS anzahl
    FROM v$session
    WHERE type = 'USER'
    GROUP BY status
    HAVING COUNT(*) > 2
    ORDER BY anzahl DESC;
    Schritt für Schritt: 1. FROM stellt die Session-Zeilen bereit. 2. WHERE behält USER-Sessions. 3. GROUP BY bildet Statusgruppen. 4. HAVING entfernt kleine Gruppen. 5. SELECT erzeugt die sichtbaren Ausgabewerte. 6. ORDER BY sortiert das Resultset.

    Diese Reihenfolge erklärt typische Fragen. Ein Alias aus der SELECT-Liste existiert beispielsweise fachlich nicht einfach an jeder beliebigen früheren Stelle der Abfrage.

    34. Literale, Spalten und Ausdrücke unterscheiden

    In SQL sehen viele Bestandteile ähnlich aus, haben aber unterschiedliche Rollen. Ein Literal ist ein fest angegebener Wert, eine Spalte liefert pro Zeile einen Wert und ein Ausdruck berechnet daraus einen neuen Wert.

    SELECT username,                  -- Spalte
           'ORACLE' AS system_name,  -- Zeichenliteral
           10 AS faktor,             -- Zahlenliteral
           LENGTH(username) AS len   -- Ausdruck/Funktion
    FROM dba_users;
    Merke: Zeichenliterale stehen in einfachen Anführungszeichen. Objekt- und Spaltennamen sind keine Zeichenliterale. Wer diesen Unterschied sicher erkennt, versteht Fehlermeldungen und Datentypkonvertierungen deutlich schneller.

    35. Von einer einfachen zu einer aussagekräftigen DBA-Abfrage

    Eine gute Lernmethode besteht darin, eine Abfrage schrittweise aufzubauen. So ist nach jedem Schritt klar, welche neue Information hinzukommt.

    Schritt 1 – Quelle ansehen:

    SELECT sid, username, status
    FROM v$session;

    Schritt 2 – fachlich filtern:

    SELECT sid, username, status
    FROM v$session
    WHERE type = 'USER'
      AND username IS NOT NULL;

    Schritt 3 – nur aktive USER-Sessions:

    SELECT sid, serial#, username, status, sql_id
    FROM v$session
    WHERE type = 'USER'
      AND username IS NOT NULL
      AND status = 'ACTIVE'
    ORDER BY username, sid;
    Was lerne ich daraus? Nicht sofort ein langes Statement bauen. Erst Quelle und Spalten prüfen, danach Filter ergänzen und zuletzt Sortierung oder Aggregation hinzufügen. Wenn das Ergebnis an einem Schritt falsch wird, ist die Ursache leichter einzugrenzen.

    36. SQL vor der Ausführung gedanklich prüfen

    Bevor du eine unbekannte Abfrage ausführst, solltest du sie fachlich lesen können. Bei einem reinen SELECT sind besonders diese Fragen nützlich:

    1. Welche Quellen werden gelesen?
    2. Welche Spalten erscheinen im Ergebnis?
    3. Welche Filter schränken die Zeilen ein?
    4. Welche JOINs können die Zeilenmenge vergrößern?
    5. Gibt es Aggregationen und welche Gruppierung gehört dazu?
    6. Wie werden NULL-Werte behandelt?
    7. Gibt es implizite Konvertierungen oder NLS-Abhängigkeiten?
    8. Ist die Sortierung für die fachliche Aussage notwendig?
    DBA-Denkweise: Erst beschreiben können, was das SQL voraussichtlich liefert. Dann ausführen und Resultset prüfen. Erst danach Performance oder Optimierung bewerten.

    37. Eine Abfrage Schritt für Schritt aufbauen

    Gerade am Anfang ist es besser, eine Abfrage nicht sofort komplett zu schreiben. Baue sie in kleinen Schritten auf und prüfe nach jedem Schritt, ob du das Ergebnis erklären kannst.

    Frage: Welche aktiven USER-Sessions gibt es?

    Schritt 1 – Datenquelle ansehen:

    SELECT sid, username, type, status
    FROM v$session;

    Schritt 2 – USER-Sessions filtern:

    SELECT sid, username, status
    FROM v$session
    WHERE type = 'USER';

    Schritt 3 – ACTIVE ergänzen:

    SELECT sid, username, status
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE';
    Warum ist das hilfreich? Du kannst nach jedem Schritt erklären, welche Datenmenge kleiner wird und warum. Diese Methode eignet sich auch zur Fehlersuche in deutlich längeren DBA-Abfragen.

    38. Kleine SQL-Denkübungen mit DUAL

    Mit sehr kleinen Beispielen kannst du einzelne Ausdrücke verstehen, ohne dass eine große Tabelle vom eigentlichen Lernziel ablenkt.

    SELECT 10 + 5 AS ergebnis
    FROM dual;

    Das Ergebnis ist 15. Hier siehst du nur, wie ein Ausdruck in der SELECT-Liste berechnet wird.

    SELECT CASE
             WHEN 10 > 5 THEN 'JA'
             ELSE 'NEIN'
           END AS ergebnis
    FROM dual;

    Das Ergebnis ist JA, weil die Bedingung TRUE ist.

    SELECT NVL(NULL, 'ERSATZ') AS ergebnis
    FROM dual;

    Das Ergebnis ist ERSATZ. So wird die Wirkung von NVL isoliert und unmittelbar sichtbar.

    Offizielle Oracle-Referenzen (19c)

    SELECT · Nulls · IN-Condition · Joins

    Übung: SQL selbst formulieren statt eine Lösung ergänzen

    Du benötigst nur SELECT auf DUAL. Dieser kleine Datenbestand ist unabhängig von LAB_OWNER und von DBA-Rechten. Beginne jede Aufgabe mit derselben WITH-Klausel; ersetze die letzte SELECT-Anweisung durch deinen eigenen Lösungsansatz. Sage die Ergebniszeilen voraus, bevor du ausführst.

    SQL*Plus – lesende Kontrolle
    WITH auftrag (id, kunde, betrag) AS (
      SELECT 1, 'Alpha', 10 FROM dual UNION ALL
      SELECT 2, 'Alpha', 20 FROM dual UNION ALL
      SELECT 3, 'Beta', CAST(NULL AS NUMBER) FROM dual UNION ALL
      SELECT 4, 'Gamma', 5 FROM dual
    )
    SELECT id, kunde, betrag FROM auftrag ORDER BY id;
    • Verstehen: Wie unterscheiden sich COUNT(*), COUNT(betrag) und SUM(betrag)?
    • Anwenden: Schreibe eine Gruppierung je Kunde mit Anzahl der Aufträge und Summe. Zeige anschließend nur Kunden mit einer Summe größer als 15.
    • Transfer: Baue eine zweite CTE mit den Kunden Alpha, Beta, Gamma und Delta. Zeige jeden Kunden, auch Delta ohne Auftrag. Erkläre, warum COUNT(*) bei einem LEFT JOIN nicht ohne Weiteres die Zahl seiner Aufträge liefert.
    Musterlösung und Abnahmekriterien

    Für alle vier Aufträge gilt COUNT(*)=4, COUNT(betrag)=3 und SUM(betrag)=35. Die Gruppierung liefert Alpha mit zwei Aufträgen und Summe 30, Beta mit einem Auftrag und SUM=NULL, Gamma mit einem Auftrag und Summe 5. HAVING SUM(betrag)>15 liefert nur Alpha. Im LEFT JOIN zählst du eine nicht nullable Auftragskennung wie COUNT(a.id); Delta hat dann 0. NVL auf der Summe kann eine gewollte Darstellung sein, ersetzt aber nicht die Erklärung des fehlenden Werts. Als Nachweis reichen weder eine passende Zeilenzahl ohne SQL noch ein kopierter Lösungstext.

    Oracle 19c: SELECT · COUNT · Aggregatfunktionen

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. SELECT liest Daten, DML verändert Daten und DDL verändert Datenbankobjekte. Die Unterschiede im Transaktionsverhalten müssen vor dem Ausführen einer Anweisung klar sein.
    2. WHERE filtert Zeilen, GROUP BY bildet Gruppen und HAVING filtert Gruppenergebnisse. ORDER BY bestimmt die Reihenfolge; ohne passende Sortierung ist eine Top-N-Auswahl nicht eindeutig.
    3. NULL ist kein gewöhnlicher Vergleichswert. IS NULL, Aggregatfunktionen und Bedingungen müssen entsprechend der NULL-Semantik gelesen werden.
    4. JOINs verbinden Zeilen anhand ihrer Beziehungen. Fehlende Joinbedingungen oder falsch platzierte Filter können Zeilen vervielfachen oder die Wirkung eines OUTER JOIN verändern.
    5. Datentypen, explizite Konvertierungen und eindeutige Zeitfilter gehören zur fachlichen Korrektheit. Eine syntaktisch gültige Abfrage kann dennoch die falsche Datenmenge liefern.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Warum liefert SPALTE = NULL nicht die gesuchten leeren Werte?

    Lösung: Der Vergleich ergibt UNKNOWN. WHERE übernimmt nur TRUE. Verwende SPALTE IS NULL; mit IS NOT NULL suchst du belegte Werte.

    Frage 2: Was ist der Unterschied zwischen WHERE und HAVING?

    Lösung: WHERE filtert einzelne Eingabezeilen vor der Gruppierung. HAVING filtert die entstandenen Gruppen, beispielsweise anhand COUNT(*).

    Frage 3: Wie erhältst du zuverlässig die zehn höchsten vorhandenen Werte?

    Lösung: Nach der gewünschten Kennzahl absteigend sortieren und danach mit FETCH FIRST 10 ROWS ONLY begrenzen. Bei möglichen NULL-Werten NULLS LAST verwenden oder fehlende Werte gezielt ausschließen; DESC allein stellt NULL standardmäßig zuerst. Ein zusätzlicher eindeutiger Sortierschlüssel macht die Auswahl bei gleichen Werten reproduzierbar. Gibt es weniger als zehn passende Zeilen, werden entsprechend weniger geliefert.

    Frage 4: Was liefert SELECT 2 + 3 AS ergebnis FROM dual?

    Lösung: Eine Zeile mit der Spalte ERGEBNIS und dem Wert 5. Die Abfrage berechnet einen Wert und legt keine Tabelle an.

    Frage 5: Drei Werte lauten 10, NULL und 20. Was liefern COUNT(*) und COUNT(wert)?

    Lösung: COUNT(*) zählt drei Zeilen; COUNT(wert) zählt die zwei vorhandenen Werte. NULL wird beim zweiten Ausdruck nicht mitgezählt.

    Frage 6: Warum kann ein WHERE-Filter auf die rechte Seite das Ergebnis eines LEFT JOIN verändern?

    Lösung: Der LEFT JOIN erhält zunächst auch linke Zeilen ohne Partner und ergänzt rechts NULL. Ein WHERE-Vergleich auf eine rechte Spalte kann diese Zeilen anschließend ausschließen. Im Session-/Cursor-Beispiel entscheidet deshalb die gewünschte Aussage, ob ein Filter nur die Cursorzuordnung begrenzt oder Sessions ganz aus dem Ergebnis entfernt. ON und WHERE sind hier nicht beliebig austauschbar.

    Frage 7: Ein Kunde hat zwei Bestellungen. Warum kann sein Name nach einem JOIN zweimal erscheinen?

    Lösung: Der JOIN liefert zwei passende Zeilenpaare. Der wiederholte Name ist damit erwartbar; DISTINCT würde die Beziehung nicht erklären.

    Frage 8: Was prüfst du bei ORA-00942 in einer DBA-Abfrage zuerst?

    Lösung: Datenquelle, Name, aktuellen Container und Sichtbarkeit für den verbundenen Benutzer. Der Fehler rechtfertigt weder eine automatische Rechtevergabe noch die Annahme, dass die gesamte Datenbank ausgefallen ist.

    37. JSON in Oracle – In der Spalte steckt ein ganzes Dokument

    JSON von Grund auf verstehen, lesen und mit SQL auswerten.

    Lernkompass
    Einfach gesagt JSON beschreibt zusammengehörige Daten als Text. Darin können einzelne Werte, Gruppen und ganze Listen stehen.
    Warum ist das wichtig? Anwendungen tauschen solche Dokumente aus. Als DBA solltest du ihren Aufbau erkennen und ihren Inhalt gezielt prüfen können.
    Nach diesem Kapitel Du kannst ein JSON-Dokument erklären, typische Fehler erkennen und kleine Oracle-Abfragen samt Ergebnis nachvollziehen.

    Einführung: JSON steht für JavaScript Object Notation und ist ein Format zur Darstellung strukturierter Daten. Ein Dokument kann einzelne Werte, benannte Eigenschaften, Listen und ineinander verschachtelte Objekte enthalten. Es beschreibt Daten, keinen auszuführenden Programmablauf. In Oracle lässt sich ein solches Dokument speichern und mit SQL untersuchen; seine innere Struktur muss dabei ausdrücklich angesprochen werden.

    Das Kapitel entwickelt aus dem vorhandenen Artikelbeispiel eine Bestellung. Zuerst lernst du die Schreibweise zu lesen, danach folgen Pfade und SQL/JSON-Funktionen. Du siehst, wie einzelne Werte oder Ergebniszeilen aus einem Dokument entstehen. Die Aussagen zur Speicherung beziehen sich auf Oracle 19c; JSON-Funktionen sind nicht mit einem eigenständigen SQL-Datentyp JSON in dieser Version gleichzusetzen.

    Oracle 19c: fachliche Grundlage

    Deutschsprachiger Einstieg bei Oracle:

    Diese allgemeinen Einführungen sind keine Oracle-19c-Befehlsreferenz. Aussagen zu Syntax, View-Spalten, Editionen und Voraussetzungen werden anhand der versionsbezogenen technischen Handbücher geprüft.

    1. Was ist JSON überhaupt?

    JSON steht für JavaScript Object Notation. Es ist ein Format, mit dem Programme Daten als Text darstellen und austauschen. Der Name beschreibt seinen Ursprung; verwenden lässt es sich auch mit anderen Programmiersprachen. JSON selbst enthält keine Programmschritte.

    Stell dir einen ausgefüllten Bestellzettel vor: Bestellnummer, Kunde und bestellte Artikel gehören zusammen. Ein JSON-Dokument hält diese Angaben in einer Form fest, die Menschen lesen und Programme zerlegen können. „Dokument“ bedeutet hier eine zusammengehörige Datenbeschreibung, keine Word-Datei und kein eingescanntes Formular.

    JSON-Beispiel
    {
      "artikel": "Notizbuch",
      "preis": 12.5,
      "lieferbar": true
    }

    Du kannst das bereits ohne SQL lesen: Der Artikel heißt Notizbuch, sein Preis beträgt 12,50 und er ist lieferbar. Welche Währung gemeint ist, legt das Beispiel noch nicht fest. Für eine echte Schnittstelle müsste auch diese Vereinbarung eindeutig sein.

    2. Wofür wird JSON gebraucht?

    Ein Onlineshop kann eine Bestellung an ein Lagerprogramm senden. Das Lagerprogramm braucht dafür die Artikel und Mengen, aber nicht die komplette Shopoberfläche. Beide Seiten vereinbaren die Feldnamen und übertragen die Angaben als JSON. Ein anderes Beispiel ist eine Wetteranwendung, die Temperatur und Ort von einem Dienst abruft.

    Eine API ist eine vereinbarte Schnittstelle zwischen Programmen. Häufig wird JSON im Inhalt einer HTTP-Anfrage oder -Antwort übertragen. HTTP übernimmt dabei den Transport; JSON beschreibt den Aufbau der übertragenen Daten. Auch eine Datei mit der Endung .json oder eine Datenbankspalte kann denselben Inhalt enthalten. Die Dateiendung allein bestätigt noch keinen gültigen Inhalt.

    Der Ablauf im Bestellbeispiel ist konkret: Der Shop sammelt die Eingaben, erzeugt daraus JSON und sendet es. Das empfangende Programm liest die Struktur, prüft die Angaben und verarbeitet die Bestellung. Dieses Einlesen heißt Parsen. Dabei wird zum Beispiel aus dem Text einer Artikelliste eine Liste, mit der das Programm arbeiten kann.

    3. Ein Feld besteht aus Name und Wert

    Bei "artikel": "Notizbuch" heißt das Feld artikel; sein Wert ist Notizbuch. Den Feldnamen nennt man auch Schlüssel oder Key. Das ist hier keine Aussage über einen Primärschlüssel in einer Datenbank.

    ZeichenBedeutung im Beispiel
    { }Begrenzt ein Objekt: eine Gruppe benannter Angaben.
    :Trennt den Feldnamen von seinem Wert.
    ,Trennt aufeinanderfolgende Felder oder Listenelemente.
    " "Kennzeichnet Feldnamen und Textwerte.

    Einrückungen und Zeilenumbrüche zwischen den Bestandteilen machen das Dokument übersichtlicher. Dasselbe Dokument kann auch in einer einzigen Zeile stehen. Innerhalb eines Textwertes bleiben Leerzeichen dagegen Bestandteil des Textes: "Artikel A" ist etwas anderes als "ArtikelA".

    4. Welche Arten von Werten gibt es?

    WertartBeispielSo liest du es
    Text / String"Notizbuch"Eine Zeichenfolge.
    Zahl12.5Ein numerischer Wert.
    Wahrheitswert / BooleantrueWahr; das Gegenstück heißt false.
    NullwertnullEin ausdrücklich gesetzter Nullwert.
    Objekt{"ort":"Bonn"}Eine Gruppe benannter Angaben.
    Array / Liste["rot","blau"]Eine geordnete Folge von Werten.

    Achte auf 12.5 gegenüber "12.5": Das Erste ist eine Zahl, das Zweite Text. Eine Kundennummer "0017" kann absichtlich Text sein, damit führende Nullen erhalten bleiben. Ein Preis wird für Berechnungen üblicherweise als Zahl vereinbart. Die Wahl richtet sich nach der Bedeutung der Angabe.

    JSON-Zahlen verwenden einen Dezimalpunkt und kein Währungszeichen. Für ein Datum gibt es keinen eigenen grundlegenden JSON-Datentyp. "2026-10-05" ist zunächst Text. Eine Anwendung kann vereinbaren, diesen Text als Kalenderdatum zu interpretieren. Ob der Tag tatsächlich existiert, muss sie zusätzlich prüfen.

    5. Objekte und Arrays unterscheiden

    JSON-Beispiel
    {
      "kunde": {"name": "Alex", "ort": "Bonn"},
      "farben": ["rot", "blau"]
    }

    kunde enthält ein Objekt. Seine Angaben haben Namen: name und ort. farben enthält dagegen ein Array mit zwei Einträgen. Dort entscheidet die Position, welcher Eintrag der erste oder zweite ist.

    Die Reihenfolge der Felder in einem Objekt ist für deren Bedeutung nicht maßgeblich. Ein Array ist hingegen geordnet. Bei einem JSON-Pfad beginnt die Zählung seiner Positionen bei 0: Position 0 ist der erste Eintrag, Position 1 der zweite. Leere Gruppen sind möglich: {} ist ein leeres Objekt, [] ein leeres Array.

    Ein Array darf nach dem JSON-Format verschiedene Wertarten enthalten. Für eine verständliche Schnittstelle ist es häufig sinnvoll, eine einheitliche Liste zu vereinbaren: beispielsweise ausschließlich Artikelobjekte mit denselben Pflichtfeldern.

    6. Ein vollständiges, überschaubares Bestellbeispiel

    JSON-Beispiel
    {
      "bestellnummer": 4711,
      "kunde": {"name": "Alex", "ort": "Bonn"},
      "bezahlt": false,
      "rabatt": null,
      "waehrung": "EUR",
      "positionen": [
        {"artikel": "Notizbuch", "menge": 2, "einzelpreis": 12.5},
        {"artikel": "Stift", "menge": 1, "einzelpreis": 5}
      ]
    }

    Lies von außen nach innen: Die äußeren geschweiften Klammern umfassen eine Bestellung. Darin liegt das Kundenobjekt. Die eckigen Klammern bei positionen umfassen eine Liste mit zwei Artikelobjekten. Jeder Artikel hat einen Namen, eine Menge und einen Einzelpreis.

    Es sind eine Bestellung, zwei Positionen und insgesamt drei Stück. Diese drei Zahlen beschreiben unterschiedliche Dinge. Der Warenwert beträgt 2 × 12,50 + 1 × 5,00 = 30,00 EUR. Versandkosten und Steuern sind in diesem Lernbeispiel nicht modelliert. rabatt: null interpretieren wir ausdrücklich als „noch nicht angegeben“, nicht als zugesicherte Null-Prozent-Ermäßigung.

    7. Welche Schreibregeln muss ich beachten?

    Für standardkonformes JSON stehen Feldnamen und Texte in doppelten Anführungszeichen. Zwischen zwei Feldern beziehungsweise Arrayeinträgen steht ein Komma; hinter dem letzten Eintrag steht keines. Verwende die kleingeschriebenen Werte true, false und null. Kommentare gehören nicht zum Standardformat.

    Absichtlich fehlerhaftes JSON
    {
      artikel: "Notizbuch",
      "menge": 2,
    }

    Korrektur: Der Feldname artikel braucht doppelte Anführungszeichen. Außerdem muss das Komma nach 2 weg. Die korrigierte Fassung lautet:

    Korrigierte Fassung
    {"artikel":"Notizbuch","menge":2}

    Ein Anführungszeichen innerhalb eines Textes wird als \" geschrieben, ein Backslash als \\ und ein Zeilenumbruch innerhalb des Textwertes als \n. So erkennt der Leser des Formats, dass das Zeichen zum Wert gehört. Echte neue Zeilen zwischen den Feldern sind dagegen normale Formatierung.

    Text mit Sonderzeichen
    {"hinweis":"Farbe \"blau\"","pfad":"C:\\Daten","text":"Zeile 1\nZeile 2"}

    8. Gültige Schreibweise ist noch keine fachliche Richtigkeit

    JSON-Beispiel
    {"artikel":"Stift","menge":-3,"lieferdatum":"2026-02-31"}

    Diese Schreibweise ist gültiges JSON. Für eine normale Neubestellung sind die Angaben trotzdem problematisch: Die Menge ist negativ und der genannte Februartag existiert nicht. Ein Parser prüft den Aufbau; er kennt nicht automatisch die Geschäftsregeln des Shops.

    Eine Schnittstellenvereinbarung muss deshalb zusätzlich beantworten: Welche Felder sind erforderlich? Welcher Typ ist erlaubt? Welche Wertebereiche gelten? Dürfen weitere Felder vorkommen? Solche Regeln lassen sich beispielsweise mit JSON Schema beschreiben und mit einem geeigneten Validator prüfen. Das ist eine zusätzliche Prüfung und nicht bereits durch das Dateiformat erledigt.

    Vermeide außerdem doppelte Feldnamen innerhalb desselben Objekts. Bei {"menge":2,"menge":7} ist die beabsichtigte Menge unklar. In Oracle ist nicht festgelegt, welchen der gleichnamigen Werte die Pfadauswertung verwendet. Einfache Schreibweisen mit eindeutigen Namen vermeiden diese Fehlerquelle.

    9. Fehlend, null, leer, 0 und false sind verschieden

    BeispielBedeutung im vereinbarten Bestellmodell
    {}Ein Rabattfeld wurde überhaupt nicht übertragen.
    {"rabatt":null}Das Feld existiert, der Rabatt ist nicht angegeben.
    {"rabatt":0}Der Rabatt ist ausdrücklich null Prozent.
    {"hinweis":""}Der Hinweis ist ein Text mit Länge null.
    {"bezahlt":false}Die Bestellung ist ausdrücklich nicht bezahlt.

    Die fachliche Bedeutung von null muss vereinbart sein. Sie steht nicht automatisch für „unbekannt“, „gelöscht“ oder „nicht zutreffend“. Diese Bedeutungen kann eine Anwendung festlegen. Besonders bei Änderungsnachrichten macht es einen Unterschied, ob ein Feld nicht geschickt wird oder mit einem Nullwert geschickt wird.

    10. Warum nicht alles in normale Tabellenspalten schreiben?

    Haben alle Bestellungen dieselben Pflichtangaben und werden sie häufig gemeinsam ausgewertet, sind normale Spalten und eine eigene Positionstabelle oft gut verständlich. Datentypen, Fremdschlüssel und weitere Regeln lassen sich dort direkt ausdrücken. JSON ist hilfreich, wenn ein vollständiges Austauschdokument erhalten bleiben soll oder optionale Angaben je nach Fall variieren.

    Ein Beispiel: Ein Shop erhält für Bücher Angaben zur Ausgabe, für Kleidung Angaben zur Größe. Solche zusätzlichen Eigenschaften können in JSON liegen, während Bestellnummer und Eingangszeit normale Spalten bleiben. Die Anwendung braucht dennoch klare Vereinbarungen darüber, was in diesen Dokumenten stehen darf.

    JSON ersetzt weder SQL noch automatisch ein gutes Datenmodell. Auch wird eine Abfrage nicht allein dadurch schneller, dass Daten in einem Dokument stehen. Ein DBA muss weiterhin Zugriffswege, Datenmenge und tatsächlich benötigte Auswertungen betrachten. Für den Einstieg genügt: Relationale Daten und JSON können in derselben Oracle-Datenbank zusammenarbeiten.

    11. Was bedeutet „In der Spalte steckt ein ganzes Dokument“?

    Eine Tabellenzeile kann eine normale ID-Spalte und eine Dokumentspalte besitzen. In der Dokumentspalte liegt dann beispielsweise der gesamte Text aus Abschnitt 6, einschließlich Kunde und Positionen. Die Positionen sind in dieser Speicherung keine zusätzlichen Zeilen derselben Tabelle.

    IDDOKUMENT – stark gekürzte Anzeige
    4711{"bestellnummer":4711, ...}

    Die drei Punkte in dieser Übersicht sind nur eine Kürzung der Anzeige und kein gültiger JSON-Inhalt. Das vollständige Dokument bleibt für das Programm strukturiert lesbar. Oracle kann deshalb gezielt den Kundennamen oder die einzelnen Positionen herauslesen, ohne dass du selbst nach Anführungszeichen suchen musst.

    Bezug auf Oracle Database 19c: Für die hier behandelte textuelle Speicherung werden VARCHAR2, CLOB oder BLOB verwendet. Ein CLOB speichert umfangreiche Zeichendaten; ein BLOB speichert Bytes. Eine BLOB-Spalte macht Text nicht automatisch zu einem speziellen binären JSON-Format. Die Beispiele dieses Kapitels benötigen keinen eigenen SQL-Datentyp namens JSON.

    Eine IS JSON-Prüfbedingung kann die Dokumentspalte auf gültigen Aufbau prüfen. Eine Pflichtbelegung benötigt zusätzlich eine passende Nullregel, zum Beispiel NOT NULL. Auch mit JSON bleibt die Tabelle ein Datenbankobjekt mit Spalten, Rechten und Speicherbedarf. Flexibel ist der Inhalt des Dokuments, nicht das völlige Fehlen von Regeln.

    12. Die Beispiele ohne eigene Tabelle ausprobieren

    Die folgenden Abfragen enthalten ihre Daten direkt. Du brauchst eine Oracle-19c-Verbindung und die Möglichkeit, SELECT-Abfragen auszuführen, beispielsweise in SQL*Plus oder SQL Developer. Du brauchst dafür weder SYS noch eine neu angelegte Beispieltabelle. Kopiere jeweils den gesamten SQL-Block bis zum Semikolon.

    Ein Dokument als Abfrageeingabe
    WITH demo AS (
      SELECT '{"artikel":"Stift","menge":2}' AS dokument
      FROM dual
    )
    SELECT dokument
    FROM demo;
    Fiktive Beispielausgabe:
    DOKUMENT
    {"artikel":"Stift","menge":2}

    WITH demo AS (...) gibt einem Zwischenergebnis innerhalb dieser einen Abfrage den Namen demo. DUAL ermöglicht in Oracle die Auswahl eines festen Ausdrucks. AS dokument benennt die Ergebnisspalte. Hier wird keine Tabelle gespeichert; nach Ende der Abfrage steht demo nicht als eigenes Objekt zur Verfügung.

    Die äußeren einfachen Anführungszeichen gehören zu SQL. Sie begrenzen den Text, den SQL als Eingabe erhält. Die doppelten Anführungszeichen innerhalb dieses Textes gehören zu JSON. Unsere Beispiele vermeiden Apostrophe in den Daten, damit sich beide Ebenen zunächst leicht unterscheiden lassen.

    13. Den Aufbau in Oracle prüfen

    Standardnahe Syntaxprüfung
    WITH demo AS (
      SELECT 1 AS nr, '{"artikel":"Stift","menge":2}' AS dokument
      FROM dual
      UNION ALL
      SELECT 2, '{artikel:"Stift","menge":2}'
      FROM dual
    )
    SELECT nr,
           CASE WHEN dokument IS JSON STRICT
                THEN 'gueltig' ELSE 'ungueltig' END AS json_status
    FROM demo
    ORDER BY nr;
    Fiktive Beispielausgabe:
    NRJSON_STATUS
    1gueltig
    2ungueltig

    Zeile 2 scheitert an dem unquotierten Feldnamen artikel. STRICT ist hier bewusst angegeben: Oracle akzeptiert ohne diesen Zusatz auch eine lockerere Schreibweise. Dass Oracle einen Text einlesen kann, beweist daher allein noch keine standardkonforme Schreibweise. Die Prüfung sagt außerdem nichts darüber aus, ob Menge 2 fachlich sinnvoll ist.

    Eindeutige Feldnamen werden gesondert mit WITH UNIQUE KEYS verlangt. STRICT allein verbietet doppelte Namen nicht. Unsere Dokumente verwenden stets eindeutige Namen. Eine SQL-NULL-Eingabe ist nochmals ein eigener Fall; sie darf nicht mit dem Text eines JSON-Dokuments verwechselt werden.

    14. Mit einem Pfad zur richtigen Stelle navigieren

    Ein JSON-Pfad beschreibt den Weg innerhalb eines Dokuments. Das Dollarzeichen $ steht für den Ausgangspunkt: das Dokument, das du der Funktion übergibst. Ein Punkt führt zu einem benannten Feld, eckige Klammern zu einer Position in einer Liste.

    Pfad im BestellbeispielZiel
    $.bestellnummer4711
    $.kunde.nameAlex
    $.positionen[0].artikelNotizbuch, also der erste Artikel
    $.positionen[1].menge1, also die Menge der zweiten Position
    $.positionen[*]Alle Positionen; * steht hier für alle Arrayeinträge.

    Feldnamen werden dabei genau unterschieden: kunde und Kunde sind nicht derselbe Name. Prüfe bei einem scheinbar leeren Ergebnis daher zuerst den tatsächlich gespeicherten Namen und die Ebene. $.name erreicht nicht den Namen, der innerhalb von kunde liegt.

    15. JSON_VALUE: einen einzelnen Wert als SQL-Wert lesen

    Bestellnummer und Kundenname lesen
    WITH demo AS (
      SELECT '{"bestellnummer":4711,"kunde":{"name":"Alex"}}' AS dokument
      FROM dual
    )
    SELECT JSON_VALUE(dokument, '$.bestellnummer'
                      RETURNING NUMBER ERROR ON ERROR) AS bestellnummer,
           JSON_VALUE(dokument, '$.kunde.name'
                      RETURNING VARCHAR2(30) ERROR ON ERROR) AS kundenname
    FROM demo;
    Fiktive Beispielausgabe:
    BESTELLNUMMERKUNDENNAME
    4711Alex

    Die erste Funktion folgt dem Weg zur Bestellnummer und liefert mit RETURNING NUMBER einen SQL-Zahlenwert. Die zweite liefert einen Text mit höchstens der angegebenen Länge. Aus einem Dokument entstehen hier zwei Ergebnisspalten, aber weiterhin nur eine Ergebniszeile.

    ERROR ON ERROR macht Laufzeitprobleme beim Auslesen sichtbar. Ohne ausdrückliche Fehlerregel liefert JSON_VALUE standardmäßig bei vielen solchen Problemen SQL NULL. Ein leer erscheinendes Ergebnis beweist deshalb nicht, dass das Dokument leer ist. Eine bewusst erlaubte fehlende Angabe braucht eine passende gesonderte Fehler- beziehungsweise Leerwertregel.

    Für diese einfachen Aufrufe ist JSON_VALUE für einzelne Werte gedacht, nicht für das gesamte Kundenobjekt oder die komplette Artikelliste. Ohne RETURNING ist der Standard-Rückgabetyp VARCHAR2(4000). Ein JSON-Wahrheitswert kann in Oracle-19c-SQL als Text true oder false zurückkommen. Eine Zahlenkonvertierung ist außerdem kein vollständiger Nachweis dafür, dass die gesamte Eingabe dem vereinbarten Datenmodell entspricht.

    16. JSON_QUERY: eine zusammengehörige Gruppe behalten

    Das Kundenobjekt als JSON ausgeben
    WITH demo AS (
      SELECT '{"bestellnummer":4711,"kunde":{"name":"Alex","ort":"Bonn"}}' AS dokument
      FROM dual
    )
    SELECT JSON_QUERY(dokument, '$.kunde' ERROR ON ERROR) AS kunde_json
    FROM demo;
    Fiktive Beispielausgabe:
    KUNDE_JSON
    {"name":"Alex","ort":"Bonn"}

    Das Ergebnis enthält weiterhin ein JSON-Objekt mit Feldnamen und Klammern. Du bekommst also nicht nur Alex, sondern die zusammengehörigen Kundenangaben. Ebenso lässt sich ein komplettes Array auswählen. Für unsere Oracle-19c-Beispiele gilt die einfache Entscheidung: Einzelwert auslesen mit JSON_VALUE; Objekt oder Array als JSON erhalten mit JSON_QUERY. Die genaue Leerzeichenformatierung ist für den Inhalt unerheblich.

    17. JSON_EXISTS: fehlt das Feld oder ist sein Wert null?

    Vorhandensein und ausgelesenen Wert trennen
    WITH demo AS (
      SELECT 1 AS nr, '{"rabatt":null}' AS dokument FROM dual
      UNION ALL
      SELECT 2, '{}' FROM dual
      UNION ALL
      SELECT 3, '{"rabatt":0}' FROM dual
    )
    SELECT nr,
           CASE WHEN JSON_EXISTS(dokument, '$.rabatt')
                THEN 'ja' ELSE 'nein' END AS feld_vorhanden,
           NVL(JSON_VALUE(dokument, '$.rabatt'), '(SQL NULL)') AS wert
    FROM demo
    ORDER BY nr;
    Fiktive Beispielausgabe:
    NRFELD_VORHANDENWERT
    1ja(SQL NULL)
    2nein(SQL NULL)
    3ja0

    In Zeile 1 findet JSON_EXISTS das Feld, obwohl sein Wert null ist. In Zeile 2 gibt es das Feld nicht. JSON_VALUE allein liefert in dieser Abfrage in beiden Fällen SQL NULL. Erst die zusätzliche Existenzprüfung macht den Unterschied sichtbar. In Zeile 3 ist der vorhandene Wert die Zahl 0.

    NVL ersetzt SQL NULL lediglich für unsere Anzeige durch den Text (SQL NULL). Dieser Text steht nicht im Dokument. Ein leerer JSON-Text "" ist nochmals ein anderer Eingabewert; Oracle behandelt einen leeren VARCHAR2-Wert allerdings ebenfalls als SQL NULL. Die Kombination aus Existenzprüfung und Textausgabe unterscheidet daher nicht automatisch jede denkbare Art leerer Angaben.

    18. JSON_TABLE: aus der Artikelliste werden Ergebniszeilen

    Für eine Liste brauchst du häufig eine Zeile je Eintrag. JSON_TABLE beschreibt dazu, welche Arrayeinträge zu Zeilen werden und welche Felder die Spalten liefern. Es entsteht ein Abfrageergebnis, keine dauerhaft neu angelegte Tabelle.

    Zwei Positionen als SQL-Ergebnis
    WITH demo AS (
      SELECT '{"positionen":[
        {"artikel":"Notizbuch","menge":2,"einzelpreis":12.5},
        {"artikel":"Stift","menge":1,"einzelpreis":5}
      ]}' AS dokument
      FROM dual
    )
    SELECT j.pos, j.artikel, j.menge, j.einzelpreis
    FROM demo d,
         JSON_TABLE(d.dokument, '$.positionen[*]' ERROR ON ERROR
           COLUMNS (
             pos         FOR ORDINALITY,
             artikel     VARCHAR2(30) PATH '$.artikel',
             menge       NUMBER       PATH '$.menge',
             einzelpreis NUMBER       PATH '$.einzelpreis'
           )
         ) j
    ORDER BY j.pos;
    Fiktive Beispielausgabe:
    POSARTIKELMENGEEINZELPREIS
    1Notizbuch212,5
    2Stift15

    So arbeitet die Abfrage: demo d stellt das Dokument bereit. JSON_TABLE liest daraus bei $.positionen[*] beide Einträge. Innerhalb von COLUMNS beziehen sich die Pfade auf den jeweiligen Eintrag: $.artikel meint dort den Artikel dieser Position. Die Aliase d und j sind kurze Namen für die beiden Abfragequellen.

    FOR ORDINALITY erzeugt die Nummerierung 1 und 2. Das ist eine SQL-Ausgabespalte; der JSON-Pfad auf den ersten Arrayeintrag verwendet weiterhin den Index 0. ORDER BY sorgt für die gewünschte Anzeigereihenfolge. Ohne eine Sortierung solltest du dich bei SQL-Ergebnissen nicht auf eine bestimmte Reihenfolge verlassen.

    Die Abfrage setzt die hier gezeigte, vollständig befüllte Artikelliste voraus. Eine leere Liste hat keinen passenden Eintrag für diesen Arraypfad. Mit dem hier ausdrücklich gesetzten ERROR ON ERROR wird das als Fehler gemeldet. Soll eine Bestellung auch ohne Positionen im Ergebnis bleiben, muss die Abfrage diese Anforderung gesondert berücksichtigen; das ist nicht die Aufgabe dieses ersten Listenbeispiels.

    19. Vollständige Aufgabe: den Warenwert berechnen

    Aufgabe: Ermittle für die beiden Artikel die Anzahl der Positionen, die gesamte Stückzahl und den Warenwert. Die Bestelldaten sind dieselben wie eben. Der Rechenweg lautet: je Position Menge mal Einzelpreis; anschließend alle Positionswerte addieren.

    Vollständige Lösung mit eigenen Beispieldaten
    WITH demo AS (
      SELECT '{"positionen":[
        {"artikel":"Notizbuch","menge":2,"einzelpreis":12.5},
        {"artikel":"Stift","menge":1,"einzelpreis":5}
      ]}' AS dokument
      FROM dual
    )
    SELECT COUNT(*) AS positionen,
           SUM(j.menge) AS stueckzahl,
           SUM(j.menge * j.einzelpreis) AS warenwert
    FROM demo d,
         JSON_TABLE(d.dokument, '$.positionen[*]' ERROR ON ERROR
           COLUMNS (
             pos         FOR ORDINALITY,
             artikel     VARCHAR2(30) PATH '$.artikel',
             menge       NUMBER       PATH '$.menge',
             einzelpreis NUMBER       PATH '$.einzelpreis'
           )
         ) j;
    Fiktive Beispielausgabe:
    POSITIONENSTUECKZAHLWARENWERT
    2330

    Ergebnis nachvollziehen: JSON_TABLE liefert zwei Zeilen, deshalb ist COUNT(*) gleich 2. Die Mengen 2 und 1 ergeben drei Stück. Die Positionswerte 25 und 5 ergeben einen Warenwert von 30. Im vereinbarten Beispiel sind das 30 EUR. Diese Abfrage berechnet keinen Rabatt, keine Steuern und keine Versandkosten.

    Die Zahl 2 ist hier nicht die Anzahl der Bestellungen. Nach dem Aufteilen stehen die Zeilen für Positionen. Diese Unterscheidung ist bei echten Berichten entscheidend: Ein Betrag auf Bestellebene darf nicht für jede Position erneut addiert werden.

    20. Wenn das Ergebnis unerwartet leer ist: ein gelöster Fehlerfall

    Ausgangslage: Das Dokument enthält einen Kunden, aber die folgende Abfrage zeigt keinen Namen. Warum?

    Fehlerfall: richtiger Feldname auf der falschen Ebene
    WITH demo AS (
      SELECT '{"kunde":{"name":"Alex"}}' AS dokument FROM dual
    )
    SELECT NVL(JSON_VALUE(dokument, '$.name'), '(SQL NULL)') AS kundenname
    FROM demo;
    Fiktive Beispielausgabe:
    KUNDENNAME
    (SQL NULL)

    Vorgehen: Lies zuerst die äußere Ebene. Dort steht kunde, nicht name. Öffne gedanklich das Kundenobjekt; erst darin liegt name. Korrigiere deshalb den Pfad auf $.kunde.name. Der Datensatz muss nicht verändert werden.

    Korrigierte Abfrage
    WITH demo AS (
      SELECT '{"kunde":{"name":"Alex"}}' AS dokument FROM dual
    )
    SELECT JSON_VALUE(dokument, '$.kunde.name'
                      RETURNING VARCHAR2(30) ERROR ON ERROR) AS kundenname
    FROM demo;
    Fiktive Beispielausgabe:
    KUNDENNAME
    Alex

    Übertrage diese Reihenfolge auf eigene Fälle: Dokumentaufbau prüfen, Feldnamen vergleichen, Pfad Ebene für Ebene verfolgen, Einzelwert oder Gruppe unterscheiden und erst dann Rückgabetyp sowie Fehlerregel untersuchen. Eine leere Anzeige ist ein Anlass zur Prüfung, noch keine Fehlerursache.

    21. Auch die Gegenrichtung gehört dazu: JSON erzeugen

    Bislang haben wir JSON ausgelesen. Ein Programm kann aber auch Datenbankwerte als JSON zurückgeben. Dafür sollte es die vorgesehenen Erzeugungsfunktionen verwenden, statt Anführungszeichen und Kommas von Hand zusammenzukleben.

    Aus SQL-Werten ein JSON-Objekt erzeugen
    SELECT JSON_OBJECT(
             'artikel' VALUE 'Stift',
             'menge'   VALUE 2
           ) AS dokument
    FROM dual;
    Fiktive Beispielausgabe:
    DOKUMENT
    {"artikel":"Stift","menge":2}

    Die Feldnamen und der Text Stift stehen hier in SQL-Schreibweise mit einfachen Anführungszeichen. JSON_OBJECT erzeugt daraus JSON mit doppelten Anführungszeichen. Die SQL-Zahl 2 wird als Zahl ausgegeben. So übernimmt die Funktion den korrekten Aufbau und die erforderliche Maskierung von Textzeichen.

    22. Was sollte ein DBA nach dieser Einführung prüfen können?

    1. Speicherung verstehen: Welche Tabelle und Spalte enthalten das Dokument? Welche Angaben liegen daneben in normalen Spalten?
    2. Vereinbarung lesen: Welche Felder sind Pflicht, welche Typen und Leerwerte sind vorgesehen?
    3. Beispiel untersuchen: Ist die Schreibweise gültig, und stimmen die fachlichen Angaben?
    4. Passend auswerten: Einzelwert, ganze Gruppe, Existenz eines Feldes oder eine Liste von Ergebniszeilen?
    5. Ergebnis einordnen: Zählt die Abfrage Dokumente, Positionen oder Stückzahlen? Was bedeutet eine Nullanzeige?

    Für den Einstieg musst du keine komplexen JSON-Indizes oder mehrstufigen Schnittstellen entwerfen. Entscheidend ist, die gespeicherten Angaben sicher lesen und ein kleines Ergebnis begründen zu können.

    23. Quellen und Geltungsbereich

    Die Oracle-Beispiele beziehen sich auf Oracle Database 19c. Die Grundlagen folgen dem JSON-Standard; die Aufgaben und Daten dieses Kapitels sind eigens erstellte Lernbeispiele. Die gezeigten Ergebnistabellen sind didaktisch hergeleitet und nicht als Protokolle einer hier ausgeführten Oracle-Sitzung zu verstehen.

    Selbst rechnen, dann das Dokument prüfen

    Nutze die vollständige Warenwertabfrage aus Abschnitt 19. Sage zuerst voraus, was passiert, wenn du ausschließlich die Menge der Notizbücher von 2 auf 3 änderst. Die Anzahl der Positionen bleibt 2, die Stückzahl steigt auf 4 und der Warenwert auf 42,50 EUR. Es ändert sich der Inhalt einer Position, nicht die Anzahl der Positionen. Diese Änderung findet nur im mitgelieferten Textliteral deiner SELECT-Übung statt.

    Wenn dein Ergebnis abweicht, vergleiche Dokument, Pfad und Ergebniszeilen von JSON_TABLE, bevor du die Summe prüfst. Damit trennst du das Aufteilen des Dokuments von der anschließenden Rechnung.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. JSON beschreibt Werte in Objekten und Arrays. Gültige JSON-Syntax garantiert noch nicht, dass Pflichtangaben und fachliche Regeln erfüllt sind.
    2. Ein fehlendes Feld, JSON null, eine leere Zeichenfolge, 0 und false bedeuten Unterschiedliches. Bei der Überführung in SQL muss diese Unterscheidung bewusst geprüft werden.
    3. In Oracle 19c können JSON-Dokumente in dafür geeigneten herkömmlichen Spaltentypen gespeichert und mit SQL/JSON-Funktionen verarbeitet werden. Ein Dokument in einer Spalte bleibt intern strukturiert.
    4. JSON_VALUE liest einen skalaren SQL-Wert, JSON_QUERY einen JSON-Ausschnitt und JSON_EXISTS prüft einen Pfad. JSON_TABLE bildet Dokumentstrukturen auf Ergebniszeilen und Spalten ab.
    5. Pfad, Rückgabetyp sowie Verhalten bei fehlenden Werten oder Fehlern bestimmen das Ergebnis. Ein unerwartetes NULL ist deshalb noch kein Beweis, dass das gesamte Dokument leer ist.

    Lernzielkontrolle

    Beantworte die Fragen zunächst selbst. Öffne anschließend die jeweilige Frage, um die Lösung mit Begründung zu lesen.

    Frage 1: Was unterscheidet die JSON-Werte 12.5 und "12.5"?

    Lösung: 12.5 ist eine Zahl; "12.5" ist Text. Für einen Preis ist im Lernmodell eine Zahl vereinbart. Gültige JSON-Schreibweise allein bestätigt noch nicht den erwarteten Typ eines Feldes.

    Frage 2: Wie erreichst du im Bestellbeispiel den Namen des ersten Artikels?

    Lösung: Mit dem Pfad $.positionen[0].artikel. $ beginnt beim Dokument, positionen führt zur Liste, [0] wählt den ersten Eintrag und artikel dessen Feld. Die Zählung im JSON-Array beginnt bei null.

    Frage 3: Warum genügt JSON_VALUE allein nicht, um ein fehlendes Feld von JSON null zu unterscheiden?

    Lösung: Im gezeigten Aufruf kann beides SQL NULL liefern. JSON_EXISTS prüft zusätzlich das Vorhandensein: Ein vorhandenes Feld mit JSON null wird gefunden, ein fehlendes nicht. Die Rückgabe hängt außerdem von der gewählten Fehler- und Leerwertbehandlung ab.

    Frage 4: Zwei Notizbücher kosten je 12,50 EUR, ein Stift 5 EUR. Wie viele Positionen, Stücke und welchen Warenwert enthält die Bestellung?

    Lösung: Zwei Positionen, drei Stück und 30 EUR Warenwert. Rechnung: 2 × 12,50 + 1 × 5 = 30. Nach JSON_TABLE zählen die zwei Ergebniszeilen Positionen, nicht Bestellungen.

    Frage 5: Ist ein Dokument mit Menge −3 automatisch ungültiges JSON?

    Lösung: Nein. Die Schreibweise einer negativen Zahl ist zulässig. Ob die Menge fachlich erlaubt ist, entscheidet eine zusätzliche Geschäftsregel. Syntaxprüfung und fachliche Prüfung sind getrennte Aufgaben.

    Frage 6: Die Notizbuchmenge steigt von 2 auf 3 bei 12,50 EUR je Stück. Der Stift kostet weiterhin 5 EUR. Wie lautet das Ergebnis?

    Lösung: Zwei Positionen, vier Stück und 42,50 EUR. Die Zahl der Positionen bleibt gleich, nur eine Menge ändert sich.

    Frage 7: Ein JSON-Pfad trifft kein Feld. Welcher nächste Schritt hilft?

    Lösung: Vergleiche die tatsächlichen Ebenen und die genaue Schreibweise des Feldnamens mit dem Pfad. Ein NULL-Ergebnis allein erklärt nicht, ob ein Feld fehlt oder eine Fehlerregel den Befund verdeckt.

    Frage 8: Ist ein erfolgreicher JSON-Syntaxtest eine Prüfung aller Geschäftsregeln?

    Lösung: Nein. Ein Dokument kann syntaktisch gültig sein und einen unzulässigen Preis oder eine unzulässige Menge enthalten. Solche Regeln werden gesondert geprüft.

    38. APIs und REST – Wie kommen Oracle-Daten in eine Anwendung?

    Eine Schnittstelle vom ersten Aufruf bis zur nachvollziehbaren Fehlerdiagnose verstehen.

    Lernkompass
    Einfach gesagt Eine Anwendung fragt über eine vereinbarte Adresse nach Daten. Ein Dienst verarbeitet die Anfrage und schickt eine Antwort zurück.
    Warum ist das wichtig? Zwischen Bildschirm und Datenbank liegen weitere Komponenten. Ihre Antworten helfen, Fehler an der richtigen Stelle zu suchen.
    Nach diesem Kapitel Du kannst einen HTTP-Aufruf lesen, ORDS einordnen und typische Fehler mit einer begründeten Vorgehensweise untersuchen.

    Einführung: Eine API ist eine definierte Schnittstelle, über die Programme Funktionen oder Daten nutzen. Dieses Kapitel betrachtet Web-APIs: Eine Anwendung sendet eine Anfrage an einen Endpunkt und erhält eine Antwort. Bei REST-orientierten Diensten werden Ressourcen über Adressen und HTTP-Methoden angesprochen. JSON kann dabei das Datenformat sein; es ist nicht die Schnittstelle selbst.

    An der vorhandenen Artikelauskunft verfolgen wir Anfrage, Verarbeitung und Antwort. Du lernst, Adresse, Methode, Statuscode und Inhalt getrennt zu prüfen und einen Fehler einer Schicht zuzuordnen. Oracle REST Data Services, kurz ORDS, wird als möglicher Vermittler zur Datenbank eingeordnet. ORDS hat eine eigene Versionsfolge; Oracle Database 19c allein legt seine Konfiguration nicht fest.

    Oracle ORDS 19.4: fachliche Einordnung

    1. Was ist eine API?

    API steht für Application Programming Interface, also eine Programmierschnittstelle. Sie beschreibt, wie ein Programm eine Funktion oder Daten eines anderen Programms nutzen kann. Dazu gehören die erlaubten Aufrufe, benötigte Angaben und die Form der Antwort. Nicht jede API arbeitet über ein Netzwerk; dieses Kapitel behandelt Web-APIs.

    Stell dir einen Artikelkatalog vor. Die Anwendung möchte wissen, wie Artikel 1001 heißt und was er kostet. Sie muss dafür weder die internen Tabellennamen kennen noch selbst eine Datenbankverbindung öffnen. Sie stellt die vereinbarte Anfrage an den Dienst. Dieser entscheidet, welche Daten er liefert und wer sie erhalten darf.

    Eine API ist damit auch eine Vereinbarung: Heißt das Preisfeld preis oder betrag? Ist die Währung enthalten? Wie wird ein unbekannter Artikel gemeldet? Werden solche Regeln nachträglich geändert, können bestehende Anwendungen scheitern. Verständliche Dokumentation gehört deshalb zur Schnittstelle.

    2. Client, Server und Datenbank auseinanderhalten

    RolleAufgabe im Artikelbeispiel
    ClientEine Anwendung fordert die Artikelauskunft an.
    API-DienstNimmt den Aufruf entgegen, prüft ihn und erstellt die Antwort.
    DatenbankLiefert die benötigten Artikeldaten über SQL.

    „Client“ und „Server“ beschreiben Rollen in einem Austausch, nicht zwingend verschiedene Rechner. ORDS ist gegenüber der aufrufenden Anwendung ein Server und gegenüber der Datenbank ein Client. Eine Datenbankverbindung ist daher etwas anderes als die HTTP-Verbindung der Anwendung zum Dienst.

    Ein Reverse Proxy kann vor dem API-Dienst stehen. Er nimmt Webanfragen an und leitet sie intern weiter. Dadurch können Meldungen schon entstehen, bevor ORDS oder Oracle erreicht werden. Für den Einstieg betrachten wir zuerst den direkten Ablauf und nehmen den Proxy bei der Fehlerdiagnose hinzu.

    3. HTTP, HTTPS, REST und JSON: vier verschiedene Aufgaben

    BegriffWofür steht er hier?
    HTTPRegeln für Anfragen und Antworten im Web.
    HTTPSHTTP über eine durch TLS geschützte Verbindung.
    RESTEin Architekturstil für verteilte Systeme.
    JSONEin mögliches Format für die übertragenen Daten.

    REST bedeutet Representational State Transfer. Eine Ressource wie „Artikel 1001“ wird über eine Adresse angesprochen; die Antwort enthält eine Darstellung dieser Ressource. Das kann JSON sein, muss es aber nicht. Ein Dienst wird nicht allein dadurch REST-konform, dass er JSON zurückschickt.

    Zu REST gehören unter anderem eine einheitliche Schnittstelle, die Trennung von Client und Server, Regeln für Zwischenspeicherung und zustandslose Anfragen. Zustandslos heißt hier: Die einzelne Anfrage enthält die Informationen, die der Dienst für ihre Verarbeitung benötigt. Es bedeutet weder „keine gespeicherten Geschäftsdaten“ noch „für jeden Aufruf eine neue Datenbankverbindung“.

    HTTPS schützt die Übertragung auf der jeweiligen TLS-Verbindung. Es ersetzt keine Berechtigungsprüfung. Wenn ein Proxy TLS beendet und intern weiterleitet, ist die Absicherung dieses weiteren Verbindungswegs eine eigene Aufgabe. JSON selbst verschlüsselt nichts.

    4. Eine Adresse Schritt für Schritt lesen

    Fiktive Adresse unseres Lernbeispiels
    https://api.example/ords/demo/artikel/1001
    TeilBedeutung
    https://Verbindung über HTTPS.
    api.exampleName des angesprochenen Hosts.
    /ords/Im Beispiel gewählter Pfad zum Dienst.
    demo/artikel/Im Beispiel vereinbarter Bereich der Artikelauskunft.
    1001Kennung des angefragten Artikels.

    Eine solche erreichbare Aufrufstelle heißt Endpunkt. Welche Aktion sie ausführt, hängt auch von der HTTP-Methode ab. Der Pfad ist keine automatische Übersetzung eines Oracle-Tabellennamens. Er wird beim Entwurf beziehungsweise bei der Konfiguration des Dienstes festgelegt.

    Die Domain api.example ist ein reservierter Beispielname; dort betreiben wir keinen Dienst. Alle folgenden Pfade, Antworten und Geschäftsregeln sind Teil unseres Lehrmodells. Sie sind keine Zusicherung des Standardverhaltens einer beliebigen ORDS-Installation.

    5. Was bedeuten GET, POST, PUT, PATCH und DELETE?

    MethodeTypische Aufgabe
    GETEine Darstellung abrufen, hier die Artikelauskunft.
    POSTÜbermittelte Daten durch die Zielressource verarbeiten lassen, etwa zum Anlegen einer Bestellung.
    PUTDen Zustand der Zielressource mit der übermittelten Darstellung anlegen oder ersetzen.
    PATCHBeschriebene Teiländerungen an einer Ressource anwenden.
    DELETEDie Zuordnung der Zielressource entfernen; die konkrete fachliche Wirkung legt der Dienst fest.

    Die Methode ist nicht eins zu eins ein SQL-Befehl. POST heißt beispielsweise nicht automatisch INSERT. Ein Dienst kann mehrere Schritte ausführen oder eine Aufgabe zur späteren Bearbeitung annehmen. Die erlaubten Methoden stehen in seiner Dokumentation.

    GET ist für einen Abruf ohne angeforderte fachliche Zustandsänderung vorgesehen. Protokollierung und Verbrauch von Rechenzeit sind trotzdem möglich. Das Wort GET allein beweist außerdem nicht, dass ein fehlerhaft programmierter Dienst tatsächlich nur liest. Unsere Aufrufbeispiele setzen eine ausdrücklich als lesend vorgesehene Artikelauskunft voraus; schreibende Methoden werden hier nur erklärt.

    6. Eine Anfrage besteht aus mehr als der Adresse

    Vereinfachte HTTP/1.1-Anfrage
    GET /ords/demo/artikel/1001 HTTP/1.1
    Host: api.example
    Accept: application/json

    Die erste Zeile sagt: Rufe mit GET diesen Pfad ab. Host benennt den Zielhost. Accept: application/json teilt dem Dienst mit, dass der Client eine JSON-Darstellung akzeptiert. Solche Begleitangaben heißen Header. Dieser Abruf benötigt keinen Nachrichteninhalt, also keinen Request Body.

    Die lesbare Schreibweise zeigt HTTP/1.1 vereinfacht. HTTP/2 und HTTP/3 übertragen die Informationen anders; Methode, Ziel, Header und Inhalt bleiben jedoch wichtige Bestandteile des Verständnisses. Dieser Block veranschaulicht eine Nachricht und ist kein Shell-Befehl.

    Für eine geschützte Schnittstelle käme eine vorgesehene Authentifizierung hinzu. Unser erstes Lehrbeispiel nimmt einen bereits freigegebenen, anonym lesbaren Artikelkatalog an. Daraus folgt keine Empfehlung, eigene Daten ohne Zugangsschutz zu veröffentlichen.

    7. Eine erfolgreiche Antwort vollständig lesen

    Vereinfachte Antwort des Lehrdienstes
    HTTP/1.1 200 OK
    Content-Type: application/json
    
    {
      "artikelnummer": 1001,
      "bezeichnung": "Notizbuch",
      "preis": 12.5,
      "waehrung": "EUR"
    }

    Was sehe ich hier? 200 meldet einen erfolgreichen Abruf. Content-Type bezeichnet das Format des tatsächlich übertragenen Inhalts. Nach der Leerzeile folgt der Response Body, hier das JSON-Dokument mit den Artikeldaten.

    Accept beschreibt also die akzeptierten Antwortformate aus Sicht des Clients; Content-Type beschreibt den Inhalt der jeweiligen Nachricht. Ein JSON-Wunsch garantiert nicht, dass jeder Fehlerfall JSON zurückliefert. Ein vorgeschalteter Dienst kann beispielsweise eine HTML-Fehlerseite senden.

    Die Anwendung kann aus preis und waehrung die Anzeige „12,50 EUR“ erzeugen. Im JSON bleibt der Preis eine Zahl mit Dezimalpunkt. Diese Trennung zwischen Daten und Anzeige kennst du bereits aus dem JSON-Kapitel.

    8. Wo passt Oracle REST Data Services hinein?

    Oracle REST Data Services, kurz ORDS, ist eine separate Softwarekomponente, die HTTP-Zugriffe mit Oracle-Funktionen verbindet. Für eine eigene REST-Schnittstelle kann ein Entwickler SQL oder PL/SQL als Verarbeitung hinterlegen. ORDS kann die Ergebnisse als Antwort aufbereiten. Die Verbindung zur Datenbank erfolgt über JDBC, eine Java-Schnittstelle für Datenbankzugriffe.

    Für unseren Artikelaufruf ist der gedachte Ablauf: ORDS erkennt den Pfad, ordnet den GET-Aufruf einer Verarbeitung zu, übernimmt die Artikelnummer und führt die vorgesehene SQL-Abfrage aus. Aus deren Ergebnis entsteht die vereinbarte JSON-Antwort. Dabei müssen sowohl Zugriffsrechte als auch die Behandlung unbekannter Artikel festgelegt sein.

    Ein Handler ist in diesem Zusammenhang die definierte Verarbeitung für eine Methode und einen Pfad. Andere ORDS-Funktionen können Objekte automatisch über REST bereitstellen oder SQL-Dienste anbieten. Unser Beispiel beschreibt bewusst einen festgelegten Artikel-Endpunkt; er ist kein offener Zugang für beliebiges SQL.

    ORDS hat eine eigene Versionsnummer und eigene Anforderungen. „Oracle Database 19c“ sagt daher noch nicht, welche ORDS-Version installiert ist. Die Quellen unten beziehen sich für ORDS auf 25.1; Installation und Freigabe einer konkreten Umgebung müssen zur dort eingesetzten Version passen. Dieses Kapitel installiert und aktiviert keine Komponenten.

    9. Den Datenbankteil ohne Webserver nachvollziehen

    Die folgende SELECT-Abfrage stellt zwei Artikel als Zwischenergebnis bereit. Sie simuliert nur den Datenbankteil der Auskunft; sie erstellt keinen REST-Endpunkt. Du kannst sie mit einer Oracle-19c-Verbindung ausführen, ohne eine Tabelle anzulegen.

    Lesendes SQL-Lernbeispiel
    WITH artikel AS (
      SELECT 1001 AS artikelnummer, 'Notizbuch' AS bezeichnung,
             12.5 AS preis, 'EUR' AS waehrung
      FROM dual
      UNION ALL
      SELECT 1002, 'Stift', 5, 'EUR'
      FROM dual
    )
    SELECT artikelnummer, bezeichnung, preis, waehrung
    FROM artikel
    WHERE artikelnummer = 1001;
    Fiktive Beispielausgabe:
    ARTIKELNUMMERBEZEICHNUNGPREISWAEHRUNG
    1001Notizbuch12,5EUR

    Die Bedingung wählt genau den angefragten Artikel. Ersetzt du im letzten Ausdruck 1001 durch 9999, liefert diese Abfrage keine Zeile. Was daraus als HTTP-Antwort entsteht, entscheidet die implementierte Schnittstelle. Oracle erzeugt aus „keine Zeile“ nicht automatisch einen HTTP-Status 404.

    In einer echten Verarbeitung wird die geprüfte Artikelnummer typischerweise als Bind-Variable übergeben, etwa im Ausdruck WHERE artikelnummer = :id. Sie wird nicht ungeprüft zu SQL-Text zusammengesetzt. Das SQL-Lernbeispiel verwendet einen festen Wert, damit es eigenständig ausführbar ist.

    10. Einen lesenden Aufruf mit curl verstehen

    curl ist ein Kommandozeilenwerkzeug für Datenübertragungen. Der folgende Bash-Befehl zeigt den Abruf unseres fiktiven Endpunkts. Er setzt ein installiertes curl voraus. Für einen echten Test müsste die Beispieladresse durch einen bekannten, freigegebenen und lesenden Test-Endpunkt ersetzt werden; die hier gezeigte Antwort kommt nicht von api.example.

    Bash-Lernbeispiel: eine GET-Anfrage, keine automatische Wiederholung
    curl --silent --show-error --include \
      --connect-timeout 5 --max-time 15 \
      --header 'Accept: application/json' \
      'https://api.example/ords/demo/artikel/1001'
    rc=$?
    printf 'curl-Rueckgabecode: %s\n' "$rc"

    Ohne Datenargument oder andere Methodenwahl verwendet curl bei diesem HTTP-Aufruf GET. --include zeigt auch die Antwortheader. --silent --show-error blendet die Fortschrittsanzeige aus, lässt Fehlermeldungen aber sichtbar. Fünf Sekunden begrenzen hier den Verbindungsaufbau, 15 Sekunden den gesamten Vorgang.

    Erwartetes Lehrresultat bei Erfolg: die Antwort aus Abschnitt 7 und danach curl-Rueckgabecode: 0. Der unmittelbar gespeicherte Wert $? gehört zum curl-Prozess. Ein curl-Rückgabecode von 0 beweist bei diesen Optionen keinen HTTP-Erfolg: Auch eine vollständig empfangene 404- oder 500-Antwort kann diesen Rückgabecode haben. Prüfe deshalb zusätzlich HTTP-Status, Content-Type und Inhalt.

    11. Welche Antwortcodes sollte ein DBA kennen?

    StatusErste Einordnung
    200Anfrage erfolgreich; Inhalt trotzdem auf die erwartete Bedeutung prüfen.
    204Erfolgreich, aber ohne Antwortinhalt.
    400Anfrage aus Sicht des Dienstes fehlerhaft, etwa ein ungültiger Parameter.
    401Gültige Authentifizierungsangaben für die Ressource fehlen.
    403Der Dienst verweigert die Verarbeitung.
    404Ziel nicht gefunden oder seine Existenz wird nicht offengelegt.
    405Die verwendete Methode ist für das Ziel nicht erlaubt.
    StatusErste Einordnung
    500Unerwarteter serverseitiger Fehler bei der Verarbeitung.
    502Ein Gateway oder Proxy erhielt eine ungültige Antwort vom nachgelagerten Dienst.
    503Der Dienst ist vorübergehend nicht verfügbar.
    504Ein Gateway oder Proxy erhielt nicht rechtzeitig die benötigte Antwort.

    Der Code grenzt die Suche ein, benennt aber nicht automatisch die betroffene technische Komponente. Ein 500 kann aus der Anwendung stammen; ein 504 kann vom Proxy kommen. Eine 403 beweist nicht, dass alle Anmeldedaten korrekt waren. Für eine belastbare Aussage gehören Zeitpunkt, Pfad, Methode und passende Protokolle dazu.

    12. Gelöster Fall: 404 – falsche Adresse oder unbekannter Artikel?

    Aufgabe: Der Abruf von /ords/demo/artikel/1001 gelingt, der von /ords/demo/artikel/9999 liefert die folgende Antwort. Unser Lehrdienst dokumentiert für eine gültige, aber unbekannte Artikelnummer den Status 404.

    Fiktive Antwort für einen unbekannten Artikel
    HTTP/1.1 404 Not Found
    Content-Type: application/json
    
    {"code":"ARTIKEL_NICHT_GEFUNDEN","artikelnummer":9999}

    Vorgehensweise: Vergleiche zuerst Host, Grundpfad und Methode mit dem erfolgreichen Aufruf. In diesem Fall unterscheidet sich nur die Artikelnummer. Prüfe anschließend den Antwortinhalt und die dokumentierte Fehlerregel. Führe die Abfrage aus Abschnitt 9 mit 9999 als Filter aus: Sie liefert keine Zeile.

    Lösung: Für die vorliegenden Beispieldaten ist die unbekannte Nummer die Erklärung. Für einen erfolgreichen Test verwende 1001. Es gibt keinen Anlass, den Dienst neu zu starten. Würde dagegen auch 1001 unter einem abweichenden Grundpfad 404 liefern, wäre zunächst die Zuordnung der Adresse zu prüfen. In einem echten System können Berechtigungen oder Filter ebenfalls beeinflussen, welche Daten sichtbar sind.

    13. Gelöster Fall: 401 und 403 unterscheiden

    Ausgangslage: Eine geschützte Variante der Artikelauskunft liefert ohne Zugangsnachweis 401. Nach Anmeldung erhält ein Benutzer 200, ein anderer 403. Laut Schnittstellenvereinbarung dürfen nur freigegebene Benutzer diese Artikelauskunft verwenden.

    Vorgehensweise: Prüfe bei 401, welches Anmeldeverfahren vorgesehen ist und ob der Dienst einen gültigen Nachweis erhält. Ein Token ist ein vom vorgesehenen Verfahren ausgestellter Zugangsnachweis; er kann ablaufen. Prüfe beim zweiten Benutzer die Berechtigungszuordnung und die serverseitigen Protokolle. Der Vergleich ist nur aussagekräftig, wenn Ziel, Methode und übrige Anfrage gleich bleiben.

    Lösung im Beispiel: Der erste Aufruf benötigt einen gültigen Zugangsnachweis. Dem zweiten Benutzer fehlt nach bestätigter Anmeldung die vorgesehene Freigabe. Das wird über den zuständigen Berechtigungsprozess geklärt; die Datenbank benötigt dafür keinen Neustart. Tokens und Passwörter gehören weder in die URL noch in veröffentlichte Diagnoseausgaben.

    Begriffe: Authentifizierung prüft die Identität beziehungsweise den vorgelegten Nachweis. Autorisierung entscheidet, welche Aktion damit erlaubt ist. Der genaue Ablauf hängt vom eingesetzten Verfahren ab; nicht jede API verwendet denselben Token-Typ.

    14. Gelöster Fall: Status 200, aber die Anwendung meldet einen JSON-Fehler

    Fiktiver Antwortausschnitt
    HTTP/1.1 200 OK
    Content-Type: text/html
    
    <html><body>Anmeldung erforderlich</body></html>

    Aufgabe: Die Anwendung erwartet die Artikeldaten aus Abschnitt 7. Stattdessen erhält sie diese Antwort. Die Datenbankabfrage auf den Artikel funktioniert. Wo setzt die Untersuchung an?

    Vorgehensweise: Lies neben dem Status auch Content-Type und Body. Die Antwort ist HTML und enthält eine Anmeldeseite. Vergleiche die tatsächlich verwendete Adresse mit dem vorgesehenen API-Endpunkt. Prüfe außerdem, ob das verwendete Werkzeug einer Weiterleitung gefolgt ist. Unser curl-Beispiel folgt Weiterleitungen ohne zusätzliche Option nicht automatisch.

    Lösung: Im Lehrfall wurde die Adresse der Webanmeldung statt der Artikelschnittstelle verwendet. Mit dem richtigen Endpunkt und dessen vorgesehenem Anmeldeverfahren kommt die vereinbarte JSON-Antwort zurück. Änderungen am JSON-Datentyp in Oracle würden das ursprüngliche Problem nicht lösen.

    15. Gelöster Fall: 504 – ist die Datenbank zu langsam?

    Ausgangslage: Ein Proxy wartet im Beispiel höchstens zehn Sekunden. Ein Artikelaufruf endet dort mit 504. In der passenden Protokollierung sehen wir für genau diesen Aufruf neun Sekunden Warten auf eine freie Datenbankverbindung und zwei Sekunden für die SQL-Verarbeitung.

    Gemessener Abschnitt im LehrfallDauer
    Warten auf eine freie Verbindung9 Sekunden
    SQL-Verarbeitung2 Sekunden
    Zusammen, ohne weitere Zeiten11 Sekunden

    Vorgehensweise: Ordne die Meldungen über Zeitpunkt und eine gemeinsam protokollierte Anfragekennung demselben Aufruf zu. Prüfe, welche Komponente den 504 erzeugt hat. Vergleiche ihre Wartefrist mit den gemessenen Abschnitten. Die reine SQL-Zeit erklärt hier nicht die gesamte Verzögerung.

    Lösung: Der untersuchte Ablauf überschreitet bereits mit elf Sekunden die Zehn-Sekunden-Frist. Zuerst muss geklärt werden, warum Verbindungen so lange belegt sind oder nicht verfügbar werden. Mögliche Ursachen sind lange laufende Arbeit, nicht zurückgegebene Verbindungen oder eine unpassende Dimensionierung. Die Beispieldaten entscheiden noch nicht, welche davon zutrifft.

    Eine Anfragekennung, oft Request-ID genannt, ist nur hilfreich, wenn die beteiligten Komponenten sie tatsächlich weitergeben und protokollieren. Es gibt hier keinen angenommenen universellen ORDS-Header. Ein Timeout beim Client oder Proxy beweist außerdem nicht, dass die nachgelagerte Verarbeitung bereits beendet wurde.

    16. Eine Liste kann aus mehreren Antwortseiten bestehen

    Ein Dienst sollte nicht zwingend den ganzen Artikelkatalog auf einmal übertragen. Er kann die Ergebnisse auf Seiten verteilen. Das heißt Pagination. Parameter, Sortierung und Antwortfelder müssen in der Schnittstelle dokumentiert sein.

    Beispiel für eine vereinbarte erste Seite
    {
      "items": [
        {"artikelnummer":1001,"bezeichnung":"Notizbuch"},
        {"artikelnummer":1002,"bezeichnung":"Stift"}
      ],
      "hasMore": true,
      "next": "/ords/demo/artikel?offset=2&limit=2"
    }

    Unser Lehrformat enthält zwei Einträge und sagt mit hasMore ausdrücklich, dass weitere folgen. next nennt die nächste Aufrufadresse. Diese Feldkombination ist für das Beispiel vereinbart und keine allgemeine ORDS-Antwortschablone. Reale Dienste können andere Metadaten oder Linkstrukturen verwenden.

    Gelöste Aufgabe: „Der Katalog hat nur zwei Artikel“ ist aus dieser Antwort nicht ableitbar. Richtig ist: Die erste Seite enthält zwei Artikel. Die Auswertung muss die dokumentierten Folgeseiten berücksichtigen. Bei veränderlichen Daten erfordert ein vollständiger Abgleich zusätzlich eine geeignete Sortierung und ein abgestimmtes Verfahren; mehrere Abrufe bilden nicht automatisch einen gemeinsamen Datenbank-Snapshot.

    17. Warum klappt curl, aber der Browser meldet CORS?

    Eine Webseite und die API können unterschiedliche Ursprünge haben. Ein Ursprung wird durch Schema, Host und Port bestimmt. Browser beschränken das Lesen von Antworten über solche Grenzen hinweg. CORS beschreibt, wie ein Server bestimmte Zugriffe aus anderen Ursprüngen erlauben kann.

    Beispiel: Die Webseite läuft auf https://shop.example, die API auf https://api.example. curl erhält die erwarteten Daten; die Browseranwendung darf die Antwort jedoch nicht lesen. Das ist möglich, weil curl die CORS-Regeln des Browsers nicht durchsetzt.

    Vorgehen und Lösung: Vergleiche Anfrage, Zugangsnachweis und Antwort im Netzwerkbereich der Browser-Entwicklerwerkzeuge. Prüfe den Origin-Header, die CORS-Antwortheader und, falls vorhanden, die vorausgehende OPTIONS-Anfrage. Im Lehrfall fehlt die vorgesehene Freigabe für den Ursprung der Shopseite. Die Korrektur gehört zur Konfiguration des zuständigen Webdienstes oder Proxys. Browserprüfungen abzuschalten löst den Konfigurationsfehler nicht.

    CORS ist keine Anmeldung und kein allgemeiner Schutz gegen beliebige API-Clients. Bei einem CORS-Fehler kann die eigentliche Anfrage bereits verarbeitet worden sein; eine fehlgeschlagene Vorabprüfung kann ihre Übermittlung aber auch verhindern. Der beobachtete Ablauf entscheidet.

    18. Verbindungsfehler, HTTP-Fehler und Inhaltsfehler getrennt untersuchen

    BeobachtungNächster sinnvoller Prüfschritt
    Host wird nicht aufgelöstSchreibweise und Namensauflösung prüfen.
    Zertifikatsprüfung scheitertHostname, Gültigkeit, Vertrauenskette und Systemzeit prüfen.
    HTTP-Antwort mit FehlerstatusAntwortenden Dienst und passende Logs ermitteln.
    HTTP 200 mit unerwartetem InhaltContent-Type, Body und Schnittstellenvereinbarung vergleichen.

    Ein Zertifikatsfehler wird nicht fachlich behoben, indem die Prüfung abgeschaltet wird. Ebenso lässt sich aus „kein HTTP-Status erhalten“ noch kein Datenbankfehler ableiten. Die Abfolge der Prüfung folgt den vorhandenen Befunden. Häufig genügt schon die Unterscheidung zwischen „keine Verbindung“, „Fehlerantwort“ und „unerwarteter Inhalt“, um die Untersuchung erheblich einzugrenzen.

    Bei einem Fehlerbericht sind besonders hilfreich: Zeitpunkt mit Zeitzone, Zielumgebung, Methode und Pfad, Status oder Verbindungsfehler, Dauer, bereinigter Antwortausschnitt und eine vorhandene Anfragekennung. Eine Sessionnummer aus der Datenbank ergänzt das Bild nur dann, wenn sie tatsächlich diesem Aufruf zugeordnet werden kann.

    19. Warum automatische Wiederholungen mit Bedacht erfolgen müssen

    Ein Timeout heißt: Der wartende Teilnehmer hat nicht rechtzeitig die benötigte Antwort erhalten. Er weiß dadurch nicht zuverlässig, ob der andere Dienst die Arbeit schon ausgeführt hat. Wird beispielsweise eine Bestellung nach einer unklaren POST-Antwort erneut abgeschickt, könnte sie ohne geeignete Absicherung doppelt verarbeitet werden.

    Der Fachbegriff idempotent beschreibt, dass wiederholte identische Anforderungen dieselbe beabsichtigte Wirkung haben wie eine einzelne. Er verspricht weder identische Antworten noch kostenlose Wiederholungen. Unsere GET-Beispiele dienen dem Abruf; auch ihre Wiederholung erzeugt Last. Automatische Wiederholungen gehören deshalb zu einer dokumentierten Fehlerstrategie und nicht zu einem pauschalen „noch einmal senden“.

    20. Ein vollständiger Diagnoseweg für die Artikelauskunft

    1. Erwartung festhalten: Für Artikel 1001 sollen Name, Preis und Währung als JSON erscheinen.
    2. Aufruf bestimmen: Umgebung, Host, Pfad und GET-Methode mit der Dokumentation vergleichen.
    3. Antwort erfassen: Status, Header und Body gemeinsam lesen; Zugangsnachweise aus aufgezeichneten Diagnoseausgaben entfernen.
    4. Fehlerklasse wählen: Verbindung, Anmeldung, Berechtigung, Adresse, interne Verarbeitung oder Inhalt.
    5. Befund zuordnen: Bei Bedarf Proxy-, ORDS- und Datenbankinformationen für denselben Aufruf zusammenführen.
    6. Ergebnis prüfen: Der freigegebene Vergleichsaufruf liefert den erwarteten Artikel und die erwartete Antwortstruktur.

    Eine erfolgreiche SQL-Abfrage bestätigt nur einen Teil dieses Wegs. Sie beweist weder die Erreichbarkeit des Webdienstes noch die Freigabe des aufrufenden Benutzers. Umgekehrt ist eine sichtbare HTTP-Antwort kein Beleg dafür, dass bei diesem Aufruf überhaupt SQL ausgeführt wurde. Diese Trennung ist der wichtigste praktische Gewinn für die Zusammenarbeit zwischen DBA, Anwendungs- und Webbetrieb.

    21. Quellen und Geltungsbereich

    Die SQL-Abfrage ist für Oracle Database 19c formuliert. ORDS-Begriffe wurden mit der Oracle-Dokumentation zu ORDS 25.1 abgeglichen; konkrete Installationsanforderungen und Einstellungen richten sich nach der eingesetzten Version. HTTP- und REST-Grundlagen sind davon unabhängig. Die Lehrantworten sind absichtlich überschaubar und keine Mitschnitte einer laufenden Schnittstelle. Live-ORDS, Authentifizierung und Netzwerkverhalten wurden hier nicht gegen eine reale Umgebung getestet.

    Geltungsbereich: Dieses Kapitel vermittelt einen Architekturüberblick. ORDS hat einen eigenständigen Versionsstand. Konkrete HTTP-, CORS- und ORDS-Konfiguration ist durch die ausschließliche Oracle-Database-19c-Referenz nicht vollständig verifiziert; Beispielantworten sind kein universelles ORDS-Format.

    Eine Diagnose in einem Satz festhalten

    Übe am vorhandenen Fall mit Status 200 und einer HTML-Anmeldeseite: „Der Aufruf an den verwendeten Endpunkt liefert HTTP 200, aber Content-Type text/html und eine Anmeldeseite; die Artikelauskunft erwartet JSON.“ Dieser Satz trennt Beobachtung und Erwartung. Der nächste Schritt ist der Vergleich von Endpunkt und Anmeldeweg, nicht eine Änderung der Artikeltabelle.

    Notiere bei einem echten Aufruf Zeitpunkt, Methode, Ziel und den bereinigten Antwortausschnitt. Ein Passwort oder vollständiger Zugriffstoken gehört nicht in diesen Befund. Die gelösten Fälle zeigen jeweils, welche zusätzliche Information die Ursache belegt.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Eine API ist eine Schnittstelle, HTTP ein Kommunikationsprotokoll, REST ein Architekturstil und JSON ein Datenformat. HTTPS ergänzt den geschützten Transport.
    2. Client, Webdienst und Datenbank sind verschiedene Stationen einer Anfrage. ORDS kann den Zugang zwischen HTTP-Anfragen und Oracle-Datenbankfunktionen bereitstellen.
    3. Eine Anfrage besteht aus Methode, Adresse, Headern und gegebenenfalls Inhalt. Die Antwort muss anhand von Statuscode, Inhaltstyp und tatsächlichem Inhalt gelesen werden.
    4. Namensauflösung, Verbindung, Authentifizierung, Berechtigung und Antwortinhalt können unabhängig voneinander scheitern. Auch ein HTTP-Status 200 beweist nicht die fachliche Richtigkeit der gelieferten Daten.
    5. Paginierung, Timeouts, CORS und Wiederholungen beeinflussen das Verhalten der Anwendung. Die Diagnose folgt dem gesamten Anfrageweg, statt jeden API-Fehler der Datenbank zuzuschreiben.

    Lernzielkontrolle

    Beantworte die Fragen zunächst selbst. Öffne anschließend die jeweilige Frage, um die Lösung mit Begründung zu lesen.

    Frage 1: Welche unterschiedlichen Aufgaben haben JSON, HTTP und ORDS?

    Lösung: JSON beschreibt die Datenstruktur. HTTP regelt den Austausch von Anfragen und Antworten. ORDS kann als Dienst HTTP-Aufrufe einer definierten Oracle-Verarbeitung zuordnen und deren Ergebnis zurückliefern.

    Frage 2: Was bedeuten Accept und Content-Type?

    Lösung: Accept nennt die vom Client akzeptierten Antwortformate. Content-Type beschreibt den tatsächlich übertragenen Inhalt der jeweiligen Nachricht. Ein JSON-Wunsch verhindert nicht, dass beispielsweise ein vorgeschalteter Dienst eine HTML-Fehlerseite sendet.

    Frage 3: curl meldet Rückgabecode 0, die HTTP-Antwort enthält 404. Kann das zusammenpassen?

    Lösung: Ja. Ohne eine entsprechende Fehleroption kann curl den vollständig empfangenen HTTP-Austausch als erfolgreich behandeln. Der Prozessrückgabecode ersetzt deshalb nicht die Prüfung von HTTP-Status und Inhalt.

    Frage 4: Im Lehrfall wartet der Dienst neun Sekunden auf eine Verbindung und benötigt zwei Sekunden für SQL. Der Proxy wartet zehn Sekunden. Was folgt daraus?

    Lösung: Die beiden Abschnitte ergeben bereits elf Sekunden. Das überschreitet die Zehn-Sekunden-Frist. Die reine SQL-Zeit erklärt den Ablauf nicht; die Wartezeit auf die Verbindung muss untersucht werden. Die Antwort 504 allein würde diese konkrete Ursache noch nicht beweisen.

    Frage 5: Eine Antwort enthält zwei Artikel und hasMore: true. Hat der Katalog insgesamt zwei Artikel?

    Lösung: Nein. Sichtbar ist nur eine Seite. Die dokumentierten Folgeseiten müssen berücksichtigt werden. Für einen vollständigen Abgleich über mehrere Abrufe sind außerdem Sortierung und mögliche zwischenzeitliche Änderungen zu beachten.

    Frage 6: Was notierst du bei HTTP 200 mit einer HTML-Anmeldeseite statt Artikeldaten?

    Lösung: Zeitpunkt, Methode, Ziel, Status, Content-Type und bereinigten Inhalt. Dann vergleichst du Endpunkt und Anmeldeweg mit der erwarteten JSON-Schnittstelle.

    Frage 7: Welche Angabe verbindet die Diagnose mehrerer Dienste?

    Lösung: Eine tatsächlich weitergegebene und protokollierte Anfragekennung zusammen mit einem passenden Zeitfenster. Eine nur angenommene Request-ID liefert keinen Zusammenhang.

    Frage 8: Warum beendet ein Proxy-Timeout nicht nachweislich die Datenbankarbeit?

    Lösung: Der Proxy kann das Warten auf eine Antwort aufgeben, während nachgelagerte Arbeit noch läuft. Deren Ende muss in den passenden Protokollen oder der Sitzung überprüft werden.

    39. Connection Pools – Warum bleiben so viele Verbindungen offen?

    Verbindungen wiederverwenden, Wartezeiten verstehen und Anwendung und Datenbank gemeinsam untersuchen.

    Lernkompass
    Einfach gesagt Ein Connection Pool hält Datenbankverbindungen bereit. Die Anwendung leiht eine Verbindung aus und gibt sie nach der Arbeit zurück.
    Warum ist das wichtig? Eine Anwendung kann auf freie Verbindungen warten, obwohl Oracle nur wenig Arbeit ausführt. Auch viele offene Sessions können zum normalen Betrieb gehören.
    Nach diesem Kapitel Du kannst Poolbelegung und Sessionstatus unterscheiden, einfache Messwerte erklären und typische Störungen gezielt eingrenzen.

    Einführung: Ein Connection Pool verwaltet Datenbankverbindungen, die Anwendungen ausleihen und anschließend zurückgeben können. Die Wiederverwendung vermeidet, für jeden kurzen Auftrag eine vollständige neue Verbindung aufzubauen. Eine zurückgegebene Verbindung kann dabei weiterhin zur Datenbank bestehen. Deshalb sind offene Verbindungen, ausgeliehene Poolverbindungen und aktuell aktive Oracle-Sessions unterschiedliche Größen.

    Das Kapitel verfolgt den bestehenden Aufruf einer Artikelauskunft durch diesen Lebenszyklus. Danach werden Poolgrenzen, Wartezeiten und Zustandsreste eingeordnet. Du lernst, Messwerte der Anwendung mit der Datenbanksicht zu verbinden. So lässt sich unterscheiden, ob eine Anfrage schon auf einen freien Poolplatz wartet oder erst innerhalb eines Datenbankaufrufs verzögert wird.

    Oracle 19c: fachliche Grundlage

    1. Wozu braucht man einen Connection Pool?

    Eine neue Datenbankverbindung kostet Zeit und Ressourcen: Das Ziel muss erreicht werden, eine Anmeldung wird geprüft und der benötigte Verbindungskontext wird aufgebaut. Würde eine Anwendung dies für jede kleine Artikelauskunft wiederholen, entstünde vermeidbarer Aufwand. Ein Pool verwaltet deshalb wiederverwendbare Verbindungen.

    Stell dir eine Ausleihe mit mehreren Werkzeugen vor. Ein Mitarbeiter nimmt ein freies Werkzeug, erledigt seine Aufgabe und legt es zurück. Danach kann es der nächste verwenden. Beim Connection Pool ist das ausgeliehene Werkzeug die Datenbankverbindung. Der Vergleich erklärt die Wiederverwendung; die technische Verwaltung übernimmt Software.

    Oracle bietet dafür unter anderem den Universal Connection Pool, kurz UCP, für Java-Anwendungen an. Andere Produkte besitzen eigene Poolimplementierungen. Die Grundidee ist ähnlich, Namen, Standardwerte und genaue Regeln können sich jedoch unterscheiden.

    2. Benutzer, Anfrage, Verbindung und Session sind nicht dasselbe

    BegriffBedeutung im Lernbeispiel
    BenutzerEine Person verwendet den Artikelkatalog.
    AnfrageEin einzelner Aufruf, etwa die Suche nach Artikel 1001.
    DatenbankverbindungDer technische Zugang, den die Anwendung für Datenbankarbeit nutzt.
    DatenbanksessionDer dazugehörige angemeldete Kontext auf der Oracle-Seite.

    Eine Person kann mehrere Anfragen auslösen. Viele Personen können nacheinander dieselbe Poolverbindung nutzen. Umgekehrt kann eine Anwendung mehrere Verbindungen für unterschiedliche Aufgaben benötigen. Aus „100 angemeldete Benutzer“ folgt deshalb keine feste Zahl von Datenbanksessions.

    Für die Zahlenbeispiele nehmen wir einen einfachen Pool mit gewöhnlichen, dauerhaft verbundenen JDBC-Verbindungen an: je physischer Verbindung eine zugehörige Session, ohne zusätzliche Vermittlung wie DRCP. Diese Annahme erleichtert den Einstieg und ist keine allgemeine Aussage über jede Oracle-Verbindungsarchitektur.

    3. Ausleihen, verwenden und zurückgeben

    1. Anfordern: Die Anwendung fragt den Pool nach einer passenden Verbindung.
    2. Ausleihen: Der Pool gibt eine verfügbare Verbindung heraus oder erstellt innerhalb seiner Grenzen eine neue.
    3. Verwenden: Die Anwendung führt ihre Datenbankarbeit aus und verarbeitet das Ergebnis.
    4. Zurückgeben: Der Zugriff wird freigegeben, damit eine andere Anfrage die Verbindung nutzen kann.

    Beim UCP-Aufruf close() auf dem ausgeliehenen Verbindungsobjekt wird die Verbindung normalerweise an den Pool zurückgegeben; die physische Verbindung wird dadurch nicht einfach jedes Mal entfernt. Deshalb kann die zugehörige Oracle-Session nach Ende einer Anfrage sichtbar bleiben.

    Vergisst die Anwendung die Rückgabe, bleibt die Verbindung ausgeliehen. Neue Anforderungen können dann weitere Verbindungen erzeugen oder warten, sobald keine passende freie Verbindung mehr verfügbar ist. Die Rückgabe muss daher auch auf Fehlerpfaden zuverlässig erfolgen.

    4. Ein Ablauf mit drei Verbindungen

    ZeitpunktAusgeliehen / freiWas passiert?
    Start0 / 3Der Pool hält drei verfügbare Verbindungen bereit.
    Drei Anfragen beginnen3 / 0Jede Anfrage verwendet eine Verbindung.
    Vierte Anfrage kommt3 / 0Bei einem Maximum von drei muss sie zunächst warten.
    Eine Anfrage gibt zurückweiterhin bis zu 3 / 0Die wartende Anfrage kann die freigewordene Verbindung übernehmen.
    Alle Aufgaben fertig0 / 3Die Verbindungen stehen erneut bereit.

    Für diesen Ablauf sind alle drei Verbindungen nutzbar und gleich geeignet. Die vierte Anfrage erhält eine Verbindung, wenn rechtzeitig eine frei wird; läuft vorher ihre konfigurierte Wartefrist ab, meldet die Anwendung einen Fehler. Der Pool muss dafür nicht eine vierte Oracle-Session erzeugen.

    Ein voller Pool ist zunächst eine Belegungssituation. Problematisch wird er beispielsweise dann, wenn Anforderungen lange warten oder scheitern. Eine kurzzeitig vollständige Auslastung allein beweist weder ein Verbindungsleck noch eine zu kleine Konfiguration.

    5. Startgröße, Mindestgröße und Maximum lesen

    EinstellungBedeutung bei UCP
    Initial Pool SizeZahl der Verbindungen, die beim Start beziehungsweise Neuinitialisieren vorbereitet werden.
    Minimum Pool SizeUntergrenze für das Halten bereits aufgebauter Poolverbindungen, sobald diese Größe erreicht wurde.
    Maximum Pool SizeObergrenze für die insgesamt verfügbaren und ausgeliehenen Verbindungen des Pools.

    Die Mindestgröße ist bei UCP keine Zusicherung, dass unmittelbar beim Start diese Zahl vorhanden ist. Ist die Startgröße kleiner, kann der Pool zunächst darunter liegen. Auch das Maximum sagt nur, wie weit er wachsen darf, nicht wie viele Verbindungen gerade existieren.

    Beispiel: Startgröße 2, Mindestgröße 2 und Maximum 10. Direkt nach dem erfolgreichen Aufbau können zwei Verbindungen bereitstehen. Steigt die Nachfrage, kann der Pool weitere anlegen, bis insgesamt zehn erreicht sind. Die tatsächliche Entwicklung hängt auch von Verfügbarkeit, Prüfungen und weiteren Einstellungen ab. Diese Zahlen sind Lernwerte, keine Empfehlung für eine reale Anwendung.

    6. Warum hundert Sessions bei zehn Benutzern möglich sind

    Nehmen wir fünf laufende Anwendungsprozesse an. Jeder besitzt einen eigenen Pool und hält zwanzig physische Verbindungen offen. Dann sind 5 × 20 = 100 zugehörige Datenbanksessions möglich, obwohl gerade nur zehn Personen die Anwendung verwenden. Die Pools kennen die aktuelle Anzahl dieser Personen nicht als feste Obergrenze.

    Ebenso müssen mehrere Maximalgrößen gemeinsam betrachtet werden. Drei Prozesse mit jeweils maximal zwanzig Verbindungen können zusammen bis zu sechzig Poolverbindungen anfordern. Hintergrundjobs, Administrationszugriffe und andere Anwendungen kommen gegebenenfalls hinzu. Der konfigurierte Wert einer einzelnen Anwendung ist kein datenbankweites Limit.

    Vorgehen: Erfasse zunächst, welche Prozesse, Dienste und Pools überhaupt auf die Datenbank zugreifen. Vergleiche deren tatsächliche Belegung und Wartezeiten mit der Anzahl der Sessions. Viele sichtbare Sessions allein rechtfertigen weder eine Verkleinerung noch einen Neustart.

    7. Borrowed, Available und Pending richtig verstehen

    PoolbegriffFrage, die der Wert beantwortet
    Borrowed / ausgeliehenWie viele Verbindungen hält die Anwendung gerade?
    Available / verfügbarWie viele Verbindungen sind derzeit nicht ausgeliehen?
    Total / insgesamtWie viele Verbindungen besitzt der Pool insgesamt?
    Pending / wartendWie viele Anforderungen warten gerade auf eine Verbindung?

    UCP stellt solche Werte über seine Poolstatistiken bereit. In anderen Produkten können die Bezeichnungen abweichen. Für eine belastbare Auswertung gehören Poolname, Prozess beziehungsweise Anwendungsinstanz, Zeitpunkt und Einheit zur Messung. Eine Gesamtzahl aus mehreren Pools verdeckt möglicherweise den Engpass eines einzelnen Pools.

    Zähler und Momentanwerte dürfen nicht vermischt werden: „Gerade vier wartende Anforderungen“ ist etwas anderes als „seit Beginn der Messung vier fehlgeschlagene Ausleihversuche“. Kumulative Werte werden für einen Zeitraum durch einen passenden Vorher-Nachher-Vergleich ausgewertet; Reset und Messumfang müssen bekannt sein.

    8. Ausgeliehen bedeutet nicht automatisch ACTIVE in Oracle

    Was sehe ich hier? Für denselben einfachen Pool betrachten wir einen abgestimmten Zeitpunkt. Zehn physische Verbindungen existieren, acht sind ausgeliehen und zwei frei. Nur drei der ausgeliehenen Verbindungen führen gerade Datenbankaufrufe aus; die anderen fünf werden noch von der Anwendung gehalten.

    SichtWertBedeutung im Lehrfall
    Pool: Borrowed8Drei Verbindungen arbeiten in Oracle, fünf werden außerhalb eines DB-Aufrufs gehalten.
    Pool: Available2Zwei sind zurückgegeben und verfügbar.
    Oracle: ACTIVE3Drei Sessions bearbeiten einen DB-Aufruf.
    Oracle: INACTIVE7Fünf ausgeliehene und zwei freie Verbindungen führen gerade keinen DB-Aufruf aus.

    Eine Anwendung kann nach dem SQL-Aufruf noch Daten verarbeiten oder auf einen anderen Dienst warten, während sie die Verbindung festhält. Oracle kennt diese Ausleihentscheidung nicht als allgemeines Poolkennzeichen. Deshalb lässt sich aus INACTIVE nicht ableiten, dass die Verbindung frei ist. ACTIVE bedeutet umgekehrt nicht zwingend CPU-Arbeit; eine aktive Session kann innerhalb des Aufrufs warten.

    9. Welche Messwerte kommen von welcher Seite?

    DatenbankseiteAnwendungs- beziehungsweise Poolseite
    Sessionstatus und zugeordnete SQL-ArbeitAnzahl ausgeliehener und verfügbarer Verbindungen
    Wartezustände und TransaktionskontextWarteschlange vor der Vergabe einer Verbindung
    Verbindungsherkunft, soweit erkennbarAusleihdauer, Vergabefehler und konfigurierte Poolgrenzen

    Die allgemeine Oracle-View V$SESSION enthält keinen verlässlichen Schalter „diese Session ist an Pool X zurückgegeben“. Die Zuordnung benötigt Anwendungsinformationen. Von Clients gepflegte Angaben wie MODULE helfen dabei, sind aber nur so gut wie ihre korrekte und aktuelle Pflege.

    DB-seitige Warteereignisse werden im Sessionkapitel und im Kapitel zu Wait Events erklärt. Hier geht es zusätzlich um die Zeit, bevor eine Anfrage überhaupt eine Datenbankverbindung erhält. Diese Poolwartezeit ist nicht automatisch ein Oracle-Wait-Event der wartenden Anfrage.

    10. Sessionzahlen mit einer lesenden Abfrage prüfen

    Die folgenden Diagnoseabfragen setzen Leserechte auf V$SESSION und den passenden Datenbank- beziehungsweise PDB-Kontext voraus. SYS ist dafür nicht zwingend erforderlich. Ersetze den neutralen Beispielbenutzer APP_DEMO durch den tatsächlich zu untersuchenden Datenbankbenutzer. Fehlende Rechte oder eine falsche Auswahl sind kein Beweis für einen leeren Pool.

    Sessionstatus für einen bekannten Anwendungsbenutzer
    SELECT status, COUNT(*) AS anzahl
    FROM v$session
    WHERE type = 'USER'
      AND username = 'APP_DEMO'
    GROUP BY status
    ORDER BY status;
    Fiktive Beispielausgabe:
    STATUSANZAHL
    ACTIVE3
    INACTIVE7

    Auswertung: Die Ausgabe passt zum Zehn-Verbindungen-Beispiel aus Abschnitt 8. Sie zeigt aber nur den Sessionstatus, nicht die acht ausgeliehenen Verbindungen. Auch mehrere Pools können denselben Datenbankbenutzer verwenden. Für die Zuordnung brauchst du die ergänzenden Poolmesswerte.

    Die Abfrage liefert eine Momentaufnahme. Nacheinander abgelesene Datenbank- und Poolwerte können wegen der laufenden Arbeit voneinander abweichen. Vergleiche deshalb eng zusammenliegende Zeitpunkte und bei Bedarf den Verlauf über mehrere Messungen. Die Tabelle oben ist ein didaktisch abgestimmtes Beispiel, kein realer Messmitschnitt.

    11. Die Herkunft näher eingrenzen

    Sessionverteilung nach Client und Modul
    SELECT NVL(machine, '(nicht gesetzt)') AS client_host,
           NVL(module, '(nicht gesetzt)') AS modul,
           COUNT(*) AS sessions
    FROM v$session
    WHERE type = 'USER'
      AND username = 'APP_DEMO'
    GROUP BY machine, module
    ORDER BY client_host, modul;
    Fiktive Beispielausgabe:
    CLIENT_HOSTMODULSESSIONS
    app01Artikelservice6
    app02Artikelservice4

    Was lerne ich daraus? In diesem getrennten Lehrbeispiel kommen die zehn Sessions aus zwei gemeldeten Clientherkünften. Das ist ein Ansatzpunkt für die Suche nach den zugehörigen Anwendungsprozessen. Es beweist nicht, dass exakt zwei Pools existieren: Ein Prozess kann mehrere Pools betreiben, und dieselben Angaben können mehrfach verwendet werden.

    Vergleiche die Zuordnung mit der Prozess- und Poolübersicht des Anwendungsbetriebs. Ist MODULE nicht gepflegt, ist das ein fehlender Hinweis; es darf nicht durch einen geratenen Poolnamen ersetzt werden. Die Anzeige „nicht gesetzt“ macht die fehlende Information ausdrücklich sichtbar.

    12. Gelöster Fall: Pool erschöpft, Datenbank kaum beschäftigt

    Ausgangslage: Der Pool hat ein Maximum von zehn. Zehn Verbindungen sind ausgeliehen, keine ist frei und vier Anforderungen warten. Oracle zeigt eine aktive und neun inaktive zugehörige Sessions. Die Anwendung antwortet langsam.

    Vorgehen: Prüfe zuerst die Ausleihdauer und die Arbeitsschritte der zehn Besitzer auf Anwendungsseite. Vergleiche dafür zeitlich passende Ablaufprotokolle. Im Lehrfall warten neun Anforderungen nach ihrer Artikelauskunft auf einen externen Dienst, ohne ihre Verbindung vorher zurückzugeben. Die SQL-Abfrage selbst ist bereits beendet.

    Lösung: Der Engpass liegt hier in der unnötig langen Belegung der Verbindungen während externer Arbeit. Die Anwendungsentwicklung muss den vorgesehenen Ablauf prüfen und die Verbindung zurückgeben, sobald die Datenbankarbeit einschließlich des erforderlichen Transaktionsabschlusses beendet ist. Das ist eine fachlich zu prüfende Programmänderung; der DBA weist sie mit den Messungen nach.

    Eine größere Poolgrenze könnte das Symptom verschieben, behebt aber diesen Ablauf nicht. Ebenso würde das Beenden inaktiver Sessions bestehende Anfragen stören. Nach einer freigegebenen Korrektur prüft man unter vergleichbarer Last, ob Ausleihdauer, Warteschlange und Fehlerrate sinken.

    13. Gelöster Fall: ein Verbindungsleck erkennen

    Ein Verbindungsleck liegt vor, wenn eine nicht mehr benötigte Verbindung nicht ordnungsgemäß zurückgegeben wird. Für das folgende Lehrbeispiel bleibt die fachliche Last ähnlich, der Pool hat maximal zehn Verbindungen und es laufen keine vorgesehenen Langzeitaufträge.

    ZeitpunktAusgeliehen / freiZusatzbeobachtung
    09:002 / 8Kurze Aufgaben werden normal beendet.
    09:056 / 4Belegung sinkt nach Aufgabenende nicht entsprechend.
    09:1010 / 0Neue Anforderungen warten.

    Vorgehen: Stelle den Verlauf den gestarteten und abgeschlossenen Aufgaben gegenüber. Prüfe besonders Fehlerpfade: Wird die Verbindung auch zurückgegeben, wenn die Verarbeitung mit einer Ausnahme endet? Im Lehrfall lässt sich eine bestimmte Fehlermeldung jeweils mit einer ausgebliebenen Rückgabe verknüpfen.

    Lösung: Der nachgewiesene Fehlerpfad benötigt eine zuverlässige Freigabe der Verbindung. Die Korrektur wird mit wiederholten Erfolgs- und Fehlerfällen geprüft. Danach muss die Belegung im vergleichbaren Ablauf wieder zurückgehen. Eine steigende Borrowed-Zahl allein wäre noch kein Beweis für ein Leck; steigende Last oder längere legitime Aufgaben können ebenfalls mehr Verbindungen belegen.

    14. Timeout ist nicht gleich Timeout

    ZeitlimitWelche Phase wird begrenzt?
    Connection Wait TimeoutWarten auf die Vergabe einer Poolverbindung.
    Connect TimeoutAufbau einer neuen physischen Verbindung; genauer Umfang hängt von Treiber und Konfiguration ab.
    Query TimeoutAusführung eines Statements nach den Regeln des Treibers.
    HTTP- oder Proxy-TimeoutWarten eines Webteilnehmers auf die benötigte Antwort.

    Gelöste Aufgabe: Eine Anfrage scheitert nach fünf Sekunden beim Ausleihen. Im betroffenen Zeitraum startet für sie kein SQL-Aufruf. Untersuche deshalb Poolbelegung, Vergabefehler und Verbindungsverfügbarkeit. Eine Erhöhung des Query Timeout greift für diese beobachtete Phase nicht.

    Bei UCP betrifft der Inactive Connection Timeout verfügbare Verbindungen, nicht ausgeliehene. Das ist nicht gleichbedeutend mit STATUS = INACTIVE in Oracle. Verfahren zur Rückforderung ausgeliehener Verbindungen haben eigene Regeln und können laufende Arbeit unterbrechen. Sie sind keine pauschale Reparatur für lange Belegungszeiten.

    Ein abgelaufenes Zeitlimit beim Client bestätigt nicht automatisch, dass alle nachgelagerten Arbeiten beendet sind. Fehlerbehandlung, Abbruch und Rückgabe müssen zusammenpassen. Die genaue Wirkung wird mit der eingesetzten Pool- und Treiberversion geprüft.

    15. Nach einer Unterbrechung: sichtbar heißt nicht benutzbar

    Nach einer Netzwerkunterbrechung oder einem Datenbankneustart kann ein Pool noch Verbindungsobjekte kennen, deren physische Verbindung nicht mehr verwendbar ist. Die Zahl der Objekte allein garantiert daher keine erfolgreiche nächste Abfrage. Eine Verbindungsvalidierung prüft die Nutzbarkeit nach dem Verfahren des jeweiligen Produkts.

    Beispiel und Vorgehen: Ein erster Artikelaufruf nach einer Unterbrechung scheitert, spätere Aufrufe funktionieren wieder. Vergleiche Fehlerzeitpunkt, Verbindungsalter und Protokolle zur Prüfung beziehungsweise Neuerstellung. Prüfe, ob die Anwendung eine ungültige Verbindung erkannt und ersetzt hat. Ein späterer Erfolg allein erklärt den ersten Fehler noch nicht.

    UCP kann Verbindungen unter anderem beim Ausleihen validieren. Häufigkeit und Verfahren haben einen Aufwand und richten sich nach Treiber und Konfiguration. Eine erfolgreiche Prüfung schützt außerdem nicht vor einer Unterbrechung unmittelbar danach. Fehlerbehandlung bleibt deshalb notwendig.

    16. Transaktionen und Sessionzustand bei Wiederverwendung

    Wiederverwendung bedeutet, dass später ein anderer Arbeitsauftrag dieselbe Verbindung erhält. Offene Transaktionen und veränderte Sessioneinstellungen dürfen dabei nicht unbeabsichtigt übernommen werden. Der Ablauf muss definieren, wie Datenbankarbeit abgeschlossen und der erforderliche Zustand für den nächsten Auftrag hergestellt wird.

    Eine Rückgabe ist kein fachlicher Auftrag zum Speichern von Änderungen. Bei schreibenden Anwendungen gehören die Entscheidung über Commit oder Rollback und die Freigabe in eine abgestimmte Transaktionsbehandlung. Welches automatische Aufräumen der Pool oder ein Framework übernimmt, muss für das konkrete Produkt geklärt sein.

    Auch eine inaktive Session kann noch eine offene Transaktion besitzen. Daraus folgt: INACTIVE ist kein sicheres Freigabesignal für einen manuellen Eingriff. Die Grundlagen stehen im Transaktionskapitel; hier ist entscheidend, dass Sessionstatus, Transaktionsabschluss und Poolrückgabe unterschiedliche Fragen beantworten.

    17. Wie viele Verbindungen sind sinnvoll?

    Die Anzahl angemeldeter Personen reicht für diese Entscheidung nicht aus. Relevant sind unter anderem gleichzeitig benötigte Datenbankarbeit, Dauer der Ausleihe, Lastspitzen und die Leistungsfähigkeit der gesamten Verarbeitung. Mehr Verbindungen erzeugen nicht automatisch mehr Durchsatz. Sie können auch mehr gleichzeitige Arbeit und zusätzliche Konkurrenz ermöglichen.

    Rechenbeispiel als Orientierung: In einem stabilen Zeitraum beginnen und enden durchschnittlich zwanzig Ausleihvorgänge pro Sekunde. Jede Verbindung bleibt im Mittel 0,2 Sekunden ausgeliehen. Dann ergibt sich als mittlere Belegung etwa 20 × 0,2 = 4. Verlängert sich die mittlere Haltezeit bei gleichem Durchsatz auf zwei Sekunden, wären es etwa vierzig. Gezählt werden Ausleihvorgänge, nicht automatisch HTTP-Aufrufe.

    Diese Mittelwertbetrachtung legt kein sinnvolles Maximum fest. Sie enthält weder Spitzen noch Verteilungsunterschiede und setzt einen passenden stabilen Messzeitraum voraus. Der praktische Nutzen ist die Frage: Hat sich die Zahl der Aufgaben erhöht oder hält jede Aufgabe ihre Verbindung länger? Beides verlangt unterschiedliche Untersuchungen.

    18. Connection Pool, Shared Pool und DRCP unterscheiden

    BegriffEinordnung
    Connection Pool der AnwendungVerwaltet wiederverwendbare Zugriffe der Anwendung auf die Datenbank.
    Oracle Shared PoolSpeicherbereich innerhalb der SGA; kein Vorrat an ausleihbaren Anwendungsverbindungen.
    DRCPDatabase Resident Connection Pooling: Pooling von Datenbankserverressourcen auf Datenbankseite.

    DRCP kann mit einem clientseitigen Pool zusammenarbeiten. Es ist eine eigene Technik und nicht automatisch aktiv, sobald die Anwendung UCP verwendet. Bei solchen Architekturen darf die einfache Eins-zu-eins-Annahme unserer Zahlenbeispiele nicht ungeprüft übertragen werden. Für die erste Diagnose klärt man daher immer, welches Verbindungsmodell tatsächlich eingesetzt wird.

    19. Ein vollständiger Diagnoseweg

    1. Betroffenen Pool bestimmen: Anwendung, Prozess, Poolname, Zielservice und Zeitpunkt erfassen.
    2. Belegung lesen: Total, Borrowed, Available, Pending und Ausleihfehler zusammen betrachten.
    3. Zeitverlauf prüfen: Kurze Spitze, dauerhaftes Warten oder fortlaufender Anstieg?
    4. Datenbanksicht ergänzen: Sessionstatus und Datenbankarbeit für die passende Herkunft vergleichen.
    5. Ausleihdauer erklären: SQL-Arbeit, externe Wartezeit, Transaktion und Rückgabe anhand konkreter Abläufe unterscheiden.
    6. Ergebnis nachweisen: Nach einer separat freigegebenen Korrektur denselben Ablauf unter vergleichbarer Last erneut messen.

    Ein guter Befund lautet beispielsweise: „Im Pool Artikelservice waren um 09:10 alle zehn Verbindungen ausgeliehen; vier Anforderungen warteten. Neun Verbindungen wurden während externer Arbeit festgehalten.“ Das ist wesentlich genauer als „zu viele Sessions“. Es beschreibt Beobachtung und Ursache im untersuchten Lehrfall, ohne eine pauschale Konfigurationsänderung abzuleiten.

    20. Quellen und Geltungsbereich

    Die Oracle-Begriffe beziehen sich auf die Dokumentation für Oracle Database und UCP 19c. Andere Pools und Treiberversionen können abweichende Regeln besitzen. Die Tabellen sind fiktive, rechnerisch abgestimmte Lernbeispiele. Die SQL-Abfragen wurden hier nicht auf einer Oracle-Instanz ausgeführt; Rechte, Container und reale Zuordnung müssen in der eigenen Umgebung geprüft werden. Dieses Kapitel verändert keine Poolkonfiguration und beendet keine Sessions.

    Poolzahlen mit einem kleinen Gegenbeispiel lesen

    Zwei Anwendungsprozesse betreiben je einen Pool mit Maximum 10. Im ersten sind 8 Verbindungen ausgeliehen, im zweiten 2. Daraus folgen 10 ausgeliehene Verbindungen insgesamt, aber kein gemeinsamer frei verschiebbarer Vorrat: Eine freie Verbindung des zweiten Pools steht dem ersten nicht automatisch zur Verfügung. Prüfe deshalb Poolname und Prozess, bevor du Zahlen addierst.

    Oracle ACTIVE ist weiterhin eine andere Messgröße. Erkläre bei einer wartenden Anfrage zuerst, ob sie auf einen Poolplatz oder innerhalb eines Datenbankaufrufs wartet. Die vorhandenen Fälle zeigen, welche Messwerte diese beiden Situationen auseinanderhalten.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Ein Connection Pool hält Verbindungen zur Wiederverwendung bereit. Anwendungen leihen sie aus und geben sie nach der Arbeit zurück.
    2. Benutzerzahl, Anfragezahl, Verbindungen und Datenbanksessions sind unterschiedliche Größen. Viele offene Sessions können deshalb auch bei wenigen aktiven Benutzern plausibel sein.
    3. Borrowed, Available und Pending beschreiben den Poolzustand. Eine ausgeliehene Verbindung muss aus Oracle-Sicht nicht ständig ACTIVE sein.
    4. Ein erschöpfter Pool kann durch lange Nutzung oder fehlende Rückgabe entstehen. Poolwerte und Datenbanksicht müssen gemeinsam untersucht werden, bevor das Maximum verändert wird.
    5. Wiederverwendete Verbindungen benötigen einen kontrollierten Transaktions- und Sessionzustand. Nach Unterbrechungen muss zusätzlich geprüft werden, ob eine vorhandene Verbindung noch nutzbar ist.

    Lernzielkontrolle

    Beantworte die Fragen zunächst selbst. Öffne anschließend die jeweilige Frage, um die Lösung mit Begründung zu lesen.

    Frage 1: Warum kann eine Oracle-Session nach Ende einer Anfrage weiter sichtbar sein?

    Lösung: Der Pool kann die physische Verbindung für spätere Aufgaben behalten. Bei UCP gibt close() auf dem ausgeliehenen Verbindungsobjekt den Zugriff an den Pool zurück. Eine weiter sichtbare Session beweist daher kein Verbindungsleck.

    Frage 2: Ein Pool hat zehn Verbindungen, acht ausgeliehen und zwei frei. Oracle zeigt drei ACTIVE. Ist das ein Widerspruch?

    Lösung: Nein. Im einfachen Lehrmodell können fünf ausgeliehene Verbindungen gerade außerhalb eines Datenbankaufrufs gehalten werden. Zusammen mit den zwei freien ergeben sie sieben INACTIVE-Sessions. Poolbelegung und Sessionstatus beschreiben unterschiedliche Zustände.

    Frage 3: Drei Anwendungsprozesse besitzen je einen Pool mit maximal zwanzig Verbindungen. Wie groß ist ihr gemeinsames Maximum?

    Lösung: Bis zu sechzig Verbindungen: 3 × 20 = 60. Das ist eine konfigurierte Obergrenze dieser drei Pools, keine Messung der aktuellen Belegung. Weitere Pools und andere Zugriffe sind darin nicht enthalten.

    Frage 4: Eine Anfrage scheitert beim Ausleihen nach fünf Sekunden. Hilft ein höherer Query Timeout?

    Lösung: Nicht für diese beobachtete Wartephase. Noch vor dem SQL-Aufruf fehlt die nutzbare Verbindung. Untersucht werden Poolbelegung, Ausleihdauer, Verfügbarkeit und die zutreffenden Vergabefehler.

    Frage 5: Borrowed steigt bei gleicher Last immer weiter. Ist damit ein Verbindungsleck bewiesen?

    Lösung: Noch nicht. Zunächst sind längere Aufgaben und andere Veränderungen auszuschließen. Im gelösten Beispiel belegt die Zuordnung zwischen beendeten Fehlerfällen und ausgebliebener Rückgabe das Leck. Nach der Korrektur muss die Belegung im vergleichbaren Ablauf wieder zurückgehen.

    Frage 6: Welche zwei Seiten brauchst du für die Diagnose „Pool voll, Oracle kaum aktiv“?

    Lösung: Pool- und Anwendungsdaten zeigen Besitzer, Ausleihdauer und wartende Anforderungen. Die Datenbank zeigt die zugehörige Arbeit und Sessionzustände. Gemeinsam lässt sich unterscheiden, ob Verbindungen in Oracle arbeiten oder außerhalb eines Aufrufs festgehalten werden.

    Frage 7: Zwei getrennte Pools haben Maximum 10. Ist eine freie Verbindung des zweiten Pools automatisch im ersten verfügbar?

    Lösung: Nein. Die Vorräte gehören zu ihren jeweiligen Pools. Poolname, Prozess und Belegung müssen getrennt betrachtet werden.

    Frage 8: Welche Gegenprobe gehört zur Korrektur eines Verbindungslecks?

    Lösung: Wiederhole erfolgreiche und fehlerhafte Abläufe bei vergleichbarer Last. Benötigte Verbindungen müssen zuverlässig zurückgegeben werden; Warteschlange und Fehlerrate dürfen nicht durch die Korrektur steigen.

    41. PL/SQL-Grundlagen

    Programmabläufe verstehen und gespeicherte Programme gezielt untersuchen.

    Lernkompass
    Einfach gesagt SQL fragt Daten ab. PL/SQL verbindet solche Anweisungen mit Rechenschritten, Entscheidungen und Fehlerbehandlung.
    Warum ist das wichtig? Eine Anwendung kann hinter einem einzigen Aufruf viele Schritte ausführen. Bei einem Fehler hilft es, diesen Ablauf zu verstehen.
    Nach diesem Kapitel Du erkennst die wichtigsten Bausteine und kannst Status, Fehler, Schnittstellen und Abhängigkeiten lesen.

    Einführung: PL/SQL ist Oracles prozedurale Erweiterung von SQL. Damit lassen sich Datenbankanweisungen mit Variablen, Entscheidungen, Wiederholungen und Fehlerbehandlung zu einem Ablauf verbinden. SQL bleibt für die mengenorientierte Datenverarbeitung zuständig; PL/SQL ergänzt die Steuerung darum. Für den DBA sind solche Programme wichtig, weil Anwendungen, Jobs und Verwaltungsfunktionen sie verwenden können.

    Das vorhandene Preisbeispiel führt vom einzelnen Rechenschritt zu einem benannten Programmbaustein. Danach unterscheiden wir anonyme Blöcke, gespeicherte Programme und Packages. Die Diagnose zeigt, wie Definition, Objektstatus und Compilerfehler zusammengehören. Du sollst einen Programmfehler eingrenzen und den Ausführungskontext verstehen können, bevor du Code oder Rechte veränderst.

    Oracle 19c: fachliche Grundlage

    1. Von SQL zum Programmablauf

    Eine SQL-Abfrage beschreibt, welche Daten du erhalten möchtest. Zum Beispiel liefert sie alle offenen Bestellungen. PL/SQL kann darum einen Ablauf bauen: einen Wert übernehmen, ihn prüfen, eine Berechnung durchführen und je nach Ergebnis unterschiedlich reagieren.

    PL/SQL steht für die prozedurale Erweiterung von SQL in Oracle. „Prozedural“ bedeutet hier: Ein Ablauf wird durch einzelne Programmschritte beschrieben. SQL bleibt darin wichtig. Wenn eine einzige SQL-Anweisung eine Datenaufgabe gut löst, muss sie nicht durch eine Schleife ersetzt werden.

    2. Einen Block von außen nach innen lesen

    Ein Block ist ein zusammengehöriger Programmabschnitt. DECLARE enthält optionale Vorbereitungen, BEGIN startet die ausführbaren Schritte, EXCEPTION kann Fehler behandeln und END beendet den Block. Unser Lernbeispiel benötigt keine Datenbanktabellen:

    PL/SQL – Lernbeispiel
    DECLARE
      l_netto   NUMBER := 250;
      l_satz    NUMBER := 20;
      l_brutto  NUMBER;
    BEGIN
      l_brutto := l_netto * (1 + l_satz / 100);
    END;

    Der Doppelpunkt mit Gleichheitszeichen, :=, weist einer Variablen einen Wert zu. Nach der Rechnung enthält l_brutto den Wert 300. Der Block erzeugt dadurch noch keine sichtbare Ausgabe. Die folgende Tabelle beschreibt seinen inneren Zustand:

    VariableWert nach der Rechnung
    l_netto250
    l_satz20
    l_brutto300

    Das Beispiel ist reiner Lerncode. Ein abschließender Schrägstrich in SQL*Plus wäre eine Anweisung an das Werkzeug, den gepufferten Block auszuführen; er gehört nicht zum eigentlichen PL/SQL-Block. Für eine sichtbare Textausgabe wäre zusätzlich eine passende Ausgabeanweisung und Werkzeugkonfiguration erforderlich.

    3. Variablen und Datentypen

    Eine Variable ist ein benannter Platz für einen Wert während des Ablaufs. NUMBER eignet sich für Zahlen, VARCHAR2 für Text. Der Name l_netto ist eine frei gewählte Bezeichnung; das Präfix l_ ist lediglich eine verbreitete Kennzeichnung lokaler Variablen.

    Ohne Anfangswert enthält eine solche Variable normalerweise NULL. NULL bedeutet fehlender oder unbekannter Wert und ist nicht dasselbe wie null Euro. Eine Rechnung mit NULL liefert häufig ebenfalls NULL. Deshalb müssen fehlende Eingaben bewusst behandelt werden.

    Vertiefung: Datentypen an vorhandene Definitionen koppeln

    Mit %TYPE kann eine Variable ihren Datentyp von einer Spalte oder einer anderen Variablen übernehmen. %ROWTYPE beschreibt einen Datensatz passend zu einer Zeilenstruktur. Das spart doppelte Typdefinitionen. Änderungen an referenzierten Objekten können trotzdem Auswirkungen auf das Programm haben. %TYPE übernimmt von einer Tabellenspalte nicht automatisch alle Regeln wie deren NOT-NULL-Constraint.

    4. Entscheidungen und Wiederholungen

    Eine IF-Abfrage könnte prüfen, ob der Nettopreis kleiner als null ist. Dann soll die Berechnung abgebrochen und die Eingabe korrigiert werden. Ein ELSE-Zweig beschreibt, was andernfalls passiert. Eine Bedingung muss ausdrücklich TRUE ergeben, damit ihr THEN-Zweig läuft; eine Bedingung mit NULL kann unbekannt sein.

    Schleifen wiederholen Arbeit. Bei zehn einzelnen Berechnungen mag das anschaulich sein. Für tausende Tabellenzeilen ist jedoch zuerst zu prüfen, ob SQL die Aufgabe als gemeinsame Mengenoperation erledigen kann. Viele einzelne Wechsel zwischen SQL und PL/SQL können zusätzlichen Aufwand verursachen. BULK COLLECT und FORALL sind weiterführende Werkzeuge für passende Massenverarbeitung, keine automatische Beschleunigung jeder Schleife.

    5. Prozedur, Funktion, Package und Trigger

    BausteinEinfach erklärt
    ProzedurEin benannter Ablauf, beispielsweise eine Prüfung durchführen.
    FunktionEin benannter Ablauf mit einem Rückgabewert, beispielsweise den Bruttopreis liefern.
    PackageZusammengehörige Schnittstellen und Programmteile unter einem gemeinsamen Namen.
    TriggerEin Ablauf, den ein festgelegtes Datenbankereignis automatisch auslöst.

    Eine Prozedur kann Werte auch über Ausgabeparameter zurückgeben. Eine Funktion besitzt dagegen einen ausdrücklich definierten Rückgabewert. Daraus lässt sich nicht ableiten, ob ein Programm Daten verändert. Auch ein harmlos klingender Funktionsname beweist keine Nebenwirkungsfreiheit.

    Ein Package besitzt eine Specification mit öffentlich nutzbaren Definitionen. Ein Package Body enthält die Umsetzung und gegebenenfalls interne Hilfsroutinen. Nicht jedes Package benötigt einen Body. Ein Trigger kann beispielsweise bei einer Tabellenänderung zusätzliche Prüfungen auslösen. Dadurch kann hinter einer einzelnen Anwendungsaktion mehr Arbeit stattfinden als zunächst sichtbar.

    Vertiefung: Package-Schnittstelle, Body und Auswirkungen einer Änderung

    Die Specification ist die veröffentlichte Schnittstelle eines Packages. Im Lernbeispiel könnte BESTELL_SERVICE eine Funktion ANZAHL_FUER_REGION mit einem Regionsnamen als Eingabe und einer Zahl als Rückgabewert anbieten. Der Body setzt diese Funktion um, etwa durch einen Zugriff auf OFFENE_BESTELLUNGEN. Der Aufrufer braucht dafür weder die interne SELECT-Anweisung noch die Namen privater Hilfsroutinen zu kennen.

    ÄnderungWas muss geprüft werden?
    Nur interne Umsetzung im BodyBleibt die öffentliche Schnittstelle gleich und liefert die Berechnung weiterhin das fachlich erwartete Ergebnis?
    Parameter oder Rückgabetyp in der SpecificationPassen die vorhandenen Aufrufer noch zur geänderten Schnittstelle?
    Referenziertes Objekt oder erforderliches RechtKann der Body seine benötigten Objekte weiterhin auflösen und verwenden?

    Öffentlich deklarierte Unterprogramme müssen im Body passend definiert werden. Ein Package, das nur geeignete Deklarationen enthält, braucht dagegen nicht zwingend einen Body. Bei einer reinen Body-Änderung müssen Aufrufer nicht allein wegen einer geänderten internen Implementierung neu übersetzt werden. Das ist ein Vorteil der Trennung; es ist aber keine Garantie für fachlich unverändertes Verhalten.

    Ein zusätzlicher Betriebsaspekt ist der Package-Zustand. Ein zustandsbehaftetes Package kann in einer Session Werte halten. Wird sein Body neu kompiliert, während die Session das Package bereits instanziiert hat, kann beim nächsten Aufruf der bisherige Zustand verworfen und ORA-04068 gemeldet werden. Die Session könnte zu einem langlebigen Connection Pool gehören. Deshalb umfasst eine Auslieferungsprüfung auch bestehende Verbindungen und die Fehlerbehandlung der Anwendung, nicht nur einen Test mit einer neuen Anmeldung.

    Oracle 19c: Package Specification; Package Body; Package State.

    6. Parameter sind die Schnittstelle

    Unsere Preisfunktion könnte zwei Eingaben besitzen: Nettopreis und Steuersatz. Der Aufrufer übergibt 250 und 20; die Funktion gibt 300 zurück. IN bedeutet Eingabe, OUT Ausgabe und IN OUT einen Wert, der hinein- und verändert wieder herausgeht.

    Ein Standardwert erlaubt bei passenden Parametern das Weglassen eines Arguments. Mehrere Routinen mit gleichem Namen, aber unterschiedlichen passenden Parameterlisten heißen Überladungen. Zur Diagnose gehört deshalb die konkrete Schnittstelle, nicht nur der Name.

    7. Gespeicherte Programme und ihr Status

    SELECT: Welche Programmobjekte sind vorhanden?
    READ ONLY – Programmstatus
    SELECT object_name, object_type, status
    FROM   all_objects
    WHERE  owner = UPPER('&OWNER')
    AND    object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE',
                           'PACKAGE BODY', 'TRIGGER')
    ORDER BY object_name, object_type;
    Fiktive Beispielausgabe:
    OBJECT_NAMEOBJECT_TYPESTATUS
    PREIS_SERVICEPACKAGEVALID
    PREIS_SERVICEPACKAGE BODYINVALID

    Die fiktive Ausgabe zeigt eine gültige Schnittstelle und einen ungültigen Body. VALID heißt, dass das Objekt aktuell gültig ist; es garantiert keine fachlich richtige Berechnung. INVALID beweist keine beschädigten Daten. Mögliche Ursachen sind Compilerfehler oder Änderungen an Abhängigkeiten. Oracle kann eine erneute Übersetzung bei Verwendung versuchen. Vor manuellen Änderungen werden Ursache und Fehlermeldungen gelesen.

    ALL_-Views zeigen die für die aktuelle Verbindung sichtbaren Objekte. Eine leere Liste kann deshalb auch an Sichtbarkeit oder Filtern liegen. &OWNER ist ein SQL*Plus-Eingabeplatzhalter; für diese Metadatenfilter ist der im Dictionary gespeicherte Name einzusetzen. UPPER passt zu üblichen, ohne Anführungszeichen angelegten Namen.

    8. Übersetzungsfehler und Laufzeitfehler unterscheiden

    Beim Übersetzen prüft Oracle unter anderem Syntax und auflösbare Referenzen. Ein fehlendes Semikolon ist ein typischer Übersetzungsfehler. Ein Laufzeitfehler entsteht dagegen erst bei einem konkreten Ablauf, etwa wenn eine Division durch null versucht wird. Ein gültiges Programm kann deshalb später trotzdem scheitern.

    SELECT: aktuelle Compilerhinweise für ein Objekt lesen
    READ ONLY – Compilerfehler
    SELECT type, line, position, attribute, text
    FROM   all_errors
    WHERE  owner = UPPER('&OWNER')
    AND    name = UPPER('&OBJECT_NAME')
    ORDER BY type, sequence;
    Fiktive Beispielausgabe:
    TYPELINEPOSITIONATTRIBUTETEXT
    PACKAGE BODY1210ERRORPLS-00201: identifier 'L_BRUTOO' must be declared

    Zeile und Position verweisen auf die gespeicherte Programmeinheit. ATTRIBUTE unterscheidet Fehler und Warnungen. Beginne beim ersten aussagekräftigen Hinweis; weitere Meldungen können Folgeprobleme sein. Diese View ist kein Verlauf aller früheren Anwendungsfehler. Keine Zeilen bedeuten deshalb nicht, dass ein Programm bei jeder Eingabe funktioniert.

    9. Den passenden Quelltextausschnitt lesen

    SELECT: wenige Zeilen eines Package Body anzeigen
    READ ONLY – Quelltextausschnitt
    SELECT line, text
    FROM   all_source
    WHERE  owner = UPPER('&OWNER')
    AND    name = UPPER('&OBJECT_NAME')
    AND    type = 'PACKAGE BODY'
    AND    line BETWEEN 10 AND 16
    ORDER BY line;
    Fiktive Beispielausgabe:
    LINETEXT
    10BEGIN
    11 l_brutto := p_netto * (1 + p_satz / 100);
    12 RETURN l_brutoo;

    Hier wird Quelltext gelesen und nicht ausgeführt. Der Typfilter ist bewusst auf PACKAGE BODY beschränkt; für eine eigenständige Funktion wäre FUNCTION passend. Lies einige Zeilen vor und nach einer gemeldeten Fehlerstelle, damit der Zusammenhang erkennbar bleibt. Im fiktiven PREIS_SERVICE zeigt die Fehlerzeile auf L_BRUTOO: Im vorherigen Schritt wurde L_BRUTTO berechnet. Der abweichende Name erklärt hier den Compilerfehler. Das ist eine Diagnose, keine automatisch ausgeführte Quelltextänderung.

    Quelltext kann vertrauliche Geschäftslogik oder versehentlich hinterlegte Zugangsdaten enthalten. Teile deshalb nur den benötigten Ausschnitt. Bei gewrapptem Code ist die ursprüngliche Darstellung nicht einfach über diese View lesbar.

    10. Ein- und Ausgaben im Dictionary erkennen

    SELECT: Argumente einer bekannten Routine
    READ ONLY – Routineargumente
    SELECT subprogram_id, overload,
           argument_name, position, in_out, data_type
    FROM   all_arguments
    WHERE  owner = UPPER('&OWNER')
    AND    package_name = 'PREIS_SERVICE'
    AND    object_name = 'BRUTTO'
    AND    data_level = 0
    ORDER BY subprogram_id, sequence;

    SUBPROGRAM_ID unterscheidet Unterprogramme; OVERLOAD kennzeichnet Überladungen. POSITION = 0 bezeichnet bei Funktionen den Rückgabewert. Seit Oracle 18c ist DATA_LEVEL in ALL_ARGUMENTS immer 0; es zeigt dort keine verschachtelten Typstufen mehr an.

    Fiktive Beispielausgabe:
    SUBPROGRAM_IDOVERLOADARGUMENT_NAMEPOSITIONIN_OUTDATA_TYPE
    1NULLNULL0OUTNUMBER
    1NULLP_NETTO1INNUMBER
    1NULLP_SATZ2INNUMBER

    Position 0 steht hier für den Rückgabewert einer Funktion; dessen ARGUMENT_NAME ist NULL. Danach folgen die zwei Eingaben. Der feste Package- und Routinenname ist für die eigene Untersuchung anzupassen. Bei Überladungen müssen zusätzlich SUBPROGRAM_ID beziehungsweise OVERLOAD zur eindeutigen Zuordnung betrachtet werden. Eine Routine ohne Parameter muss nicht als einzelne Zeile in ALL_ARGUMENTS erscheinen.

    11. Fehler bewusst behandeln

    IF und Fehlerbehandlung an einer Preisberechnung

    Eigenständiges Lernbeispiel, kein Diagnose-SELECT. In SQL*Plus zuerst SET SERVEROUTPUT ON aktivieren, damit DBMS_OUTPUT angezeigt wird. Der Block verändert keine Daten.

    Wo geht der Ablauf nach einem Fehler weiter? PL/SQL springt zum passenden Exception Handler; es setzt anschließend nicht automatisch direkt hinter der fehlgeschlagenen Anweisung fort. Nach einem normal beendeten Handler ist der betreffende Block beendet. Ein umgebender Block kann danach weiterlaufen. Wird die Ausnahme erneut ausgelöst, sucht PL/SQL dagegen im äußeren Kontext nach einer Behandlung. Im vorhandenen Preisbeispiel sorgt RAISE daher für eine erkennbare Fehlerrückmeldung. Ein sichtbarer Fehlertext allein wäre noch keine Zusicherung, dass der Aufrufer einen Fehlerstatus erhält. Oracle 19c.

    PL/SQL – Lernbeispiel
    DECLARE
      l_netto NUMBER := 250;
    BEGIN
      IF l_netto IS NULL OR l_netto < 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'Preis muss vorhanden und nicht negativ sein');
      END IF;
      DBMS_OUTPUT.PUT_LINE('Brutto: ' || TO_CHAR(l_netto * 1.2, 'FM999990'));
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
        RAISE;
    END;
    /

    Bei NULL oder einem negativen Preis wird die Eingabe abgewiesen. Ausgabe mit 250: Brutto: 300. Setzt du l_netto auf −1, wird ORA-20001 mit dem eigenen Fehlertext ausgegeben. RAISE gibt den Fehler anschließend an den Aufrufer weiter; die Verarbeitung wird nicht als erfolgreich verschleiert. SQL*Plus zeigt zusätzlich den Fehlerstack, dessen Zeilennummern vom eingefügten Block abhängen.

    Ein EXCEPTION-Abschnitt bestimmt, wie ein Block auf bestimmte Fehler reagiert. SELECT INTO erwartet bei einer gewöhnlichen Einzelzeilenabfrage genau eine Zeile. Keine Zeile führt zu NO_DATA_FOUND, mehrere Zeilen zu TOO_MANY_ROWS. Eine Aggregatabfrage ohne GROUP BY, etwa COUNT(*), verhält sich anders: Sie liefert auch bei keiner passenden Eingabezeile ein Ergebnis.

    Eine Behandlung muss zur Bedeutung des Fehlers passen. „Kunde nicht gefunden“ kann eine verständliche Rückmeldung sein. Ein unerwarteter technischer Fehler darf hingegen nicht einfach verschluckt werden, während die Anwendung Erfolg meldet.

    Vertiefung: Fehler weitergeben und den Ursprung erhalten

    WHEN OTHERS fängt die übrigen behandelbaren Ausnahmen ab. Oracle empfiehlt am Ende eines solchen Handlers RAISE oder RAISE_APPLICATION_ERROR. Ein leeres Weiterlaufen kann die Ursache verbergen. RAISE ohne ausdrücklich benannte Ausnahme wirft innerhalb des Handlers die aktuelle Ausnahme erneut. Für Diagnose sind Fehlermeldung, Fehlerstack und ursprüngliche Fehlerstelle wichtig; eine spätere Protokollierungsstörung darf die erste Ursache nicht verdrängen.

    12. Ein Fehler beendet nicht automatisch jede Transaktion

    Ein Programm kann rechnen, lesen und auch Daten ändern. Ob Änderungen bestätigt oder zurückgenommen werden, hängt vom Ablauf und seinem Aufrufer ab. Eine unbehandelte PL/SQL-Ausnahme ist keine allgemeine Zusage, dass Oracle die gesamte bisherige Transaktion zurückrollt. Ebenso bestätigt das erfolgreiche Ende eines Blocks nicht automatisch alle Änderungen.

    COMMIT, ROLLBACK und Sperren werden im Transaktionskapitel erklärt. Für PL/SQL lautet die zusätzliche Prüffrage: Wer besitzt die Verantwortung für die Transaktion, und enthält eine aufgerufene Routine selbst solche Anweisungen? Ein Test unbekannter Programme in Produktion ist keine reine Metadatenabfrage.

    13. Mit wessen Rechten läuft das Programm?

    SELECT: AUTHID einer gespeicherten Programmeinheit
    READ ONLY – Ausführungskontext
    SELECT object_name, procedure_name, authid
    FROM   all_procedures
    WHERE  owner = UPPER('&OWNER')
    AND    object_name = UPPER('&OBJECT_NAME')
    ORDER BY procedure_name NULLS FIRST;
    Fiktive Beispielausgabe:
    OBJECT_NAMEPROCEDURE_NAMEAUTHID
    PREIS_SERVICEBRUTTODEFINER

    DEFINER bezeichnet den Kontext der definierenden Programmeinheit, CURRENT_USER den Aufruferkontext. AUTHID beeinflusst bei der Ausführung Namensauflösung und Rechteprüfung. Das ist keine pauschale Zusage, dass jede benötigte Tabelle erreichbar ist.

    Bei Definer-Rechten zählen in üblichen Fällen direkte Objektberechtigungen statt lediglich über eine Benutzerrolle geerbter Rechte. Zusätzlich existieren besondere Regeln, etwa für an Programmeinheiten gewährte Rollen und Invoker-Rechte. Fehlende Rechte müssen deshalb am konkreten Zugriff geprüft werden. Die allgemeinen Benutzer- und Rollenregeln stehen im Security-Kapitel.

    14. Abhängigkeiten erklären Folgefehler

    Die Objektvertiefung in Kapitel 7 erklärt direkte und indirekte Beziehungen sowie die Suche nach Verwendern einer Tabelle. Hier wird die Gegenrichtung für einen Package Body gelesen: Welche Objekte benötigt seine Umsetzung?

    SELECT: welche Objekte eine Programmeinheit referenziert
    READ ONLY – Programmabhängigkeiten
    SELECT referenced_owner, referenced_name, referenced_type
    FROM   all_dependencies
    WHERE  owner = 'APP_DEMO'
    AND    name = 'BESTELL_SERVICE'
    AND    type = 'PACKAGE BODY'
    ORDER BY referenced_owner, referenced_name, referenced_type;
    Fiktive Beispielausgabe:
    REFERENCED_OWNERREFERENCED_NAMEREFERENCED_TYPE
    APP_DEMOOFFENE_BESTELLUNGENVIEW

    Der fiktive Auszug zeigt eine Abhängigkeit des Bodys BESTELL_SERVICE zur View OFFENE_BESTELLUNGEN. In einer echten Ausgabe können weitere Zeilen erscheinen, etwa eine Beziehung zur eigenen Package-Spezifikation. Die Abfrage ist kein vollständiger Aufrufverlauf. Folge bei einem konkreten Fehler der betroffenen Referenz und lies die Compilerhinweise aus Abschnitt 8; deren TYPE unterscheidet unter anderem PACKAGE und PACKAGE BODY.

    15. Dynamisches SQL und Hintergrundaufrufe

    Dynamisches SQL entsteht erst während des Programmlaufs als Text. Das kann für variable Aufgaben nötig sein. Werden Eingaben unkontrolliert in diesen Text eingebaut, können sie dessen Bedeutung verändern. Werte sollen deshalb über passende Bind-Variablen übergeben werden. Tabellen- oder Spaltennamen lassen sich nicht einfach wie Datenwerte binden; dafür sind gesonderte kontrollierte Regeln nötig.

    Eine gespeicherte Prozedur kann auch durch einen Scheduler-Job aufgerufen werden. Läuft sie interaktiv und scheitert im Hintergrund, gehören Jobkontext, übergebene Argumente, Rechte und konkrete Fehlermeldung zur Untersuchung. Die Scheduler-Einstellungen werden dort erklärt.

    16. Eine verständliche Diagnosefolge

    1. Den konkreten Aufruf, Besitzer und vollständigen Fehler festhalten.
    2. Übersetzungsfehler von einem Fehler bei der Ausführung unterscheiden.
    3. Objektstatus lesen; bei einem Package Specification und Body getrennt betrachten.
    4. Compilerhinweise und den passenden Quelltextausschnitt zusammen lesen.
    5. Argumente, Abhängigkeiten und Ausführungskontext überprüfen.
    6. Vor Änderungen einen gezielten Test in einer geeigneten Testumgebung planen.

    Beispiel: Die Anwendung meldet „Preisberechnung nicht möglich“. Anna sieht einen INVALID Package Body. ALL_ERRORS nennt einen nicht auflösbaren Bezeichner. Der Quelltextausschnitt und die Abhängigkeiten helfen anschließend zu klären, ob eine Referenz, ein Objekt oder eine erforderliche Berechtigung betroffen ist. Sie ändert nicht vorschnell die Preisformel.

    17. Weiterführende Informationen

    Oracle 19c: PL/SQL-Überblick, Fehlerbehandlung und AUTHID und Rechte.

    Read-only-Diagnose: Sechs SELECT-Abfragen lesen Metadaten. Das zusätzliche Rechenbeispiel erläutert Variablen und wird vom Wiki nicht ausgeführt.

    Offizielle Oracle-Referenzen (19c)

    ALL_ARGUMENTS · plsql-error-handling

    Vom Rechenbeispiel zum Fehlerbefund

    Lies zuerst den anonymen Block und rechne 250 × 1,20 = 300 von Hand nach. Danach verfolge den gespeicherten PREIS_SERVICE: Objektstatus lesen, Compilerhinweis finden und den genannten Quelltextausschnitt vergleichen. Die Schreibweisen L_BRUTTO und L_BRUTOO unterscheiden sich um einen Buchstaben. Damit lässt sich der gezeigte Fehler erklären, ohne ein Programm neu zu kompilieren.

    Ein anonymer Block ist ein einmaliger Programmtext; ein gespeichertes Package besitzt dagegen einen Namen und eine Definition in der Datenbank. Die folgenden Beispiele zeigen beide Lernformen ausdrücklich getrennt.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. PL/SQL ergänzt SQL um Variablen, Entscheidungen, Schleifen und Fehlerbehandlung. Ein Block besitzt einen ausführbaren Teil sowie optionale Deklarations- und Ausnahmebereiche.
    2. Prozeduren, Funktionen, Packages und Trigger erfüllen unterschiedliche Aufgaben. Parameter beschreiben, welche Werte über die jeweilige Schnittstelle hinein- und hinausgehen.
    3. Übersetzungsfehler und Laufzeitfehler werden unterschiedlich untersucht. Objektstatus, Compilerfehler, Quelltext und Fehlerstack gehören in den passenden Diagnosekontext.
    4. Ein Exception Handler behandelt eine Ausnahme; er setzt die Verarbeitung nicht automatisch an der fehlgeschlagenen Anweisung fort. RAISE gibt eine Ausnahme weiter, während eine bloße Textausgabe kein Fehlerstatus für den Aufrufer ist.
    5. Ausführungskontext, Definer beziehungsweise Invoker Rights und Transaktionsgrenzen beeinflussen das Verhalten. Ein Programmfehler bedeutet nicht automatisch, dass sämtliche bisherigen Änderungen zurückgerollt wurden.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Was unterscheidet Package Specification und Body?

    Lösung: Die Specification beschreibt die öffentliche Schnittstelle. Der Body enthält die Implementierung. Ihr Objektstatus kann verschieden sein; deshalb beide getrennt prüfen.

    Frage 2: Warum kann ein interaktiver SELECT funktionieren, aber ein Definer-Rights-Programm scheitern?

    Lösung: Das interaktive Recht kann aus einer Benutzerrolle stammen. Für statische Referenzen und den Definer-Kontext sind die passenden direkten Rechte entscheidend; prüfe Objektbesitzer, Fehler und AUTHID statt pauschal weitere Rollen zu vergeben.

    Frage 3: Wie untersuchst du einen INVALID Package Body lesend?

    Lösung: Zuerst den Objektstatus mit Owner und Objekttyp sichern. Dann ALL_ERRORS beziehungsweise bei passenden Rechten DBA_ERRORS auswerten und die genannten Zeilen im Quelltext prüfen. Die Fehlerstelle führt zur fehlenden Referenz, Syntax oder Berechtigung; INVALID allein nennt die Ursache nicht.

    Frage 4: Warum sieht man nach dem ersten Rechenblock noch keine Zahl im Werkzeug?

    Lösung: Die Zuweisung ändert nur den Variablenwert im Block. Für Textausgabe braucht es beispielsweise DBMS_OUTPUT und eine dazu passende Client-Einstellung.

    Frage 5: Was bedeutet L_BRUTOO statt L_BRUTTO im Quelltextbeispiel?

    Lösung: Es ist ein anderer Bezeichner. Der Compiler kann die nicht deklarierte Variable nicht auflösen; Fehlerposition und gespeicherter Quelltext belegen den Schreibfehler.

    Frage 6: Eine Funktion erhält NULL als Nettopreis. Genügt die Bedingung l_netto < 0?

    Lösung: Nein. Der Vergleich mit NULL ist nicht TRUE. Ein benötigter Pflichtwert wird mit IS NULL ausdrücklich geprüft.

    Frage 7: Was unterscheidet einen anonymen Block vom Package Body?

    Lösung: Der anonyme Block ist ein einmaliger Programmtext. Der Package Body ist die gespeicherte Umsetzung einer benannten Package-Schnittstelle und lässt sich mit den passenden Metadaten untersuchen.

    Frage 8: Was verändert das RAISE im Fehlerhandler des vorhandenen Preisbeispiels?

    Lösung: RAISE gibt die gerade behandelte Ausnahme an den äußeren Aufrufer weiter. Ohne diese Weitergabe könnte ein Handler den Fehler lediglich ausgeben und normal enden. Die Ausgabe einer Meldung ist von der technischen Fehlerrückmeldung zu unterscheiden. Die Verarbeitung setzt nach dem Handler nicht automatisch an der fehlgeschlagenen Anweisung fort.

    42. SQL-Abfragen Test – von leicht bis anspruchsvoll

    150 SQL-Testaufgaben mit jeweils drei Antwortmöglichkeiten: 90 Verständnisfragen und 60 zu vervollständigende Statements.

    Lernkompass
    Einfach gesagt Du bekommst eine SQL-Frage oder Abfrage und entscheidest dich jeweils für genau eine von drei Antworten.
    Warum ist das wichtig? SQL wird sicherer, wenn du nicht nur Syntax wiedererkennst, sondern Ergebnis, Filter, JOINs und Aggregationen selbst beurteilen kannst.
    Nach diesem Kapitel Du erkennst typische SQL-Muster und kannst auch komplexere Abfragen systematisch zerlegen.

    Einführung: Dieser SQL-Test prüft, ob du aus einer Anweisung das erwartete Ergebnis ableiten kannst. Entscheidend ist nicht, einen Befehl wiederzuerkennen, sondern Filter, NULL-Werte, Gruppierungen und Verknüpfungen gemeinsam zu verstehen. Die Aufgaben bauen auf Kapitel 36 auf und verwenden eigene Lernmodelle statt einer vorausgesetzten produktiven Datenbank.

    Wähle zunächst einen passenden Schwierigkeitsbereich und begründe deine Erwartung, bevor du die Antwort prüfst. Die Lösungen erläutern die entscheidende Regel und helfen, einen Denkfehler gezielt nachzuarbeiten. Die Bewertung erfolgt im Browser; die gezeigten SQL-Anweisungen werden dabei nicht ausgeführt. Der anschließende Haupttext erklärt die Aufteilung und Bedienung des Tests.

    Oracle 19c: fachliche Grundlage

    Nach einer falschen Antwort weiterlernen

    Notiere drei Dinge: meine Erwartung, die entscheidende SQL-Regel und das tatsächliche Ergebnis der Musterlösung. Bei COUNT ist beispielsweise wichtig, ob Zeilen oder vorhandene Werte gezählt werden. Bei JOIN ist wichtig, welche Zeilenpaare zusammenpassen. Wiederhole später eine ähnliche Aufgabe und begründe die Antwort ohne Blick auf die Lösung. Die 150 Aufgaben sind ein Übungsvorrat; du kannst mit einer kleinen Gruppe beginnen.

    Arbeite die Fragen möglichst ohne Nachschlagen durch. Nach Antwort prüfen wird die Auswahl bewertet und eine Erklärung eingeblendet. Am Ende kannst du den Gesamtstand auswerten. Die SQL-Beispiele dieses Tests sind read-only.

    Noch nicht ausgewertet.

    Teil A – 90 Fragen in drei Lernstufen

    Fragen 1–30: einfache Grundlagen. Fragen 31–60: das Gelernte an kleinen Beispielen anwenden. Fragen 61–90: mehrere SQL-Bausteine verbinden. Es geht um SQL-Verständnis; Spezialwissen zu internen Oracle-Prozessen und Performance-Plänen ist hier nicht erforderlich. Die Daten in den Aufgaben sind erfundene Lernbeispiele.

    1. Einfach – Fragen 1–30

    Ein Lernziel pro Frage: Begriffe, Zeichen und einfache Abfragen erkennen.

    Frage 1Einfach
    Wofür wird eine einfache SELECT-Abfrage verwendet?
    Frage 2Einfach
    Welche Spalte zeigt SELECT name FROM artikel?
    Frage 3Einfach
    Welche Aufgabe hat FROM artikel?
    Frage 4Einfach
    Was bedeutet * in SELECT * FROM artikel?
    Frage 5Einfach
    Wozu dient WHERE in einer einfachen Abfrage?
    Frage 6Einfach
    Welche Bedingung wählt den Artikel mit der numerischen ID 10 aus?
    Frage 7Einfach
    Welche Bedingung findet Preise über 50?
    Frage 8Einfach
    Welcher Operator bedeutet in SQL „ungleich“?
    Frage 9Einfach
    Wie wird der feste Text Berlin als SQL-Zeichenliteral geschrieben?
    Frage 10Einfach
    Was verlangt eine Verknüpfung mit AND?
    Frage 11Einfach
    Wann ist eine Verknüpfung mit OR TRUE?
    Frage 12Einfach
    Welche Bedingung sucht die numerischen IDs 1, 3 oder 5?
    Frage 13Einfach
    Welche Werte umfasst menge BETWEEN 2 AND 4 bei ganzzahligen Mengen?
    Frage 14Einfach
    Wofür steht NULL?
    Frage 15Einfach
    Wie prüfst du, ob TELEFON keinen Wert enthält?
    Frage 16Einfach
    Welche Klausel sortiert Ergebniszeilen?
    Frage 17Einfach
    Was bedeutet ORDER BY preis DESC?
    Frage 18Einfach
    Was macht preis AS einzelpreis in der SELECT-Liste?
    Frage 19Einfach
    Wozu dient SELECT DISTINCT kategorie FROM artikel?
    Frage 20Einfach
    Was liefert COUNT(*) für eine Tabelle mit fünf Zeilen ohne Filter?
    Frage 21Einfach
    Welche Funktion addiert die Werte einer Zahlenspalte?
    Frage 22Einfach
    Welche Funktion liefert den kleinsten vorhandenen Preis?
    Frage 23Einfach
    Welche Bedingung findet Namen, die mit Buch beginnen?
    Frage 24Einfach
    Was liefert UPPER('abc')?
    Frage 25Einfach
    Was liefert LENGTH('Buch')?
    Frage 26Einfach
    Was liefert SELECT 3 + 4 AS ergebnis FROM dual?
    Frage 27Einfach
    Welcher Operator verbindet zwei Texte in Oracle SQL?
    Frage 28Einfach
    Wozu eignet sich DUAL in einem einfachen Oracle-19c-Beispiel?
    Frage 29Einfach
    Sind SELECT und select als SQL-Schlüsselwort unterschiedlich?
    Frage 30Einfach
    Was bedeutet eine erfolgreiche Abfrage mit „keine Zeilen ausgewählt“?

    2. Grundlagen anwenden – Fragen 31–60

    Kleine Ergebnisse beurteilen und erste Gruppierungen, Joins und Unterabfragen verstehen.

    Frage 31Anwenden
    Die Spalte RABATT enthält 5, NULL und 0. Was liefert COUNT(rabatt)?
    Frage 32Anwenden
    Die Werte sind 10 und 30. Was liefert AVG(wert)?
    Frage 33Anwenden
    Was liefert NVL(NULL, 0) in diesem Zahlenbeispiel?
    Frage 34Anwenden
    Was liefert TRIM(' Buch ') bei normalen Leerzeichen?
    Frage 35Anwenden
    Was liefert ROUND(12.345, 2)?
    Frage 36Anwenden
    Welche Schreibweise ist ein eindeutiges Oracle-Datums-Literal?
    Frage 37Anwenden
    Was bewirkt ORDER BY kategorie, preis?
    Frage 38Anwenden
    Welche Bedingung wählt nur Bestellungen mit vorhandenem Lieferdatum?
    Frage 39Anwenden
    Welche Bedingung schließt Namen mit dem Präfix TEST aus, wenn NAME nie NULL ist?
    Frage 40Anwenden
    Welche Werte passen bei case-sensitivem Vergleich zu LIKE 'A_'?
    Frage 41Anwenden
    Was liefert CASE WHEN menge >= 10 THEN 'gross' ELSE 'klein' END bei MENGE = 12?
    Frage 42Anwenden
    Welche Abfrage zählt Artikel je Kategorie?
    Frage 43Anwenden
    Wie werden nur Kategorien mit mehr als fünf Artikeln ausgewählt?
    Frage 44Anwenden
    Was bewirkt WHERE preis > 0 vor GROUP BY kategorie?
    Frage 45Anwenden
    Was bedeutet GROUP BY kategorie, status?
    Frage 46Anwenden
    Welcher Join zeigt nur Kunden mit passenden Bestellungen?
    Frage 47Anwenden
    Welche Grundform behält auch Kunden ohne Bestellung?
    Frage 48Anwenden
    Warum steht in einer Join-Abfrage k.id statt nur id?
    Frage 49Anwenden
    Eine Tabelle enthält 2, die andere 3 Zeilen. Wie viele Zeilen liefert ihr CROSS JOIN ohne Filter?
    Frage 50Anwenden
    Ein Kunde hat drei Bestellungen. Wie oft erscheint er beim passenden INNER JOIN auf diese Bestellungen?
    Frage 51Anwenden
    Zwei SELECTs liefern jeweils eine Zeile mit dem Wert 1. Was ergibt UNION ALL?
    Frage 52Anwenden
    Was unterscheidet UNION von UNION ALL?
    Frage 53Anwenden
    Was bewirkt FETCH FIRST 5 ROWS ONLY nach ORDER BY preis DESC?
    Frage 54Anwenden
    Eine Abfrage besitzt kein ORDER BY. Welche Aussage ist richtig?
    Frage 55Anwenden
    Wann ist EXISTS (Unterabfrage) TRUE?
    Frage 56Anwenden
    Was ist die Hauptidee einer einfachen WITH-Klausel?
    Frage 57Anwenden
    Was sucht preis = (SELECT MAX(preis) FROM artikel)?
    Frage 58Anwenden
    Was ergibt 10 + NULL in Oracle SQL?
    Frage 59Anwenden
    Welche Bedingung meint: Status OFFEN oder NEU, aber in beiden Fällen PREIS > 0?
    Frage 60Anwenden
    Welche Beschreibung passt zu SELECT kategorie, SUM(preis) FROM artikel GROUP BY kategorie?

    3. Zusammenhänge verstehen – Fragen 61–90

    Bedingungen und Ergebnisse gemeinsam beurteilen. Benötigte Annahmen und Beispieldaten stehen jeweils in der Frage.

    Frage 61Kombinieren
    Eine COUNT(*)-Abfrage ohne GROUP BY findet durch WHERE keine Eingabezeile. Was kommt zurück?
    Frage 62Kombinieren
    Was liefert SUM(preis) ohne GROUP BY bei leerer Eingabemenge?
    Frage 63Kombinieren
    PREIS enthält 10, NULL und 30. Was liefert AVG(preis)?
    Frage 64Kombinieren
    KATEGORIE enthält Buch, Buch, Spiel und NULL. Was liefert COUNT(DISTINCT kategorie)?
    Frage 65Kombinieren
    Drei Zeilen besitzen KATEGORIE = NULL. Was passiert bei GROUP BY kategorie?
    Frage 66Kombinieren
    Du suchst Kunden mit mehr als zwei bezahlten Bestellungen. Welche Kombination passt?
    Frage 67Kombinieren
    Was zählt SUM(CASE WHEN status = 'OFFEN' THEN 1 ELSE 0 END) bei einer nicht leeren Eingabemenge?
    Frage 68Kombinieren
    Welche SELECT-Liste passt zu GROUP BY kategorie, wenn keine weiteren Gruppierausdrücke verwendet werden?
    Frage 69Kombinieren
    Ein Kunde ohne Bestellung bleibt im LEFT JOIN erhalten. Welche Zählung liefert für ihn 0, wenn b.id ein nicht-NULL-Bestellschlüssel ist?
    Frage 70Kombinieren
    Was bewirkt WHERE b.status = 'OFFEN' nach einem LEFT JOIN, wenn ein Kunde keine Bestellung besitzt?
    Frage 71Kombinieren
    Alle Kunden sollen bleiben, aber nur offene Bestellungen sollen zugeordnet werden. Wohin gehört der Filter?
    Frage 72Kombinieren
    Wie findest du nach einem LEFT JOIN Kunden ohne Bestellung, wenn b.id nie NULL sein darf?
    Frage 73Kombinieren
    Warum beweist ein NULL in b.kommentar nach LEFT JOIN keinen fehlenden Bestelltreffer?
    Frage 74Kombinieren
    Bestellnummern sind nur zusammen mit FIRMA eindeutig. Welche Joinbedingung ist passend?
    Frage 75Kombinieren
    Ein Join liefert unerwartet viele Zeilen. Was prüfst du vor einem zusätzlichen DISTINCT?
    Frage 76Kombinieren
    Was liefert SELECT 1 FROM dual WHERE 1 NOT IN (2, NULL)?
    Frage 77Kombinieren
    Welche Form fragt nach Kunden ohne passende Bestellung?
    Frage 78Kombinieren
    Eine Unterabfrage im skalaren Vergleich preis = (Unterabfrage) liefert zwei Zeilen. Was passiert?
    Frage 79Kombinieren
    Eine skalare Unterabfrage in der SELECT-Liste liefert keine Zeile. Welchen Wert liefert sie?
    Frage 80Kombinieren
    Was liefert COALESCE(NULL, NULL, 'unbekannt')?
    Frage 81Kombinieren
    MENGE ist 20. Was liefert CASE WHEN menge >= 10 THEN 'A' WHEN menge >= 20 THEN 'B' ELSE 'C' END?
    Frage 82Kombinieren
    Welche Sortierung zeigt vorhandene hohe Preise zuerst und NULL-Werte am Ende?
    Frage 83Kombinieren
    Mehrere Artikel haben denselben Preis. Wie wird die Top-5-Auswahl bei unveränderten Daten eindeutig, wenn ID eindeutig ist?
    Frage 84Kombinieren
    Welche Bedingung erfasst den ganzen 8. Oktober 2026 in einer DATE-Spalte einschließlich Uhrzeit?
    Frage 85Kombinieren
    Was muss für zwei mit UNION verbundene SELECT-Listen zusammenpassen?
    Frage 86Kombinieren
    Welcher Operator findet Kundennummern, die in beiden Ergebnismengen vorkommen?
    Frage 87Kombinieren
    A enthält 1 und 2, B enthält 2 und 3. Was liefert A MINUS B?
    Frage 88Kombinieren
    Die Zeilen sind (Buch, OFFEN), (Buch, OFFEN), (Buch, BEZAHLT). Wie viele Zeilen liefert SELECT DISTINCT kategorie, status?
    Frage 89Kombinieren
    Warum ist bei einer NUMBER-Spalte preis der Filter preis > 50 klarer als preis > '50'?
    Frage 90Kombinieren
    Eine Abfrage ist syntaktisch gültig, liefert aber falsche Summen. Was ist der sinnvollste nächste Schritt?

    Teil B – SQL-Abfragen und Statements vervollständigen

    Teil B1 – Einfach starten

    Die ersten 15 Aufgaben sind bewusst die einfachsten Statement-Aufgaben. Danach steigt der Schwierigkeitsgrad schrittweise an.
    Aufgabe 1Leicht
    Ziel: Die Datenquelle angeben. Welcher Baustein ersetzt ___?
    SELECT owner, table_name ___ dba_tables;
    Aufgabe 2Leicht
    Ziel: Nur offene Konten auswählen. Welcher Baustein ersetzt ___?
    SELECT username FROM dba_users WHERE account_status ___ 'OPEN';
    Aufgabe 3Leicht
    Ziel: Auf NULL prüfen. Welcher Baustein ersetzt ___?
    SELECT username FROM dba_users WHERE username IS ___;
    Aufgabe 4Leicht
    Ziel: Nach Erstellungsdatum absteigend sortieren. Welcher Baustein ersetzt ___?
    SELECT username, created FROM dba_users ___ BY created DESC;
    Aufgabe 5Leicht
    Ziel: Alle Sessionzeilen zählen. Welcher Baustein ersetzt ___?
    SELECT COUNT(___) FROM v$session;
    Aufgabe 6Mittel
    Ziel: Objekte je Owner gruppieren. Welcher Baustein ersetzt ___?
    SELECT owner, COUNT(*) FROM dba_objects ___ BY owner;
    Aufgabe 7Mittel
    Ziel: Nur Gruppen mit mehr als 100 Objekten behalten. Welcher Baustein ersetzt ___?
    SELECT owner, COUNT(*) c FROM dba_objects GROUP BY owner ___ COUNT(*) > 100;
    Aufgabe 8Mittel
    Ziel: Die Joinbedingung formulieren. Welcher Baustein ersetzt ___?
    SELECT s.sid,p.spid FROM v$session s LEFT JOIN v$process p ___ s.paddr=p.addr;
    Aufgabe 9Mittel
    Ziel: SYS und SYSTEM auswählen. Welcher Baustein ersetzt ___?
    SELECT username FROM dba_users WHERE username ___ ('SYS','SYSTEM');
    Aufgabe 10Mittel
    Ziel: Fehlende Modulnamen durch unbekannt ersetzen. Welcher Baustein ersetzt ___?
    SELECT NVL(module, ___) AS module_name FROM v$session;
    Aufgabe 11Schwer
    Ziel: Sessions mit einem bestätigten Blocker erkennen. Welcher Baustein ersetzt ___?
    SELECT sid,serial#,sql_id FROM v$session WHERE blocking_session_status ___ 'VALID';
    Aufgabe 12Schwer
    Ziel: Höchstens 20 Zeilen zurückgeben. Welcher Baustein ersetzt ___?
    SELECT sql_id, executions FROM v$sql WHERE executions > 0 ORDER BY executions DESC FETCH FIRST 20 ___ ONLY;
    Aufgabe 13Schwer
    Ziel: Benutzer mit eigenen Objekten finden. Welcher Baustein ersetzt ___?
    SELECT username FROM dba_users u WHERE ___ (SELECT 1 FROM dba_objects o WHERE o.owner=u.username);
    Aufgabe 14Schwer
    Ziel: Gruppen mit mehr als fünf Sessions auswählen. Welcher Baustein ersetzt ___?
    WITH x AS (SELECT username,COUNT(*) c FROM v$session GROUP BY username) SELECT * FROM x WHERE c ___ 5;
    Aufgabe 15Schwer
    Ziel: Bei fehlendem bestätigten Blocker einen vorsichtigen Status ausgeben. Welcher Baustein ersetzt ___?
    SELECT CASE WHEN blocking_session_status='VALID' THEN 'BLOCKIERT' ___ 'KEIN BESTÄTIGTER BLOCKER' END status_text FROM v$session;

    Teil B2 – Grundlagen anwenden

    Die nächsten Aufgaben kombinieren bekannte Bausteine aus Kapitel 36, ohne unnötig kompliziert zu werden.
    Aufgabe 16Leicht
    Ziel: Namen mit dem Präfix SYS auswählen. Welcher Baustein ersetzt ___?
    SELECT username
    FROM dba_users
    WHERE username ___ 'SYS%';
    Aufgabe 17Leicht
    Ziel: USER_ID zwischen 10 und 100 einschließlich auswählen. Welcher Baustein ersetzt ___?
    SELECT username
    FROM dba_users
    WHERE user_id ___ 10 AND 100;
    Aufgabe 18Leicht
    Ziel: NULL im NOT-IN-Vergleich beurteilen. Welcher Baustein ersetzt ___?
    SELECT 1 AS nr FROM dual WHERE 1 NOT IN (2, ___);
    Aufgabe 19Leicht
    Ziel: Doppelte Benutzernamen im Ergebnis entfernen. Welcher Baustein ersetzt ___?
    SELECT ___ username
    FROM dba_users;
    Aufgabe 20Leicht
    Ziel: Benutzernamen in Kleinbuchstaben ausgeben. Welcher Baustein ersetzt ___?
    SELECT username,
           ___(username) AS username_klein
    FROM dba_users;
    Aufgabe 21Mittel
    Ziel: Gruppen absteigend nach ihrer Anzahl sortieren. Welcher Baustein ersetzt ___?
    SELECT status,
           COUNT(*) AS anzahl
    FROM v$session
    GROUP BY status
    ___ anzahl DESC;
    Aufgabe 22Mittel
    Ziel: Benutzersessions je Benutzer gruppieren. Welcher Baustein ersetzt ___?
    SELECT username,
           COUNT(*) AS anzahl
    FROM v$session
    WHERE type='USER'
    ___ username;
    Aufgabe 23Mittel
    Ziel: Gruppen mit mehr als einer Session behalten. Welcher Baustein ersetzt ___?
    SELECT username,
           COUNT(*) AS anzahl
    FROM v$session
    GROUP BY username
    ___ COUNT(*) > 1;
    Aufgabe 24Mittel
    Ziel: Sessions mit passendem Prozess verbinden. Welcher Baustein ersetzt ___?
    SELECT s.sid, s.username, p.spid
    FROM v$session s
    ___ v$process p ON p.addr=s.paddr;
    Aufgabe 25Mittel
    Ziel: Einen Standardzweig im CASE angeben. Welcher Baustein ersetzt ___?
    SELECT sid,
           CASE WHEN status='ACTIVE' THEN 'aktiv'
                ___ 'nicht aktiv' END AS status_text
    FROM v$session;
    Aufgabe 26Mittel
    Ziel: Den Benutzer mit der kleinsten USER_ID ermitteln. Welcher Baustein ersetzt ___?
    SELECT username
    FROM dba_users
    WHERE user_id = (
      SELECT ___(user_id) FROM dba_users
    );
    Aufgabe 27Mittel
    Ziel: Nur nicht leere Werte zählen. Welcher Baustein ersetzt ___?
    WITH x (wert) AS (SELECT 10 FROM dual UNION ALL SELECT NULL FROM dual)
    SELECT ___ AS anzahl FROM x;
    Aufgabe 28Mittel
    Ziel: Die benannte WITH-Abfrage lesen. Welcher Baustein ersetzt ___?
    WITH aktive AS (
      SELECT sid, username
      FROM v$session
      WHERE status='ACTIVE'
    )
    SELECT * ___ aktive;
    Aufgabe 29Mittel
    Ziel: Höchstens zehn Zeilen zurückgeben. Welcher Baustein ersetzt ___?
    SELECT sql_id, executions
    FROM v$sql
    ORDER BY executions DESC
    ___ FIRST 10 ROWS ONLY;
    Aufgabe 30Mittel
    Ziel: Den ersten nicht leeren Wert aus MODULE, PROGRAM und dem Ersatztext ausgeben. Welcher Baustein ersetzt ___?
    SELECT username,
           ___(module, program, 'UNBEKANNT') AS quelle
    FROM v$session;

    Teil B3 – Zusammenhänge verstehen

    Jetzt werden die SQL-Bausteine etwas stärker miteinander kombiniert.
    Aufgabe 31Leicht
    Ziel: Die Zeichenanzahl des Benutzernamens ausgeben. Welcher Baustein ersetzt ___?
    SELECT username,
           ___(username) AS zeichen
    FROM dba_users;
    Aufgabe 32Leicht
    Ziel: Ein fehlendes Login-Datum ersetzen. Welcher Baustein ersetzt ___?
    SELECT username,
           ___(last_login, DATE '1900-01-01') AS login_wert
    FROM dba_users;
    Aufgabe 33Leicht
    Ziel: Das Präfix APP mit genau einem weiteren Zeichen suchen. Welcher Baustein ersetzt ___?
    SELECT username FROM dba_users WHERE username LIKE 'APP' || ___;
    Aufgabe 34Leicht
    Ziel: Die kleinste OBJECT_ID bestimmen. Welcher Baustein ersetzt ___?
    SELECT ___(object_id) AS kleinste_id
    FROM dba_objects;
    Aufgabe 35Mittel
    Ziel: Die größte Objekt-ID je Owner bestimmen. Welcher Baustein ersetzt ___?
    SELECT owner,
           MAX(object_id) AS groesste_id
    FROM dba_objects
    ___ owner;
    Aufgabe 36Mittel
    Ziel: Einen Standardzweig für nicht offene Konten angeben. Welcher Baustein ersetzt ___?
    SELECT username,
           CASE WHEN account_status='OPEN'
                THEN 'offen'
                ___ 'nicht offen' END AS status_text
    FROM dba_users;
    Aufgabe 37Mittel
    Ziel: Mit dem Ergebnis einer skalaren Unterabfrage vergleichen. Welcher Baustein ersetzt ___?
    SELECT username
    FROM dba_users
    WHERE user_id ___ (SELECT MIN(user_id) FROM dba_users);
    Aufgabe 38Mittel
    Ziel: Linke Zeilen ohne passenden rechten Schlüssel finden. Welcher Baustein ersetzt ___?
    WITH a (id) AS (SELECT 1 FROM dual UNION ALL SELECT 2 FROM dual),
    b (id) AS (SELECT 1 FROM dual)
    SELECT a.id FROM a LEFT JOIN b ON b.id=a.id WHERE b.id ___;
    Aufgabe 39Mittel
    Ziel: Zwei Ergebnisse ohne Entfernung von Duplikaten vereinigen. Welcher Baustein ersetzt ___?
    SELECT 1 AS nr FROM dual ___ SELECT 1 AS nr FROM dual;
    Aufgabe 40Mittel
    Ziel: Owner ohne passenden Eintrag unter den Benutzern ermitteln. Welcher Baustein ersetzt ___?
    SELECT owner FROM dba_objects
    ___
    SELECT username FROM dba_users;
    Aufgabe 41Mittel
    Ziel: Nur Namen aus beiden Ergebnismengen ausgeben. Welcher Baustein ersetzt ___?
    SELECT grantee FROM dba_sys_privs
    ___
    SELECT username FROM dba_users;
    Aufgabe 42Schwer
    Ziel: Den ersten Rang auch bei Gleichständen vergeben. Welcher Baustein ersetzt ___?
    WITH x (betrag) AS (SELECT 10 FROM dual UNION ALL SELECT 10 FROM dual)
    SELECT betrag, ___() OVER (ORDER BY betrag DESC) AS rang FROM x;
    Aufgabe 43Schwer
    Ziel: Die Prozessadresse mit PADDR verbinden. Welcher Baustein ersetzt ___?
    SELECT s.sid, s.username, p.spid
    FROM v$session s
    JOIN v$process p
      ON p.___ = s.paddr;
    Aufgabe 44Schwer
    Ziel: Garantiert einen Ersatztext ausgeben, wenn MODULE und PROGRAM NULL sind. Welcher Baustein ersetzt ___?
    SELECT username,
           COALESCE(module, program, ___) AS quelle
    FROM v$session;
    Aufgabe 45Schwer
    Ziel: Die Gruppen absteigend sortieren. Welcher Baustein ersetzt ___?
    SELECT username, COUNT(*) AS anzahl
    FROM v$session
    WHERE type='USER'
    GROUP BY username
    HAVING COUNT(*) > 2
    ORDER BY anzahl ___;

    Teil B4 – Etwas anspruchsvoller

    Zum Schluss folgen die anspruchsvolleren Aufgaben aus dem Stoff von Kapitel 36.
    Aufgabe 46Anspruchsvoller
    Ziel: Benutzernamen mit dem Präfix SYS ausschließen. Welcher Baustein ersetzt ___?
    SELECT username,
           account_status
    FROM dba_users
    WHERE account_status = 'OPEN'
      AND username ___ 'SYS%'
    ORDER BY username;
    Aufgabe 47Anspruchsvoller
    Ziel: Nur Statusgruppen mit mindestens zwei Sessions ausgeben. Welcher Baustein ersetzt ___?
    SELECT status,
           COUNT(*) AS anzahl
    FROM v$session
    WHERE type = 'USER'
    GROUP BY status
    ___ COUNT(*) >= 2
    ORDER BY anzahl DESC;
    Aufgabe 48Anspruchsvoller
    Ziel: Sessions ohne Benutzernamen ausschließen. Welcher Baustein ersetzt ___?
    SELECT s.username,
           p.spid
    FROM v$session s
    LEFT JOIN v$process p
      ON p.addr = s.paddr
    WHERE s.type = 'USER'
      AND s.username ___ NULL;
    Aufgabe 49Anspruchsvoller
    Ziel: Offene Konten als KONTO OFFEN kennzeichnen. Welcher Baustein ersetzt ___?
    SELECT username,
           CASE
             WHEN account_status = 'OPEN' THEN 'KONTO OFFEN'
             ___ 'PRUEFEN'
           END AS bewertung
    FROM dba_users;
    Aufgabe 50Anspruchsvoller
    Ziel: Die Objektgruppen absteigend sortieren. Welcher Baustein ersetzt ___?
    SELECT owner,
           COUNT(*) AS objekte
    FROM dba_objects
    WHERE object_type IN ('TABLE','INDEX')
    GROUP BY owner
    HAVING COUNT(*) > 10
    ___ objekte DESC;
    Aufgabe 51Anspruchsvoller
    Ziel: Den Objekttyp TABLE als Zeichenliteral vergleichen. Welcher Baustein ersetzt ___?
    SELECT username
    FROM dba_users u
    WHERE EXISTS (
      SELECT 1
      FROM dba_objects o
      WHERE o.owner = u.username
        AND o.object_type = ___
    );
    Aufgabe 52Anspruchsvoller
    Ziel: Das WITH-Ergebnis nach Anzahl sortieren. Welcher Baustein ersetzt ___?
    WITH session_count AS (
      SELECT username, COUNT(*) AS anzahl
      FROM v$session
      WHERE type = 'USER'
      GROUP BY username
    )
    SELECT username, anzahl
    FROM session_count
    WHERE anzahl > 1
    ___ anzahl DESC;
    Aufgabe 53Anspruchsvoller
    Ziel: USER_ID oberhalb des Durchschnitts auswählen. Welcher Baustein ersetzt ___?
    SELECT username
    FROM dba_users
    WHERE user_id > (
      SELECT ___(user_id)
      FROM dba_users
    );
    Aufgabe 54Anspruchsvoller
    Ziel: Owner finden, die sowohl Tabellen als auch Indizes besitzen. Welcher Baustein ersetzt ___?
    SELECT owner
    FROM dba_objects
    WHERE object_type = 'TABLE'
    ___
    SELECT owner
    FROM dba_objects
    WHERE object_type = 'INDEX';
    Aufgabe 55Anspruchsvoller
    Ziel: Das Ergebnis nach dem berechneten Alias sortieren. Welcher Baustein ersetzt ___?
    SELECT username,
           COALESCE(module, program, 'UNBEKANNT') AS quelle
    FROM v$session
    WHERE type = 'USER'
      AND status = 'ACTIVE'
    ___ quelle;
    Aufgabe 56Anspruchsvoller
    Ziel: Höchstens zehn sortierte Sessionzeilen ausgeben. Welcher Baustein ersetzt ___?
    SELECT s.sid,
           s.username,
           p.spid
    FROM v$session s
    JOIN v$process p
      ON p.addr = s.paddr
    WHERE s.status = 'ACTIVE'
      AND s.type = 'USER'
    ORDER BY s.sid
    ___ FIRST 10 ROWS ONLY;
    Aufgabe 57Anspruchsvoller
    Ziel: Benutzergruppen absteigend nach Sessionanzahl sortieren. Welcher Baustein ersetzt ___?
    SELECT username,
           COUNT(*) AS sessions
    FROM v$session
    WHERE type = 'USER'
      AND username IS NOT NULL
    GROUP BY username
    HAVING COUNT(*) > 1
    ORDER BY sessions ___;
    Aufgabe 58Anspruchsvoller
    Ziel: Die passenden Benutzernamen aufsteigend sortieren, ohne zu gruppieren. Welcher Baustein ersetzt ___?
    SELECT username
    FROM dba_users
    WHERE username IN (
      SELECT owner
      FROM dba_objects
      WHERE object_type = 'TABLE'
    )
      AND account_status = 'OPEN'
    ___ username;
    Aufgabe 59Anspruchsvoller
    Ziel: Gruppen mit mehr als fünf Objekten behalten. Welcher Baustein ersetzt ___?
    SELECT owner,
           COUNT(*) AS anzahl
    FROM dba_objects
    WHERE object_type IN ('TABLE','INDEX')
    GROUP BY owner
    ___ COUNT(*) > 5
    ORDER BY anzahl DESC
    FETCH FIRST 10 ROWS ONLY;
    Aufgabe 60Anspruchsvoller
    Ziel: NULL-Benutzernamen nach dem LEFT JOIN ausschließen. Welcher Baustein ersetzt ___?
    WITH aktive AS (
      SELECT sid, username, paddr
      FROM v$session
      WHERE type = 'USER'
        AND status = 'ACTIVE'
    )
    SELECT a.sid,
           a.username,
           p.spid
    FROM aktive a
    LEFT JOIN v$process p
      ON p.addr = a.paddr
    WHERE a.username ___ NULL
    ORDER BY a.username;
    Bewertung: 135–150 richtig = sehr sicher, 115–134 = gute Grundlage, 90–114 = Grundlagen vorhanden, unter 90 = Kapitel 36 gezielt wiederholen. Entscheidend ist nicht nur die Punktzahl, sondern ob du die Erklärung zu einer falschen Antwort nachvollziehen kannst.

    Offizielle Oracle-Referenzen (19c)

    SELECT · Nulls · Joins

    43. SQL-Rezeptbuch – 34 Themen mit gezielten read-only DBA-Abfragen

    Nach Themen sortiert, durchsuchbar und mit ausführlichen Erklärungen zur Anwendung und Interpretation.

    Lernkompass
    Einfach gesagt Das Rezeptbuch liefert fertige read-only Abfragen für typische DBA-Fragen.
    Warum ist das wichtig? Es ist zum Nachschlagen gedacht: zuerst die Frage verstehen, dann SQL ausführen, anschließend Ergebnis interpretieren.
    Nach diesem Kapitel Du findest schneller eine passende Diagnoseabfrage, ohne jedes Statement neu schreiben zu müssen.

    Einführung: Das SQL-Rezeptbuch übersetzt typische DBA-Fragen in lesende Abfragen. Ein Rezept verbindet eine Datenquelle mit Filtern, Ausgabespalten und einer Interpretation. Es liefert damit mehr als kopierbaren SQL-Text: Du sollst erkennen, welche Frage die Abfrage tatsächlich beantwortet und welche Schlussfolgerung ihr Ergebnis nicht zulässt.

    Wähle zuerst den Betriebsbereich und lies Zweck sowie Beispielausgabe des passenden Rezepts. Prüfe anschließend Instanz, Container, Rechte und Zeitbezug für deinen eigenen Einsatz. Die folgenden Erläuterungen helfen bei Einheiten und Messumfang. Für die fachliche Ursache führt der Weg zurück in das jeweilige Kapitel; das Rezeptbuch bleibt der praktische Zugang zur benötigten Information.

    Oracle 19c: fachliche Grundlage

    Lesetipp: Du musst diesen Abschnitt nicht auswendig lernen. Verstehe zuerst die Aufgabe und merke dir, wo du die Details später nachschlagen kannst.

    Die Messwerte im Rezept richtig lesen

    CURRENT_WAIT_S wird nur für STATE=WAITING ausgegeben. Fehlt ein aktueller Wait, bleibt der Wert NULL; EVENT kann dann den letzten Wait benennen. In den SQL-Cursor-Rezepten sind ELAPSED_TIME und CPU_TIME Mikrosekunden. AVERAGE_WAIT in den Event-Views ist dagegen in Hundertstelsekunden angegeben. Größte Gesamtwerte stehen in den betreffenden Ranglisten zuerst; für aktuelle Belastung brauchst du zwei gültige Messpunkte.

    Oracle 19c: V$SESSION · V$SYSTEM_EVENT.

    Ein Rezept auswählen und abschließen

    Beispiel: Du möchtest wissen, welche Benutzerverbindungen gerade arbeiten. Öffne das Rezept für Benutzersessions, lies STATUS und STATE gemeinsam und halte den Messzeitpunkt fest. Eine ACTIVE-Session kann warten. Eine hohe seit dem Cursorladen gesammelte SQL-Zeit beantwortet dagegen nicht dieselbe Frage.

    Schreibe den Befund mit seinem Geltungsbereich auf: „In dieser Instanz zum Messzeitpunkt …“. Eine zweite Beobachtung kann den Zustand ändern. Für die Ursache wechselst du aus dem Rezept in das zugehörige Fachkapitel.

    Vom SQL-Grundwissen zur DBA-Praxis: Das Rezeptbuch ist keine Sammlung von Befehlen zum blinden Kopieren. Jede Abfrage beantwortet eine konkrete Betriebsfrage und soll gleichzeitig zeigen, welche Oracle-View für diese Frage zuständig ist, welche Spalten relevant sind und wie das Ergebnis interpretiert werden muss.

    Vor dem Einsatz: Auch read-only SQL kann auf großen Dictionary- oder Performance-Views Last erzeugen. Filter, Zeitraum und Datenmenge sollten deshalb zur Fragestellung passen. Außerdem muss zwischen Momentaufnahme und historischer Aussage unterschieden werden: Eine aktuelle V$-Sicht beantwortet nicht automatisch eine Frage über die vergangenen 24 Stunden.

    Ziel des Rezeptbuchs: Du sollst von einer DBA-Frage zu einer belastbaren Abfrage und anschließend zu einer fachlich richtigen Interpretation gelangen. Die Rezepte ergänzen deshalb die Grundlagen und den View-Finder, statt sie zu ersetzen.

    Gemeinsamer Lesehinweis: Alle Rezepte sind SELECT-Abfragen. Prüfe vor der Auswertung Container, Leserechte, Messzeitraum und Einheiten. Eine auffällige Kennzahl allein beweist keine Ursache. Pro Thema findest du eine Übersicht und zwei aufklappbare Diagnosevarianten. Tabellen zeigen ausschließlich fiktive Ausschnitte zur jeweiligen Übersicht.

    Die Rezepte nutzen: Wähle die Abfrage nach deiner konkreten Frage. Prüfe vorher Leserechte, Datenbank beziehungsweise PDB und die Platzhalter. Eine Zeilenanzahl, eine Sortierung oder ein einzelner Status ist noch keine Ursachenanalyse. Besonders V$INSTANCE und V$DATABASE beschreiben die aktuelle Instanz beziehungsweise Datenbank; eine „Top“-Variante hat dort keine Aussage über mehrere Datenbanken oder historische Zustände.

    Ergebnisse richtig einordnen: Grenzen der Rezepte

    Eine Trefferliste ist ein Ausgangspunkt für die Diagnose, keine automatische Fehlermeldung. Beispielschwellen wie 80 Prozent, 100 MB oder 30 Tage sind an den Workload anzupassen. Ein normaler aktiver Prozess, eine reguläre Sperre und belegter PGA-Speicher sind für sich keine Störung.

    V$-Daten werden während der Abfrage aktualisiert; komplexe Joins liefern keine garantierte gemeinsame Momentaufnahme. Kumulierte Zähler brauchen Messdifferenzen im gleichen Instance-Lebenszyklus. Auch eine SELECT-Abfrage kann CPU, I/O und Wartezeit verursachen. Begrenze große Log- und Metadatenabfragen passend.

    &TAGE, &FILTERWERT und &SCHLUESSEL sind SQL*Plus-Textsubstitutionen, keine Bind-Variablen. Verwende nur kontrollierte Eingaben; Anführungszeichen können die SQL-Syntax verändern. Bei schemaübergreifenden Namen gehören Owner und bei CDB-Views der Container zur eindeutigen Zuordnung. Für automatisch übernommene Fremdeingaben sind passend typisierte Bind-Variablen erforderlich.

    Abgrenzung: Das SQL-Rezeptbuch beantwortet „Welche read-only Abfrage hilft mir?“. Die Bedeutung von Sessions, Redo, Locks, Statistiken, Multitenant, RMAN usw. steht im jeweiligen Fachkapitel.

    Das SQL-Rezeptbuch ist kein ungeordneter Befehlsvorrat. Jede Abfrage beantwortet eine konkrete DBA-Frage und erklärt, welche Datenquelle verwendet wird, wann das Rezept sinnvoll ist und wie das Ergebnis interpretiert werden muss.

    Die 34 Hauptrezepte sind reine SELECT-Abfragen. Varianten mit &FILTERWERT, &SCHLUESSEL oder &TAGE fragen in SQL*Plus beziehungsweise SQLcl einen Wert ab. In SQL Developer kann die Substitutionsvariable ebenfalls verwendet oder vor der Ausführung ersetzt werden.

    1. Empfohlener Arbeitsablauf

    1. Themenbereich Instanz, Sessions, SQL, Storage, RMAN oder Security auswählen
    →
    2. Übersicht Mit einer breiten Abfrage den Ist-Zustand erfassen
    →
    3. Eingrenzen Filter, Schlüssel, Zeitraum oder Auffälligkeiten verwenden
    →
    4. Interpretieren Normalwerte, Instanzlaufzeit und fachlichen Kontext beachten
    →
    5. Dokumentieren SQL, Ergebnis, Zeitpunkt und Schlussfolgerung sichern
    Read-only-Garantie: Die Diagnosebeispiele in diesem Bereich sind read-only. Schreibende Befehle werden nicht automatisch ausgeführt.

    So liest du die Rezepte: Übersicht, Zeilenzahl, Gruppierung, Filter und Detailauswahl sind verschiedene Blickwinkel auf dieselbe Datenquelle. COUNT(*) zählt sichtbare View-Zeilen, keine Fehler oder Last. Eine Gruppierung zählt Einträge pro Merkmal. &FILTERWERT und &SCHLUESSEL sind SQL*Plus-Textersetzungen für kontrollierte Diagnoseeingaben; sie sind keine Bind-Variablen. Ein als Schlüssel bezeichneter Filter muss nicht eindeutig sein: beispielsweise kann dieselbe SQL_ID mehrere Child Cursor besitzen.

    Bei Top- und Ausschnittsabfragen lies die konkrete Sortierung. Eine begrenzte Ausgabe ist keine vollständige Historie. Die Beispielschwellen der Auffälligkeitsrezepte sind keine Oracle-Grenzwerte; der jeweilige Interpretationstext erklärt ihre Aussage. Größen aus Bytes / 1024 / 1024 entsprechen MiB und aus Bytes / 1024 / 1024 / 1024 GiB, auch wenn ältere Ausgabealiasnamen MB oder GB verwenden.

    Instanz und Datenbank
    Grundlegende Zustands-, Identitäts- und Rolleninformationen der Oracle-Instanz und Datenbank.
    Instanzstatus – Übersicht und gezielte Diagnose Status, Host, Version, Startzeit und Rolle der laufenden Oracle-Instanz bewerten. Instanz und Datenbank Übersicht

    1. Was liefert diese Abfrage?

    Status, Host, Version, Startzeit und Rolle der laufenden Oracle-Instanz bewerten.

    Datenquelle:
    V$INSTANCE
    Themenbereich:
    Instanz und Datenbank
    Wichtige Spalten:
    INSTANCE_NAME, HOST_NAME, VERSION, STATUS, STARTUP_TIME, DATABASE_STATUS, INSTANCE_ROLE
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Instanzstatus – Übersicht
    SELECT
        instance_name,
        host_name,
        version,
        status,
        startup_time,
        database_status,
        instance_role
    FROM V$INSTANCE
    ORDER BY instance_name;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    INSTANCE_NAMESTATUSDATABASE_STATUS
    DEMODBOPENACTIVE

    Auswertung und nächster Schritt: Die Instanz ist geöffnet und aktiv. Das beweist weder freie Storage-Kapazität noch fehlerfreie Anwendungsfunktionen. Danach OPEN_MODE und Datenbankrolle prüfen.

    Instanzstatus – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Instanzstatus – Gefilterte Auswertung
    SELECT
        instance_name,
        host_name,
        version,
        status,
        startup_time,
        database_status,
        instance_role
    FROM V$INSTANCE
    WHERE UPPER(TO_CHAR(instance_name)) = UPPER('&FILTERWERT')
    ORDER BY instance_name;
    Instanzstatus – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt einen Instanzzustand außerhalb OPEN/ACTIVE. NOMOUNT oder MOUNT kann während geplanter Arbeiten beabsichtigt sein; das Ergebnis ist kein selbstständiger Ausfallnachweis.
    Instanzstatus – Auffälligkeiten und Abweichungen
    SELECT
        instance_name,
        host_name,
        version,
        status,
        startup_time,
        database_status,
        instance_role
    FROM V$INSTANCE
    WHERE status <> 'OPEN' OR database_status <> 'ACTIVE'
    ORDER BY instance_name;
    Datenbankstatus – Übersicht und gezielte Diagnose DBID, Open Mode, Logging, Datenbankrolle, Force Logging und aktuellen SCN anzeigen. Instanz und Datenbank Übersicht

    1. Was liefert diese Abfrage?

    DBID, Open Mode, Logging, Datenbankrolle, Force Logging und aktuellen SCN anzeigen.

    Datenquelle:
    V$DATABASE
    Themenbereich:
    Instanz und Datenbank
    Wichtige Spalten:
    NAME, DBID, LOG_MODE, OPEN_MODE, DATABASE_ROLE, FORCE_LOGGING, FLASHBACK_ON, CURRENT_SCN
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Datenbankstatus – Übersicht
    SELECT
        name,
        dbid,
        created,
        log_mode,
        open_mode,
        database_role,
        force_logging,
        flashback_on,
        current_scn
    FROM V$DATABASE
    ORDER BY name;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    NAMEOPEN_MODEDATABASE_ROLE
    DEMODBREAD WRITEPRIMARY

    Auswertung und nächster Schritt: Die Beispieldatenbank ist als Primary schreibbar geöffnet. Ein READ ONLY bei einer bewusst lesend betriebenen Datenbank wäre nicht automatisch ein Fehler.

    Datenbankstatus – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Datenbankstatus – Gefilterte Auswertung
    SELECT
        name,
        dbid,
        created,
        log_mode,
        open_mode,
        database_role,
        force_logging,
        flashback_on,
        current_scn
    FROM V$DATABASE
    WHERE UPPER(TO_CHAR(name)) = UPPER('&FILTERWERT')
    ORDER BY name;
    Datenbankstatus – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt eine Datenbank außerhalb READ WRITE beziehungsweise mit anderer Rolle als PRIMARY. READ ONLY oder eine Standby-Rolle kann beabsichtigt sein. Vergleiche den erwarteten Betriebszustand.
    Datenbankstatus – Auffälligkeiten und Abweichungen
    SELECT
        name,
        dbid,
        created,
        log_mode,
        open_mode,
        database_role,
        force_logging,
        flashback_on,
        current_scn
    FROM V$DATABASE
    WHERE open_mode NOT LIKE 'READ WRITE%' OR database_role <> 'PRIMARY'
    ORDER BY name;
    Sessions und Prozesse
    Aktuelle Benutzeraktivität, Clientzuordnung, Serverprozesse und PGA-Verbrauch untersuchen.
    Benutzersessions – Übersicht und gezielte Diagnose Aktive und inaktive Benutzersessions mit Client, SQL und Wait Event untersuchen. Sessions und Prozesse Übersicht

    1. Was liefert diese Abfrage?

    Aktive und inaktive Benutzersessions mit Client, SQL und Wait Event untersuchen.

    Datenquelle:
    V$SESSION
    Themenbereich:
    Sessions und Prozesse
    Wichtige Spalten:
    SID, SERIAL#, USERNAME, STATUS, MACHINE, PROGRAM, MODULE, SERVICE_NAME, SQL_ID, EVENT
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Benutzersessions – Übersicht
    SELECT
        sid,
        serial#,
        username,
        status,
        machine,
        program,
        module,
        service_name,
        sql_id,
        event,
        wait_class,
        state,
        CASE WHEN state = 'WAITING' THEN wait_time_micro/1000000 END AS current_wait_s
    FROM V$SESSION
    WHERE type = 'USER'
    ORDER BY sid;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    SIDSTATUSEVENTSTATE
    41ACTIVEdb file sequential readWAITING
    52INACTIVESQL*Net message from clientWAITING

    Auswertung und nächster Schritt: SID 41 ist aktiv; erst STATE=WAITING belegt, dass der angezeigte Wait gerade läuft. Eine inaktive Session wie 52 kann zu einem normalen Connection Pool gehören. Für eine Diagnose SQL_ID, STATE und Anwendungskontext zusammen lesen.

    Benutzersessions – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Benutzersessions – Gefilterte Auswertung
    SELECT
        sid,
        serial#,
        username,
        status,
        machine,
        program,
        module,
        service_name,
        sql_id,
        event,
        wait_class,
        state,
        CASE WHEN state = 'WAITING' THEN wait_time_micro/1000000 END AS current_wait_s
    FROM V$SESSION
    WHERE type = 'USER'
      AND UPPER(TO_CHAR(username)) = UPPER('&FILTERWERT')
    ORDER BY sid;
    Benutzersessions – Aktive oder blockierte Sessions
    Interpretation:
    Zeigt aktive Benutzersessions oder Sessions mit gültig gemeldetem Blocker. ACTIVE allein ist kein Fehler. Für aktuelles Warten zusätzlich STATE und für Blockierungen die Sperrkette auswerten.
    Benutzersessions – Aktive oder blockierte Sessions
    SELECT
        sid,
        serial#,
        username,
        status,
        machine,
        program,
        module,
        service_name,
        sql_id,
        event,
        wait_class,
        state,
        CASE WHEN state = 'WAITING' THEN wait_time_micro/1000000 END AS current_wait_s
    FROM V$SESSION
    WHERE type = 'USER'
      AND (blocking_session_status = 'VALID' OR status = 'ACTIVE')
    ORDER BY sid;
    Oracle-Prozesse – Übersicht und gezielte Diagnose Oracle-Hintergrund- und Serverprozesse dem Betriebssystem sowie ihrem PGA-Verbrauch zuordnen. Sessions und Prozesse Übersicht

    1. Was liefert diese Abfrage?

    Oracle-Hintergrund- und Serverprozesse dem Betriebssystem sowie ihrem PGA-Verbrauch zuordnen.

    Datenquelle:
    V$PROCESS
    Themenbereich:
    Sessions und Prozesse
    Wichtige Spalten:
    PID, SPID, PNAME, PROGRAM, TRACEFILE, PGA_USED_MEM, PGA_ALLOC_MEM, PGA_MAX_MEM
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Oracle-Prozesse – Übersicht
    SELECT
        pid,
        spid,
        pname,
        username,
        program,
        tracefile,
        pga_used_mem,
        pga_alloc_mem,
        pga_max_mem
    FROM V$PROCESS
    ORDER BY pid;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    PIDSPIDPGA_ALLOC_MEM
    24812410485760
    25812520971520

    Auswertung und nächster Schritt: Der zweite Prozess hat 20 MiB PGA allokiert. Das ist nicht gleichbedeutend mit aktuell genutztem Speicher oder einem Speicherproblem; PGA_USED_MEM und Verlauf vergleichen.

    Oracle-Prozesse – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Oracle-Prozesse – Gefilterte Auswertung
    SELECT
        pid,
        spid,
        pname,
        username,
        program,
        tracefile,
        pga_used_mem,
        pga_alloc_mem,
        pga_max_mem
    FROM V$PROCESS
    WHERE UPPER(TO_CHAR(pname)) = UPPER('&FILTERWERT')
    ORDER BY pid;
    Oracle-Prozesse – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Prozesse mit mehr als 1 GiB aktuell allokierter PGA. Das ist ein frei gewählter Suchwert, keine Oracle-Grenze. PGA_ALLOC_MEM ist nicht gleich tatsächlich genutzter PGA.
    Oracle-Prozesse – Auffälligkeiten und Abweichungen
    SELECT
        pid,
        spid,
        pname,
        username,
        program,
        tracefile,
        pga_used_mem,
        pga_alloc_mem,
        pga_max_mem
    FROM V$PROCESS
    WHERE pga_alloc_mem > 1024*1024*1024
    ORDER BY pid;
    Locks und Transaktionen
    Sperren, offene Transaktionen, Undo-Verbrauch und blockierende Zusammenhänge analysieren.
    Gesperrte Objekte – Übersicht und gezielte Diagnose Aktuell gesperrte Objekte, Sessions und Lock-Modi identifizieren. Locks und Transaktionen Übersicht

    1. Was liefert diese Abfrage?

    Aktuell gesperrte Objekte, Sessions und Lock-Modi identifizieren.

    Datenquelle:
    V$LOCKED_OBJECT
    Themenbereich:
    Locks und Transaktionen
    Wichtige Spalten:
    SESSION_ID, ORACLE_USERNAME, OS_USER_NAME, LOCKED_MODE, OBJECT_ID, XIDUSN, XIDSLOT, XIDSQN
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Gesperrte Objekte – Übersicht
    SELECT
        session_id,
        oracle_username,
        os_user_name,
        process,
        locked_mode,
        object_id,
        xidusn,
        xidslot,
        xidsqn
    FROM V$LOCKED_OBJECT
    ORDER BY session_id;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    SESSION_IDOBJECT_IDLOCKED_MODE
    41810013

    Auswertung und nächster Schritt: Die Session hält einen Lock im Modus 3 auf diesem Objekt. Ein vorhandener DML-Lock ist normal und beweist keine Blockierung. Erst wartende Sessions und Blockerbeziehung prüfen.

    Gesperrte Objekte – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Gesperrte Objekte – Gefilterte Auswertung
    SELECT
        session_id,
        oracle_username,
        os_user_name,
        process,
        locked_mode,
        object_id,
        xidusn,
        xidslot,
        xidsqn
    FROM V$LOCKED_OBJECT
    WHERE UPPER(TO_CHAR(oracle_username)) = UPPER('&FILTERWERT')
    ORDER BY session_id;
    Gesperrte Objekte – Staerkere Tabellenlocks
    Interpretation:
    Zeigt gehaltene Objektsperren ab Modus 4. Der Sperrmodus allein beweist keine Blockierung; dazu muss ein konkurrierender wartender Zugriff nachgewiesen werden.
    Gesperrte Objekte – Staerkere Tabellenlocks
    SELECT
        session_id,
        oracle_username,
        os_user_name,
        process,
        locked_mode,
        object_id,
        xidusn,
        xidslot,
        xidsqn
    FROM V$LOCKED_OBJECT
    WHERE locked_mode >= 4
    ORDER BY session_id;
    Offene Transaktionen – Übersicht und gezielte Diagnose Offene Transaktionen nach Startzeit, Undo-Verbrauch und I/O-Aufwand bewerten. Locks und Transaktionen Übersicht

    1. Was liefert diese Abfrage?

    Offene Transaktionen nach Startzeit, Undo-Verbrauch und I/O-Aufwand bewerten.

    Datenquelle:
    V$TRANSACTION
    Themenbereich:
    Locks und Transaktionen
    Wichtige Spalten:
    ADDR, XIDUSN, XIDSLOT, XIDSQN, START_TIME, START_DATE, USED_UBLK, USED_UREC, LOG_IO, PHY_IO
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Offene Transaktionen – Übersicht
    SELECT
        addr,
        xidusn,
        xidslot,
        xidsqn,
        start_date,
        used_ublk,
        used_urec,
        log_io,
        phy_io,
        cr_get,
        cr_change
    FROM V$TRANSACTION
    ORDER BY start_date;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    XIDUSNUSED_UBLKUSED_UREC
    712180

    Auswertung und nächster Schritt: Die offene Transaktion nutzt 12 Undo-Blöcke und 180 Undo-Records. Diese Einheiten sind verschieden. Über die Transaktionsadresse zur Session zuordnen; nicht aus einem einzelnen Wert auf einen Fehler schließen.

    Offene Transaktionen – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Offene Transaktionen – Gefilterte Auswertung
    SELECT
        addr,
        xidusn,
        xidslot,
        xidsqn,
        start_date,
        used_ublk,
        used_urec,
        log_io,
        phy_io,
        cr_get,
        cr_change
    FROM V$TRANSACTION
    WHERE UPPER(TO_CHAR(xidusn)) = UPPER('&FILTERWERT')
    ORDER BY start_date;
    Offene Transaktionen – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Transaktionen oberhalb der Beispielgrenzen für Undo-Blöcke oder Undo-Records. Daraus folgt weder automatisch ein Fehler noch ein sinnvoller Abbruch. Geschäftsvorgang und Verlauf prüfen.
    Offene Transaktionen – Auffälligkeiten und Abweichungen
    SELECT
        addr,
        xidusn,
        xidslot,
        xidsqn,
        start_date,
        used_ublk,
        used_urec,
        log_io,
        phy_io,
        cr_get,
        cr_change
    FROM V$TRANSACTION
    WHERE used_ublk > 10000 OR used_urec > 100000
    ORDER BY start_date;
    SQL und Performance
    SQL_IDs, Child Cursor, Laufzeit, CPU, Buffer Gets, Reads und Cursorauffälligkeiten bewerten.
    SQL-Cursor – Übersicht und gezielte Diagnose Aktuell im Shared Pool vorhandene Child Cursor nach Laufzeit, CPU, Reads und Buffer Gets analysieren. SQL und Performance Übersicht

    1. Was liefert diese Abfrage?

    Aktuell im Shared Pool vorhandene Child Cursor nach Laufzeit, CPU, Reads und Buffer Gets analysieren.

    Datenquelle:
    V$SQL
    Themenbereich:
    SQL und Performance
    Wichtige Spalten:
    SQL_ID, CHILD_NUMBER, PLAN_HASH_VALUE, EXECUTIONS, ELAPSED_TIME, CPU_TIME, BUFFER_GETS, DISK_READS
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    SQL-Cursor – Übersicht
    SELECT
        sql_id,
        child_number,
        plan_hash_value,
        executions,
        parse_calls,
        elapsed_time,
        cpu_time,
        buffer_gets,
        disk_reads,
        rows_processed,
        last_active_time,
        substr(sql_text,1,180) sql_text
    FROM V$SQL
    ORDER BY elapsed_time DESC
    FETCH FIRST 50 ROWS ONLY;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    SQL_IDCHILD_NUMBEREXECUTIONS
    9abc123def4560120

    Auswertung und nächster Schritt: Die Werte gehören zu einem Child Cursor. Für Laufzeitfragen ELAPSED_TIME, vollständige Ausführungen und identische Cursoridentität beachten; für eine aktuelle Störung Differenzen statt bloßer Gesamtzähler verwenden.

    SQL-Cursor – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    SQL-Cursor – Gefilterte Auswertung
    SELECT
        sql_id,
        child_number,
        plan_hash_value,
        executions,
        parse_calls,
        elapsed_time,
        cpu_time,
        buffer_gets,
        disk_reads,
        rows_processed,
        last_active_time,
        substr(sql_text,1,180) sql_text
    FROM V$SQL
    WHERE UPPER(TO_CHAR(sql_id)) = UPPER('&FILTERWERT')
    ORDER BY elapsed_time DESC;
    SQL-Cursor – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Cursor mit durchschnittlich mehr als einer Sekunde ELAPSED_TIME je gezählter Ausführung. Die Werte sind kumuliert und keine Messung der letzten Ausführung. Unvollständige Ausführungen und parallele Arbeit können die Interpretation beeinflussen.
    SQL-Cursor – Auffälligkeiten und Abweichungen
    SELECT
        sql_id,
        child_number,
        plan_hash_value,
        executions,
        parse_calls,
        elapsed_time,
        cpu_time,
        buffer_gets,
        disk_reads,
        rows_processed,
        last_active_time,
        substr(sql_text,1,180) sql_text
    FROM V$SQL
    WHERE executions > 0 AND elapsed_time/executions > 1000000
    ORDER BY elapsed_time DESC;

    Die Übersicht ist auf die ersten 50 Zeilen in der angegebenen Sortierung begrenzt. Das ist keine vollständige Bestandsliste.

    SQL-Aggregate – Übersicht und gezielte Diagnose Child-Cursor-Aggregate je SQL_ID und auffällige Version Counts untersuchen. SQL und Performance Übersicht

    1. Was liefert diese Abfrage?

    Child-Cursor-Aggregate je SQL_ID und auffällige Version Counts untersuchen.

    Datenquelle:
    V$SQLAREA
    Themenbereich:
    SQL und Performance
    Wichtige Spalten:
    SQL_ID, VERSION_COUNT, EXECUTIONS, PARSE_CALLS, ELAPSED_TIME, CPU_TIME, BUFFER_GETS, DISK_READS
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    SQL-Aggregate – Übersicht
    SELECT
        sql_id,
        version_count,
        executions,
        parse_calls,
        elapsed_time,
        cpu_time,
        buffer_gets,
        disk_reads,
        rows_processed,
        last_active_time,
        substr(sql_text,1,180) sql_text
    FROM V$SQLAREA
    ORDER BY elapsed_time DESC;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    SQL_IDVERSION_COUNTEXECUTIONS
    9abc123def4562240

    Auswertung und nächster Schritt: Hier werden Child Cursor zum Parent zusammengefasst. Zwei Versionen sind noch kein Fehler. Bei auffälligem Wachstum die Child Cursor und Gründe für fehlendes Teilen untersuchen.

    SQL-Aggregate – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    SQL-Aggregate – Gefilterte Auswertung
    SELECT
        sql_id,
        version_count,
        executions,
        parse_calls,
        elapsed_time,
        cpu_time,
        buffer_gets,
        disk_reads,
        rows_processed,
        last_active_time,
        substr(sql_text,1,180) sql_text
    FROM V$SQLAREA
    WHERE UPPER(TO_CHAR(sql_id)) = UPPER('&FILTERWERT')
    ORDER BY elapsed_time DESC;
    SQL-Aggregate – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt mehr als 20 Child-Versionen oder mehr als 10 Invalidierungen. Die Zahlen sind Beispielschwellen. Erst Gründe und zeitlicher Verlauf zeigen, ob problematische Cursorvermehrung vorliegt.
    SQL-Aggregate – Auffälligkeiten und Abweichungen
    SELECT
        sql_id,
        version_count,
        executions,
        parse_calls,
        elapsed_time,
        cpu_time,
        buffer_gets,
        disk_reads,
        rows_processed,
        last_active_time,
        substr(sql_text,1,180) sql_text
    FROM V$SQLAREA
    WHERE version_count > 20 OR invalidations > 10
    ORDER BY elapsed_time DESC;
    Wait Events
    Warteursachen instanzweit und je Session priorisieren und richtig interpretieren.
    Systemweite Wait Events – Übersicht und gezielte Diagnose Kumulierte Wait Events seit Instanzstart nach Wait Class und Wartezeit priorisieren. Wait Events Übersicht

    1. Was liefert diese Abfrage?

    Kumulierte Wait Events seit Instanzstart nach Wait Class und Wartezeit priorisieren.

    Datenquelle:
    V$SYSTEM_EVENT
    Themenbereich:
    Wait Events
    Wichtige Spalten:
    EVENT, WAIT_CLASS, TOTAL_WAITS, TOTAL_TIMEOUTS, TIME_WAITED_MICRO, AVERAGE_WAIT
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Systemweite Wait Events – Übersicht
    SELECT
        event,
        wait_class,
        total_waits,
        total_timeouts,
        time_waited_micro,
        average_wait,
        time_waited_micro_fg
    FROM V$SYSTEM_EVENT
    ORDER BY time_waited_micro DESC;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    EVENTTOTAL_WAITSAVERAGE_WAIT
    log file sync100000.2

    Auswertung und nächster Schritt: AVERAGE_WAIT ist hier in Hundertstelsekunden angegeben: 0,2 entspricht 2 ms. Das ist ein kumulierter Mittelwert, keine aktuelle Latenzmessung. Für die Störungsminute passende Zählerdifferenzen bilden.

    Systemweite Wait Events – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Systemweite Wait Events – Gefilterte Auswertung
    SELECT
        event,
        wait_class,
        total_waits,
        total_timeouts,
        time_waited_micro,
        average_wait,
        time_waited_micro_fg
    FROM V$SYSTEM_EVENT
    WHERE UPPER(TO_CHAR(wait_class)) = UPPER('&FILTERWERT')
    ORDER BY time_waited_micro DESC;
    Systemweite Wait Events – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Nicht-Idle-Ereignisse mit aufgelaufener Wartezeit. Das sind kumulierte Instanzzähler einschließlich Hintergrundarbeit, kein Beweis für eine aktuelle Störung. Für ein Zeitfenster Differenzen bilden.
    Systemweite Wait Events – Auffälligkeiten und Abweichungen
    SELECT
        event,
        wait_class,
        total_waits,
        total_timeouts,
        time_waited_micro,
        average_wait,
        time_waited_micro_fg
    FROM V$SYSTEM_EVENT
    WHERE wait_class <> 'Idle' AND time_waited_micro > 0
    ORDER BY time_waited_micro DESC;
    Session Wait Events – Übersicht und gezielte Diagnose Wait-Historie einzelner Sessions seit Sessionstart analysieren. Wait Events Übersicht

    1. Was liefert diese Abfrage?

    Wait-Historie einzelner Sessions seit Sessionstart analysieren.

    Datenquelle:
    V$SESSION_EVENT
    Themenbereich:
    Wait Events
    Wichtige Spalten:
    SID, EVENT, WAIT_CLASS, TOTAL_WAITS, TOTAL_TIMEOUTS, TIME_WAITED, AVERAGE_WAIT, MAX_WAIT
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Session Wait Events – Übersicht
    SELECT
        sid,
        event,
        wait_class,
        total_waits,
        total_timeouts,
        time_waited,
        average_wait,
        max_wait
    FROM V$SESSION_EVENT
    ORDER BY time_waited DESC;
    Was sehe ich hier?

    V$SESSION_EVENT liefert kumulierte Wait-Informationen je Session. Für aktuelle Ursachen müssen Sessionzustand, Zeitraum und aktuelle SQL-Aktivität hinzugenommen werden.

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    SIDEVENTTIME_WAITED
    41db file sequential read250

    Auswertung und nächster Schritt: TIME_WAITED=250 bedeutet 2,5 Sekunden kumulierte Wartezeit dieser Session für das Event. Das heißt nicht, dass sie gerade wartet. Den aktuellen Zustand aus V$SESSION ergänzen.

    Session Wait Events – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Session Wait Events – Gefilterte Auswertung
    SELECT
        sid,
        event,
        wait_class,
        total_waits,
        total_timeouts,
        time_waited,
        average_wait,
        max_wait
    FROM V$SESSION_EVENT
    WHERE UPPER(TO_CHAR(sid)) = UPPER('&FILTERWERT')
    ORDER BY time_waited DESC;
    Session Wait Events – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Nicht-Idle-Warteereignisse mit aufgelaufener Wartezeit je Session. Ein Eintrag bedeutet nicht, dass die Session gerade auf dieses Ereignis wartet; dafür V$SESSION.STATE prüfen.
    Session Wait Events – Auffälligkeiten und Abweichungen
    SELECT
        sid,
        event,
        wait_class,
        total_waits,
        total_timeouts,
        time_waited,
        average_wait,
        max_wait
    FROM V$SESSION_EVENT
    WHERE wait_class <> 'Idle' AND time_waited > 0
    ORDER BY time_waited DESC;
    Memory
    SGA- und PGA-Komponenten, Speichergrößen, Peaks und mögliche Überallokation untersuchen.
    SGA-Komponenten – Übersicht und gezielte Diagnose Größe und dynamische Anpassbarkeit der wichtigsten SGA-Komponenten anzeigen. Memory Übersicht

    1. Was liefert diese Abfrage?

    Größe und dynamische Anpassbarkeit der wichtigsten SGA-Komponenten anzeigen.

    Datenquelle:
    V$SGAINFO
    Themenbereich:
    Memory
    Wichtige Spalten:
    NAME, BYTES, RESIZEABLE, CON_ID
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    SGA-Komponenten – Übersicht
    SELECT
        name,
        bytes,
        resizeable,
        con_id
    FROM V$SGAINFO
    ORDER BY bytes;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    NAMEBYTESRESIZEABLE
    Buffer Cache Size1073741824Yes

    Auswertung und nächster Schritt: Das Beispiel zeigt 1 GiB Buffer Cache. Die Größe allein beweist keine ausreichende oder übermäßige Dimensionierung; Workload und I/O-Verhalten sind erforderlich.

    SGA-Komponenten – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    SGA-Komponenten – Gefilterte Auswertung
    SELECT
        name,
        bytes,
        resizeable,
        con_id
    FROM V$SGAINFO
    WHERE UPPER(TO_CHAR(name)) = UPPER('&FILTERWERT')
    ORDER BY bytes;
    SGA-Komponenten – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt SGAINFO-Zeilen über 10 GiB. Einzelne Zeilen beschreiben Komponenten, andere Gesamt- oder Grenzwerte; sie dürfen nicht pauschal addiert werden. Der Filter ist eine Beispielschwelle.
    SGA-Komponenten – Auffälligkeiten und Abweichungen
    SELECT
        name,
        bytes,
        resizeable,
        con_id
    FROM V$SGAINFO
    WHERE bytes > 10*1024*1024*1024
    ORDER BY bytes;
    PGA-Statistik – Übersicht und gezielte Diagnose Instanzweite PGA-Kennzahlen, Peaks und mögliche Überallokation bewerten. Memory Übersicht

    1. Was liefert diese Abfrage?

    Instanzweite PGA-Kennzahlen, Peaks und mögliche Überallokation bewerten.

    Datenquelle:
    V$PGASTAT
    Themenbereich:
    Memory
    Wichtige Spalten:
    NAME, VALUE, UNIT, CON_ID
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    PGA-Statistik – Übersicht
    SELECT
        name,
        value,
        unit,
        con_id
    FROM V$PGASTAT
    ORDER BY unit, name;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    NAMEVALUEUNIT
    total PGA allocated536870912bytes

    Auswertung und nächster Schritt: Die Instanz hat hier insgesamt 512 MiB PGA allokiert. UNIT gehört zum Wert: Andere Zeilen der View können Zähler statt Bytes enthalten.

    PGA-Statistik – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    PGA-Statistik – Gefilterte Auswertung
    SELECT
        name,
        value,
        unit,
        con_id
    FROM V$PGASTAT
    WHERE UPPER(TO_CHAR(name)) = UPPER('&FILTERWERT')
    ORDER BY value;
    PGA-Statistik – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt einen positiven kumulierten over allocation count. Das weist auf frühere Überallokationen hin, aber nicht zwingend auf ein aktuelles Problem. Zuwachs im Messintervall und PGA-Kontext prüfen.
    PGA-Statistik – Auffälligkeiten und Abweichungen
    SELECT
        name,
        value,
        unit,
        con_id
    FROM V$PGASTAT
    WHERE name = 'over allocation count' AND value > 0
    ORDER BY value;
    Redo und Archivierung
    Online Redo Logs, Archived Logs, Sequenzen, Backup Count und Archivierungsstatus kontrollieren.
    Online Redo Logs – Übersicht und gezielte Diagnose Redo-Gruppen, Größe, Sequenz, Archivierungsstatus und aktuellen Zustand prüfen. Redo und Archivierung Übersicht

    1. Was liefert diese Abfrage?

    Redo-Gruppen, Größe, Sequenz, Archivierungsstatus und aktuellen Zustand prüfen.

    Datenquelle:
    V$LOG
    Themenbereich:
    Redo und Archivierung
    Wichtige Spalten:
    GROUP#, THREAD#, SEQUENCE#, BYTES, MEMBERS, ARCHIVED, STATUS, FIRST_TIME
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Online Redo Logs – Übersicht
    SELECT
        group#,
        thread#,
        sequence#,
        bytes,
        members,
        archived,
        status,
        first_change#,
        first_time,
        next_change#
    FROM V$LOG
    ORDER BY group#;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    GROUP#SEQUENCE#STATUS
    1120INACTIVE
    2121CURRENT

    Auswertung und nächster Schritt: Gruppe 2 wird aktuell beschrieben. INACTIVE bedeutet, dass Gruppe 1 für Instance Recovery nicht mehr gebraucht wird; Archivierungsanforderungen bleiben zusätzlich zu beachten.

    Online Redo Logs – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Online Redo Logs – Gefilterte Auswertung
    SELECT
        group#,
        thread#,
        sequence#,
        bytes,
        members,
        archived,
        status,
        first_change#,
        first_time,
        next_change#
    FROM V$LOG
    WHERE UPPER(TO_CHAR(status)) = UPPER('&FILTERWERT')
    ORDER BY group#;
    Online Redo Logs – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Redo-Gruppen in CLEARING oder CLEARING_CURRENT. Ob das ein vorübergehender Vorgang oder ein Fehler ist, ergibt sich aus Dauer und Alert Log.
    Online Redo Logs – Auffälligkeiten und Abweichungen
    SELECT
        group#,
        thread#,
        sequence#,
        bytes,
        members,
        archived,
        status,
        first_change#,
        first_time,
        next_change#
    FROM V$LOG
    WHERE status IN ('CLEARING','CLEARING_CURRENT')
    ORDER BY group#;
    Archived Logs – Übersicht und gezielte Diagnose Archived Logs nach Sequenz, Zeitraum, Backup Count, Apply- und Löschstatus untersuchen. Redo und Archivierung Übersicht

    1. Was liefert diese Abfrage?

    Archived Logs nach Sequenz, Zeitraum, Backup Count, Apply- und Löschstatus untersuchen.

    Datenquelle:
    V$ARCHIVED_LOG
    Themenbereich:
    Redo und Archivierung
    Wichtige Spalten:
    THREAD#, SEQUENCE#, FIRST_TIME, NEXT_TIME, COMPLETION_TIME, APPLIED, DELETED, BACKUP_COUNT, NAME
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Archived Logs – Übersicht
    SELECT
        recid,
        thread#,
        sequence#,
        first_time,
        next_time,
        completion_time,
        blocks,
        block_size,
        archived,
        applied,
        deleted,
        backup_count,
        name
    FROM V$ARCHIVED_LOG
    ORDER BY completion_time;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    THREAD#SEQUENCE#BACKUP_COUNT
    11201

    Auswertung und nächster Schritt: Die Repository-Zeile weist eine Sicherung dieser Logkopie aus. Das beweist weder eine lückenlose Redo-Kette noch die Lesbarkeit des Backups. Weitere Kopien können eigene Zeilen besitzen.

    Archived Logs – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Archived Logs – Gefilterte Auswertung
    SELECT
        recid,
        thread#,
        sequence#,
        first_time,
        next_time,
        completion_time,
        blocks,
        block_size,
        archived,
        applied,
        deleted,
        backup_count,
        name
    FROM V$ARCHIVED_LOG
    WHERE UPPER(TO_CHAR(thread#)) = UPPER('&FILTERWERT')
    ORDER BY completion_time;
    Archived Logs – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt mehr als einen Tag alte Repository-Einträge ohne gezählte Sicherung und ohne Löschkennzeichen. Mehrere Einträge können dieselbe Logsequenz betreffen. Das ist keine Liste eindeutig ungesicherter Dateien und keine Löschfreigabe.
    Archived Logs – Auffälligkeiten und Abweichungen
    SELECT
        recid,
        thread#,
        sequence#,
        first_time,
        next_time,
        completion_time,
        blocks,
        block_size,
        archived,
        applied,
        deleted,
        backup_count,
        name
    FROM V$ARCHIVED_LOG
    WHERE deleted = 'NO' AND backup_count = 0 AND completion_time < SYSDATE - 1
    ORDER BY completion_time;
    Storage und Tablespaces
    Datafiles, Segmente, Tablespaces und freien Speicher für Kapazitätsanalysen auswerten.
    Datafiles – Übersicht und gezielte Diagnose Datafile-Pfade, aktuelle Größe, Maxsize, Autoextend und Status auswerten. Storage und Tablespaces Übersicht

    1. Was liefert diese Abfrage?

    Datafile-Pfade, aktuelle Größe, Maxsize, Autoextend und Status auswerten.

    Datenquelle:
    DBA_DATA_FILES
    Themenbereich:
    Storage und Tablespaces
    Wichtige Spalten:
    FILE_ID, FILE_NAME, TABLESPACE_NAME, BYTES, MAXBYTES, AUTOEXTENSIBLE, STATUS, ONLINE_STATUS
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Datafiles – Übersicht
    SELECT
        file_id,
        file_name,
        tablespace_name,
        bytes,
        maxbytes,
        autoextensible,
        increment_by,
        status,
        online_status
    FROM DBA_DATA_FILES
    ORDER BY file_id;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    FILE_IDTABLESPACE_NAMEAUTOEXTENSIBLE
    7APP_DATAYES

    Auswertung und nächster Schritt: Datei 7 darf automatisch wachsen. MAXBYTES und freie Storage-Kapazität begrenzen das Wachstum; YES ist keine Zusage unbegrenzten Platzes.

    Datafiles – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Datafiles – Gefilterte Auswertung
    SELECT
        file_id,
        file_name,
        tablespace_name,
        bytes,
        maxbytes,
        autoextensible,
        increment_by,
        status,
        online_status
    FROM DBA_DATA_FILES
    WHERE UPPER(TO_CHAR(tablespace_name)) = UPPER('&FILTERWERT')
    ORDER BY file_id;
    Datafiles – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt automatisch erweiterbare Datafiles, deren konfigurierte Höchstgröße erreicht ist. Freie Extents und tatsächlich freier Speicher im Dateisystem beziehungsweise ASM sind zusätzlich zu prüfen.
    Datafiles – Auffälligkeiten und Abweichungen
    SELECT
        file_id,
        file_name,
        tablespace_name,
        bytes,
        maxbytes,
        autoextensible,
        increment_by,
        status,
        online_status
    FROM DBA_DATA_FILES
    WHERE autoextensible = 'YES' AND maxbytes <= bytes
    ORDER BY file_id;
    Segmente – Übersicht und gezielte Diagnose Allokierten Segmentplatz für Tabellen, Indizes, LOBs und Partitionen analysieren. Storage und Tablespaces Übersicht

    1. Was liefert diese Abfrage?

    Allokierten Segmentplatz für Tabellen, Indizes, LOBs und Partitionen analysieren.

    Datenquelle:
    DBA_SEGMENTS
    Themenbereich:
    Storage und Tablespaces
    Wichtige Spalten:
    OWNER, SEGMENT_NAME, PARTITION_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Segmente – Übersicht
    SELECT
        owner,
        segment_name,
        partition_name,
        segment_type,
        tablespace_name,
        bytes,
        blocks,
        extents
    FROM DBA_SEGMENTS
    ORDER BY bytes
    FETCH FIRST 50 ROWS ONLY;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    OWNERSEGMENT_NAMEBYTES
    APP_DEMOBESTELLUNGEN10485760

    Auswertung und nächster Schritt: Das Segment belegt allokiert 10 MiB. Das ist nicht die Summe der Nutzdatenlängen. Für die gesamte Tabelle können weitere Segmente, etwa LOBs oder Partitionen, hinzukommen.

    Segmente – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Segmente – Gefilterte Auswertung
    SELECT
        owner,
        segment_name,
        partition_name,
        segment_type,
        tablespace_name,
        bytes,
        blocks,
        extents
    FROM DBA_SEGMENTS
    WHERE UPPER(TO_CHAR(owner)) = UPPER('&FILTERWERT')
    ORDER BY bytes;
    Segmente – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Segmente über 10 GiB. Größe allein ist kein Fehler; Wachstum, Nutzung und Kapazitätsplanung entscheiden. Die Grenze ist ein Lehrbeispiel.
    Segmente – Auffälligkeiten und Abweichungen
    SELECT
        owner,
        segment_name,
        partition_name,
        segment_type,
        tablespace_name,
        bytes,
        blocks,
        extents
    FROM DBA_SEGMENTS
    WHERE bytes > 10*1024*1024*1024
    ORDER BY bytes;

    Die Übersicht ist auf die ersten 50 Zeilen in der angegebenen Sortierung begrenzt. Das ist keine vollständige Bestandsliste.

    Tablespaces – Übersicht und gezielte Diagnose Tablespace-Typ, Status, Extent Management, ASSM und BIGFILE-Eigenschaft dokumentieren. Storage und Tablespaces Übersicht

    1. Was liefert diese Abfrage?

    Tablespace-Typ, Status, Extent Management, ASSM und BIGFILE-Eigenschaft dokumentieren.

    Datenquelle:
    DBA_TABLESPACES
    Themenbereich:
    Storage und Tablespaces
    Wichtige Spalten:
    TABLESPACE_NAME, BLOCK_SIZE, EXTENT_MANAGEMENT, ALLOCATION_TYPE, SEGMENT_SPACE_MANAGEMENT, STATUS, CONTENTS, BIGFILE
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Tablespaces – Übersicht
    SELECT
        tablespace_name,
        block_size,
        initial_extent,
        next_extent,
        extent_management,
        allocation_type,
        segment_space_management,
        status,
        contents,
        bigfile
    FROM DBA_TABLESPACES
    ORDER BY tablespace_name;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    TABLESPACE_NAMECONTENTSSTATUS
    APP_DATAPERMANENTONLINE

    Auswertung und nächster Schritt: APP_DATA ist ein permanenter, online befindlicher Tablespace. Ob er ausreichend Platz besitzt, beantwortet diese Statuszeile noch nicht.

    Tablespaces – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Tablespaces – Gefilterte Auswertung
    SELECT
        tablespace_name,
        block_size,
        initial_extent,
        next_extent,
        extent_management,
        allocation_type,
        segment_space_management,
        status,
        contents,
        bigfile
    FROM DBA_TABLESPACES
    WHERE UPPER(TO_CHAR(tablespace_name)) = UPPER('&FILTERWERT')
    ORDER BY tablespace_name;
    Tablespaces – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Tablespaces außerhalb ONLINE. READ ONLY und OFFLINE können beabsichtigt sein. TEMP- und UNDO-Kontext sowie den gewünschten Betriebszustand beachten.
    Tablespaces – Auffälligkeiten und Abweichungen
    SELECT
        tablespace_name,
        block_size,
        initial_extent,
        next_extent,
        extent_management,
        allocation_type,
        segment_space_management,
        status,
        contents,
        bigfile
    FROM DBA_TABLESPACES
    WHERE status <> 'ONLINE'
    ORDER BY tablespace_name;
    Freier Tablespace-Speicher – Übersicht und gezielte Diagnose Freie Extents je Tablespace und Datafile sowie größte freie Bereiche untersuchen. Storage und Tablespaces Übersicht

    1. Was liefert diese Abfrage?

    Freie Extents je Tablespace und Datafile sowie größte freie Bereiche untersuchen.

    Datenquelle:
    DBA_FREE_SPACE
    Themenbereich:
    Storage und Tablespaces
    Wichtige Spalten:
    TABLESPACE_NAME, FILE_ID, BLOCK_ID, BYTES, BLOCKS, RELATIVE_FNO
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Freier Tablespace-Speicher – Übersicht
    SELECT
        tablespace_name,
        file_id,
        block_id,
        bytes,
        blocks,
        relative_fno
    FROM DBA_FREE_SPACE
    ORDER BY bytes;
    Was sehe ich hier?

    DBA_FREE_SPACE zeigt freie Extents in permanenten Tablespaces. Eine reine Summierung muss mit Datafile-Größe und Autoextend-Konfiguration zusammen bewertet werden.

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    TABLESPACE_NAMEFILE_IDBYTES
    APP_DATA78388608

    Auswertung und nächster Schritt: Die Zeile beschreibt ein freies Extent mit 8 MiB, nicht automatisch den gesamten freien Platz des Tablespaces. Für Summen gruppieren; bei fehlenden Zeilen auch Offline-Zustände beachten.

    Freier Tablespace-Speicher – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Freier Tablespace-Speicher – Gefilterte Auswertung
    SELECT
        tablespace_name,
        file_id,
        block_id,
        bytes,
        blocks,
        relative_fno
    FROM DBA_FREE_SPACE
    WHERE UPPER(TO_CHAR(tablespace_name)) = UPPER('&FILTERWERT')
    ORDER BY bytes;
    Freier Tablespace-Speicher – Auffälligkeiten und Abweichungen

    Summiert freie Extents je Online-Tablespace und zeigt Gruppen unter 100 MiB. Die Spalten sind TABLESPACE_NAME und FREE_MB; FREE_MB ist hier in MiB berechnet. Autoextend ist nicht enthalten; freier UNDO-Speicher benötigt eine eigene Bewertung.

    Freier Tablespace-Speicher – Auffälligkeiten und Abweichungen
    SELECT t.tablespace_name,
           ROUND(NVL(SUM(f.bytes), 0) / 1024 / 1024, 2) AS free_mb
    FROM dba_tablespaces t
    LEFT JOIN dba_free_space f ON f.tablespace_name = t.tablespace_name
    WHERE t.contents IN ('PERMANENT','UNDO') AND t.status = 'ONLINE'
    GROUP BY t.tablespace_name
    HAVING NVL(SUM(f.bytes), 0) < 100 * 1024 * 1024
    ORDER BY free_mb, t.tablespace_name;
    Objekte und Schema
    Tabellen, Indizes und sonstige Schemaobjekte nach Status, Größe, Statistik und Struktur untersuchen.
    Datenbankobjekte – Übersicht und gezielte Diagnose Objektbestand, Status, Typ und letzte DDL-Änderung schemaübergreifend analysieren. Objekte und Schema Übersicht

    1. Was liefert diese Abfrage?

    Objektbestand, Status, Typ und letzte DDL-Änderung schemaübergreifend analysieren.

    Datenquelle:
    DBA_OBJECTS
    Themenbereich:
    Objekte und Schema
    Wichtige Spalten:
    OWNER, OBJECT_NAME, OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS, TEMPORARY, GENERATED
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Datenbankobjekte – Übersicht
    SELECT
        owner,
        object_name,
        subobject_name,
        object_id,
        data_object_id,
        object_type,
        created,
        last_ddl_time,
        status,
        temporary,
        generated
    FROM DBA_OBJECTS
    ORDER BY last_ddl_time;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    OWNEROBJECT_NAMESTATUS
    APP_DEMOBESTELLUNGENVALID

    Auswertung und nächster Schritt: Das Objekt ist gültig. VALID ist keine Aussage über fachlich korrekte Daten, optimale Pläne oder passende Benutzerrechte.

    Datenbankobjekte – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Datenbankobjekte – Gefilterte Auswertung
    SELECT
        owner,
        object_name,
        subobject_name,
        object_id,
        data_object_id,
        object_type,
        created,
        last_ddl_time,
        status,
        temporary,
        generated
    FROM DBA_OBJECTS
    WHERE UPPER(TO_CHAR(owner)) = UPPER('&FILTERWERT')
    ORDER BY last_ddl_time;
    Datenbankobjekte – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Objekte mit einem Status ungleich VALID. Objektart, Fehlerdetails und Abhängigkeiten prüfen; der Status allein erklärt weder Ursache noch Auswirkung.
    Datenbankobjekte – Auffälligkeiten und Abweichungen
    SELECT
        owner,
        object_name,
        subobject_name,
        object_id,
        data_object_id,
        object_type,
        created,
        last_ddl_time,
        status,
        temporary,
        generated
    FROM DBA_OBJECTS
    WHERE status <> 'VALID'
    ORDER BY last_ddl_time;
    Tabellen – Übersicht und gezielte Diagnose Tabelleneigenschaften, Optimizer-Statistiken, Größe und Partitionierung auswerten. Objekte und Schema Übersicht

    1. Was liefert diese Abfrage?

    Tabelleneigenschaften, Optimizer-Statistiken, Größe und Partitionierung auswerten.

    Datenquelle:
    DBA_TABLES
    Themenbereich:
    Objekte und Schema
    Wichtige Spalten:
    OWNER, TABLE_NAME, TABLESPACE_NAME, NUM_ROWS, BLOCKS, AVG_ROW_LEN, LAST_ANALYZED, PARTITIONED, COMPRESSION
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Tabellen – Übersicht
    SELECT
        owner,
        table_name,
        tablespace_name,
        num_rows,
        blocks,
        empty_blocks,
        avg_row_len,
        last_analyzed,
        partitioned,
        compression,
        status
    FROM DBA_TABLES
    ORDER BY blocks;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    OWNERTABLE_NAMENUM_ROWS
    APP_DEMOBESTELLUNGEN12000

    Auswertung und nächster Schritt: NUM_ROWS ist ein Statistikwert. Für dessen Alter LAST_ANALYZED betrachten. Eine exakte aktuelle Zeilenzahl würde eine andere Abfrage benötigen und kann Aufwand verursachen.

    Tabellen – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Tabellen – Gefilterte Auswertung
    SELECT
        owner,
        table_name,
        tablespace_name,
        num_rows,
        blocks,
        empty_blocks,
        avg_row_len,
        last_analyzed,
        partitioned,
        compression,
        status
    FROM DBA_TABLES
    WHERE UPPER(TO_CHAR(owner)) = UPPER('&FILTERWERT')
    ORDER BY blocks;
    Tabellen – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Tabellen ohne Statistikdatum oder mit einem Statistikdatum älter als 30 Tage. Alter allein bedeutet nicht STALE; unveränderte Tabellen können passende alte Statistiken besitzen.
    Tabellen – Auffälligkeiten und Abweichungen
    SELECT
        owner,
        table_name,
        tablespace_name,
        num_rows,
        blocks,
        empty_blocks,
        avg_row_len,
        last_analyzed,
        partitioned,
        compression,
        status
    FROM DBA_TABLES
    WHERE last_analyzed IS NULL OR last_analyzed < SYSDATE - 30
    ORDER BY blocks;
    Indizes – Übersicht und gezielte Diagnose Indexstatus, Strukturwerte, Selektivität und Clustering Factor untersuchen. Objekte und Schema Übersicht

    1. Was liefert diese Abfrage?

    Indexstatus, Strukturwerte, Selektivität und Clustering Factor untersuchen.

    Datenquelle:
    DBA_INDEXES
    Themenbereich:
    Objekte und Schema
    Wichtige Spalten:
    OWNER, INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS, STATUS, BLEVEL, LEAF_BLOCKS, DISTINCT_KEYS, CLUSTERING_FACTOR
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Indizes – Übersicht
    SELECT
        owner,
        index_name,
        index_type,
        table_owner,
        table_name,
        uniqueness,
        tablespace_name,
        status,
        blevel,
        leaf_blocks,
        distinct_keys,
        clustering_factor,
        last_analyzed
    FROM DBA_INDEXES
    ORDER BY leaf_blocks;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    OWNERINDEX_NAMEBLEVEL
    APP_DEMOIX_BESTELL_DATUM2

    Auswertung und nächster Schritt: BLEVEL beschreibt die B-Tree-Tiefe ohne Blattebene. Der Wert 2 allein begründet keinen Rebuild. Verwendung, Selektivität und Plan prüfen.

    Indizes – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Indizes – Gefilterte Auswertung
    SELECT
        owner,
        index_name,
        index_type,
        table_owner,
        table_name,
        uniqueness,
        tablespace_name,
        status,
        blevel,
        leaf_blocks,
        distinct_keys,
        clustering_factor,
        last_analyzed
    FROM DBA_INDEXES
    WHERE UPPER(TO_CHAR(owner)) = UPPER('&FILTERWERT')
    ORDER BY leaf_blocks;
    Indizes – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt auf Indexebene als UNUSABLE gemeldete Indizes. Bei partitionierten Indizes zusätzlich Partitionen und Subpartitionen prüfen; der Filter deckt diese nicht vollständig ab.
    Indizes – Auffälligkeiten und Abweichungen
    SELECT
        owner,
        index_name,
        index_type,
        table_owner,
        table_name,
        uniqueness,
        tablespace_name,
        status,
        blevel,
        leaf_blocks,
        distinct_keys,
        clustering_factor,
        last_analyzed
    FROM DBA_INDEXES
    WHERE status = 'UNUSABLE'
    ORDER BY leaf_blocks;
    Indexspalten – Übersicht und gezielte Diagnose Spaltenreihenfolge, Sortierrichtung und Tabellenzuordnung von Indizes dokumentieren. Objekte und Schema Übersicht

    1. Was liefert diese Abfrage?

    Spaltenreihenfolge, Sortierrichtung und Tabellenzuordnung von Indizes dokumentieren.

    Datenquelle:
    DBA_IND_COLUMNS
    Themenbereich:
    Objekte und Schema
    Wichtige Spalten:
    INDEX_OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, DESCEND
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Indexspalten – Übersicht
    SELECT
        index_owner,
        index_name,
        table_owner,
        table_name,
        column_name,
        column_position,
        column_length,
        descend
    FROM DBA_IND_COLUMNS
    ORDER BY index_name, column_position;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    INDEX_NAMECOLUMN_NAMECOLUMN_POSITION
    IX_BESTELL_KUNDEKUNDEN_ID1
    IX_BESTELL_KUNDEBESTELLDATUM2

    Auswertung und nächster Schritt: Der zusammengesetzte Index beginnt mit KUNDEN_ID, danach folgt BESTELLDATUM. Diese Reihenfolge ist für passende Zugriffswege relevant; sie ist keine Problemrangfolge.

    Indexspalten – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Indexspalten – Gefilterte Auswertung
    SELECT
        index_owner,
        index_name,
        table_owner,
        table_name,
        column_name,
        column_position,
        column_length,
        descend
    FROM DBA_IND_COLUMNS
    WHERE UPPER(TO_CHAR(index_owner)) = UPPER('&FILTERWERT')
    ORDER BY index_name, column_position;
    Indexspalten – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Indexspalten ab Position 9. Das ist eine Suche nach breiten zusammengesetzten Indizes, keine allgemeine Oracle-Grenze und kein Beweis für einen schlechten Index.
    Indexspalten – Auffälligkeiten und Abweichungen
    SELECT
        index_owner,
        index_name,
        table_owner,
        table_name,
        column_name,
        column_position,
        column_length,
        descend
    FROM DBA_IND_COLUMNS
    WHERE column_position > 8
    ORDER BY index_name, column_position;
    Benutzer und Security
    Accounts, Rollen, Authentifizierung und auffällige Berechtigungen nachvollziehen.
    Datenbankbenutzer – Übersicht und gezielte Diagnose Accountstatus, Tablespaces, Profile, Authentifizierung und Oracle-maintained-Kennzeichen prüfen. Benutzer und Security Übersicht

    1. Was liefert diese Abfrage?

    Accountstatus, Tablespaces, Profile, Authentifizierung und Oracle-maintained-Kennzeichen prüfen.

    Datenquelle:
    DBA_USERS
    Themenbereich:
    Benutzer und Security
    Wichtige Spalten:
    USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE, DEFAULT_TABLESPACE, PROFILE, AUTHENTICATION_TYPE, ORACLE_MAINTAINED
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Datenbankbenutzer – Übersicht
    SELECT
        username,
        user_id,
        account_status,
        lock_date,
        expiry_date,
        default_tablespace,
        temporary_tablespace,
        profile,
        authentication_type,
        oracle_maintained,
        created
    FROM DBA_USERS
    ORDER BY username;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    USERNAMEACCOUNT_STATUSPROFILE
    REPORT_USEROPENDEFAULT

    Auswertung und nächster Schritt: OPEN beschreibt den Kontostatus. Zum tatsächlichen Zugriff gehören zusätzlich Anmeldung, Rollen und Objektprivilegien.

    Datenbankbenutzer – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Datenbankbenutzer – Gefilterte Auswertung
    SELECT
        username,
        user_id,
        account_status,
        lock_date,
        expiry_date,
        default_tablespace,
        temporary_tablespace,
        profile,
        authentication_type,
        oracle_maintained,
        created
    FROM DBA_USERS
    WHERE UPPER(TO_CHAR(username)) = UPPER('&FILTERWERT')
    ORDER BY username;
    Datenbankbenutzer – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt nicht von Oracle verwaltete Konten außerhalb OPEN. Gesperrte technische oder ungenutzte Konten können gewollt sein. Authentifizierung und vorgesehenen Kontozweck prüfen.
    Datenbankbenutzer – Auffälligkeiten und Abweichungen
    SELECT
        username,
        user_id,
        account_status,
        lock_date,
        expiry_date,
        default_tablespace,
        temporary_tablespace,
        profile,
        authentication_type,
        oracle_maintained,
        created
    FROM DBA_USERS
    WHERE account_status <> 'OPEN' AND oracle_maintained = 'N'
    ORDER BY username;
    Rollenrechte – Übersicht und gezielte Diagnose Vergebene Rollen, Admin Option, Default Role und Common-Rechte analysieren. Benutzer und Security Übersicht

    1. Was liefert diese Abfrage?

    Vergebene Rollen, Admin Option, Default Role und Common-Rechte analysieren.

    Datenquelle:
    DBA_ROLE_PRIVS
    Themenbereich:
    Benutzer und Security
    Wichtige Spalten:
    GRANTEE, GRANTED_ROLE, ADMIN_OPTION, DELEGATE_OPTION, DEFAULT_ROLE, COMMON, INHERITED
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Rollenrechte – Übersicht
    SELECT
        grantee,
        granted_role,
        admin_option,
        delegate_option,
        default_role,
        common,
        inherited
    FROM DBA_ROLE_PRIVS
    ORDER BY grantee, granted_role;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    GRANTEEGRANTED_ROLEADMIN_OPTION
    REPORT_USERAPP_READ_ROLENO

    Auswertung und nächster Schritt: REPORT_USER wurde die Rolle erteilt, jedoch ohne ADMIN OPTION. Welche Objekte damit lesbar sind, ergibt sich erst aus den Rechten der Rolle und dem Ausführungskontext.

    Rollenrechte – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Rollenrechte – Gefilterte Auswertung
    SELECT
        grantee,
        granted_role,
        admin_option,
        delegate_option,
        default_role,
        common,
        inherited
    FROM DBA_ROLE_PRIVS
    WHERE UPPER(TO_CHAR(grantee)) = UPPER('&FILTERWERT')
    ORDER BY grantee, granted_role;
    Rollenrechte – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Rollenvergaben mit ADMIN_OPTION. Das Weitergaberecht kann berechtigt sein; der Befund ist mit dem Berechtigungskonzept abzugleichen.
    Rollenrechte – Auffälligkeiten und Abweichungen
    SELECT
        grantee,
        granted_role,
        admin_option,
        delegate_option,
        default_role,
        common,
        inherited
    FROM DBA_ROLE_PRIVS
    WHERE admin_option = 'YES'
    ORDER BY grantee, granted_role;
    Scheduler und Jobs
    Scheduler-Konfiguration, Laufhistorie, Fehler und nächste Startzeiten kontrollieren.
    Scheduler Jobs – Übersicht und gezielte Diagnose Konfiguration, Zustand, letzte und nächste Laufzeit sowie Fehlerzähler von Scheduler Jobs prüfen. Scheduler und Jobs Übersicht

    1. Was liefert diese Abfrage?

    Konfiguration, Zustand, letzte und nächste Laufzeit sowie Fehlerzähler von Scheduler Jobs prüfen.

    Datenquelle:
    DBA_SCHEDULER_JOBS
    Themenbereich:
    Scheduler und Jobs
    Wichtige Spalten:
    OWNER, JOB_NAME, JOB_TYPE, ENABLED, STATE, LAST_START_DATE, LAST_RUN_DURATION, NEXT_RUN_DATE, FAILURE_COUNT
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Scheduler Jobs – Übersicht
    SELECT
        owner,
        job_name,
        job_type,
        job_action,
        enabled,
        state,
        start_date,
        repeat_interval,
        last_start_date,
        last_run_duration,
        next_run_date,
        failure_count
    FROM DBA_SCHEDULER_JOBS
    ORDER BY next_run_date;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    OWNERJOB_NAMESTATE
    APP_DEMOTAGESBERICHTSCHEDULED

    Auswertung und nächster Schritt: Der Job ist eingeplant. Das ist kein Erfolgsnachweis für den letzten Lauf; Laufhistorie und letzter Start müssen dazu betrachtet werden.

    Scheduler Jobs – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Scheduler Jobs – Gefilterte Auswertung
    SELECT
        owner,
        job_name,
        job_type,
        job_action,
        enabled,
        state,
        start_date,
        repeat_interval,
        last_start_date,
        last_run_duration,
        next_run_date,
        failure_count
    FROM DBA_SCHEDULER_JOBS
    WHERE UPPER(TO_CHAR(owner)) = UPPER('&FILTERWERT')
    ORDER BY next_run_date;
    Scheduler Jobs – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt problematische Jobzustände auch bei deaktivierten Jobs sowie aktivierte Jobs mit Fehlerzähler. ENABLED und STATE getrennt lesen. Ein alter Fehlerzähler beweist keinen aktuell fehlgeschlagenen Lauf; die Laufhistorie prüfen.
    Scheduler Jobs – Auffälligkeiten und Abweichungen
    SELECT
        owner,
        job_name,
        job_type,
        job_action,
        enabled,
        state,
        start_date,
        repeat_interval,
        last_start_date,
        last_run_duration,
        next_run_date,
        failure_count
    FROM DBA_SCHEDULER_JOBS
    WHERE state IN ('BROKEN', 'FAILED', 'CHAIN_STALLED',
                    'RESOURCE_UNAVAILABLE', 'SOME FAILED')
       OR (enabled = 'TRUE' AND failure_count > 0)
    ORDER BY next_run_date;
    Scheduler Laufhistorie – Übersicht und gezielte Diagnose Einzelne Scheduler-Läufe, Status, Dauer, CPU und Fehlerdetails auswerten. Scheduler und Jobs Übersicht

    1. Was liefert diese Abfrage?

    Einzelne Scheduler-Läufe, Status, Dauer, CPU und Fehlerdetails auswerten.

    Datenquelle:
    DBA_SCHEDULER_JOB_RUN_DETAILS
    Themenbereich:
    Scheduler und Jobs
    Wichtige Spalten:
    LOG_ID, LOG_DATE, OWNER, JOB_NAME, STATUS, ACTUAL_START_DATE, RUN_DURATION, CPU_USED, ERROR#
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Scheduler Laufhistorie – Übersicht
    SELECT
        log_id,
        log_date,
        owner,
        job_name,
        status,
        actual_start_date,
        run_duration,
        cpu_used,
        error#,
        additional_info
    FROM DBA_SCHEDULER_JOB_RUN_DETAILS
    ORDER BY log_date;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    LOG_IDJOB_NAMESTATUS
    501TAGESBERICHTFAILED

    Auswertung und nächster Schritt: Der konkrete Lauf ist fehlgeschlagen. ERROR# und ADDITIONAL_INFO aus derselben Zeile helfen bei der Ursache. Ein späterer erfolgreicher Lauf ist getrennt zu bewerten.

    Scheduler Laufhistorie – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Scheduler Laufhistorie – Gefilterte Auswertung
    SELECT
        log_id,
        log_date,
        owner,
        job_name,
        status,
        actual_start_date,
        run_duration,
        cpu_used,
        error#,
        additional_info
    FROM DBA_SCHEDULER_JOB_RUN_DETAILS
    WHERE UPPER(TO_CHAR(owner)) = UPPER('&FILTERWERT')
    ORDER BY log_date;
    Scheduler Laufhistorie – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt protokollierte Läufe mit Status ungleich SUCCEEDED. Beispielsweise ist STOPPED anders zu bewerten als FAILED. Ein früherer Fehler beweist keinen aktuellen Jobfehler.
    Scheduler Laufhistorie – Auffälligkeiten und Abweichungen
    SELECT
        log_id,
        log_date,
        owner,
        job_name,
        status,
        actual_start_date,
        run_duration,
        cpu_used,
        error#,
        additional_info
    FROM DBA_SCHEDULER_JOB_RUN_DETAILS
    WHERE status <> 'SUCCEEDED'
    ORDER BY log_date;
    RMAN und Backup
    RMAN-Jobs, Backup Pieces, Status, Laufzeiten und Backupgeräte prüfen.
    RMAN Backupjobs – Übersicht und gezielte Diagnose RMAN-Jobs nach Backupart, Status, Laufzeit, Datenmenge, Device Type und Kompression bewerten. RMAN und Backup Übersicht

    1. Was liefert diese Abfrage?

    RMAN-Jobs nach Backupart, Status, Laufzeit, Datenmenge, Device Type und Kompression bewerten.

    Datenquelle:
    V$RMAN_BACKUP_JOB_DETAILS
    Themenbereich:
    RMAN und Backup
    Wichtige Spalten:
    SESSION_KEY, INPUT_TYPE, STATUS, START_TIME, END_TIME, ELAPSED_SECONDS, INPUT_BYTES_DISPLAY, OUTPUT_BYTES_DISPLAY
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    RMAN Backupjobs – Übersicht
    SELECT
        session_key,
        input_type,
        status,
        start_time,
        end_time,
        elapsed_seconds,
        input_bytes_display,
        output_bytes_display,
        output_device_type,
        compression_ratio
    FROM V$RMAN_BACKUP_JOB_DETAILS
    ORDER BY start_time;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    SESSION_KEYINPUT_TYPESTATUS
    913ARCHIVELOGCOMPLETED WITH WARNINGS

    Auswertung und nächster Schritt: Der Job ist mit Warnungen beendet. Die RMAN-Ausgabe klärt deren Bedeutung; dieser Status allein beweist keine vollständige Recovery-Kette.

    RMAN Backupjobs – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    RMAN Backupjobs – Gefilterte Auswertung
    SELECT
        session_key,
        input_type,
        status,
        start_time,
        end_time,
        elapsed_seconds,
        input_bytes_display,
        output_bytes_display,
        output_device_type,
        compression_ratio
    FROM V$RMAN_BACKUP_JOB_DETAILS
    WHERE UPPER(TO_CHAR(input_type)) = UPPER('&FILTERWERT')
    ORDER BY start_time;
    RMAN Backupjobs – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt fehlgeschlagene Sicherungen sowie laufende oder abgeschlossene Jobs mit Warnungen beziehungsweise Fehlern. Ein reines COMPLETED wird nicht ausgewählt; die Warn- und Fehlervarianten bleiben sichtbar. Den vollständigen RMAN-Fehlerstack lesen.
    RMAN Backupjobs – Auffälligkeiten und Abweichungen
    SELECT
        session_key,
        input_type,
        status,
        start_time,
        end_time,
        elapsed_seconds,
        input_bytes_display,
        output_bytes_display,
        output_device_type,
        compression_ratio
    FROM V$RMAN_BACKUP_JOB_DETAILS
    WHERE status IN ('FAILED',
                     'COMPLETED WITH WARNINGS',
                     'COMPLETED WITH ERRORS',
                     'RUNNING WITH WARNINGS',
                     'RUNNING WITH ERRORS')
    ORDER BY start_time;
    Backup Pieces – Übersicht und gezielte Diagnose Physische RMAN Backup Pieces, Handle, Größe, Status, Kompression und Löschkennzeichen untersuchen. RMAN und Backup Übersicht

    1. Was liefert diese Abfrage?

    Physische RMAN Backup Pieces, Handle, Größe, Status, Kompression und Löschkennzeichen untersuchen.

    Datenquelle:
    V$BACKUP_PIECE
    Themenbereich:
    RMAN und Backup
    Wichtige Spalten:
    RECID, SET_STAMP, SET_COUNT, PIECE#, DEVICE_TYPE, HANDLE, STATUS, COMPLETION_TIME, BYTES, COMPRESSED, DELETED
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Backup Pieces – Übersicht
    SELECT
        recid,
        stamp,
        set_stamp,
        set_count,
        piece#,
        copy#,
        device_type,
        handle,
        status,
        start_time,
        completion_time,
        bytes,
        compressed,
        deleted
    FROM V$BACKUP_PIECE
    ORDER BY completion_time;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    RECIDSTATUSBYTES
    210A104857600

    Auswertung und nächster Schritt: A bedeutet im Repository verfügbar; die Größe beträgt 100 MiB. Für tatsächliche Lesbarkeit und Wiederherstellbarkeit sind zusätzliche Prüfungen erforderlich.

    Backup Pieces – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Backup Pieces – Gefilterte Auswertung
    SELECT
        recid,
        stamp,
        set_stamp,
        set_count,
        piece#,
        copy#,
        device_type,
        handle,
        status,
        start_time,
        completion_time,
        bytes,
        compressed,
        deleted
    FROM V$BACKUP_PIECE
    WHERE UPPER(TO_CHAR(device_type)) = UPPER('&FILTERWERT')
    ORDER BY completion_time;
    Backup Pieces – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Backup-Piece-Metadaten außerhalb AVAILABLE oder mit Löschkennzeichen. Gelöschte, planmäßig obsolete Sicherungen können normal sein. Repository-Status und tatsächliche Lesbarkeit sind unterschiedliche Aussagen.
    Backup Pieces – Auffälligkeiten und Abweichungen
    SELECT
        recid,
        stamp,
        set_stamp,
        set_count,
        piece#,
        copy#,
        device_type,
        handle,
        status,
        start_time,
        completion_time,
        bytes,
        compressed,
        deleted
    FROM V$BACKUP_PIECE
    WHERE status <> 'A' OR deleted = 'YES'
    ORDER BY completion_time;
    Diagnose und Alertlog
    ADR-Pfade und Alertlog-Meldungen zeitlich und inhaltlich auswerten.
    ADR Alertmeldungen – Übersicht und gezielte Diagnose Strukturierte Alertlog-Meldungen zeitlich begrenzen, kategorisieren und nach Fehlern durchsuchen. Diagnose und Alertlog Übersicht

    1. Was liefert diese Abfrage?

    Strukturierte Alertlog-Meldungen zeitlich begrenzen, kategorisieren und nach Fehlern durchsuchen.

    Datenquelle:
    V$DIAG_ALERT_EXT
    Themenbereich:
    Diagnose und Alertlog
    Wichtige Spalten:
    ORIGINATING_TIMESTAMP, MESSAGE_TYPE, MESSAGE_LEVEL, COMPONENT_ID, PROBLEM_KEY, MESSAGE_TEXT
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    ADR Alertmeldungen – Übersicht
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        error_instance_id,
        substr(message_text,1,1000) message_text
    FROM V$DIAG_ALERT_EXT
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
    ORDER BY originating_timestamp DESC
    FETCH FIRST 50 ROWS ONLY;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    COMPONENT_IDMESSAGE_TYPEMESSAGE_TEXT
    rdbms2ORA-01653: unable to extend table APP_DEMO.BESTELLUNGEN

    Auswertung und nächster Schritt: Dies ist ein gekürzter fiktiver Meldungstext. Vollständige Meldung, Zeitstempel und betroffenen Tablespace sichern; nicht aus einer einzelnen Meldung eine pauschale Löschmaßnahme ableiten.

    ADR Alertmeldungen – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    ADR Alertmeldungen – Gefilterte Auswertung
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        error_instance_id,
        substr(message_text,1,1000) message_text
    FROM V$DIAG_ALERT_EXT
    WHERE UPPER(TO_CHAR(component_id)) = UPPER('&FILTERWERT')
    ORDER BY originating_timestamp;
    ADR Alertmeldungen – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Meldungen mit hoher Dringlichkeit oder den Textmustern ORA-/WARNING. Texttreffer können Folgefehler oder zitierte Meldungen sein. Die vollständige zeitliche Meldungskette lesen.
    ADR Alertmeldungen – Auffälligkeiten und Abweichungen
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        error_instance_id,
        substr(message_text,1,1000) message_text
    FROM V$DIAG_ALERT_EXT
    WHERE message_level <= 8 OR upper(message_text) LIKE '%ORA-%' OR upper(message_text) LIKE '%WARNING%'
    ORDER BY originating_timestamp;

    Die Übersicht zeigt höchstens 50 Meldungen der letzten 24 Stunden; keine vollständige Alertlog-Historie.

    ADR-Pfade – Übersicht und gezielte Diagnose ADR Home, Trace-, Alert- und Incident-Pfade der aktuellen Instanz anzeigen. Diagnose und Alertlog Übersicht

    1. Was liefert diese Abfrage?

    ADR Home, Trace-, Alert- und Incident-Pfade der aktuellen Instanz anzeigen.

    Datenquelle:
    V$DIAG_INFO
    Themenbereich:
    Diagnose und Alertlog
    Wichtige Spalten:
    INST_ID, NAME, VALUE, CON_ID
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    ADR-Pfade – Übersicht
    SELECT
        inst_id,
        name,
        value,
        con_id
    FROM V$DIAG_INFO
    ORDER BY name;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    NAMEVALUE
    Diag Trace/u01/app/oracle/diag/rdbms/demo/DEMODB/trace

    Auswertung und nächster Schritt: Der Pfad gehört zum Server der betrachteten Instanz. Er ist kein Pfad auf dem Arbeitsplatz. Vor dem Lesen von Logs den tatsächlichen Host und Zeitpunkt zuordnen.

    ADR-Pfade – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    ADR-Pfade – Gefilterte Auswertung
    SELECT
        inst_id,
        name,
        value,
        con_id
    FROM V$DIAG_INFO
    WHERE UPPER(TO_CHAR(name)) = UPPER('&FILTERWERT')
    ORDER BY name;
    ADR-Pfade – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Diagnoseinformationen ohne VALUE. Ein NULL-Wert allein beweist keinen ADR-Fehler; Bedeutung des jeweiligen NAME und Verfügbarkeit im aktuellen Zustand prüfen.
    ADR-Pfade – Auffälligkeiten und Abweichungen
    SELECT
        inst_id,
        name,
        value,
        con_id
    FROM V$DIAG_INFO
    WHERE value IS NULL
    ORDER BY name;
    Parameter und NLS
    Aktuelle Oracle-Parameter und dauerhafte NLS-Einstellungen dokumentieren.
    Initialisierungsparameter – Übersicht und gezielte Diagnose Aktuelle Parameterwerte, Defaultstatus und Änderbarkeit auf Session-, System- und PDB-Ebene prüfen. Parameter und NLS Übersicht

    1. Was liefert diese Abfrage?

    Aktuelle Parameterwerte, Defaultstatus und Änderbarkeit auf Session-, System- und PDB-Ebene prüfen.

    Datenquelle:
    V$PARAMETER
    Themenbereich:
    Parameter und NLS
    Wichtige Spalten:
    NAME, VALUE, DISPLAY_VALUE, ISDEFAULT, ISSES_MODIFIABLE, ISSYS_MODIFIABLE, ISPDB_MODIFIABLE, ISMODIFIED
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Initialisierungsparameter – Übersicht
    SELECT
        num,
        name,
        type,
        value,
        display_value,
        isdefault,
        isses_modifiable,
        issys_modifiable,
        ispdb_modifiable,
        ismodified,
        isadjusted,
        description
    FROM V$PARAMETER
    ORDER BY name;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    NAMEDISPLAY_VALUEISSYS_MODIFIABLE
    open_cursors300IMMEDIATE

    Auswertung und nächster Schritt: Der Parameterwert gilt für den betrachteten Sessionkontext. IMMEDIATE beschreibt eine mögliche Systemänderbarkeit, empfiehlt aber keine Änderung. Für Instanzvorgaben V$SYSTEM_PARAMETER vergleichen.

    Initialisierungsparameter – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Initialisierungsparameter – Gefilterte Auswertung
    SELECT
        num,
        name,
        type,
        value,
        display_value,
        isdefault,
        isses_modifiable,
        issys_modifiable,
        ispdb_modifiable,
        ismodified,
        isadjusted,
        description
    FROM V$PARAMETER
    WHERE UPPER(TO_CHAR(name)) = UPPER('&FILTERWERT')
    ORDER BY name;
    Initialisierungsparameter – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Parameter mit expliziter beziehungsweise veränderter Einstellung. Abweichung vom Default ist kein Fehler. V$PARAMETER beschreibt den für die abfragende Session wirksamen Kontext.
    Initialisierungsparameter – Auffälligkeiten und Abweichungen
    SELECT
        num,
        name,
        type,
        value,
        display_value,
        isdefault,
        isses_modifiable,
        issys_modifiable,
        ispdb_modifiable,
        ismodified,
        isadjusted,
        description
    FROM V$PARAMETER
    WHERE isdefault = 'FALSE' OR ismodified <> 'FALSE'
    ORDER BY name;
    NLS-Datenbankparameter – Übersicht und gezielte Diagnose Dauerhafte NLS-Einstellungen der Datenbank wie Zeichensatz und Territory dokumentieren. Parameter und NLS Übersicht

    1. Was liefert diese Abfrage?

    Dauerhafte NLS-Einstellungen der Datenbank wie Zeichensatz und Territory dokumentieren.

    Datenquelle:
    NLS_DATABASE_PARAMETERS
    Themenbereich:
    Parameter und NLS
    Wichtige Spalten:
    PARAMETER, VALUE
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    NLS-Datenbankparameter – Übersicht
    SELECT
        parameter,
        value
    FROM NLS_DATABASE_PARAMETERS
    ORDER BY parameter;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    PARAMETERVALUE
    NLS_CHARACTERSETAL32UTF8

    Auswertung und nächster Schritt: Dies ist der Datenbankzeichensatz im Beispiel. Daraus folgt nicht automatisch die Textkodierung eines Clients; die Clientseite muss gesondert geprüft werden.

    NLS-Datenbankparameter – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    NLS-Datenbankparameter – Gefilterte Auswertung
    SELECT
        parameter,
        value
    FROM NLS_DATABASE_PARAMETERS
    WHERE UPPER(TO_CHAR(parameter)) = UPPER('&FILTERWERT')
    ORDER BY parameter;
    NLS-Datenbankparameter – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Datenbank-NLS-Einträge ohne Wert. Daraus folgt keine konkrete falsche Clientdarstellung; Datenbank-, Session- und Clientebene getrennt prüfen.
    NLS-Datenbankparameter – Auffälligkeiten und Abweichungen
    SELECT
        parameter,
        value
    FROM NLS_DATABASE_PARAMETERS
    WHERE value IS NULL
    ORDER BY parameter;
    Services und Ressourcen
    Datenbankservices und Ressourcenauslastung bis zu konfigurierten Limits bewerten.
    Datenbankservices – Übersicht und gezielte Diagnose Registrierte Datenbankservices, Network Name, Load-Balancing-Ziele und Containerbezug prüfen. Services und Ressourcen Übersicht

    1. Was liefert diese Abfrage?

    Registrierte Datenbankservices, Network Name, Load-Balancing-Ziele und Containerbezug prüfen.

    Datenquelle:
    V$SERVICES
    Themenbereich:
    Services und Ressourcen
    Wichtige Spalten:
    SERVICE_ID, NAME, NETWORK_NAME, CREATION_DATE, GOAL, CLB_GOAL, AQ_HA_NOTIFICATIONS, CON_ID
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Datenbankservices – Übersicht
    SELECT
        service_id,
        name,
        network_name,
        creation_date,
        creation_date_hash,
        goal,
        dtp,
        aq_ha_notification,
        clb_goal,
        con_id
    FROM V$SERVICES
    ORDER BY name;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    NAMENETWORK_NAMECON_ID
    APP_SERVICEAPP_SERVICE3

    Auswertung und nächster Schritt: Der Service ist Container 3 zugeordnet. Die Zeile allein beweist nicht, dass Listener, Namensauflösung und Anmeldung vom Client aus funktionieren.

    Datenbankservices – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Datenbankservices – Gefilterte Auswertung
    SELECT
        service_id,
        name,
        network_name,
        creation_date,
        creation_date_hash,
        goal,
        dtp,
        aq_ha_notification,
        clb_goal,
        con_id
    FROM V$SERVICES
    WHERE UPPER(TO_CHAR(name)) = UPPER('&FILTERWERT')
    ORDER BY name;
    Datenbankservices – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Services ohne NETWORK_NAME. Ein solcher Eintrag beweist keinen Listener- oder Verbindungsfehler. Den tatsächlich benötigten Service und dessen Registrierung prüfen.
    Datenbankservices – Auffälligkeiten und Abweichungen
    SELECT
        service_id,
        name,
        network_name,
        creation_date,
        creation_date_hash,
        goal,
        dtp,
        aq_ha_notification,
        clb_goal,
        con_id
    FROM V$SERVICES
    WHERE network_name IS NULL
    ORDER BY name;
    Ressourcenlimits – Übersicht und gezielte Diagnose Aktuelle Nutzung, Peak seit Instanzstart und konfigurierte Limits für Sessions, Processes und weitere Ressourcen bewerten. Services und Ressourcen Übersicht

    1. Was liefert diese Abfrage?

    Aktuelle Nutzung, Peak seit Instanzstart und konfigurierte Limits für Sessions, Processes und weitere Ressourcen bewerten.

    Datenquelle:
    V$RESOURCE_LIMIT
    Themenbereich:
    Services und Ressourcen
    Wichtige Spalten:
    RESOURCE_NAME, CURRENT_UTILIZATION, MAX_UTILIZATION, INITIAL_ALLOCATION, LIMIT_VALUE, CON_ID
    Zugriffsart:
    Read-only SELECT

    2. Wie lese ich das Ergebnis?

    Interpretation:
    Nicht jede Zeile ist ein Problem. Zuerst Status, Zeitpunkt, Größenordnung und fachlichen Kontext prüfen.

    3. Fertige SQL-Abfrage

    Ressourcenlimits – Übersicht
    SELECT
        resource_name,
        current_utilization,
        max_utilization,
        initial_allocation,
        limit_value,
        con_id
    FROM V$RESOURCE_LIMIT
    ORDER BY resource_name;

    Fiktive Beispielausgabe:

    Darstellung: ausgewählte Spalten und Zeilen der Abfrage.

    RESOURCE_NAMECURRENT_UTILIZATIONMAX_UTILIZATION
    processes90140

    Auswertung und nächster Schritt: Aktuell werden 90 Prozesse genutzt; der Spitzenwert seit Instanzstart war 140. Für verbleibende Reserve LIMIT_VALUE zusätzlich betrachten. Der Peak ist kein aktueller Lastwert.

    Ressourcenlimits – Gefilterte Auswertung
    Interpretation:
    Bei Textfiltern auf Groß-/Kleinschreibung, Owner und Container achten.
    Ressourcenlimits – Gefilterte Auswertung
    SELECT
        resource_name,
        current_utilization,
        max_utilization,
        initial_allocation,
        limit_value,
        con_id
    FROM V$RESOURCE_LIMIT
    WHERE UPPER(TO_CHAR(resource_name)) = UPPER('&FILTERWERT')
    ORDER BY resource_name;
    Ressourcenlimits – Auffälligkeiten und Abweichungen
    Interpretation:
    Zeigt Ressourcen, deren bisheriger Höchststand mindestens 80 Prozent des numerischen Limits erreicht hat. MAX_UTILIZATION ist nicht der aktuelle Verbrauch. CURRENT_UTILIZATION und Beobachtungszeitraum mitlesen.
    Ressourcenlimits – Auffälligkeiten und Abweichungen
    SELECT
        resource_name,
        current_utilization,
        max_utilization,
        initial_allocation,
        limit_value,
        con_id
    FROM V$RESOURCE_LIMIT
    WHERE max_utilization >= 0.8 * CASE
        WHEN REGEXP_LIKE(limit_value, '^[0-9]+$')
        THEN TO_NUMBER(limit_value)
        ELSE NULL
    END
    ORDER BY resource_name;
    Das Rezeptbuch enthält 34 Hauptrezepte mit jeweils zwei gezielten Varianten in 15 Themenbereichen. Jede Abfrage kann einzeln aufgeklappt und über die vorhandene Kopierfunktion direkt übernommen werden.

    Offizielle Oracle-Referenzen (19c)

    V-SESSION · DBA_FREE_SPACE · V-PGASTAT

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Ein SQL-Rezept beantwortet eine bestimmte Diagnosefrage. Vor der Ausführung muss klar sein, welche Information gesucht wird und was eine Ergebniszeile bedeutet.
    2. View, Berechtigungen und Containerkontext bestimmen, welche Daten sichtbar sind. Ein leeres Ergebnis kann deshalb mehrere Ursachen haben und ist nicht automatisch eine Entwarnung.
    3. Filter, Join-Schlüssel und Gruppierung müssen zur untersuchten Ressource passen. Andernfalls können gleichnamige Objekte vermischt oder Ergebnisse mehrfach gezählt werden.
    4. Einheiten und Zeitbezug gehören zu jedem Messwert. Aktueller Zustand, seit dem Start aufgelaufene Werte und Intervallmessungen dürfen nicht gleichgesetzt werden.
    5. Die lesenden Abfragen liefern Befunde für die weitere Diagnose. Eine auffällige Zeile allein rechtfertigt noch keine Änderung oder automatische Korrektur.

    Lernzielkontrolle

    Erkläre zuerst deinen Befund und den nächsten Prüfschritt. Öffne danach die begründete Lösung.
    Frage 1: Welche Frage beantwortet eine auf ELAPSED_TIME sortierte SQL-Liste?

    Lösung: Sie ordnet die im Cache vorhandenen Cursor nach ihrer gesammelten Datenbankzeit. Die aktuelle Minute und der letzte einzelne Aufruf sind damit nicht isoliert gemessen.

    Frage 2: Was bedeutet CURRENT_WAIT_S = NULL in der neuen Sessionausgabe?

    Lösung: Die Session ist nicht als WAITING gemeldet. NULL steht hier für „keine aktuelle Wartedauer ausgewiesen“, nicht für eine gemessene Wartezeit von null Sekunden.

    Frage 3: Warum werden Beispielschwellen nicht unverändert zu Alarmgrenzen?

    Lösung: Die passende Bewertung hängt von Workload, Zeitbezug und Betriebsziel ab. Ein Treffer ist zunächst ein Prüfhinweis.

    Frage 4: Was gehört zum Abschluss einer Rezeptabfrage?

    Lösung: Messzeitpunkt, Datenbank-/Containerkontext, wichtige Ergebniswerte, Interpretation und der nächste Prüfschritt. Die reine SQL-Ausgabe allein erklärt die Ursache noch nicht.

    44. Welche View brauche ich? – von der DBA-Frage zur richtigen Datenquelle

    Von der praktischen Fragestellung zur passenden V$-, DBA_- oder NLS-View, ohne die Fachkapitel zu duplizieren.

    Lernkompass
    Einfach gesagt Oracle verteilt Informationen auf viele Data-Dictionary- und Dynamic-Performance-Views.
    Warum ist das wichtig? Der View-Finder startet deshalb nicht beim View-Namen, sondern bei deiner DBA-Frage.
    Nach diesem Kapitel Du kannst von 'Was will ich wissen?' zur passenden Datenquelle navigieren.

    Einführung: Eine View ist eine abfragbare Sicht auf Daten. Für DBA-Fragen sind besonders Informationen über Definitionen und über den laufenden Betrieb wichtig. Die Suche nach einem Objekteigentümer verlangt eine andere Sicht als die Suche nach einer aktuell wartenden Session. Der View-Finder hilft dir, diese erste Auswahl ausgehend von der Frage zu treffen.

    Die Karten ordnen typische Anliegen einer Datenquelle zu und erläutern wichtige Spalten, Filter und Grenzen. Du musst deshalb nicht alle View-Namen auswendig kennen. Nach der Auswahl prüfst du, ob der sichtbare Bestand zum Container und zum gesuchten Zeitpunkt passt. Kapitel 49 und 50 vertiefen die beiden Informationsfamilien; hier steht ihre gezielte Auswahl im Vordergrund.

    Oracle 19c: fachliche Grundlage

    Eine Frage, zwei unterschiedliche Datenquellen

    „Wer besitzt BESTELLUNGEN?“ führt zu einer Objektdefinition, etwa ALL_OBJECTS oder DBA_OBJECTS. „Welche Session wartet beim Speichern?“ führt zu V$SESSION. Erstere Antwort beschreibt Eigentümer und Objekttyp, letztere einen aktuellen Betriebszustand. Ein Objektname allein identifiziert keine wartende Session.

    Wähle unten zunächst die passende Frage. Prüfe anschließend Filter, Container und Zeitbezug. Wenn du keine Zeile erhältst, kläre diese Voraussetzungen, bevor du „Objekt fehlt“ oder „Störung vorbei“ notierst.

    Merksatz: Definition oder Laufzeit?

    Frage zuerst: „Wie ist etwas definiert?“ – dann suchst du meist im Data Dictionary, zum Beispiel DBA_*. Oder: „Welchen Betriebszustand oder Messwert suche ich?“ – dann sind meist V$-Views der richtige Startpunkt. Ihr Zeitbezug ist unterschiedlich: Momentaufnahme, kumulierter Zähler oder gespeicherter Betriebsbestand. Kapitel 49 und 50 erklären beide Familien ausführlich.

    Abgrenzung: Der View-Finder erklärt nicht die Fachthemen. Er führt von einer DBA-Frage zur passenden Informationsquelle.

    Dieser Finder ist eine Navigationshilfe. Ausgangspunkt ist nicht der Name einer Oracle-View, sondern die Frage, die ein DBA gerade beantworten möchte. Zu jeder Frage werden die wichtigsten Views, relevante Spalten, eine kurze Beispielabfrage und ein knapper Interpretationshinweis gezeigt.

    Ausführliche Erklärungen bleiben bewusst in den vorhandenen Fachkapiteln, im SQL-Rezeptbuch und im Troubleshooting. So vermeiden wir doppelte Inhalte.

    Problemorientiert statt View-orientiert: Starte mit deiner DBA-Frage. Der Finder zeigt die primäre Datenquelle, ergänzende Views, wichtige Spalten, eine fertige read-only Abfrage, Interpretation und den passenden nächsten Lern- oder Diagnoseschritt.
    Schnelleinstieg – was möchtest du herausfinden?
    33 Fragen
    Nach Themenbereich filtern
    Keine passende DBA-Frage gefunden. Suche allgemeiner oder setze den Filter zurück.
    1. Wer blockiert gerade? V$SESSION anzeigen
    Primäre View V$SESSION
    Zusätzliche Views V$SESSION, V$LOCK, V$LOCKED_OBJECT, V$TRANSACTION, DBA_OBJECTS
    Wichtige Spalten SID, SERIAL#, BLOCKING_SESSION, SQL_ID, EVENT, STATE, WAIT_TIME_MICRO
    Kurze Beispielabfrage
    SELECT sid, serial#, con_id, username, blocking_instance, blocking_session,
           blocking_session_status, sql_id, state, event,
           CASE WHEN state='WAITING' THEN wait_time_micro/1000000 END AS current_wait_s
    FROM v$session
    WHERE blocking_session_status='VALID'
    ORDER BY current_wait_s DESC NULLS LAST;

    Fiktive Beispielausgabe:

    Alle ausgewählten Spalten; eine erfundene Ergebniszeile als Ausschnitt. NULL kennzeichnet fehlende Werte. Datumsformat zur Lesbarkeit vereinheitlicht.

    SIDSERIAL#CON_IDUSERNAMEBLOCKING_INSTANCEBLOCKING_SESSIONBLOCKING_SESSION_STATUSSQL_IDSTATEEVENTCURRENT_WAIT_S
    811453APP_USER172VALID8m4n2k6p9r3stWAITINGenq: TX - row lock contention12.4

    Auswertung und nächster Schritt: Session 81 wartet in dieser Momentaufnahme auf Session 72 der Instanz 1. VALID bestätigt die Blockerzuordnung. 12,4 Sekunden betreffen den aktuellen Wait, nicht automatisch die gesamte Transaktion. Nun Blocker und offenen Geschäftsvorgang prüfen.

    Interpretation: BLOCKING_SESSION ist nur bei BLOCKING_SESSION_STATUS = VALID als bestätigter Blocker auszuwerten. SID zusammen mit Instanz und Container betrachten. CURRENT_WAIT_S beschreibt nur einen gerade laufenden Wait.
    Wichtig
    Nicht sofort Sessions beenden. Zuerst Blocker, offene Transaktion, Objekt und fachlichen Kontext dokumentieren.
    2. Welche Sessions sind aktuell aktiv? V$SESSION anzeigen
    Primäre View V$SESSION
    Zusätzliche Views V$SESSION
    Wichtige Spalten SID, SERIAL#, USERNAME, STATUS, MODULE, MACHINE, SQL_ID, EVENT, WAIT_CLASS
    Kurze Beispielabfrage
    SELECT sid, serial#, username, module, machine, sql_id, state,
           CASE WHEN state='WAITING' THEN event END AS current_event,
           CASE WHEN state='WAITING' THEN wait_time_micro/1000000 END AS current_wait_s
    FROM v$session
    WHERE type='USER' AND status='ACTIVE'
    ORDER BY current_wait_s DESC NULLS LAST;

    Fiktive Beispielausgabe:

    Alle ausgewählten Spalten; eine erfundene Ergebniszeile als Ausschnitt. NULL kennzeichnet fehlende Werte. Datumsformat zur Lesbarkeit vereinheitlicht.

    SIDSERIAL#USERNAMEMODULEMACHINESQL_IDSTATECURRENT_EVENTCURRENT_WAIT_S
    72302APP_USERBESTELLPORTALapp013s6k8m2n4p7rtWAITED SHORT TIMENULLNULL

    Auswertung und nächster Schritt: ACTIVE umfasst auch Sessions, die gerade auf der CPU arbeiten oder ausführbar sind. Hier meldet STATE keinen aktuellen Wait; deshalb liefern beide CASE-Ausdrücke NULL. Das ist kein Beleg für eine untätige Session.

    Interpretation: ACTIVE bedeutet einen aktiven Datenbankaufruf, nicht ausschließlich CPU-Arbeit. Nur STATE = WAITING bestätigt einen laufenden Wait. Andernfalls bleibt CURRENT_EVENT in dieser Abfrage NULL.
    Wichtig
    Eine hohe Anzahl ACTIVE Sessions ist nur im Kontext von CPU, Wait Events und Anwendungslast sinnvoll zu bewerten.
    3. Worauf warten aktive Sessions? V$SESSION anzeigen
    Primäre View V$SESSION
    Zusätzliche Views V$SESSION, V$SESSION_EVENT, V$SYSTEM_EVENT
    Wichtige Spalten EVENT, WAIT_CLASS, STATE, STATE, WAIT_TIME_MICRO
    Kurze Beispielabfrage
    SELECT sid, serial#, username, event, wait_class, state,
           wait_time_micro/1000000 AS current_wait_s, sql_id
    FROM v$session
    WHERE type='USER' AND status='ACTIVE' AND state='WAITING'
    ORDER BY current_wait_s DESC;
    Interpretation: Die Abfrage zeigt ausschließlich aktuell wartende aktive Benutzersessions. WAIT_TIME_MICRO wird von Mikrosekunden in Sekunden umgerechnet.
    Wichtig
    Ein einzelner Wait ist noch keine Ursache. Häufigkeit, Dauer, betroffene Sessions und SQL_ID gemeinsam betrachten.
    4. Welche Wait Events dominieren seit Instanzstart? V$SYSTEM_EVENT anzeigen
    Primäre View V$SYSTEM_EVENT
    Zusätzliche Views V$SYSTEM_EVENT, V$INSTANCE
    Wichtige Spalten EVENT, WAIT_CLASS, TOTAL_WAITS, TIME_WAITED_MICRO, AVERAGE_WAIT
    Kurze Beispielabfrage
    SELECT event,
           wait_class,
           total_waits,
           time_waited_micro,
           average_wait
    FROM v$system_event
    WHERE wait_class <> 'Idle'
    ORDER BY time_waited_micro DESC;
    Interpretation: TOTAL_WAITS und TIME_WAITED_MICRO sind kumulierte Zähler der Instanz; AVERAGE_WAIT wird in Hundertstelsekunden angegeben. Für ein aktuelles Problem zwei zeitlich begrenzte Messungen vergleichen. Vordergrund und Hintergrund nicht ungeprüft zusammen interpretieren.
    Wichtig
    Immer STARTUP_TIME aus V$INSTANCE beachten oder zwei Messpunkte bilden.
    5. Welche SQL verbraucht insgesamt am meisten Zeit? V$SQL anzeigen
    Primäre View V$SQL
    Zusätzliche Views V$SQL, V$SQLSTATS
    Wichtige Spalten SQL_ID, EXECUTIONS, ELAPSED_TIME, CPU_TIME, BUFFER_GETS, DISK_READS
    Kurze Beispielabfrage
    SELECT *
    FROM (
        SELECT sql_id, child_number, con_id,
               executions,
               elapsed_time/1000000 AS elapsed_s,
               cpu_time/1000000 AS cpu_s,
               buffer_gets,
               disk_reads,
               module,
               sql_text
        FROM v$sql
        WHERE sql_id IS NOT NULL
        ORDER BY elapsed_time DESC
    )
    WHERE ROWNUM <= 20;

    Fiktive Beispielausgabe:

    Alle ausgewählten Spalten; eine erfundene Ergebniszeile als Ausschnitt. NULL kennzeichnet fehlende Werte. Datumsformat zur Lesbarkeit vereinheitlicht.

    SQL_IDCHILD_NUMBERCON_IDEXECUTIONSELAPSED_SCPU_SBUFFER_GETSDISK_READSMODULESQL_TEXT
    8m4n2k6p9r3st03100240150120000018000BESTELLPORTALSELECT SUM(betrag) FROM bestellung

    Auswertung und nächster Schritt: Die Werte gelten kumulativ für diesen Child Cursor. 240 / 100 = 2,4 Sekunden ist hier ein rechnerischer Durchschnitt, keine gemessene Laufzeit des letzten Aufrufs. Für die aktuelle Störung einen zeitlich passenden Vergleich und den konkreten Cursor untersuchen.

    Interpretation: Jede Zeile gehört zu einem Child Cursor. Zeiten sind kumuliert seit dem Laden dieses Cursors; ELAPSED_S und CPU_S sind Sekunden, keine Dauer des letzten Aufrufs. Parallelität kann die Summe beeinflussen.
    Wichtig
    Ein sehr häufiges, schnelles SQL kann in Summe weit oben stehen, ohne einzelne Benutzer sichtbar auszubremsen.
    6. Welche SQL verbraucht viel CPU? V$SQL anzeigen
    Primäre View V$SQL
    Zusätzliche Views V$SQL, V$SQLSTATS
    Wichtige Spalten SQL_ID, EXECUTIONS, CPU_TIME, ELAPSED_TIME
    Kurze Beispielabfrage
    SELECT *
    FROM (
        SELECT sql_id, child_number, con_id,
               executions,
               cpu_time/1000000 AS cpu_s,
               elapsed_time/1000000 AS elapsed_s,
               buffer_gets,
               sql_text
        FROM v$sql
        WHERE sql_id IS NOT NULL
        ORDER BY cpu_time DESC
    )
    WHERE ROWNUM <= 20;
    Interpretation: CPU_S ist die kumulierte CPU-Zeit dieses Child Cursors in Sekunden. Hohe Gesamtsummen können auch aus vielen kurzen Ausführungen stammen.
    Wichtig
    V$SQL enthält nur Cursor, die noch im Shared Pool vorhanden sind.
    7. Welche SQL erzeugt viele Logical Reads? V$SQL anzeigen
    Primäre View V$SQL
    Zusätzliche Views V$SQL, V$SQLSTATS
    Wichtige Spalten BUFFER_GETS, EXECUTIONS, SQL_ID
    Kurze Beispielabfrage
    SELECT *
    FROM (
        SELECT sql_id, child_number, con_id,
               executions,
               buffer_gets,
               buffer_gets/NULLIF(executions,0) AS gets_per_exec,
               sql_text
        FROM v$sql
        WHERE executions > 0
        ORDER BY buffer_gets DESC
    )
    WHERE ROWNUM <= 20;
    Interpretation: BUFFER_GETS ist kumuliert je Child Cursor; GETS_PER_EXEC ist ein Durchschnitt, kein Messwert einer einzelnen aktuellen Ausführung.
    Wichtig
    Logical Reads sind nicht per se schlecht; sie müssen im Kontext der fachlichen Arbeit und Zeilenmenge bewertet werden.
    8. Wie finde ich den SQL-Text zu einer SQL_ID? V$SQL anzeigen
    Primäre View V$SQL
    Zusätzliche Views V$SQL, V$SQLAREA
    Wichtige Spalten SQL_ID, CHILD_NUMBER, SQL_TEXT, SQL_FULLTEXT
    Kurze Beispielabfrage
    SELECT sql_id,
           child_number,
           sql_text
    FROM v$sql
    WHERE sql_id = '&SQL_ID'
    ORDER BY child_number;
    Ergebnis kurz lesen
    Eine SQL_ID kann mehrere Child Cursor besitzen. Unterschiede zwischen Child Cursors können für Plan- oder Bind-Probleme wichtig sein.
    Wichtig
    SQL_TEXT ist gekürzt; für lange Statements kann SQL_FULLTEXT sinnvoller sein.
    9. Welchen Ausführungsplan verwendet eine SQL_ID? V$SQL_PLAN anzeigen
    Primäre View V$SQL_PLAN
    Zusätzliche Views V$SQL_PLAN, V$SQL, DBMS_XPLAN
    Wichtige Spalten SQL_SQL_ID, CHILD_NUMBER, PLAN_HASH_VALUE, ID, CHILD_NUMBER, PLAN_HASH_VALUE, OPERATION, OPTIONS, OBJECT_NAME
    Kurze Beispielabfrage
    SELECT sql_id, child_number, plan_hash_value, id, parent_id,
           operation, options, object_owner, object_name, cardinality, cost
    FROM v$sql_plan
    WHERE sql_id='&SQL_ID' AND child_number=&CHILD_NUMBER
    ORDER BY id;
    Interpretation: Die Auswahl gilt für genau eine SQL_ID und CHILD_NUMBER im aktuellen Sichtbereich. CARDINALITY und COST sind Optimizer-Schätzungen, keine gemessenen Ist-Zeilen oder Sekunden. Der Plan kann aus dem Cache verschwinden.
    Wichtig
    Ein Plan allein erklärt Performance nicht vollständig; Laufzeitstatistik und Ausführungszahlen mit betrachten.
    10. Wie ist die SGA aufgeteilt? V$SGAINFO anzeigen
    Primäre View V$SGAINFO
    Zusätzliche Views V$SGAINFO, V$SGASTAT
    Wichtige Spalten NAME, BYTES, RESIZEABLE
    Kurze Beispielabfrage
    SELECT name,
           bytes/1024/1024 AS mib,
           resizeable
    FROM v$sgainfo
    ORDER BY bytes DESC;
    Ergebnis kurz lesen
    V$SGAINFO zeigt die großen SGA-Komponenten. V$SGASTAT liefert detailliertere Allokationen innerhalb der Pools.
    Wichtig
    Allokierter Speicher ist nicht automatisch problematisch. Nutzung und Fehlerbild müssen zusammenpassen.
    11. Wie hoch ist der aktuelle PGA-Verbrauch? V$PGASTAT anzeigen
    Primäre View V$PGASTAT
    Zusätzliche Views V$PGASTAT, V$PROCESS, V$PARAMETER
    Wichtige Spalten NAME, VALUE, UNIT
    Kurze Beispielabfrage
    SELECT name,
           value,
           unit
    FROM v$pgastat
    ORDER BY name;
    Ergebnis kurz lesen
    Besonders relevant sind total PGA allocated, maximum PGA allocated und over allocation count.
    Wichtig
    PGA ist pro Prozess privat; instanzweite Gesamtwerte allein zeigen noch nicht den konkreten Top-Verbraucher.
    12. Welche Prozesse verbrauchen viel PGA? V$PROCESS anzeigen
    Primäre View V$PROCESS
    Zusätzliche Views V$PROCESS, V$SESSION
    Wichtige Spalten SPID, PGA_USED_MEM, PGA_ALLOC_MEM, PGA_MAX_MEM
    Kurze Beispielabfrage
    SELECT spid,
           pname,
           pga_used_mem/1024/1024 AS used_mib,
           pga_alloc_mem/1024/1024 AS alloc_mib,
           pga_max_mem/1024/1024 AS max_mib
    FROM v$process
    ORDER BY pga_alloc_mem DESC;
    Ergebnis kurz lesen
    PGA_ALLOC_MEM zeigt aktuell allokierten PGA-Speicher des Prozesses. Für Benutzerkontext bei Bedarf mit V$SESSION verknüpfen.
    Wichtig
    Hintergrundprozesse und Foreground-Prozesse getrennt betrachten.
    13. Welche Redo-Gruppe ist CURRENT? V$LOG anzeigen
    Primäre View V$LOG
    Zusätzliche Views V$LOG, V$LOGFILE
    Wichtige Spalten GROUP#, THREAD#, SEQUENCE#, BYTES, ARCHIVED, STATUS
    Kurze Beispielabfrage
    SELECT group#,
           thread#,
           sequence#,
           bytes/1024/1024 AS size_mib,
           archived,
           status
    FROM v$log
    ORDER BY group#;
    Ergebnis kurz lesen
    CURRENT ist die aktuell beschriebene Gruppe. ACTIVE wird noch für Instance Recovery benötigt. INACTIVE ist nicht mehr für Instance Recovery erforderlich.
    Wichtig
    ARCHIVED und STATUS sind unterschiedliche Eigenschaften und sollten nicht verwechselt werden.
    14. Wie oft wechseln die Redo Logs? V$LOG_HISTORY anzeigen
    Primäre View V$LOG_HISTORY
    Zusätzliche Views V$LOG_HISTORY
    Wichtige Spalten THREAD#, SEQUENCE#, FIRST_TIME
    Kurze Beispielabfrage
    SELECT TO_CHAR(TRUNC(first_time,'HH24'),'YYYY-MM-DD HH24:MI') AS stunde,
           COUNT(*) AS log_beginn
    FROM v$log_history
    WHERE first_time >= SYSDATE - 1
    GROUP BY TRUNC(first_time,'HH24')
    ORDER BY TRUNC(first_time,'HH24') DESC;
    Interpretation: FIRST_TIME ist der Zeitpunkt des ersten Eintrags im Log. Die Gruppierung ist ein Indikator für die Log-Folge, keine sekundengenaue Messung des Switch-Endes. Die verfügbare Historie und Redo-Threads begrenzen den Vergleich.
    Wichtig
    Eine hohe Switchrate muss gegen Redo-Erzeugungsrate und Loggröße bewertet werden.
    15. Welche Archived Logs wurden zuletzt erzeugt? V$ARCHIVED_LOG anzeigen
    Primäre View V$ARCHIVED_LOG
    Zusätzliche Views V$ARCHIVED_LOG
    Wichtige Spalten THREAD#, SEQUENCE#, FIRST_TIME, COMPLETION_TIME, ARCHIVED, DELETED, NAME
    Kurze Beispielabfrage
    SELECT thread#,
           sequence#,
           first_time,
           completion_time,
           archived,
           deleted,
           name
    FROM v$archived_log
    ORDER BY completion_time DESC
    FETCH FIRST 30 ROWS ONLY;
    Ergebnis kurz lesen
    SEQUENCE# und COMPLETION_TIME helfen, den zeitlichen Verlauf der Archivierung nachzuvollziehen.
    Wichtig
    Mehrere Datensätze pro Sequenz können je nach Destination oder Recovery-Szenario auftreten.
    16. Ist ein Archive-Ziel fehlerhaft? V$ARCHIVE_DEST anzeigen
    Primäre View V$ARCHIVE_DEST
    Zusätzliche Views V$ARCHIVE_DEST, V$ARCHIVE_DEST_STATUS
    Wichtige Spalten DEST_ID, STATUS, DESTINATION, TARGET, ERROR
    Kurze Beispielabfrage
    SELECT dest_id,
           status,
           destination,
           target,
           error
    FROM v$archive_dest
    WHERE status <> 'INACTIVE'
    ORDER BY dest_id;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    DEST_IDSTATUSDESTINATIONTARGETERROR
    1VALID/u04/archPRIMARYNULL

    Was sehe ich hier? Das lokale Ziel ist hier gültig und meldet keinen Fehlertext. Dies ist eine Momentaufnahme; Speicherplatz und tatsächlicher Archivfortschritt müssen separat geprüft werden.

    Ergebnis kurz lesen
    ERROR enthält bei einem fehlerhaften Ziel oft bereits den entscheidenden technischen Hinweis.
    Wichtig
    Bei ORA-00257 zuerst Ursache und Zielstatus prüfen; nicht reflexartig Dateien löschen.
    17. Welche Datafiles gehören zu einem Tablespace? DBA_DATA_FILES anzeigen
    Primäre View DBA_DATA_FILES
    Zusätzliche Views DBA_DATA_FILES, DBA_TABLESPACES
    Wichtige Spalten FILE_ID, FILE_NAME, TABLESPACE_NAME, BYTES, AUTOEXTENSIBLE, MAXBYTES
    Kurze Beispielabfrage
    SELECT file_id,
           file_name,
           tablespace_name,
           bytes/1024/1024 AS size_mib,
           autoextensible,
           maxbytes/1024/1024 AS max_mib
    FROM dba_data_files
    WHERE tablespace_name=UPPER('&TABLESPACE_NAME')
    ORDER BY file_id;
    Ergebnis kurz lesen
    BYTES ist die aktuell allokierte Dateigröße, MAXBYTES die Obergrenze bei Autoextend.
    Wichtig
    AUTOEXTENSIBLE=YES bedeutet nicht unbegrenzten Platz; Filesystem/ASM und MAXBYTES bleiben Grenzen.
    18. Wie viel freier Platz ist im Tablespace? DBA_FREE_SPACE anzeigen
    Primäre View DBA_FREE_SPACE
    Zusätzliche Views DBA_FREE_SPACE, DBA_DATA_FILES
    Wichtige Spalten TABLESPACE_NAME, BYTES
    Kurze Beispielabfrage
    SELECT t.tablespace_name, ROUND(NVL(SUM(f.bytes),0)/1024/1024,2) AS free_mib
    FROM dba_tablespaces t
    LEFT JOIN dba_free_space f ON f.tablespace_name=t.tablespace_name
    WHERE t.status='ONLINE' AND t.contents='PERMANENT'
    GROUP BY t.tablespace_name
    ORDER BY free_mib, t.tablespace_name;

    Fiktive Beispielausgabe:

    Alle ausgewählten Spalten; eine erfundene Ergebniszeile als Ausschnitt. NULL kennzeichnet fehlende Werte. Datumsformat zur Lesbarkeit vereinheitlicht.

    TABLESPACE_NAMEFREE_MIB
    APP_DATA640

    Auswertung und nächster Schritt: APP_DATA hat hier 640 MiB freie Extents innerhalb zugewiesener Dateien. Das ist weder die Storage-Reserve noch die maximale Autoextend-Kapazität. Dateigrößen, Wachstumslimits und freien Dateisystemplatz ergänzen.

    Interpretation: Die Ausgangsliste umfasst Online-Permanent-Tablespaces. Der LEFT JOIN erhält auch Tablespaces ohne freie Extents; NVL zeigt dann 0. Prüfe zusätzlich, dass die zugehörigen Datafiles online sind, denn Offline-Dateien können die Sichtbarkeit freier Extents einschränken. Autoextend und TEMP/UNDO sind nicht enthalten.
    Wichtig
    Freier Platz im Tablespace, Autoextend-Reserve und freier Platz im Dateisystem sind drei unterschiedliche Dinge.
    19. Welche Segmente sind am größten? DBA_SEGMENTS anzeigen
    Primäre View DBA_SEGMENTS
    Zusätzliche Views DBA_SEGMENTS
    Wichtige Spalten OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES
    Kurze Beispielabfrage
    SELECT *
    FROM (
        SELECT owner,
               segment_name,
               segment_type,
               tablespace_name,
               bytes/1024/1024 AS size_mib
        FROM dba_segments
        ORDER BY bytes DESC
    )
    WHERE ROWNUM <= 30;
    Ergebnis kurz lesen
    BYTES ist allokierter Segmentplatz und nicht automatisch die exakt fachlich genutzte Datenmenge.
    Wichtig
    Bei LOBs und Partitionen können mehrere Segmente zu einem fachlichen Objekt gehören.
    20. Welche Objekte sind INVALID? DBA_OBJECTS anzeigen
    Primäre View DBA_OBJECTS
    Zusätzliche Views DBA_OBJECTS
    Wichtige Spalten OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS
    Kurze Beispielabfrage
    SELECT owner,
           object_name,
           object_type,
           status
    FROM dba_objects
    WHERE status = 'INVALID'
    ORDER BY owner, object_type, object_name;
    Ergebnis kurz lesen
    INVALID zeigt, dass ein Objekt aktuell nicht gültig kompiliert ist, etwa nach abhängigen DDL-Änderungen.
    Wichtig
    Nicht jedes INVALID Object ist automatisch die Ursache einer aktuellen Störung.
    21. Welche Scheduler Jobs sind fehlgeschlagen? DBA_SCHEDULER_JOB_RUN_DETAILS anzeigen
    Primäre View DBA_SCHEDULER_JOB_RUN_DETAILS
    Zusätzliche Views DBA_SCHEDULER_JOBS, DBA_SCHEDULER_JOB_RUN_DETAILS
    Wichtige Spalten JOB_NAME, STATUS, ERROR#, ADDITIONAL_INFO, ACTUAL_START_DATE, RUN_DURATION
    Kurze Beispielabfrage
    SELECT owner,
           job_name,
           status,
           actual_start_date,
           run_duration,
           error#,
           additional_info
    FROM dba_scheduler_job_run_details
    WHERE status = 'FAILED'
    ORDER BY log_date DESC;
    Interpretation: FAILED ist gezielt ein fehlgeschlagener Lauf. Andere Status wie STOPPED benötigen eine getrennte Bewertung. Owner, Jobname und konkreten Lauf zusammen betrachten.
    Wichtig
    SUCCEEDED beweist nur den technischen Scheduler-Abschluss, nicht automatisch ein fachlich korrektes Ergebnis.
    22. Wann lief das letzte RMAN Backup? V$RMAN_BACKUP_JOB_DETAILS anzeigen
    Primäre View V$RMAN_BACKUP_JOB_DETAILS
    Zusätzliche Views V$RMAN_BACKUP_JOB_DETAILS
    Wichtige Spalten INPUT_TYPE, STATUS, START_TIME, END_TIME, INPUT_BYTES_DISPLAY, OUTPUT_BYTES_DISPLAY
    Kurze Beispielabfrage
    SELECT session_key,
           input_type,
           status,
           start_time,
           end_time,
           input_bytes_display,
           output_bytes_display
    FROM v$rman_backup_job_details
    ORDER BY start_time DESC;

    Fiktive Beispielausgabe:

    Alle ausgewählten Spalten; eine erfundene Ergebniszeile als Ausschnitt. NULL kennzeichnet fehlende Werte. Datumsformat zur Lesbarkeit vereinheitlicht.

    SESSION_KEYINPUT_TYPESTATUSSTART_TIMEEND_TIMEINPUT_BYTES_DISPLAYOUTPUT_BYTES_DISPLAY
    901DB INCRCOMPLETED2026-10-10 01:00:002026-10-10 01:18:0020.00G8.00G

    Auswertung und nächster Schritt: Der im Ausschnitt gezeigte RMAN-Job ist abgeschlossen. INPUT_TYPE allein nennt nicht das inkrementelle Level. Verfügbarkeit der Sicherungsmedien, benötigtes Redo und ein erfolgreicher Restore-/Recovery-Test bleiben gesonderte Nachweise.

    Ergebnis kurz lesen
    INPUT_TYPE unterscheidet unter anderem DB FULL, DB INCR und ARCHIVELOG. STATUS zeigt den technischen Jobstatus.
    Wichtig
    Der letzte erfolgreiche Job allein beweist keine vollständige Recovery-Kette.
    23. Welche Backup Pieces kennt Oracle? V$BACKUP_PIECE anzeigen
    Primäre View V$BACKUP_PIECE
    Zusätzliche Views V$BACKUP_PIECE, V$BACKUP_SET
    Wichtige Spalten HANDLE, STATUS, DELETED, COMPLETION_TIME
    Kurze Beispielabfrage
    SELECT recid,
           handle,
           status,
           deleted,
           completion_time
    FROM v$backup_piece
    ORDER BY completion_time DESC;
    Interpretation: STATUS = A bedeutet AVAILABLE in den Repository-Metadaten. Das beweist nicht, dass das Medium tatsächlich lesbar oder ein vollständiges Recovery möglich ist.
    Wichtig
    AVAILABLE in den Metadaten sollte bei kritischen Recovery-Fragen mit der tatsächlichen Medienverfügbarkeit abgeglichen werden.
    24. Welche Services sind in der Datenbank bekannt? V$SERVICES anzeigen
    Primäre View V$SERVICES
    Zusätzliche Views V$SERVICES
    Wichtige Spalten NAME, NETWORK_NAME, CREATION_DATE
    Kurze Beispielabfrage
    SELECT name,
           network_name,
           creation_date
    FROM v$services
    ORDER BY name;
    Ergebnis kurz lesen
    NAME beziehungsweise NETWORK_NAME helfen, den datenbankseitigen Service mit dem Connect-String abzugleichen.
    Wichtig
    Listener-Registrierung ist ein zusätzlicher Oracle-Net-Aspekt und wird nicht allein durch V$SERVICES bewiesen.
    25. Welchen Status hat ein Benutzerkonto? DBA_USERS anzeigen
    Primäre View DBA_USERS
    Zusätzliche Views DBA_USERS
    Wichtige Spalten USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE, PROFILE
    Kurze Beispielabfrage
    SELECT username,
           account_status,
           lock_date,
           expiry_date,
           profile
    FROM dba_users
    WHERE username=UPPER('&USERNAME');
    Ergebnis kurz lesen
    ACCOUNT_STATUS unterscheidet zum Beispiel OPEN, LOCKED, EXPIRED und Kombinationen daraus.
    Wichtig
    Bei Loginproblemen zuerst sicherstellen, dass Host, Service und Datenbankziel korrekt sind.
    26. Welche Initialisierungsparameter sind gesetzt? V$PARAMETER anzeigen
    Primäre View V$PARAMETER
    Zusätzliche Views V$PARAMETER, V$SPPARAMETER
    Wichtige Spalten NAME, VALUE, ISDEFAULT, ISMODIFIED, ISSYS_MODIFIABLE
    Kurze Beispielabfrage
    SELECT name,
           value,
           isdefault,
           ismodified,
           issys_modifiable
    FROM v$parameter
    ORDER BY name;
    Interpretation: V$PARAMETER zeigt die in der aktuellen Session wirksamen Werte. V$SYSTEM_PARAMETER zeigt instanzweite Werte; V$SPPARAMETER gespeicherte SPFILE-Einträge. Container und Änderbarkeit zusätzlich beachten.
    Wichtig
    V$SPPARAMETER beschreibt SPFILE-Einträge und ist nicht identisch mit dem aktuell wirksamen Laufzeitwert.
    27. Wann wurde die Instanz gestartet? V$INSTANCE anzeigen
    Primäre View V$INSTANCE
    Zusätzliche Views V$INSTANCE
    Wichtige Spalten INSTANCE_NAME, HOST_NAME, STATUS, STARTUP_TIME
    Kurze Beispielabfrage
    SELECT instance_name,
           host_name,
           status,
           startup_time
    FROM v$instance;
    Ergebnis kurz lesen
    STARTUP_TIME ist der Beginn der aktuellen Instanzlaufzeit und wichtig für alle seit Instanzstart kumulierten Statistiken.
    Wichtig
    Ein unerwarteter aktueller STARTUP_TIME-Wert kann auf einen Neustart hinweisen und sollte mit dem Alertlog korreliert werden.
    28. Welchen OPEN_MODE und welche DATABASE_ROLE hat die Datenbank? V$DATABASE anzeigen
    Primäre View V$DATABASE
    Zusätzliche Views V$DATABASE
    Wichtige Spalten NAME, DBID, OPEN_MODE, LOG_MODE, DATABASE_ROLE
    Kurze Beispielabfrage
    SELECT name,
           dbid,
           open_mode,
           log_mode,
           database_role
    FROM v$database;
    Ergebnis kurz lesen
    OPEN_MODE beschreibt den Öffnungszustand; DATABASE_ROLE ist besonders bei Data-Guard-Umgebungen relevant.
    Wichtig
    OPEN_MODE und Instanz-STATUS sind unterschiedliche Ebenen.
    29. Welche Ressourcengrenzen sind fast erreicht? V$RESOURCE_LIMIT anzeigen
    Primäre View V$RESOURCE_LIMIT
    Zusätzliche Views V$RESOURCE_LIMIT
    Wichtige Spalten RESOURCE_NAME, CURRENT_UTILIZATION, MAX_UTILIZATION, INITIAL_ALLOCATION, LIMIT_VALUE
    Kurze Beispielabfrage
    SELECT resource_name,
           current_utilization,
           max_utilization,
           initial_allocation,
           limit_value
    FROM v$resource_limit
    ORDER BY resource_name;
    Ergebnis kurz lesen
    MAX_UTILIZATION zeigt den Peak seit Instanzstart, CURRENT_UTILIZATION den aktuellen Wert.
    Wichtig
    LIMIT_VALUE kann UNLIMITED enthalten und ist deshalb nicht immer direkt numerisch vergleichbar.
    30. Welche Online Redo Log Member gehören zu einer Gruppe? V$LOGFILE anzeigen
    Primäre View V$LOGFILE
    Zusätzliche Views V$LOGFILE, V$LOG
    Wichtige Spalten GROUP#, TYPE, MEMBER, STATUS
    Kurze Beispielabfrage
    SELECT group#,
           type,
           member,
           status
    FROM v$logfile
    WHERE type='ONLINE'
    ORDER BY group#, member;
    Interpretation: TYPE = ONLINE grenzt Online Redo von Standby Redo ab. Ein leerer STATUS bedeutet bei V$LOGFILE, dass das Member verwendet wird; nicht automatisch einen Fehler.
    Wichtig
    Ein Member ist keine eigene Redo-Gruppe.
    31. Welche Session gehört zu welchem OS-Prozess? V$SESSION + V$PROCESS anzeigen
    Primäre View V$SESSION + V$PROCESS
    Zusätzliche Views V$SESSION, V$PROCESS
    Wichtige Spalten SID, SERIAL#, USERNAME, SPID, PROGRAM
    Kurze Beispielabfrage
    SELECT s.sid,
           s.serial#,
           s.username,
           s.program,
           p.spid
    FROM v$session s
    JOIN v$process p
      ON s.paddr=p.addr
    WHERE s.type='USER'
    ORDER BY s.sid;
    Ergebnis kurz lesen
    SPID ist die Betriebssystem-Prozess-ID des zugeordneten Oracle-Prozesses.
    Wichtig
    Bei Shared Server oder speziellen Architekturen ist die Zuordnung anders zu interpretieren als beim Dedicated Server.
    32. Welche Transaktionen sind aktuell offen? V$TRANSACTION anzeigen
    Primäre View V$TRANSACTION
    Zusätzliche Views V$TRANSACTION, V$SESSION
    Wichtige Spalten START_DATE, USED_UBLK, USED_UREC, TADDR
    Kurze Beispielabfrage
    SELECT s.sid,
           s.serial#,
           s.username,
           t.start_date,
           t.used_ublk,
           t.used_urec
    FROM v$session s
    JOIN v$transaction t
      ON s.taddr=t.addr
    ORDER BY t.start_date;
    Interpretation: START_DATE ist vom Typ DATE und eignet sich zur chronologischen Sortierung. START_TIME ist eine formatierte Zeichenkette. Offene Transaktionen können auch in momentan inaktiven Sessions liegen.
    Wichtig
    Eine offene Transaktion ist nicht automatisch fehlerhaft; fachlichen Prozess und Dauer mitbewerten.
    33. Wie finde ich den aktuellen Zeichensatz? NLS_DATABASE_PARAMETERS anzeigen
    Primäre View NLS_DATABASE_PARAMETERS
    Zusätzliche Views NLS_DATABASE_PARAMETERS, NLS_INSTANCE_PARAMETERS, NLS_SESSION_PARAMETERS
    Wichtige Spalten PARAMETER, VALUE
    Kurze Beispielabfrage
    SELECT parameter,
           value
    FROM nls_database_parameters
    WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET')
    ORDER BY parameter;
    Ergebnis kurz lesen
    NLS_CHARACTERSET beschreibt den Datenbankzeichensatz, NLS_NCHAR_CHARACTERSET den nationalen Zeichensatz.
    Wichtig
    Session-NLS-Einstellungen und Datenbankzeichensatz sind unterschiedliche Ebenen.
    Merksatz: Erst die DBA-Frage formulieren, dann die View auswählen. Nicht umgekehrt. Eine gute Diagnoseabfrage ist immer an eine konkrete technische Fragestellung gebunden.

    Offizielle Oracle-Referenzen (19c)

    V-SESSION · V-SQL_PLAN · V-PARAMETER · V-TRANSACTION

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Die Auswahl einer View beginnt mit einer präzisen Frage. Gesuchte Information, betroffene Ebene und Zeitbezug bestimmen die passende Datenquelle.
    2. Dictionary-Views beschreiben überwiegend Metadaten; Dynamic Performance Views liefern Betriebsinformationen. Beide Sichten können für dieselbe Diagnose notwendig sein.
    3. USER_, ALL_, DBA_ und CDB_ unterscheiden sich im Sichtbereich. Benutzerrechte und Containerkontext müssen zur gewünschten Aussage passen.
    4. Vor einem Join muss feststehen, wofür eine Zeile jeder View steht. Objektname, Owner, Sessionidentität und gegebenenfalls Container müssen passend zugeordnet werden.
    5. Eine View liefert nur den Ausschnitt, für den sie vorgesehen ist. Fehlende Zeilen oder einzelne Kennzahlen werden mit ihrer Sichtbarkeitsgrenze und weiteren Befunden bewertet.

    Lernzielkontrolle

    Erkläre zuerst deinen Befund und den nächsten Prüfschritt. Öffne danach die begründete Lösung.
    Frage 1: Welche Quelle passt zur Frage nach dem Eigentümer einer Tabelle?

    Lösung: Eine passende Objekt- oder Tabellensicht des Data Dictionary, etwa ALL_OBJECTS für sichtbare Objekte. Owner und Objektname gemeinsam prüfen.

    Frage 2: Welche Quelle passt zur aktuell wartenden Verbindung?

    Lösung: V$SESSION mit Sessionidentität, STATE und EVENT; für eine Blockierung zusätzlich gültige Blockerangaben.

    Frage 3: Warum ist eine leere Liste noch keine sichere Entwarnung?

    Lösung: Filter, Container, Rechte und Messzeitpunkt können die Sicht einschränken. Erst nach deren Prüfung ist die Abwesenheit eines Treffers einzuordnen.

    Frage 4: Wann wechselst du vom View-Finder ins Fachkapitel?

    Lösung: Wenn du die Bedeutung oder Folgerung eines Befunds nicht sicher erklären kannst. Der Finder wählt die Quelle; das Fachkapitel erläutert Mechanismus und Diagnose.

    45. DBA Praxislabor – praxisnahe Szenarien selbst analysieren

    Erst selbst denken, danach den vollständigen DBA-Lösungsweg aufklappen.

    Lernkompass
    Einfach gesagt Im Praxislabor wird Wissen angewendet. Du bekommst ein Symptom und arbeitest dich wie bei einer echten Störung zur Erklärung vor.
    Warum ist das wichtig? Das trainiert Diagnose stärker als das reine Auswendiglernen einzelner Views.
    Nach diesem Kapitel Du kannst Beobachtung, Hypothese, Prüfung und Schlussfolgerung voneinander trennen.

    Einführung: Das Praxislabor verbindet bekannte Fachthemen zu vollständigen Diagnoseaufgaben. Im Betrieb kommt eine Störung selten mit einer fertigen Zuordnung zu Locks, Speicher oder Backup. Du musst aus der Beobachtung zunächst eine prüfbare Frage entwickeln und anschließend entscheiden, welche Information fehlt. Genau diesen Übergang üben die vorhandenen Fälle.

    Bearbeite die Situation zunächst selbst und vergleiche danach deinen Weg mit der Lösung. Bewertet wird der Zusammenhang zwischen Beobachtung, Untersuchung und Schlussfolgerung, nicht nur der Name einer passenden View. Die Szenarien und Messwerte sind fiktiv. Das Wiki führt keine Abfragen aus; ein realer Eingriff benötigt zusätzlich die für die Umgebung geltenden Voraussetzungen.

    Oracle 19c: fachliche Grundlage

    Einheiten im Lösungsweg

    CURRENT_WAIT_S zeigt Sekunden eines aktuellen Waits; außerhalb von WAITING steht NULL. Bei System-Event-Zählern misst TIME_WAITED_MICRO Mikrosekunden und AVERAGE_WAIT Hundertstelsekunden. Commit-Wartezeit und Redo-Schreibwartezeit sind unterschiedliche Messumfänge und werden nicht addiert. Vergleiche jeweils die Deltas desselben Events.

    So sieht eine begründete Lösung aus

    Verwende vier kurze Sätze: „Ich beobachte …“, „Das könnte durch … entstehen“, „Ich prüfe dafür …“ und „Der Befund zeigt …; offen bleibt …“. Eine Lösung darf eine offene Frage enthalten. Sie darf eine Vermutung nicht als gemessene Ursache ausgeben.

    Beginne mit dem Blockierungsfall, danach dem Scheduler-Fall und erst anschließend den Recovery-Fällen. Vergleiche deine Begründung mit der Musterlösung. Gleiche View-Namen allein sind noch keine gleichwertige Diagnose.

    Das Praxislabor verbindet die Einzelthemen: Im realen Betrieb treten Probleme selten sauber getrennt als „Wait Event“, „Lock“ oder „Filesystem“ auf. Meist beginnt die Analyse mit einer unscharfen Meldung und mehreren gleichzeitig sichtbaren Auffälligkeiten. Genau diese Situation wird hier nachgebildet.

    Arbeitsweise: Formuliere zuerst eine Hypothese, prüfe sie mit den angegebenen read-only Informationen und entscheide erst danach, welche weitere Messung nötig ist. Eine plausible Vermutung ist noch keine bewiesene Ursache.

    So bearbeitest du ein Praxis-Szenario

    1. Symptom lesen. Noch keine Ursache raten. 2. Fakten sammeln. Nur die vorgeschlagenen read-only Abfragen verwenden. 3. Ergebnis in eigenen Worten erklären. 4. Erst danach die Musterlösung öffnen. Ziel ist nicht, SQL auswendig zu lernen, sondern eine nachvollziehbare Diagnosekette aufzubauen.

    Abgrenzung: Praxisfälle wiederholen keine komplette Theorie. Sie verknüpfen bereits gelernte Fachkapitel zu einem Diagnoseablauf.

    Jeder Fall liefert zunächst nur Ausgangslage und Aufgaben. Die Musterlösung beantwortet anschließend jede Frage einzeln und verbindet SQL, Interpretation und nächsten Diagnoseschritt.

    Praxisfall 1 – Langsame Commits zuerst eingrenzen

    1. Ausgangslage

    Zeitpunkt
    07:15 Uhr
    Aktive Sessions
    14
    Host CPU
    62 %
    Auffällig
    log file sync
    Redo
    mehrere Log Switches

    2. Deine Aufgaben

    Was prüfst du zuerst?
    Welche View zeigt die betroffenen Sessions?
    Welche Beziehung zwischen log file sync und LGWR ist wichtig?
    Welche Hypothese prüfst du als nächstes?
    Lösungsweg anzeigen

    1. Ausgangszustand sichern

    Zuerst klären, ob die gesamte Datenbank oder nur eine Anwendung betroffen ist. Danach Zeitraum und Instanzstart dokumentieren.

    Instanzzustand
    SELECT instance_name, host_name, status, database_status, startup_time
    FROM v$instance;
    Interpretation:
    STARTUP_TIME ist wichtig, weil viele V$-Werte seit Instanzstart kumuliert sind.

    2. Betroffene Sessions finden

    V$SESSION zeigt aktuelle Sessions. Nicht nur SID betrachten, sondern auch SQL_ID, EVENT, WAIT_CLASS, MODULE und MACHINE.

    Aktive Sessions
    SELECT sid, serial#, username, machine, module, sql_id,
           event, wait_class, state, CASE WHEN state='WAITING' THEN wait_time_micro/1000000 END AS current_wait_s
    FROM v$session
    WHERE type='USER'
      AND status='ACTIVE'
    ORDER BY current_wait_s DESC NULLS LAST;
    Interpretation:
    ACTIVE bedeutet nicht automatisch CPU. Die Session kann innerhalb eines aktiven Calls warten.

    3. log file sync mit LGWR korrelieren

    log file sync ist der Session-Wait beim COMMIT. Parallel sollte log file parallel write betrachtet werden.

    Redo-Waits
    SELECT event, total_waits, time_waited_micro, average_wait
    FROM v$system_event
    WHERE event IN ('log file sync','log file parallel write');

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    EVENTTOTAL_WAITSTIME_WAITED_MICROAVERAGE_WAIT
    log file sync10000500000000.5
    log file parallel write8000160000000.2

    Was sehe ich hier? TIME_WAITED_MICRO wird in Mikrosekunden, AVERAGE_WAIT in Hundertstelsekunden ausgegeben. 50.000.000 µs / 10.000 Waits ergeben 5 ms beziehungsweise 0,5 Hundertstelsekunden. Die Zähler sind kumuliert.

    Interpretation:
    Sind beide im gleichen relevanten Zeitfenster auffällig, ist erhöhte LGWR-/Redo-I/O-Latenz plausibler. Ist vor allem log file sync auffällig, kann auch eine hohe Commit-Frequenz beteiligt sein. V$SYSTEM_EVENT enthält instanzweite kumulierte Werte; für eine aktuelle Störung sind daher Deltas beziehungsweise ein passendes Messintervall entscheidend.

    4. Redo-Hypothese prüfen

    Jetzt Loggröße, Switchrate und Commit-/Redo-Zähler gemeinsam prüfen.

    Redo-Gruppen
    SELECT group#, thread#, sequence#,
           bytes/1024/1024 AS size_mb,
           archived, status
    FROM v$log
    ORDER BY group#;
    Switches letzte 24 Stunden
    SELECT TO_CHAR(TRUNC(first_time,'HH24'),'YYYY-MM-DD HH24:MI') AS stunde,
           COUNT(*) AS sequenzanfaenge
    FROM v$log_history
    WHERE first_time >= SYSDATE - 1
    GROUP BY TRUNC(first_time,'HH24')
    ORDER BY TRUNC(first_time,'HH24') DESC;

    Gezählt werden historisch erfasste Sequenzanfänge nach FIRST_TIME, keine lückenlos gemessenen Switch-Abschlusszeitpunkte. Die verfügbare Historie und eine noch laufende Sequenz begrenzen die Aussage; Stunden ohne Treffer erscheinen nicht als Nullzeilen. Einordnung: Kapitel 18.

    Interpretation:
    Eine hohe Switchrate allein beweist noch nicht, dass größere Redo Logs die Lösung sind. Redo-Rate, Commitrate und Storage-Latenz gehören dazu.

    Konkreter Befund und nachvollziehbare Lösung

    Gemessener Ausschnitt aus V$SESSION (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    SIDSTATEEVENT
    101WAITINGlog file sync
    102WAITINGlog file sync

    Auswertung und nächster Schritt: Beide Sessions warten zum Aufnahmezeitpunkt auf Commit-Bestätigung. Das ist ein Ansatzpunkt, noch kein Nachweis eines langsamen Datenträgers. Als Nächstes die Zähler für log file sync und log file parallel write zweimal im selben Messfenster erfassen; die vollständige Deltarechnung zeigt Fall 13.

    Praxisfall 2 – Blockierte Sessions

    1. Ausgangslage

    Wait Event
    enq: TX - row lock contention
    Waiter
    6 Sessions
    Blocker
    1 Session
    Dauer
    420 Sekunden

    2. Deine Aufgaben

    Wie identifizierst du den Blocker?
    Welche Informationen gehören in die Dokumentation?
    Welche Rolle spielt eine offene Transaktion?
    Warum nicht sofort beenden?
    Lösungsweg anzeigen

    1. Waiter und Blocker

    blocking_session liefert die SID des Blockers.

    Blockierte Sessions
    SELECT sid, serial#, username, blocking_session, sql_id,
           event, CASE WHEN state='WAITING' THEN wait_time_micro/1000000 END AS current_wait_s, module, machine
    FROM v$session
    WHERE blocking_session_status='VALID'
    ORDER BY current_wait_s DESC NULLS LAST;
    Interpretation:
    SID und SERIAL# zusammen dokumentieren.

    2. Blocker analysieren

    Nun SQL, Modul, Machine und Dauer des Blockers ansehen.

    Blocker
    SELECT sid, serial#, username, status, sql_id, prev_sql_id,
           module, machine, logon_time, last_call_et
    FROM v$session
    WHERE sid=&BLOCKER_SID;
    Interpretation:
    PREV_SQL_ID kann wichtig sein, wenn die aktuell sichtbare SQL nicht die blockierende DML war.

    3. Transaktion prüfen

    Über TADDR lässt sich die offene Transaktion zuordnen.

    Offene Transaktion
    SELECT s.sid, s.serial#, t.start_date, t.used_ublk, t.used_urec
    FROM v$session s
    JOIN v$transaction t ON s.taddr=t.addr
    WHERE s.sid=&BLOCKER_SID;
    Interpretation:
    Eine sehr alte Transaktion erklärt häufig lange Lock-Haltezeiten.

    4. Objekt ermitteln

    Das betroffene Objekt liefert zusätzlichen fachlichen Kontext.

    Gesperrte Objekte
    SELECT lo.session_id, o.owner, o.object_name, o.object_type, lo.locked_mode
    FROM v$locked_object lo
    JOIN dba_objects o ON o.object_id=lo.object_id
    WHERE lo.session_id=&BLOCKER_SID
      AND lo.con_id=TO_NUMBER(SYS_CONTEXT('USERENV','CON_ID'))
    ORDER BY lo.session_id;
    Interpretation:
    Nicht automatisch killen. Erst prüfen, ob Batch, Schnittstelle oder fachlich legitime Transaktion betroffen ist.

    Konkreter Befund und nachvollziehbare Lösung

    Ausschnitt aus der Blockerabfrage (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    SIDBLOCKING_SESSION_STATUSBLOCKING_SESSION
    110VALID80
    111VALID80

    Auswertung und nächster Schritt: Beide Wartenden nennen SID 80. Mit SID und SERIAL# von 80 den Verantwortlichen und die offene Transaktion zuordnen. Ein INACTIVE-Status des Blockers schließt eine offene Transaktion nicht aus. Die Objektabfrage gilt hier im betroffenen Container; im Root für eine containerübergreifende Analyse CDB_OBJECTS mit OBJECT_ID und CON_ID verbinden.

    Praxisfall 3 – Redo Switch alle 30 Sekunden

    1. Ausgangslage

    Switchrate
    ca. alle 30 Sekunden
    Alertlog
    checkpoint not complete
    Anwendung
    hohe DML-Last

    2. Deine Aufgaben

    Welche Kennzahlen gehören zusammen?
    Welche Prozesse sind beteiligt?
    Warum kann das Performance kosten?
    Lösungsweg anzeigen

    1. Redo-Log-Größe

    Kleine Logs können bei hoher Redo-Rate extrem häufig switchen.

    Redo Logs
    SELECT group#, thread#, sequence#, bytes/1024/1024 AS size_mb,
           archived, status
    FROM v$log
    ORDER BY group#;
    Interpretation:
    Loggröße allein reicht nicht; sie muss gegen Redo-Rate und Switchrate bewertet werden.

    2. Switchrate

    Historie pro Stunde auswerten.

    Switches
    SELECT TO_CHAR(TRUNC(first_time,'HH24'),'YYYY-MM-DD HH24:MI') AS stunde,
           COUNT(*) AS sequenzanfaenge
    FROM v$log_history
    WHERE first_time>=SYSDATE-1
    GROUP BY TRUNC(first_time,'HH24')
    ORDER BY TRUNC(first_time,'HH24') DESC;

    Gezählt werden historisch erfasste Sequenzanfänge nach FIRST_TIME, keine lückenlos gemessenen Switch-Abschlusszeitpunkte. Die verfügbare Historie und eine noch laufende Sequenz begrenzen die Aussage; Stunden ohne Treffer erscheinen nicht als Nullzeilen. Einordnung: Kapitel 18.

    Interpretation:
    Peaks zu bestimmten Uhrzeiten können Batch- oder Backup-Zeiten sichtbar machen.

    3. Checkpoint-Fortschritt

    checkpoint not complete bedeutet: Oracle möchte zur nächsten Redo-Gruppe wechseln, benötigt deren bisherigen Inhalt aber noch für die Instanzwiederherstellung. Die erforderlichen Datenblöcke wurden noch nicht ausreichend in die Datafiles geschrieben; deshalb muss die Wiederverwendung warten.

    Instance Recovery
    SELECT target_mttr, estimated_mttr, optimal_logfile_size
    FROM v$instance_recovery;

    Fiktive Beispielausgabe:

    TARGET_MTTRESTIMATED_MTTROPTIMAL_LOGFILE_SIZE
    6018512

    Was sehe ich hier? TARGET_MTTR=60 und ESTIMATED_MTTR=18 sind Sekunden. OPTIMAL_LOGFILE_SIZE ist eine von Oracle ermittelte Größe in MB für das Recovery-Ziel; sie ist kein universeller Auftrag zur Redo-Verkleinerung.

    Interpretation:
    LGWR, CKPT und DBWn sind hier gemeinsam relevant; im ARCHIVELOG-Modus zusätzlich ARCn. OPTIMAL_LOGFILE_SIZE ist eine Empfehlung im Kontext von FAST_START_MTTR_TARGET und kein allgemeingültiger Sollwert für jede Datenbank.

    4. Interpretation

    Sehr häufige Switches erhöhen Checkpoint- und Archivierungsarbeit.

    Interpretation:
    Erst Redo-Rate, Loggröße, Switchrate und Storage-I/O gemeinsam bewerten, dann Maßnahmen planen.

    Konkreter Befund und nachvollziehbare Lösung

    Auswertung der Stunden-Gruppierung (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    STUNDESEQUENZANFAENGE
    2026-10-07 10:00120

    Auswertung und nächster Schritt: 120 Log-Anfänge innerhalb einer vollständig erfassten Stunde entsprechen im Mittel 30 Sekunden Abstand. Sie belegen keine gleichmäßigen Einzelabstände. FIRST_TIME bezeichnet den ersten Log-Eintrag; Redo-Thread, Last und verfügbare Historie mitbewerten. Erst danach Größenänderungen im Fachkapitel planen.

    Praxisfall 4 – RMAN Level 1 erfolgreich, Level 0 fehlt

    1. Ausgangslage

    Level 1
    COMPLETED
    Level 0
    physisch nicht mehr vorhanden
    Archived Logs
    vorhanden

    2. Deine Aufgaben

    Ist die Backupkette automatisch in Ordnung?
    Welche Prüfung ist sinnvoll?
    Was bedeutet EXPIRED?
    Warum reicht COMPLETED nicht?
    Lösungsweg anzeigen

    1. Jobhistorie ansehen

    COMPLETED gilt nur für den einzelnen Lauf.

    RMAN Jobs
    SELECT session_key, input_type, status, start_time, end_time,
           input_bytes_display, output_bytes_display
    FROM v$rman_backup_job_details
    ORDER BY start_time DESC;
    Interpretation:
    Ein erfolgreicher inkrementeller Job beweist nicht, dass die für das konkrete Restore-/Recovery-Ziel ausgewählte Sicherungskette physisch verfügbar und lesbar ist.

    2. Backup Pieces prüfen

    Status und Handle der Pieces ansehen.

    Backup Pieces
    SELECT recid, stamp, handle, status, deleted, completion_time
    FROM v$backup_piece
    ORDER BY completion_time DESC;
    Interpretation:
    AVAILABLE in Metadaten sollte mit dem Medium abgeglichen werden.

    3. Tatsächlich gespeicherten Backup-Level lesen

    V$BACKUP_SET zeigt den im Repository verzeichneten Backup-Typ und Level.

    RMAN
    SELECT set_stamp, set_count, backup_type, incremental_level, completion_time
    FROM v$backup_set
    ORDER BY completion_time DESC;
    Interpretation: BACKUP_TYPE und INCREMENTAL_LEVEL mit SET_STAMP/SET_COUNT zuordnen. EXPIRED bedeutet, dass CROSSCHECK eine Datei auf dem geprüften Device nicht bestätigen konnte; CROSSCHECK verändert diesen Repository-Status und ist daher eine separate Wartungsmaßnahme.

    4. Recovery-Kette bewerten

    Aus dem Jobnamen oder einem geplanten Level-1-Aufruf folgt nicht zuverlässig der tatsächlich entstandene Backup-Level. V$BACKUP_SET.INCREMENTAL_LEVEL, verfügbare Basis, Repository-Historie und Medien gemeinsam prüfen; ein erfolgreicher Job allein beweist keine vollständige Wiederherstellbarkeit.

    Interpretation:
    Fehlt eine im Repository erwartete Sicherung physisch, muss die konkrete Restore-Auswahl neu bewertet werden. RESTORE ... PREVIEW zeigt die von RMAN vorgesehene Auswahl; RESTORE ... VALIDATE liest die benötigten Backups, ohne Zieldateien zu restaurieren.

    Konkreter Befund und nachvollziehbare Lösung

    Ausschnitt aus V$BACKUP_SET (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    SET_STAMPSET_COUNTBACKUP_TYPEINCREMENTAL_LEVEL
    120000010018I1
    119990000017I0

    Auswertung und nächster Schritt: Hier kennt das Repository eine Level-0-Basis und ein Level-1-Set. Ob alle zugehörigen Pieces tatsächlich vorhanden und lesbar sind, ist damit offen. Fehlt Level 0 in dieser Sicht, zunächst Zeitraum, Repository und reale Set-Metadaten prüfen; aus dem geplanten Level-1-Befehl nicht pauschal den tatsächlich entstandenen Backup-Level ableiten. CROSSCHECK aktualisiert Repository-Metadaten und gehört deshalb nicht zu diesem lesenden Diagnoseablauf.

    Praxisfall 5 – ORA-00257

    1. Ausgangslage

    Fehler
    ORA-00257
    Anmeldung
    eingeschränkt
    Archive-Ziel
    Status unbekannt

    2. Deine Aufgaben

    Welche View zuerst?
    Welche Ursachen sind typisch?
    Welche Folge hat blockierte Archivierung?
    Lösungsweg anzeigen

    1. Archive-Ziele

    Status, Destination und ERROR prüfen.

    Archive Destinations
    SELECT dest_id, status, destination, target, error
    FROM v$archive_dest
    WHERE status <> 'INACTIVE'
    ORDER BY dest_id;

    Fiktive Beispielausgabe:

    DEST_IDSTATUSDESTINATIONTARGETERROR
    1VALID/u04/archPRIMARYNULL

    Was sehe ich hier? Das lokale Ziel ist hier gültig und meldet keinen Fehlertext. Dies ist eine Momentaufnahme; Speicherplatz und tatsächlicher Archivfortschritt müssen separat geprüft werden.

    Interpretation:
    ERROR liefert häufig direkt die technische Ursache.

    2. Letzte Archived Logs

    Prüfen, wann zuletzt erfolgreich archiviert wurde.

    Archived Logs
    SELECT thread#, sequence#, first_time, completion_time,
           archived, deleted, name
    FROM v$archived_log
    ORDER BY completion_time DESC
    FETCH FIRST 30 ROWS ONLY;
    Interpretation:
    Eine Lücke oder ausbleibende neue Logs kann den Störungszeitpunkt bestätigen.

    3. Wirkung verstehen

    Im ARCHIVELOG-Modus müssen abgeschlossene Redo-Sequenzen entsprechend den Archivierungsanforderungen archiviert sein, bevor ihre Online-Redo-Gruppe wiederverwendet werden darf. Die Gruppe darf außerdem nicht mehr für die Instanzwiederherstellung benötigt werden. Ein Logwechsel kann auch eine noch nicht vollständig gefüllte Gruppe abschließen.

    Interpretation:
    Kann ARCn ein erforderliches Ziel nicht mehr beschreiben, meldet Oracle ORA-00257; laut Oracle sind bis zur Behebung nur SYSDBA-Verbindungen zulässig, und wenn das Problem fortbesteht, werden Transaktionen gestoppt. Typische Ursachen sind Platzmangel oder ein ausgefallenes als MANDATORY konfiguriertes Archivziel. Das Labor bleibt bewusst read-only.

    Konkreter Befund und nachvollziehbare Lösung

    Ausschnitt aus V$ARCHIVE_DEST (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    DEST_IDSTATUSERROR
    1ERRORORA-19504: failed to create file

    Auswertung und nächster Schritt: Das Ziel meldet einen Schreibfehler. ORA-19504 allein beweist keinen Platzmangel: den vollständigen Fehlerstack und das konkrete Ziel im Alertlog lesen; anschließend Speicher, Dateisystemzugriff und Erreichbarkeit prüfen. Archivelogs nicht unkontrolliert löschen.

    Praxisfall 6 – Scheduler Job SUCCEEDED, fachlich fehlen Daten

    1. Ausgangslage

    Scheduler Status
    SUCCEEDED
    Anwendung
    Daten fehlen
    Job
    technisch beendet

    2. Deine Aufgaben

    Warum reicht SUCCEEDED nicht?
    Welche Run Details prüfst du?
    Welche fachliche Validierung ist nötig?
    Lösungsweg anzeigen

    1. Jobdefinition

    Konfiguration und Aktion kontrollieren.

    Scheduler Job
    SELECT owner, job_name, enabled, state, job_type, job_action,
           last_start_date, next_run_date, failure_count
    FROM dba_scheduler_jobs
    WHERE owner=UPPER('&OWNER') AND job_name=UPPER('&JOB_NAME');
    Interpretation:
    Prüfen, ob tatsächlich der erwartete Job und die erwartete Aktion ausgeführt wurden.

    2. Run Details

    Status, Dauer, Fehlernummer und Zusatzinformation prüfen.

    Run Details
    SELECT owner, job_name, status, actual_start_date, run_duration,
           error#, additional_info
    FROM dba_scheduler_job_run_details
    WHERE owner=UPPER('&OWNER') AND job_name=UPPER('&JOB_NAME')
    ORDER BY log_date DESC;
    Interpretation:
    SUCCEEDED ist nur ein technischer Scheduler-Status.

    3. Fachliche Kontrolle

    Nun muss anwendungsspezifisch geprüft werden, ob die erwarteten Daten tatsächlich verarbeitet wurden.

    Interpretation:
    Technisch erfolgreich ist nicht automatisch fachlich erfolgreich. Für ETL- und Schnittstellenjobs sind fachliche Kontrollzahlen notwendig.

    Konkreter Befund und nachvollziehbare Lösung

    Abgeglichene Lauf- und Fachprotokolle (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    OWNER.JOB_NAMESTATUSERWARTETVERARBEITET
    APP.IMPORT_AUFTRAEGESUCCEEDED12001180

    Auswertung und nächster Schritt: SUCCEEDED bestätigt den technischen Jobabschluss. Der fachliche Abgleich zeigt 20 fehlende Datensätze: 1200 − 1180. Im Protokoll genau dieses Laufs Filter, verworfene Zeilen und behandelte Ausnahmen untersuchen. Diese Mengen stammen aus dem Anwendungsprotokoll, nicht aus DBA_SCHEDULER_JOB_RUN_DETAILS.

    Weitere Praxisfälle zum selbstständigen Durcharbeiten

    Die folgenden Fälle sind jetzt genauso aufgebaut wie die bisherigen Praxisfälle: erst Ausgangslage und Aufgaben lesen, selbst eine Diagnosekette bilden und den Lösungsweg erst danach öffnen.

    Praxisfall 7 – Eine einzelne SQL wird teurer

    1. Ausgangslage

    Meldung
    Antwortzeiten deutlich höher
    Beginn
    08:15 Uhr
    Betroffen
    mehrere Benutzer
    Ursache
    noch unbekannt

    2. Deine Aufgaben

    Welche SQL_ID und welcher Child Cursor gehören zum betroffenen Aufruf?
    Was ergibt sich aus zwei Messungen desselben Cursors?
    Welche Aussage erlauben Durchschnittswerte und welche nicht?
    Lösungsweg anzeigen

    1. SQL und Child Cursor bestimmen

    Die betroffene SQL_ID aus dem konkreten Anwendungsaufruf übernehmen. CHILD_NUMBER und CON_ID trennen verschiedene Cursor und Container.

    SELECT sql_id, child_number, con_id, executions, loads,
           elapsed_time/1000000 AS elapsed_s, buffer_gets
    FROM v$sql WHERE sql_id='&SQL_ID' ORDER BY child_number;

    2. Gleichen Cursor zweimal erfassen

    Die folgende Abfrage zu zwei dokumentierten Zeitpunkten ausführen, beispielsweise mit 60 Sekunden Abstand. Beide Ausgaben aufbewahren; Zählerrückgang oder erneutes Laden unterbrechen den Vergleich.

    SELECT sql_id, child_number, con_id, executions, loads,
           elapsed_time/1000000 AS elapsed_s, buffer_gets
    FROM v$sql WHERE sql_id='&SQL_ID' AND child_number=&CHILD_NUMBER;

    3. Differenzen und Plan zusammen bewerten

    Mit der anschließenden Beispieltabelle den Aufwand je zusätzlicher Ausführung berechnen. Den Plan desselben Child Cursors lesen; COST ist keine gemessene Laufzeit.

    SELECT sql_id, child_number, id, operation, options, object_name, cardinality, cost
    FROM v$sql_plan WHERE sql_id='&SQL_ID' AND child_number=&CHILD_NUMBER
    ORDER BY id;

    Konkreter Befund und nachvollziehbare Lösung

    Zwei Aufnahmen desselben Child Cursors (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    ZEITEXECUTIONSELAPSED_SBUFFER_GETS
    10:0010020100000
    10:0111050400000

    Auswertung und nächster Schritt: Die Abfrage zu V$SQL für dieselbe SQL_ID, CHILD_NUMBER und CON_ID zweimal erfassen. Differenz: 10 Ausführungen, 30 Sekunden, 300000 Buffer Gets. Das ergibt im Messfenster 3 Sekunden und 30000 Gets je Ausführung im Mittel. Ein Cursor-Neuladen oder Zählerrückgang macht diesen Vergleich ungültig; laufende Ausführungen und Parallelität begrenzen die Deutung. Anschließend Plan und Parameterwerte des betroffenen Aufrufs prüfen.

    Praxisfall 8 – Eine mehrstufige Blockierkette verfolgen

    1. Ausgangslage

    Wait
    enq: TX - row lock contention
    Waiter
    mehrere Sessions
    Blocker
    unbekannt
    Aktion
    keine automatische

    2. Deine Aufgaben

    Wie findest du Blocker und Waiter?
    Welche SQL gehört zum Blocker?
    Warum wird die Session nicht sofort beendet?
    Lösungsweg anzeigen

    1. Blockierkette bestimmen

    blocking_session zeigt den direkten Blocker.

    Read-only / Lernbeispiel
    SELECT sid, serial#, username, blocking_session,
           sql_id, event, CASE WHEN state='WAITING' THEN wait_time_micro/1000000 END AS current_wait_s, module, machine
    FROM v$session
    WHERE blocking_session_status='VALID'
    ORDER BY current_wait_s DESC NULLS LAST;
    Interpretation:
    SID und SERIAL# gemeinsam dokumentieren.

    2. Blocker untersuchen

    Status, aktuelles/vorheriges SQL und Anwendungskontext des Blockers lesen.

    Read-only / Lernbeispiel
    SELECT sid, serial#, username, status,
           sql_id, prev_sql_id, module, machine,
           logon_time, last_call_et
    FROM v$session
    WHERE sid=&BLOCKER_SID;
    Interpretation:
    PREV_SQL_ID kann wichtig sein, wenn die blockierende DML bereits beendet ist, die Transaktion aber offen bleibt.

    3. Offene Transaktion prüfen

    Eine lange offene Transaktion erklärt oft lange Lock-Haltezeiten.

    Read-only / Lernbeispiel
    SELECT s.sid, s.serial#, t.start_date,
           t.used_ublk, t.used_urec
    FROM v$session s
    JOIN v$transaction t ON t.addr=s.taddr
    WHERE s.sid=&BLOCKER_SID;
    Interpretation:
    Erst fachlichen Kontext klären, keine Session automatisch beenden.

    Konkreter Befund und nachvollziehbare Lösung

    Ausschnitt aus der Blockerabfrage (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    SIDBLOCKING_SESSION_STATUSBLOCKING_SESSION
    110VALID80
    80VALID40

    Auswertung und nächster Schritt: 110 wartet auf 80, aber 80 wartet selbst auf 40. Folge der Kette bis zum letzten bestätigten Blocker; prüfe nun SID 40 mit SERIAL#, Instanz und Container. Eine einzelne Momentaufnahme kann bereits beim nächsten Abruf veraltet sein. Nicht automatisch die zuerst genannte Session beenden.

    Praxisfall 9 – ORA-01555 bei langem Report

    1. Ausgangslage

    Fehler
    ORA-01555
    SQL
    langer SELECT
    UNDO
    zu prüfen
    DML
    parallel möglich

    2. Deine Aufgaben

    Welche Rolle spielt Read Consistency?
    Welche UNDO-Informationen sind wichtig?
    Warum ist das kein automatischer Parameter-Fix?
    Lösungsweg anzeigen

    1. SQL-Laufzeit feststellen

    Der Zeitraum des Reports ist die Basis für die weitere Analyse.

    Read-only / Lernbeispiel
    SELECT sid, serial#, sql_id, status,
           sql_exec_start, sql_exec_id,
           CASE WHEN status='ACTIVE' AND sql_exec_start IS NOT NULL
                THEN ROUND((SYSDATE-sql_exec_start)*86400) END AS elapsed_s, event
    FROM v$session
    WHERE sql_id='&SQL_ID';
    Interpretation:
    Lange Laufzeit erhöht die Zeitspanne, für die alte Datenversionen benötigt werden können.

    2. UNDO-Verhalten ansehen

    Retention und tatsächliche Undo-Historie im Zeitraum prüfen.

    Read-only / Lernbeispiel
    SELECT begin_time, end_time, tuned_undoretention,
           undoblks, txncount, maxquerylen
    FROM v$undostat
    ORDER BY begin_time DESC
    FETCH FIRST 24 ROWS ONLY;
    Interpretation:
    MAXQUERYLEN und TUNED_UNDORETENTION liefern Kontext, sind aber kein alleiniger Beweis.

    3. Ursache einordnen

    Hohe DML-Rate, lange Abfrage und verfügbare Undo-Historie gemeinsam bewerten.

    Interpretation:
    ORA-01555 wird aus Read Consistency und alten Datenversionen erklärt, nicht nur aus einer einzelnen Parameterzahl.

    Konkreter Befund und nachvollziehbare Lösung

    Ausschnitt aus der aktuellen Sessionabfrage (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    SIDSTATUSSQL_EXEC_IDELAPSED_S
    130ACTIVE16777220600

    Auswertung und nächster Schritt: Für diese noch aktive SQL-Ausführung sind ungefähr 600 Sekunden seit SQL_EXEC_START vergangen. LAST_CALL_ET wäre bei ACTIVE die Zeit seit dem Wechsel in diesen Status, nicht generell die SQL-Laufzeit. Nach dem Fehler ist diese Sessionaufnahme kein historischer Nachweis; Fehlerzeit und damalige UNDO-Intervalle müssen korreliert werden.

    Praxisfall 10 – RMAN COMPLETED, Recovery-Frage offen

    1. Ausgangslage

    Backupjob
    COMPLETED
    Restoretest
    unbekannt
    Archivelogs
    zu prüfen
    Recovery
    nicht bewiesen

    2. Deine Aufgaben

    Welche Sicherungen sind vorhanden?
    Ist die Recovery-Kette vollständig?
    Warum reicht COMPLETED allein nicht?
    Lösungsweg anzeigen

    1. Backupbestand lesen

    RMAN-Repository nach vorhandenen Sicherungen und Zeiten prüfen.

    Read-only / Lernbeispiel
    LIST BACKUP SUMMARY;
    Interpretation:
    Der Repository-Eintrag zeigt bekannte Backups, nicht automatisch deren erfolgreiche Restaurierbarkeit.

    2. Archivelog-Kette prüfen

    Für einen Recovery-Zeitpunkt müssen die erforderlichen Archived Logs vorhanden sein.

    Read-only / Lernbeispiel
    LIST ARCHIVELOG ALL;
    Interpretation:
    Eine Lücke kann den erreichbaren Recovery-Zeitpunkt begrenzen.

    3. Controlfile/SPFILE einordnen

    Recovery benötigt neben Datafiles auch die nötigen Steuerinformationen.

    Read-only / Lernbeispiel
    LIST BACKUP OF CONTROLFILE;
    LIST BACKUP OF SPFILE;
    Interpretation:
    Backup COMPLETED und nachgewiesene Recovery-Fähigkeit sind zwei unterschiedliche Aussagen. Für ein konkretes Recovery-Ziel sollte zusätzlich mit RESTORE ... PREVIEW die Restore-Auswahl und mit RESTORE ... VALIDATE die Lesbarkeit der dafür benötigten Backups geprüft werden.

    Konkreter Befund und nachvollziehbare Lösung

    Fiktiver Recovery-Abgleich aus Repository und Medienprüfung (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    PUNKTBEOBACHTUNG
    Gewünschtes Ziel10:15
    Letztes gesichertes Redo-Ende10:10
    Weitere Redo-Kopienicht nachgewiesen

    Auswertung und nächster Schritt: Das Ziel 10:15 ist mit dem bislang belegten Material nicht nachgewiesen. Ein COMPLETED-Backupjob allein schließt die fünfminütige Lücke nicht. LIST-Befehle zeigen Repository-Inhalte; Lesbarkeit, Redo-Kontinuität, Inkarnation und erforderliche Controlfile-/SPFILE-Informationen müssen für einen geplanten Restore-Test geprüft werden.

    Praxisfall 11 – PDB nach Neustart nicht geöffnet

    1. Ausgangslage

    CDB
    OPEN
    PDB
    MOUNTED
    Anwendung
    nicht erreichbar
    Open State
    zu prüfen

    2. Deine Aufgaben

    In welchem Container bist du?
    Welchen Open Mode hat die PDB?
    Wie wird SAVE STATE fachlich eingeordnet?
    Lösungsweg anzeigen

    1. Container-Kontext prüfen

    Zuerst sicherstellen, in welchem Container die Session arbeitet.

    Read-only / Lernbeispiel
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS con_name FROM dual;
    Interpretation:
    Container-Kontext ist die erste Multitenant-Frage.

    2. PDB-Status lesen

    Open Mode aller PDBs anzeigen.

    Read-only / Lernbeispiel
    SELECT con_id, name, open_mode, restricted
    FROM v$pdbs
    ORDER BY con_id;

    Fiktive Beispielausgabe:

    CON_IDNAMEOPEN_MODERESTRICTED
    2PDB$SEEDREAD ONLYNO
    3APPPDBREAD WRITENO

    Was sehe ich hier? Im CDB-Root werden hier die Vorlage und die geöffnete Anwendungs-PDB sichtbar. Die Sicht aus einer PDB ist eingeschränkt.

    Interpretation:
    MOUNTED bedeutet, dass die PDB noch nicht normal READ WRITE geöffnet ist.

    3. Gespeicherten Öffnungszustand lesen

    Mit passenden Rechten in CDB$ROOT den gespeicherten Zustand pro PDB und Instanz prüfen.

    Read-only – gespeicherter PDB-Zustand
    SELECT con_name, instance_name, state, restricted
    FROM dba_pdb_saved_states
    ORDER BY con_name, instance_name;
    Interpretation:
    Diagnose und administrative Aktion bleiben klar getrennt.

    Konkreter Befund und nachvollziehbare Lösung

    Ausschnitt aus V$PDBS (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    CON_IDNAMEOPEN_MODERESTRICTED
    3APP_PDBMOUNTEDNO

    Auswertung und nächster Schritt: Die PDB ist gemountet und nimmt keine normalen Anwendungszugriffe an. Aus CDB$ROOT DBA_PDB_SAVED_STATES lesen: Ein fehlender Eintrag erklärt, dass kein gespeicherter Öffnungszustand für diese PDB/Instanz vorliegt; er beweist keine allgemeine Startursache. Alertlog zum Neustart prüfen. Öffnen und SAVE STATE sind administrative Folgemaßnahmen, keine SELECT-Diagnose.

    Praxisfall 12 – Listener antwortet, Anwendung verbindet sich nicht

    1. Ausgangslage

    Listener
    erreichbar
    Anmeldung
    fehlgeschlagen
    Service
    zu prüfen
    PDB
    zu prüfen

    2. Deine Aufgaben

    Warum beweist Listener-Erreichbarkeit keinen Login?
    Welche Ebenen prüfst du?
    Welche Logs korrelierst du?
    Lösungsweg anzeigen

    1. Konkreten Fehler sichern

    TNS-/ORA-Fehlernummer und Zeitpunkt dokumentieren.

    Interpretation:
    Ohne exakten Fehler bleibt die Diagnose zu unscharf.

    2. Service und PDB prüfen

    Datenbankservices und PDB-Open-Mode read-only kontrollieren.

    Read-only / Lernbeispiel
    SELECT name, network_name, pdb
    FROM v$services
    ORDER BY name;
    
    SELECT name, open_mode
    FROM v$pdbs
    ORDER BY con_id;
    Interpretation: V$SERVICES belegt bekannte Datenbankservices, nicht ihre Registrierung am angesprochenen Listener. PDB-Status und lsnrctl services am tatsächlichen Ziel getrennt prüfen.

    3. Login-Kontext prüfen

    Benutzerstatus und Zielcontainer passend zur Anwendung untersuchen.

    Interpretation:
    Netzwerk, Listener, Service, PDB und Benutzeranmeldung sind getrennte Ebenen.

    Konkreter Befund und nachvollziehbare Lösung

    Abgleich von Clientfehler und Datenbank (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    QUELLEBEFUND
    ClientORA-12514
    V$SERVICESAPP_REPORT vorhanden
    V$PDBSAPP_PDB READ WRITE

    Auswertung und nächster Schritt: Der Service ist in der Datenbank bekannt, aber seine Registrierung beim angesprochenen Listener ist damit nicht bewiesen. Auf dem tatsächlichen Listener-Host mit lsnrctl services den registrierten Service prüfen und mit Host, Port und SERVICE_NAME des Clients vergleichen. Ein anderer Listener oder falscher Servicename kann denselben Clientfehler verursachen.

    Praxisfall 13 – Hohe log file sync-Zeit

    1. Ausgangslage

    Wait
    log file sync
    Bereich
    COMMIT
    LGWR
    relevant
    Aktion
    noch keine

    2. Deine Aufgaben

    Welche zweite Redo-Wait ist wichtig?
    Wie bewertest du Commit-Häufigkeit?
    Warum nicht sofort Redo Logs vergrößern?
    Lösungsweg anzeigen

    1. Redo-Waits vergleichen

    log file sync und log file parallel write gemeinsam betrachten.

    Read-only / Lernbeispiel
    SELECT event, total_waits,
           time_waited_micro/1000000 AS time_waited_s,
           average_wait
    FROM v$system_event
    WHERE event IN ('log file sync','log file parallel write');
    Interpretation:
    Beide Waits zusammen helfen, Foreground-COMMIT und LGWR-I/O einzuordnen. Da V$SYSTEM_EVENT instanzweite kumulierte Werte liefert, sollten für eine aktuelle Störung Deltas oder ein definiertes Messintervall betrachtet werden.

    2. Commit- und Redo-Rate ansehen

    Statistiken zum Workload-Kontext lesen.

    Read-only / Lernbeispiel
    SELECT name, value
    FROM v$sysstat
    WHERE name IN ('user commits','redo size','redo writes')
    ORDER BY name;
    Interpretation:
    Viele kleine Commits können log file sync auch ohne defekten Storage verstärken.

    3. Switchrate erst danach einordnen

    Log Switches sind ein weiterer Kontext, nicht automatisch die Ursache.

    Interpretation:
    Redo-Größe wird erst nach belegtem Zusammenhang bewertet.

    Konkreter Befund und nachvollziehbare Lösung

    Zwei Aufnahmen von V$SYSTEM_EVENT für log file sync (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    ZEITTOTAL_WAITSTIME_WAITED_MICRO
    10:0010002000000
    10:0110302600000

    Auswertung und nächster Schritt: 30 zusätzliche Waits und 600000 Mikrosekunden zusätzliche Wartezeit: 600000 / 30 / 1000 = 20 ms je Wait im Messfenster. Nicht den kumulierten AVERAGE_WAIT als aktuellen Minutenwert verwenden. Für log file parallel write gleich rechnen; Commit-Anzahl und Redo-Menge aus V$SYSSTAT ebenfalls als Differenzen vergleichen. Wait-Anzahl und Commit-Anzahl sind nicht grundsätzlich identisch.

    Praxisfall 14 – Full Table Scan trotz Index

    1. Ausgangslage

    Tabelle
    groß
    Index
    vorhanden
    Plan
    Full Table Scan
    Fehler?
    nicht automatisch

    2. Deine Aufgaben

    Wie viele Zeilen werden benötigt?
    Passen Prädikat und Index?
    Welche Rolle spielen Statistiken?
    Lösungsweg anzeigen

    1. Indexdefinition prüfen

    Indexstatus, Sichtbarkeit und Spaltenreihenfolge lesen.

    Read-only / Lernbeispiel
    SELECT i.index_name, i.index_type, i.uniqueness,
           i.status, i.visibility,
           c.column_position, c.column_name
    FROM dba_indexes i
    JOIN dba_ind_columns c
      ON c.index_owner=i.owner
     AND c.index_name=i.index_name
    WHERE i.table_owner=UPPER('&OWNER')
      AND i.table_name=UPPER('&TABLE_NAME')
    ORDER BY i.index_name, c.column_position;
    Interpretation:
    Ein vorhandener Index muss zum tatsächlichen Prädikat passen.

    2. Statistik-Kontext lesen

    Tabellengröße und Aktualität der Statistiken prüfen.

    Read-only / Lernbeispiel
    SELECT owner, table_name, num_rows,
           blocks, last_analyzed, stale_stats
    FROM dba_tab_statistics
    WHERE owner=UPPER('&OWNER')
      AND table_name=UPPER('&TABLE_NAME');
    Interpretation:
    Der Optimizer verwendet Objekt- und Systemstatistiken, um Cardinality und Kosten möglicher Zugriffswege zu schätzen und daraus einen Plan auszuwählen.

    3. Plan mit Datenmenge vergleichen

    Erwartete und tatsächliche Zeilenmengen betrachten.

    Interpretation:
    Ein Full Table Scan kann trotz vorhandenem Index die kostengünstigere Wahl sein, etwa wenn ein großer Anteil der Tabellenblöcke benötigt wird. Entscheidend sind Prädikat, Selektivität, Cardinality-Schätzung, Statistiken und Kostenmodell.

    Konkreter Befund und nachvollziehbare Lösung

    Fiktive gemeinsame Beobachtungen aus Plan, Statistik und Fachfilter (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    PRÜFPUNKTBEFUND
    IndexVALID und VISIBLE
    PlanTABLE ACCESS FULL
    Trefferanteil im Beispiel700000 von 1000000 Zeilen

    Auswertung und nächster Schritt: Der Filter trifft 70 Prozent der Zeilen. Ein Full Table Scan kann hier günstiger sein als viele Tabellenzugriffe über den Index. VALID/VISIBLE allein erzwingt keine Indexnutzung. Zuerst den tatsächlich verwendeten Child-Cursor-Plan und seine Prädikate lesen; Schätzzeilen mit gemessenen Zeilen vergleichen, sofern passende Laufzeitstatistiken vorhanden sind. Keinen Index-Hint allein aufgrund des Scans setzen.

    Praxisfall 15 – TEMP wächst stark

    1. Ausgangslage

    TEMP
    starke Nutzung
    SQL
    Report
    PGA
    zu prüfen
    Workarea
    möglich

    2. Deine Aufgaben

    Welche Session nutzt TEMP?
    Welche SQL ist beteiligt?
    Wann wird PGA/TEMP relevant?
    Lösungsweg anzeigen

    1. TEMP-Verbrauch zuordnen

    Temporäre Segmente einer Session zuordnen.

    Read-only / Lernbeispiel
    SELECT s.sid, s.serial#, s.username, u.tablespace, u.blocks, u.segtype,
           u.sql_id_tempseg AS temp_sql_id, s.sql_id AS current_sql_id
    FROM v$tempseg_usage u
    JOIN v$session s ON s.saddr=u.session_addr AND s.serial#=u.session_num AND s.con_id=u.con_id
    ORDER BY u.blocks DESC;
    Interpretation: SESSION_ADDR und SESSION_NUM ordnen das Segment zur Session zu. SQL_ID_TEMPSEG bezeichnet die SQL beim Erzeugen des Segments; die aktuelle V$SESSION.SQL_ID kann inzwischen abweichen.

    2. Workarea-Kontext prüfen

    Onepass-/Multipass-Verhalten sowie große Hash-/Sort-Operationen untersuchen; V$SQL_WORKAREA_ACTIVE kann aktive Workareas und ein mögliches Spill in TEMP sichtbar machen.

    Interpretation:
    TEMP kann die Folge einer nicht im PGA-Speicher verbleibenden Workarea sein.

    3. Plan lesen

    Sort-, Hash- und Joinoperationen im Plan einordnen.

    Interpretation:
    TEMP ist ein Symptom, nicht automatisch die eigentliche Ursache.

    Konkreter Befund und nachvollziehbare Lösung

    Ausschnitt aus der TEMP-Abfrage (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    SIDTABLESPACEBLOCKSTEMP_SQL_IDCURRENT_SQL_ID
    150TEMP1310727abc123def4568abc123def456

    Auswertung und nächster Schritt: Bei nachgewiesenen 8192 Bytes je TEMP-Block sind das 131072 × 8192 / 1024 / 1024 = 1024 MiB. Die Blockgröße muss zum Tablespace gehören. TEMP_SQL_ID benennt die SQL, die das temporäre Segment erzeugt hat; CURRENT_SQL_ID kann bereits einen anderen Aufruf zeigen. Die Zuordnung verwendet Sessionadresse und Seriennummer. Sortier- oder Hash-Arbeit über die passende SQL/Workarea weiter eingrenzen.

    Praxisfall 16 – Cronjob läuft manuell, aber nicht aus cron

    1. Ausgangslage

    Manuell
    funktioniert
    cron
    schlägt fehl
    Umgebung
    reduziert
    Log
    entscheidend

    2. Deine Aufgaben

    Welche Variablen fehlen eventuell?
    Wo siehst du den Cron-Start?
    Warum ist /dev/null riskant?
    Lösungsweg anzeigen

    1. Crontab read-only lesen

    Den tatsächlich geplanten Aufruf kontrollieren.

    Read-only / Lernbeispiel
    crontab -l
    Interpretation:
    Pfad, Zeitplan und Umleitungen werden sichtbar.

    2. Oracle-Umgebung vergleichen

    ORACLE_HOME, ORACLE_SID und PATH müssen im Job eindeutig gesetzt sein.

    Read-only / Lernbeispiel
    echo "$ORACLE_HOME"
    echo "$ORACLE_SID"
    echo "$PATH" 
    Interpretation:
    Cron startet typischerweise mit einer reduzierten Umgebung.

    3. Logs lesen

    Cron-Log und eigenes Skriptlog im gleichen Zeitraum vergleichen.

    Interpretation:
    Wenn stdout/stderr nach /dev/null gehen und das Skript kein eigenes Log schreibt, verschwinden wichtige Fehlerhinweise.

    Konkreter Befund und nachvollziehbare Lösung

    Fiktiver Ausschnitt aus einem bereits vorhandenen Cron-Joblog (fiktiv; auf die benötigten Spalten gekürzt).

    Fiktive Beispielausgabe:
    QUELLEMELDUNG
    Cron-Joblogsqlplus: command not found
    Interaktive Shellsqlplus über PATH auffindbar

    Auswertung und nächster Schritt: Die interaktive Shell ist kein Nachweis der Cron-Umgebung. Lies zunächst crontab und das vom Job geschriebene Fehlerprotokoll. Hier wird SQL*Plus im Cronlauf nicht gefunden: Im Startskript ORACLE_HOME, ORACLE_SID und PATH gezielt und nachvollziehbar setzen oder SQL*Plus über den geprüften absoluten Pfad aufrufen. Danach den nächsten kontrollierten Lauf anhand seines eigenen Logs prüfen; keine Passwörter protokollieren.

    Praxisfall 17 – Die Maske braucht 20 Sekunden: Wo bleibt die Zeit?

    1. Ausgangslage

    Eine Anwenderin öffnet eine Bestellübersicht. Erst nach 20 Sekunden ist die Liste vollständig sichtbar. Im Gespräch heißt es: „Das SQL braucht doch nur eine Sekunde.“ Diese Aussage kann sich aber nur auf einen Teil des Ablaufs beziehen. Zwischen dem Klick und der Anzeige arbeiten mehrere Komponenten zusammen. Der Fall zeigt, wie du die Abschnitte auseinanderhältst und eine Datenbanksession zuordnest. Die erfundene Anwendung verwendet einen Verbindungspool im Anwendungsserver; Namen und Messwerte beschreiben keine konkrete Installation.

    Gegeben: Ein vorhandenes Anwendungsprotokoll ordnet den Vorgang der neutralen Kennung REQ-0042 zu. Die erste Rückgabe von der Datenbank wird darin nach einer Sekunde gemeldet. Die gesamte Ergebnisverarbeitung ist zu diesem Zeitpunkt noch nicht abgeschlossen. Weitere Zeitmarken werden erst im Lösungsweg ausgewertet.

    2. Deine Aufgaben

    Reicht die eine Sekunde aus, um die Datenbank als Ursache auszuschließen?
    Welche Abschnitte müssen zwischen Klick und Anzeige unterschieden werden?
    Wie findest du eine passende Session, wenn viele Personen denselben Datenbankbenutzer verwenden?
    Was kannst du aus einer einzigen Session-Abfrage nicht erkennen?
    Lösungsweg mit Beispielzeiten und SELECT-Diagnose anzeigen

    1. Den Ablauf zunächst in verständliche Schritte aufteilen

    Die Anfrage erreicht zunächst den Anwendungsserver. Dieser fordert eine Verbindung aus seinem Pool an. Sobald er sie erhält, kann er SQL an Oracle senden. Die Datenbank verarbeitet die Anfrage, und die Anwendung holt die Ergebniszeilen ab. Anschließend bereitet sie die Daten für die Oberfläche auf. Die Oberfläche muss das Ergebnis schließlich noch darstellen. In realen Anwendungen können mehrere SQL-Aufrufe und überlappende Arbeitsschritte vorkommen.

    Ein Pool hält Verbindungen zur Wiederverwendung bereit. Das Zurückgeben einer Verbindung an den Pool ist deshalb nicht automatisch eine Abmeldung bei Oracle. Ein fachlicher Benutzer, ein Datenbankkonto und eine konkrete Session sind verschiedene Dinge. Solange die Anfrage noch auf eine freie Poolverbindung wartet, ist ihr möglicherweise noch keine Datenbanksession zugeordnet. Die Grundlagen stehen in Oracle Net und Sessions und Prozesse.

    2. Zeitmarken derselben Anfrage zusammenführen

    Was sehe ich hier? Die folgende fiktive Messreihe gehört vollständig zu REQ-0042. Die Zeiten sind Sekunden seit dem Klick. Für dieses Lernbeispiel sind die Abschnitte aufeinanderfolgend und überschneiden sich nicht. Sie stammen aus einer gedachten Ablaufmessung von Anwendung und Oberfläche, nicht aus V$SESSION.

    ZeitraumDauerBeobachteter Abschnitt
    0–2 s2 sAnfrage übertragen und im Anwendungsserver vorbereiten.
    2–10 s8 sAuf eine verfügbare Verbindung aus dem Pool warten.
    10–11 s1 sErster Datenbankaufruf bis zur ersten Ergebnisportion.
    11–16 s5 sWeitere Ergebnisportionen abrufen und übernehmen.
    16–20 s4 sAntwort aufbereiten, übertragen und vollständig anzeigen.

    Die fünf Abschnitte ergeben 20 Sekunden. Die oft zitierte „eine Sekunde“ deckt nur 10–11 Sekunden ab. Auch beim späteren Abrufen können noch Datenbankarbeit und Übertragung stattfinden. Die acht Sekunden Pool-Wartezeit sind der größte einzelne Abschnitt und deshalb ein sinnvoller nächster Untersuchungspunkt. Sie beweisen aber nicht, warum keine Verbindung frei war: Andere Anfragen können Verbindungen lange halten, unter anderem wegen langsamer Datenbankarbeit.

    Bei echten Messungen notierst du Herkunft, Einheit und Bedeutung jedes Zeitstempels. Für Vergleiche über mehrere Rechner müssen Zeitzonen und Uhren zusammenpassen. Verschachtelte oder gleichzeitig laufende Abschnitte darfst du nicht einfach addieren. Ein geschätzter Zeitpunkt aus einer Anwendererinnerung ist außerdem weniger genau als ein dokumentierter Messpunkt.

    3. Service, Datenbankkonto und Anwendung zusammenbringen

    Ermittle aus der Verbindungskonfiguration den verwendeten Service und den Datenbankbenutzer. In unserem Beispiel heißen sie APP_REPORT und APP_DEMO. MODULE und ACTION können den Anwendungsbereich und den Arbeitsschritt kennzeichnen. Die Anwendung beziehungsweise ihr Treiber muss diese Angaben passend setzen und bei Wiederverwendung pflegen; Oracle erkennt die Bedeutung einer Maske nicht von selbst. Fehlende oder alte Kennzeichnungen begrenzen die Zuordnung.

    Was sehe ich hier? Die erste SELECT-Abfrage sucht Kandidaten im richtigen Service. Sie filtert bewusst nicht ausschließlich ACTIVE: Der Vorgang kann zwischen zwei Datenbankaufrufen liegen. Passe die festen Namen an und nutze eine Verbindung mit Leserecht auf V$SESSION im passenden Datenbank-/Containerkontext.

    READ ONLY – Sessions für den Anwendungsservice
    SELECT TO_CHAR(sid) || '/' || TO_CHAR(serial#) AS session_key,
           username, module, action
    FROM v$session
    WHERE type = 'USER'
      AND username = 'APP_DEMO'
      AND service_name = 'APP_REPORT'
    ORDER BY sid;

    Fiktiver Auszug während der Verarbeitung:

    SESSION_KEYUSERNAMEMODULEACTION
    142/3817APP_DEMOBESTELLUNGENBESTELLLISTE
    166/9102APP_DEMOBESTELLUNGENBESTELLLISTE

    Zwei Kandidaten passen zum gleichen Arbeitsablauf. Das allein identifiziert die Anfrage noch nicht. In diesem Lernbeispiel setzt die Anwendung zusätzlich CLIENT_IDENTIFIER auf die Anfragekennung. Diese Verwendung ist eine Vereinbarung des Beispiels; andernorts kann der Wert einen Anwendungsbenutzer oder einen anderen Kontext bezeichnen. Er ist keine automatisch erzeugte oder zwangsläufig eindeutige Oracle-Request-ID.

    READ ONLY – Kandidaten über die Anfragekennung eingrenzen
    SELECT TO_CHAR(sid) || '/' || TO_CHAR(serial#) AS session_key,
           client_identifier, status, sql_id
    FROM v$session
    WHERE type = 'USER'
      AND username = 'APP_DEMO'
      AND service_name = 'APP_REPORT'
      AND client_identifier = 'REQ-0042'
    ORDER BY sid;

    Fiktive Beispielausgabe:

    SESSION_KEYCLIENT_IDENTIFIERSTATUSSQL_ID
    142/3817REQ-0042ACTIVE7c1p4m2r8s9t0

    Damit ist zum Messzeitpunkt eine Session mit passender Kennzeichnung sichtbar. SID und SERIAL# gehören zusammen; eine SID kann später neu vergeben sein. SQL_ID bezeichnet das aktuelle SQL, keine Liste aller Anweisungen dieses Vorgangs. Notiere den Messzeitpunkt und prüfe bei einer Folgemessung die Identität erneut. Mehrere Treffer oder keine Zeile erfordern weitere Eingrenzung; auch ein bereits beendeter Vorgang kann verschwunden sein.

    Zum aktuellen Wartezustand führt die vorhandene Session-Praxisübung; den Vergleich zweier Stichproben erklärt die Messvergleichsübung. Die dortige Abfrage wird hier nicht nochmals wiederholt. Eine Momentaufnahme liefert keine rückwirkende Zerlegung der 20 Sekunden.

    4. Die noch fehlenden Informationen gezielt lesen

    AbschnittGeeignete nächste Information
    Warten auf den PoolVorhandene Pool-Metriken: belegte/freie Verbindungen, Wartende und Dauer der Ausleihe.
    DatenbankverarbeitungPassende Session, aktuelles SQL und wiederholte Zustandsmessungen im betroffenen Zeitraum.
    ErgebnisabrufAnzahl der Ergebniszeilen, Fetch-Aufrufe und gemessene Dauer der einzelnen Aufrufe.
    Aufbereitung und AnzeigeVorhandene Anwendungs- und Oberflächenmessungen bis zum vollständig dargestellten Ergebnis.

    Die Bezeichnungen und Verfügbarkeit der Pool-Metriken hängen vom verwendeten Produkt ab. Eine lange Ausleihdauer kann auch dadurch entstehen, dass die Anwendung zwischen SQL-Aufrufen weitere Arbeit erledigt, bevor sie die Verbindung zurückgibt. Deshalb würde eine pauschale Vergrößerung des Pools die Ursache nicht belegen und möglicherweise nur mehr gleichzeitige Last erzeugen. Hier werden vorhandene Messdaten gelesen; fehlende Instrumentierung wird als Messlücke dokumentiert.

    Ergebniszeilen werden häufig in Portionen abgeholt. Bei JDBC beeinflusst die Fetch Size, wie viele Zeilen pro Abruf angefordert werden. Viele kleine Abrufe können zusätzlichen Kommunikationsaufwand verursachen. Daraus folgt jedoch kein allgemeiner optimaler Wert: Datenmenge, Zeilenbreite, Speicherbedarf und tatsächlicher Treiber müssen berücksichtigt werden. Die fünf Sekunden des Beispiels sind daher nicht ohne weitere Messung als reine Netzwerkzeit zu bezeichnen.

    5. Antwortzeit, SQL-Messung und DB Time auseinanderhalten

    Die Antwortzeit ist in diesem Fall die Zeit vom Klick bis zur fertigen Anzeige. Eine SQL-Messung kann dagegen nur einen Aufruf oder eine bestimmte Ausführung erfassen. DB Time summiert die Zeit der Vordergrundsessions in Datenbankaufrufen einschließlich nicht-idler Wartezeit. Bei mehreren gleichzeitig arbeitenden Sessions kann diese Summe größer sein als der betrachtete Zeitraum. Instanzweite DB Time darf deshalb nicht einfach von den 20 Sekunden abgezogen werden, um eine vermeintliche „Anwendungszeit“ zu berechnen.

    Auch viele gleichzeitige Anwendungsanfragen bedeuten nicht ebenso viele gleichzeitig auf der CPU laufende Oracle-Sessions. Poolbelegung, Sessionstatus und CPU-Nutzung beschreiben verschiedene Ebenen. Ihre Grundlagen stehen im Prozesskapitel und unter Performance Tuning.

    6. Den Befund und die nächste Frage formulieren

    Belastbarer Befund im Lernfall: Die 20 Sekunden bestehen aus mehreren gemessenen Abschnitten. Acht Sekunden entfallen auf das Warten auf eine Poolverbindung. Die erste Ergebnisportion liegt eine Sekunde nach dem ersten Datenbankaufruf vor; weitere Abrufe folgen über fünf Sekunden. Das einzelne SQL-Zeitargument erklärt deshalb nicht die gesamte Antwortzeit.

    Nächste Frage: Welche Vorgänge hielten die Poolverbindungen während dieser acht Sekunden belegt, und weshalb? Parallel wird geprüft, wie viel Arbeit und Kommunikation in den weiteren Abrufen steckt. Erst mit diesen Informationen lässt sich ein konkreter Engpass zuordnen. Dieser Fall endet bewusst mit einer begründeten Untersuchung, nicht mit einer erfundenen sicheren Ursache.

    Oracle-19c-Grundlagen: Verbindungsstrategien und Pools; MODULE und ACTION; Client-Identifier in mehrstufigen Anwendungen; V$SESSION; JDBC-Ergebnisabruf; Datenbankzeit messen.

    Praxisregel: Symptom und Zeitraum sichern, dann read-only Beweise sammeln. Eine Maßnahme ist der letzte Schritt, nicht der erste.

    Offizielle Oracle-Referenzen (19c)

    V-SESSION · V-TEMPSEG_USAGE · V-SYSTEM_EVENT · CROSSCHECK

    Labor: Transaktionen und Blockierung mit zwei Sessions selbst beobachten

    Voraussetzung ist LAB_OWNER.LAB_ORDER aus dem Rechte-Labor in LABPDB. Der Ausgangswert für ORDER_ID=101 ist QUANTITY=2 und es gibt keine offene Änderung daran. Zwei eigene SQL*Plus-Sitzungen A und B verbinden sich als LAB_OWNER mit derselben PDB. Beide verwenden READ COMMITTED und deaktiviertes Autocommit. Eine zusätzliche Diagnosesitzung benötigt passende Leserechte auf V$SESSION; dafür wird dem Lernbenutzer nicht pauschal DBA gewährt.

    1. Identität und Ausgangswert

    SQL*Plus – in A und B; SET ist ein Clientkommando
    SET AUTOCOMMIT OFF
    SELECT SYS_CONTEXT('USERENV','CON_NAME') AS container_name,
           SYS_CONTEXT('USERENV','SID') AS sid FROM dual;
    SELECT quantity FROM lab_order WHERE order_id=101;

    2. Vorhersagen, dann ausführen

    Session A – DML; noch kein COMMIT
    UPDATE lab_order SET quantity=quantity+1 WHERE order_id=101;

    Frage zuerst: Welchen Wert sieht B jetzt? Führe in B ein normales SELECT aus. Erwartung ist weiterhin 2, während A den eigenen unbestätigten Wert 3 sieht.

    Session B – DML wartet auf dieselbe Zeile
    UPDATE lab_order SET quantity=quantity+10 WHERE order_id=101;

    B wartet nun auf die offene Änderung von A. Ein normaler lesender Zugriff und ein konkurrierendes UPDATE haben unterschiedliche Anforderungen. Halte die SID-Werte fest; „ACTIVE“ allein sagt nicht, dass B gerade CPU verbraucht.

    3. Den Zusammenhang nachweisen

    SQL*Plus – separate Diagnosesitzung mit Leserechten in LABPDB
    SELECT sid, serial#, con_id, state, event,
           blocking_session_status, blocking_session,
           CASE WHEN state='WAITING'
                THEN ROUND(wait_time_micro/1000000,3)
           END AS current_wait_seconds
    FROM v$session
    WHERE username='LAB_OWNER'
    ORDER BY sid;

    Identifiziere B und prüfe, ob ihr bestätigter Blocker A ist. Beobachtung und Identität müssen zeitlich zusammenpassen. Das bloße Vorhandensein eines TX-Waits in irgendeiner Session beweist noch nicht diese konkrete Versuchskette.

    4. Auflösen und definiert zurückkehren

    Session A – gibt die unbestätigte Änderung zurück
    ROLLBACK;

    B kann danach das UPDATE abschließen. B sieht jetzt 12, weil As Änderung zurückgenommen wurde. Führe anschließend auch in B ROLLBACK aus. Ein erneutes SELECT in beiden Sessions muss wieder 2 zeigen. Wird B versehentlich bestätigt, ist das kein identischer Ausgangszustand; stelle die ausschließlich eigene Laborzeile bewusst wieder auf 2 und bestätige diese Rücksetzung.

    Musterlösung und Abnahmekriterien

    Bestanden: Du hast den Wert vor jedem Schritt vorhergesagt, die Blockierung über die passenden Sessionkennungen nachgewiesen und beide Transaktionen kontrolliert beendet. Transferfrage ohne sofortige Ausführung: Was ändert sich, wenn A statt ROLLBACK ein COMMIT ausführt? Im gezeigten einfachen Fall arbeitet B nach der Freigabe auf dem bestätigten Wert 3 weiter und erhält 13. Erkläre die unterschiedlichen sichtbaren Werte und halte die Art der Auflösung im Versuch fest.

    Transferaufgabe: Eine Störung ohne vorgegebene View untersuchen

    Ein Tutor stellt in einer eigenen Lernumgebung genau einen Fall bereit: einen fehlenden Objektgrant, eine offene blockierende Transaktion oder eine geschlossene Labor-PDB. Der Lernende erhält nur die betroffene Verbindung, das Symptom und den Zeitpunkt. Bereits sichtbare Lösungen bleiben zunächst geschlossen. Wenn kein Tutor verfügbar ist, verwende einen dokumentierten eigenen Versuch und wiederhole ihn später ohne die ursprüngliche Schrittfolge.

    • Formuliere zuerst zwei plausible Ursachen und eine Beobachtung, mit der du sie unterscheiden kannst.
    • Wähle selbst die erste Datenquelle. Begründe, weshalb sie zum Symptom passt und welche Rechte sie voraussetzt.
    • Halte Rohbefund, Zeitpunkt, Benutzer, Container und Interpretation getrennt fest.
    • Schlage die kleinste passende Maßnahme vor; führe sie nur in der eigenen Laborumgebung im richtigen Kontext aus.
    • Wiederhole den ursprünglichen fehlgeschlagenen Anwendungsversuch und dokumentiere auch den Rückweg.
    Musterlösung und Abnahmekriterien

    Eine überzeugende Lösung nennt nicht möglichst viele Views, sondern grenzt Ursachen mit wenigen passenden Nachweisen ein. „Login erfolgreich“ widerlegt keinen fehlenden Objektgrant. „CDB offen“ beweist keine offene PDB. Eine hohe Waitsumme ohne passenden Zeitpunkt beweist keine aktuelle Blockierung. Die Aufgabe ist erst abgeschlossen, wenn der ursprüngliche Arbeitsvorgang erneut geprüft und die verbleibende Unsicherheit benannt wurde.

    46. Prüfung & Quiz

    Wissen überprüfen, falsche Antworten nacharbeiten und gezielt zu den Fachkapiteln zurückkehren.

    Prüfungskompass
    Einfach gesagt Hier wird kein neues Fachwissen erklärt. Du testest, was du aus den Fachkapiteln verstanden hast.
    So arbeitest du damit Frage beantworten, Erklärung lesen und bei Unsicherheit direkt ins zuständige Fachkapitel zurückspringen.
    Nach diesem Kapitel Wissen festigen, Lücken erkennen und die 60-Fragen-Prüfung gezielt vorbereiten.

    So nutzt du die Prüfung

    Dieses Kapitel besteht aus zwei Teilen: In Teil A übst du einzelne Fragen mit Lösungen und Erklärungen. Weiter unten startest du in Teil B eine vollständige Prüfungssimulation mit 60 Fragen. Über die Links kannst du direkt zum gewünschten Teil springen.

    Beantworte zuerst die Frage ohne Hilfe. Öffne die Lösung erst danach und vergleiche nicht nur richtig/falsch, sondern auch die Begründung. Wenn ein Begriff unklar ist, nutze das Glossar; wenn der Zusammenhang fehlt, springe zurück in das passende Fachkapitel. Die Prüfung soll Verständnis kontrollieren, nicht Spezialbegriffe auswendig abfragen.

    Grundlage ist Oracle Database 19c. Pro Frage ist genau eine Antwort richtig. Lösungen erklären auch wichtige Grenzen; konkrete Versions-, Container- und Plattformangaben sind Teil der Aufgabe. Die 60-Fragen-Simulation mischt Themen und Antwortpositionen. Fixierte Fragen haben Vorrang vor der Themenverteilung. Dies ist eine Lernkontrolle, keine offizielle Oracle-Zertifizierungsprüfung.

    Der Pool umfasst 330 eigenständig formulierte Fragen zu Grundlagen und Diagnosefällen. Mehrere Fragen können denselben Themenbereich aus unterschiedlichen Blickwinkeln prüfen.

    Verständnis statt Antwortbuchstaben prüfen

    Begründe nach jeder Aufgabe auch, warum die beiden anderen Antworten nicht passen. Schreibe bei Unsicherheit den konkreten Begriff auf und nutze den Kapitelverweis der Lösung. Beispiel: Instanz betrifft laufenden Speicher und Prozesse; Datenbankdateien bleiben über deren Ende hinaus bestehen. Eine zufällig richtige Auswahl ohne diese Unterscheidung zeigt noch keine sichere Anwendung.

    Die Fragen sind eigene Lernaufgaben dieses Wikis. Eine Punktzahl daraus ist keine offizielle Zertifizierung und keine Freigabe für einen produktiven Eingriff. Übe schwierige Themen zunächst einzeln und nutze danach die vorhandene Prüfung.

    Oracle-DBA-Zertifizierungen: Wege, Sprache und seriöse Vorbereitung

    Stand der Einordnung: 10. Oktober 2026. Eine Zertifizierung bestätigt einen definierten Kenntnisstand für einen bestimmten Prüfungsweg. Sie ist nicht identisch mit der Teilnahme an einem Seminar und ersetzt keine praktische Betriebserfahrung. Das Wiki vermittelt und prüft Wissen mit eigenen Aufgaben; es ist kein offizieller Oracle-Prüfungskatalog.

    Für den 19c-Schwerpunkt: Der klassische Weg zum Oracle Database Administration 2019 Certified Professional umfasst 1Z0-082 – Administration I und 1Z0-083 – Administration II. Bereits vorhandene Zertifizierungen können andere Übergangswege ermöglichen. Prüfe deshalb die aktuellen Anforderungen des konkreten Credentials auf MyLearn. Administration I allein ist nicht automatisch der vollständige 2019-OCP-Abschluss.

    Administration I behandelt den grundlegenden DBA- und SQL-Bereich. Administration II führt insbesondere in Installation, Patchen, Upgrades, Multitenant sowie Backup und Recovery weiter. Englische Prüfungsvarianten sind verfügbar. Oracle führt auch gesonderte regionale Sprachvarianten, etwa Japanisch; die deutsche Sprache einer Informationsseite bedeutet nicht, dass die Prüfung deutsch angeboten wird. Vor dem Kauf werden Prüfungscode, angebotene Sprache und der ausgewählte Zertifizierungsweg abgeglichen.

    Neuere Generation: Oracle bietet außerdem den Lernpfad Oracle AI Database Administration Professional mit der Prüfung 1Z0-183. Ältere Links und Veröffentlichungen nennen noch 23ai. Verwende die aktuelle MyLearn-Seite zur Entscheidung über Produktgeneration, Voraussetzungen und Inhalte. Der dort aufgeführte offizielle Practice Exam ist eine gesonderte Lernressource, kein veröffentlichter Bestand der echten Prüfungsfragen.

    Welcher Fragenpool ist zugänglich? Öffentlich nutzbar sind die von Oracle veröffentlichten Themenlisten und Informationsseiten. Lernpfade, Labs und Practice Exams können einen angemeldeten beziehungsweise berechtigten MyLearn-Zugang voraussetzen. Der interne Bestand echter Zertifizierungsfragen ist nicht öffentlich verfügbar; dieses Wiki hat darauf keinen Zugriff. Hier enthaltene Fragen sind eigenständig formulierte Lernaufgaben. Die interne Simulation mit 60 Fragen und jeweils einer richtigen Antwort bildet nicht verbindlich Anzahl, Format oder Bewertung einer Oracle-Prüfung ab.

    Nachvollziehbare Vorbereitung: Wähle zuerst den Prüfungsweg. Übertrage seine aktuelle Themenliste in eine persönliche Liste mit „verstanden“, „im Labor durchgeführt“ und „noch offen“. Lerne schwierige Inhalte zunächst mit den deutschen Erklärungen; arbeite anschließend auch mit den englischen Fachbegriffen und der offiziellen Dokumentation. Teste praktische Abläufe in einer passenden Lernumgebung. Nutze danach einen offiziellen Practice Exam und arbeite die erkannten Wissenslücken gezielt nach. Eine gute Punktzahl in unserem Wiki ist ein Lernsignal, aber keine Bestehensgarantie.

    Gebühren, Laufzeiten, Terminangebote und Prüfungsdetails können sich ändern. Maßgeblich sind der aktuelle Oracle-Eintrag und die Angaben beim Buchen; ältere Studienleitfäden sind dafür keine verlässliche Termin- oder Preisquelle.

    Referenzen zu den fachlichen Präzisierungen

    Abgleich des bisherigen Pools: 7. Oktober 2026. Security-Ergänzung: 10. Oktober 2026; die Quellen stehen in den Kapiteln Verschlüsselung, Oracle Wallet und Hardening. Die folgenden Oracle-19c-Referenzen erläutern besonders fehleranfällige Aussagen des Pools. Weitere Quellen und Plattformangaben stehen in den verlinkten Fachkapiteln. REST/HTTP, ORDS, Shell und Betriebssysteme haben eigene Versionsbezüge.

    Prüfung 330 Fragen
    Fragenpool 330
    Richtig 0
    Bearbeitet 0
    Fortschritt 0 %
    Lernstand

    Teil A – Fragenkatalog zum Üben

    Ohne Abschauen: Die Auflösung erscheint erst nach Auswahl und Klick auf Antwort prüfen.
    Zufallsprinzip: Beim Laden und beim Zurücksetzen des Gesamtfortschritts werden Fragen und Antwortpositionen neu gemischt. Auch das Zurücksetzen einer einzelnen Frage mischt deren Antworten neu. Jede Frage besitzt genau drei inhaltliche Antwortmöglichkeiten. Die richtige Lösung ist intern an die Antwort selbst gebunden und nicht an A, B oder C.
    Frage 1ArchitekturLeicht
    Welche Beschreibung passt am besten zu „Oracle-Instanz“?
    Lösung und Begründung

    Richtige Antwort: SGA und laufende Oracle-Prozesse

    Eine Instanz besteht aus Speicherstrukturen und Prozessen. Die physischen Dateien bilden die Datenbank. Oracle trennt bewusst zwischen flüchtigen Laufzeitkomponenten und dauerhaft gespeicherten Daten. Die Instanz stellt Speicher und Prozesse bereit; die Datenbank liefert die physischen Dateien. Diese Trennung erklärt, warum nach einem Instanzabsturz häufig dieselben Datafiles wieder geöffnet werden können.

    Im Fachkapitel nachlesen

    Frage 2HintergrundprozesseLeicht
    Welche Beschreibung passt am besten zu „LGWR“?
    Lösung und Begründung

    Richtige Antwort: Redo aus dem Redo Log Buffer in Online Redo Logs schreiben

    LGWR schreibt das für den COMMIT erforderliche Redo in die Online Redo Logs; die wartende Foreground-Session wird nach Abschluss des erforderlichen Schreibens von Redo fortgesetzt. DBWn schreibt Datenblöcke. Oracle verteilt Aufgaben auf spezialisierte Hintergrundprozesse. LGWR, DBWn, CKPT, SMON, PMON, ARCn und LREG haben klar getrennte Zuständigkeiten. Wer Prozesse verwechselt, zieht aus Wait Events und Alertlog-Meldungen leicht falsche Schlüsse.

    Im Fachkapitel nachlesen

    Frage 3HintergrundprozesseMittel
    Welche Beschreibung passt am besten zu „CKPT“?
    Lösung und Begründung

    Richtige Antwort: Checkpoint-Fortschritt signalisieren und Checkpoint-Informationen in Controlfile und Datafile-Headern aktualisieren; DBWn schreibt die Dirty Buffers

    CKPT koordiniert. Die eigentlichen Dirty-Buffer-Writes führt DBWn aus. Oracle verteilt Aufgaben auf spezialisierte Hintergrundprozesse. LGWR, DBWn, CKPT, SMON, PMON, ARCn und LREG haben klar getrennte Zuständigkeiten. Wer Prozesse verwechselt, zieht aus Wait Events und Alertlog-Meldungen leicht falsche Schlüsse.

    Im Fachkapitel nachlesen

    Frage 4DictionaryLeicht
    Welche Objekte beschreibt DBA_OBJECTS innerhalb des aktuellen Containers?
    Lösung und Begründung

    Richtige Antwort: Objekte aller Schemas und ihren Status bei geeigneten Leserechten

    DBA_OBJECTS liefert Objektmetadaten im aktuellen Container. USER_OBJECTS beschränkt sich auf eigene Objekte; V$SESSION beschreibt Sessions. Für containerübergreifende Metadaten ist der passende CDB_-Kontext erforderlich.

    Im Fachkapitel nachlesen

    Frage 5SessionsMittel
    Wozu dienen SID und SERIAL# zusammen innerhalb einer Oracle-Instanz?
    Lösung und Begründung

    Richtige Antwort: Eine Session gemeinsam eindeutig für den aktuellen Lebenszyklus identifizieren

    SID kann nach dem Ende einer Session wiederverwendet werden. SERIAL# unterscheidet aufeinanderfolgende Sessions mit derselben SID. Bei mehreren Instanzen gehört zusätzlich INST_ID zur eindeutigen Zuordnung.

    Im Fachkapitel nachlesen

    Frage 6LocksMittel
    Welche Beschreibung passt am besten zu „enq: TX - row lock contention“?
    Lösung und Begründung

    Richtige Antwort: Warten auf einen TX-Enqueue; häufig wegen einer konkurrierenden Zeilenänderung, aber auch bei UNIQUE-Index- oder Bitmap-Index-Konflikten möglich

    Das Event weist auf eine blockierende Transaktion hin. Blocker, Waiter, SQL und Objekt müssen korreliert werden. Locks schützen Transaktionskonsistenz. Eine wartende Session ist nicht automatisch die Ursache; häufig hält eine andere Session eine offene Transaktion und damit den benötigten Lock.

    Im Fachkapitel nachlesen

    Frage 7PerformanceMittel
    Was lässt sich aus ELAPSED_TIME / NULLIF(EXECUTIONS,0) in V$SQL näherungsweise ableiten?
    Lösung und Begründung

    Richtige Antwort: Durchschnittliche Laufzeit je Ausführung annähern

    Der Quotient liefert eine durchschnittliche akkumulierte Zeit pro Ausführung in Mikrosekunden. Die Werte gelten für den jeweiligen Child Cursor seit Aufnahme beziehungsweise Laden, nicht automatisch für den beobachteten Zeitraum. Laufende Ausführungen und Parallelverarbeitung erschweren den Vergleich mit einer einzelnen gemessenen Antwortzeit.

    Im Fachkapitel nachlesen

    Frage 8Wait EventsLeicht
    Welche Beschreibung passt am besten zu „SQL*Net message from client“?
    Lösung und Begründung

    Richtige Antwort: Meist normaler Idle-Wait auf den nächsten Clientaufruf

    Der Server hat die vorherige Arbeit beendet und wartet auf den Client. Lange offene Transaktionen bleiben trotzdem prüfenswert. Wait Events sind Messpunkte, die zeigen, worauf Oracle wartet. Sie sind keine automatische Fehlerdiagnose. Idle-Waits sind häufig normal; Non-Idle-Waits müssen im Kontext des Störungszeitraums bewertet werden.

    Im Fachkapitel nachlesen

    Frage 9Wait EventsMittel
    Welche Beschreibung passt am besten zu „log file sync“?
    Lösung und Begründung

    Richtige Antwort: Session wartet beim COMMIT auf LGWR

    Viele kleine Commits oder hohe LGWR-I/O-Latenz erhöhen log file sync. Wait Events sind Messpunkte, die zeigen, worauf Oracle wartet. Sie sind keine automatische Fehlerdiagnose. Idle-Waits sind häufig normal; Non-Idle-Waits müssen im Kontext des Störungszeitraums bewertet werden.

    Im Fachkapitel nachlesen

    Frage 10MemoryMittel
    Welche Beschreibung passt am besten zu „ORA-04036“?
    Lösung und Begründung

    Richtige Antwort: PGA-Verbrauch der Instanz oder PDB überschreitet PGA_AGGREGATE_LIMIT

    ORA-04036 betrifft das geltende PGA_AGGREGATE_LIMIT der Instanz oder PDB. Die Grenzreaktion besitzt dokumentierte Ausnahmen und ist keine Zusage, dass die Belegung niemals darüber liegt. ORA-04031 betrifft Shared Memory in der SGA. Oracle nutzt gemeinsame SGA-Strukturen und prozessbezogene PGA-Strukturen. Memory-Fehler müssen daher zuerst dem richtigen Speicherbereich zugeordnet werden. ORA-04031 und ORA-04036 betreffen unterschiedliche Ursachen.

    Im Fachkapitel nachlesen

    Frage 11StorageLeicht
    Welche Beschreibung passt am besten zu „Tablespace“?
    Lösung und Begründung

    Richtige Antwort: Logischer Speichercontainer; permanente/UNDO-Tablespaces verwenden Datafiles, temporäre Tablespaces Tempfiles

    Tablespaces sind logisch, Datafiles physisch. Oracle-Speicher hat mehrere Ebenen: physischer Storage, Datafile, Tablespace, Segment, Extent und Block. Kapazitätsaussagen sind nur korrekt, wenn diese Ebenen nicht miteinander vermischt werden.

    Im Fachkapitel nachlesen

    Frage 12StorageMittel
    Welche Beschreibung passt am besten zu „DBA_SEGMENTS.BYTES“?
    Lösung und Begründung

    Richtige Antwort: Allokierten Segmentplatz

    Allokierter Platz kann freien Raum innerhalb des Segments enthalten. Oracle-Speicher hat mehrere Ebenen: physischer Storage, Datafile, Tablespace, Segment, Extent und Block. Kapazitätsaussagen sind nur korrekt, wenn diese Ebenen nicht miteinander vermischt werden.

    Im Fachkapitel nachlesen

    Frage 13RedoLeicht
    Welche Beschreibung passt am besten zu „Online Redo Log“?
    Lösung und Begründung

    Richtige Antwort: Änderungsinformationen für Recovery speichern

    Redo enthält Änderungsinformationen für Recovery. Beim synchronen COMMIT wartet Oracle auf das dauerhafte Schreiben des zugehörigen Redo, nicht auf das sofortige Schreiben der geänderten Datenblöcke. COMMIT WRITE NOWAIT ist eine ausdrücklich zu unterscheidende asynchrone Variante.

    Redo dokumentiert Änderungen, damit Oracle sie für Recovery wiederholen kann. Ein synchron bestätigtes COMMIT wartet auf dauerhaft geschriebenes Redo, nicht auf den sofortigen Datafile-Write; eine ausdrücklich asynchrone Bestätigung hat andere Garantien.

    Im Fachkapitel nachlesen

    Frage 14RedoMittel
    Welche Beschreibung passt am besten zu „checkpoint not complete“?
    Lösung und Begründung

    Richtige Antwort: Die nächste Redo-Gruppe ist wegen des noch nicht weit genug fortgeschrittenen Checkpoints nicht wiederverwendbar.

    checkpoint not complete bedeutet, dass der notwendige Checkpoint für die Wiederverwendung noch nicht abgeschlossen ist. Häufige Wechsel, kleine Gruppen oder langsame Datafile-Schreibvorgänge sind mögliche Zusammenhänge. Archivierungsengpässe müssen als eigener Befund unterschieden werden; ein Logwechsel setzt nicht voraus, dass alle Transaktionen beendet sind.

    Redo dokumentiert Änderungen, damit Oracle sie für Recovery wiederholen kann. Ein synchron bestätigtes COMMIT wartet auf dauerhaft geschriebenes Redo, nicht auf den sofortigen Datafile-Write; eine ausdrücklich asynchrone Bestätigung hat andere Garantien.

    Im Fachkapitel nachlesen

    Frage 15RMANLeicht
    Welche Beschreibung passt am besten zu „Incremental Level 0“?
    Lösung und Begründung

    Richtige Antwort: Vollständige Basis für spätere Level-1-Backups

    Full und Level 0 können alle verwendeten Blöcke enthalten. Nur Level 0 ist Incremental-Basis. RMAN verwaltet eine Recovery-Kette aus Datenbankbackups, Archived Logs, Controlfile-Metadaten und optional Recovery Catalog. Backup, Restore und Recover sind unterschiedliche Schritte.

    Im Fachkapitel nachlesen

    Frage 16RMANMittel
    Welche Beschreibung passt im RMAN-Befehl BACKUP ARCHIVELOG ... DELETE INPUT am besten zu „DELETE INPUT“?
    Lösung und Begründung

    Richtige Antwort: Nach erfolgreichem Backup die als Input verwendeten Archived Logs gemäß RMAN-Semantik entfernen

    Die Quelle wird erst nach erfolgreichem Backup entfernt; das Backup Piece bleibt. RMAN verwaltet eine Recovery-Kette aus Datenbankbackups, Archived Logs, Controlfile-Metadaten und optional Recovery Catalog. Backup, Restore und Recover sind unterschiedliche Schritte.

    Im Fachkapitel nachlesen

    Frage 17RMANSchwer
    Welche Beschreibung passt am besten zu „OPEN RESETLOGS“?
    Lösung und Begründung

    Richtige Antwort: Redo-Log-Sequenz zurücksetzen und eine neue Redo-Historie beginnen; RMAN behandelt dies als neue Database Incarnation

    PITR endet vor der alten Redo-Zukunft. RESETLOGS startet eine neue Recovery-Linie. RMAN verwaltet eine Recovery-Kette aus Datenbankbackups, Archived Logs, Controlfile-Metadaten und optional Recovery Catalog. Backup, Restore und Recover sind unterschiedliche Schritte.

    Im Fachkapitel nachlesen

    Frage 18ORA-FehlerMittel
    Welche Beschreibung passt am besten zu „ORA-01555“?
    Lösung und Begründung

    Richtige Antwort: Benötigte ältere Undo-Version ist nicht mehr verfügbar

    Lange Abfragen, hohe DML-Rate und unzureichende Undo-Historie sind typische Zusammenhänge. Eine ORA-Meldung ist häufig Teil eines Fehlerstacks. Die erste sichtbare Meldung ist nicht immer die eigentliche Ursache. Alertlog, Trace, Zeitpunkt und Begleitmeldungen gehören zusammen.

    Im Fachkapitel nachlesen

    Frage 19TroubleshootingLeicht
    Welche Beschreibung passt am besten zu „Methodisches Vorgehen“?
    Lösung und Begründung

    Richtige Antwort: Zustand erfassen, Hypothese bilden, read-only prüfen, Maßnahme planen

    Beweissicherung und reproduzierbare Diagnose verhindern Folgeschäden. Methodisches Troubleshooting beginnt mit Symptom und Zeitraum, formuliert Hypothesen und prüft sie zunächst read-only. Erst nach belegter Ursache wird eine Maßnahme geplant.

    Im Fachkapitel nachlesen

    Frage 20SQL / OptimizerMittel
    Welche Aussage zur Selektivität eines Prädikats ist richtig?
    Lösung und Begründung

    Richtige Antwort: Ein hochselektives Prädikat liefert nur einen kleinen Teil der Zeilen.

    Selektivität beschreibt, wie stark ein Prädikat eine Datenmenge einschränkt. Je kleiner der relevante Anteil, desto selektiver ist die Bedingung.

    Im Fachkapitel nachlesen

    Frage 21SQL / OptimizerMittel
    Was beschreibt Kardinalität in einem Execution Plan?
    Lösung und Begründung

    Richtige Antwort: Die vom Optimizer geschätzte Zeilenanzahl eines Plan-Schritts; tatsächliche Laufzeitzeilen werden separat als A-Rows ausgewiesen.

    CARDINALITY beziehungsweise E-Rows beschreibt die geschätzte Zeilenanzahl. A-Rows zeigt tatsächlich gemessene Zeilen, wenn Laufzeitstatistiken vorliegen. Bei mehrfach gestarteten Operationen ist zusätzlich Starts zu berücksichtigen.

    Im Fachkapitel nachlesen

    Frage 22SQL / OptimizerMittel
    Welche Aussage zu COST im Execution Plan ist korrekt?
    Lösung und Begründung

    Richtige Antwort: COST ist eine Optimizer-Schätzung und keine Laufzeit in Millisekunden.

    COST ist eine interne relative Schätzgröße des Optimizers. Reale Performance wird mit Laufzeit, Buffers, Reads, CPU und Waits beurteilt.

    Im Fachkapitel nachlesen

    Frage 23SQL / OptimizerMittel
    Warum ist die Spalte STARTS beim Lesen eines Plans wichtig?
    Lösung und Begründung

    Richtige Antwort: Ein billiger innerer Schritt kann durch sehr viele Starts insgesamt teuer werden.

    STARTS zeigt, wie oft ein Plan-Schritt gestartet wurde. Bei Nested Loops oder korrelierten Unterabfragen kann sich Arbeit dadurch massiv multiplizieren.

    Im Fachkapitel nachlesen

    Frage 24SQL / OptimizerMittel
    Was ist ein Access Predicate?
    Lösung und Begründung

    Richtige Antwort: Eine Bedingung, die direkt zur Eingrenzung des Zugriffswegs genutzt wird.

    Access Predicates können einen Zugriffspfad direkt eingrenzen, beispielsweise einen Index Range Scan. Filter Predicates werden dagegen auf bereits gelesene Daten angewendet.

    Im Fachkapitel nachlesen

    Frage 25SQL / OptimizerMittel
    Welcher Hauptvorteil von Bind Variables ist für Cursor Sharing relevant?
    Lösung und Begründung

    Richtige Antwort: Die SQL-Struktur bleibt gleich, während Werte separat gebunden werden.

    Bind Variables trennen SQL-Struktur und Werte. Dadurch kann derselbe SQL-Text leichter wiederverwendet werden, ohne dass jeder Wert einen neuen Text erzeugt.

    Im Fachkapitel nachlesen

    Frage 26Oracle NetMittel
    Was beweist ein erfolgreiches TNSping?
    Lösung und Begründung

    Richtige Antwort: Der Net Service Name kann aufgelöst werden und der zugehörige Listener ist mit TNSPING erreichbar; ein Datenbank-Login wird damit nicht getestet.

    TNSping testet keine vollständige Datenbankanmeldung. Es zeigt vor allem, dass die Net-Konfiguration aufgelöst und der Listener-Endpunkt erreicht werden kann.

    Im Fachkapitel nachlesen

    Frage 27Oracle NetMittel
    Was ist ein SERVICE_NAME?
    Lösung und Begründung

    Richtige Antwort: Ein logischer Dienst für Clientverbindungen.

    Services bilden logische Anwendungs- oder Workload-Ziele und sind von SID, DB_NAME und Prozesskennungen zu unterscheiden.

    Im Fachkapitel nachlesen

    Frage 28Oracle NetMittel
    Warum ist TNS_ADMIN bei mehreren Oracle Homes wichtig?
    Lösung und Begründung

    Richtige Antwort: Es kann festlegen, aus welchem Verzeichnis Oracle-Net-Konfigurationsdateien gelesen werden.

    TNS_ADMIN kann auf ein zentrales Verzeichnis für tnsnames.ora und sqlnet.ora zeigen. Das vermeidet die falsche Annahme, dass immer die Datei im aktuellen ORACLE_HOME verwendet wird.

    Im Fachkapitel nachlesen

    Frage 29SessionsMittel
    Was bedeutet STATUS='ACTIVE' in V$SESSION?
    Lösung und Begründung

    Richtige Antwort: Die Session befindet sich in einem aktiven Call; sie kann dabei CPU nutzen oder warten.

    ACTIVE beschreibt einen aktiven Call, nicht zwingend CPU-Verbrauch. Eine aktive Session kann auf I/O, Locks, Redo oder andere Events warten.

    Im Fachkapitel nachlesen

    Frage 30SessionsMittel
    Wozu wird V$PROCESS typischerweise mit V$SESSION verbunden?
    Lösung und Begründung

    Richtige Antwort: Um Datenbanksessions Oracle-/OS-Prozessen zuzuordnen.

    V$SESSION.PADDR kann mit V$PROCESS.ADDR verbunden werden. So lassen sich Session, Oracle-Prozess und Betriebssystemprozess korrelieren.

    Im Fachkapitel nachlesen

    Frage 31SessionsMittel
    Welche View zeigt Current und Max Utilization für PROCESSES und SESSIONS?
    Lösung und Begründung

    Richtige Antwort: V$RESOURCE_LIMIT

    V$RESOURCE_LIMIT zeigt aktuelle und maximale Nutzung sowie das konfigurierte Limit für Ressourcen wie processes und sessions.

    Im Fachkapitel nachlesen

    Frage 32LocksMittel
    Was ist bei einer blockierten Session der erste sinnvolle DBA-Schritt?
    Lösung und Begründung

    Richtige Antwort: Blocker, Waiter, SQL, Transaktion und Kontext read-only dokumentieren.

    Vor einer Maßnahme müssen Blocker, Waiter, offene Transaktion, SQL und Anwendungskontext gesichert werden. Das Beenden einer Session ist keine Diagnose.

    Im Fachkapitel nachlesen

    Frage 33MemoryMittel
    Welche Aussage zur PGA ist korrekt?
    Lösung und Begründung

    Richtige Antwort: Sie ist prozessbezogener Arbeitsspeicher und nicht gemeinsam wie die SGA.

    Die PGA gehört zu einem Prozess und enthält unter anderem Sortier-/Hash-Arbeitsbereiche und Prozesszustand. Die SGA ist dagegen gemeinsam.

    Im Fachkapitel nachlesen

    Frage 34MemoryMittel
    Was ist bei steigender PGA sinnvoll zuerst zu prüfen?
    Lösung und Begründung

    Richtige Antwort: V$PGASTAT, Workareas und die größten PGA-Prozesse.

    PGA-Diagnose benötigt Gesamtverbrauch, Peak, Over Allocation sowie Onepass/Multipass und die verursachenden Prozesse/SQL.

    Im Fachkapitel nachlesen

    Frage 35MemoryMittel
    Warum beweist eine Buffer Cache Hit Ratio von 99 % keine gute SQL-Performance?
    Lösung und Begründung

    Richtige Antwort: Eine SQL kann trotzdem Millionen unnötige Buffer Gets erzeugen.

    Eine hohe Hit Ratio sagt nur, dass ein großer Anteil aus dem Cache bedient wurde. Die absolute logische Arbeitsmenge kann trotzdem extrem hoch sein.

    Im Fachkapitel nachlesen

    Frage 36Wait EventsMittel
    Was sollte bei erhöhtem log file sync zusätzlich betrachtet werden?
    Lösung und Begründung

    Richtige Antwort: log file parallel write, Commit-Rate und Redo-Rate.

    log file sync ist ein Foreground-Commit-Wait. Der Zusammenhang mit LGWR-I/O, log file parallel write und Commit-Frequenz hilft bei der Ursachenabgrenzung.

    Im Fachkapitel nachlesen

    Frage 37Wait EventsMittel
    Was bedeutet db file sequential read typischerweise?
    Lösung und Begründung

    Richtige Antwort: Single-Block-Read, häufig im Umfeld indexgestützter Zugriffe.

    Das Event beschreibt einen Single-Block-I/O. Ob ein Problem vorliegt, hängt von Anzahl, Latenz, SQL und Zugriffspfad ab.

    Im Fachkapitel nachlesen

    Frage 38Wait EventsMittel
    Wie sollten Idle Waits in einer Performanceanalyse grundsätzlich behandelt werden?
    Lösung und Begründung

    Richtige Antwort: Für die Priorisierung meist zunächst ausblenden, aber im passenden Kontext nicht ignorieren.

    Idle Waits beschreiben oft erwartetes Warten auf neue Arbeit. Bei Netzwerk-/Anwendungsfragen können sie trotzdem relevant sein.

    Im Fachkapitel nachlesen

    Frage 39RedoMittel
    Worauf wartet COMMIT WRITE WAIT vor der erfolgreichen Rückmeldung für die Dauerhaftigkeit der Transaktion?
    Lösung und Begründung

    Richtige Antwort: Auf das notwendige Schreiben von Redo durch LGWR.

    Bei synchroner Bestätigung wartet die Session auf das erforderliche Schreiben von Redo durch LGWR. Dirty Buffers können später durch DBWn geschrieben werden. COMMIT WRITE NOWAIT hat eine andere Bestätigungssemantik.

    Im Fachkapitel nachlesen

    Frage 40RedoMittel
    Welche Aussage zu häufigen Log Switches ist korrekt?
    Lösung und Begründung

    Richtige Antwort: Switchrate, Redo-Rate, Log-Größe und Checkpoint-/Archive-Kontext gemeinsam bewerten.

    Eine feste Minutenregel allein reicht nicht. Workload, Redo-Volumen, Loggröße, Archiver und Checkpoint-Verhalten gehören zusammen.

    Im Fachkapitel nachlesen

    Frage 41StorageMittel
    Was ist bei DBA_TABLES.NUM_ROWS zu beachten?
    Lösung und Begründung

    Richtige Antwort: Der Wert stammt typischerweise aus Optimizer-Statistiken und ist nicht zwingend live.

    NUM_ROWS repräsentiert den Statistikstand. LAST_ANALYZED hilft zu beurteilen, wie aktuell diese Information ist.

    Im Fachkapitel nachlesen

    Frage 42StorageMittel
    Was passiert nach einem großen DELETE typischerweise mit der Segmentgröße?
    Lösung und Begründung

    Richtige Antwort: Sie schrumpft nicht automatisch im gleichen Verhältnis wie die gelöschten Zeilen.

    DELETE entfernt Zeilen logisch, reduziert aber nicht automatisch allokierte Extents oder die High Water Mark.

    Im Fachkapitel nachlesen

    Frage 43StorageMittel
    Wann ist hohe TEMP-Nutzung nicht automatisch ein Fehler?
    Lösung und Begründung

    Richtige Antwort: Bei großen Sort-/Hash-Operationen kann TEMP Teil eines legitimen Plans sein.

    Große Workareas können nach TEMP ausweichen. Entscheidend sind SQL, Workarea-Verhalten, Onepass/Multipass und I/O-Kosten.

    Im Fachkapitel nachlesen

    Frage 44RMANMittel
    Welchen Zweck hat ein RMAN Recovery Catalog?
    Lösung und Begründung

    Richtige Antwort: Er speichert zusätzliche RMAN-Metadaten zentral außerhalb des Target-Controlfiles.

    Der Recovery Catalog verwaltet RMAN-Metadaten zentral und kann Informationen über längere Zeit sowie mehrere Targets bereitstellen.

    Im Fachkapitel nachlesen

    Frage 45RMANMittel
    Was macht RMAN CROSSCHECK grundsätzlich?
    Lösung und Begründung

    Richtige Antwort: Es prüft, ob im RMAN-Repository registrierte Backup-Objekte am erwarteten Speicherort zugreifbar sind, und aktualisiert ihren Repository-Status entsprechend.

    CROSSCHECK prüft, ob registrierte Backupobjekte am erwarteten Ort verfügbar sind, und aktualisiert ihren Repository-Status entsprechend.

    Im Fachkapitel nachlesen

    Frage 46RMANMittel
    Wovon hängt DELETE OBSOLETE ab?
    Lösung und Begründung

    Richtige Antwort: Primär von der konfigurierten RMAN-Retention-Policy und dem daraus berechneten Recovery-Bedarf.

    Ob ein Backup obsolete ist, wird anhand der Retention Policy bestimmt, beispielsweise Recovery Window oder Redundancy.

    Im Fachkapitel nachlesen

    Frage 47Benutzer & RechteLeicht
    Welches Privileg wird typischerweise für eine normale Datenbankanmeldung benötigt?
    Lösung und Begründung

    Richtige Antwort: CREATE SESSION

    CREATE SESSION erlaubt die Anmeldung; Benutzeranlage allein reicht nicht.

    Im Fachkapitel nachlesen

    Frage 48Benutzer & RechteMittel
    Was ist der Hauptzweck einer Rolle?
    Lösung und Begründung

    Richtige Antwort: Privilegien logisch bündeln und mehreren Benutzern zuweisen

    Rollen bündeln System- und Objektprivilegien für wiederkehrende fachliche Aufgaben.

    Im Fachkapitel nachlesen

    Frage 49Benutzer & RechteMittel
    Was ist ein Objektprivileg?
    Lösung und Begründung

    Richtige Antwort: Ein Recht auf ein konkretes Objekt wie SELECT ON APP.KUNDE

    Objektprivilegien beziehen sich auf konkrete Tabellen, Views, Packages oder andere Objekte.

    Im Fachkapitel nachlesen

    Frage 50Benutzer & RechteSchwer
    Welche Aussage zu WITH GRANT OPTION ist richtig?
    Lösung und Begründung

    Richtige Antwort: Der Empfänger kann ein Objektprivileg weitervergeben

    WITH GRANT OPTION betrifft Objektprivilegien und erlaubt deren Weitergabe.

    Im Fachkapitel nachlesen

    Frage 51Benutzer & RechteSchwer
    Welche View zeigt Rollen, die einem Grantee gewährt wurden?
    Lösung und Begründung

    Richtige Antwort: DBA_ROLE_PRIVS

    DBA_ROLE_PRIVS zeigt Rollenzuweisungen und ADMIN_OPTION.

    Im Fachkapitel nachlesen

    Frage 52Benutzer & RechteMittel
    Was bedeutet ORA-01950 typischerweise?
    Lösung und Begründung

    Richtige Antwort: Keine ausreichende Quota auf einem Tablespace

    ORA-01950 weist typischerweise auf fehlende Tablespace-Quota hin.

    Im Fachkapitel nachlesen

    Frage 53Benutzer & RechteMittel
    Was unterscheidet System- von Objektprivilegien?
    Lösung und Begründung

    Richtige Antwort: Systemprivilegien erlauben Datenbankaktionen; Objektprivilegien beziehen sich auf konkrete Objekte

    Die Reichweite ist unterschiedlich: Datenbankaktion versus konkretes Objekt.

    Im Fachkapitel nachlesen

    Frage 54Benutzer & RechteSchwer
    Warum ist Least Privilege wichtig?
    Lösung und Begründung

    Richtige Antwort: Es begrenzt Rechte auf das fachlich notwendige Minimum

    Least Privilege reduziert unnötige Berechtigungen und vereinfacht Sicherheitsbewertung.

    Im Fachkapitel nachlesen

    Frage 55Benutzer & RechteMittel
    Welche View zeigt gewährte Objektprivilegien auf Objektebene?
    Lösung und Begründung

    Richtige Antwort: DBA_TAB_PRIVS

    DBA_TAB_PRIVS enthält Objektgrants einschließlich des Empfängers GRANTEE. Dieser kann ein Benutzer, eine Rolle oder PUBLIC sein. Einzelne Spaltengrants stehen in DBA_COL_PRIVS; die View allein ist deshalb keine vollständige effektive Rechteanalyse.

    Im Fachkapitel nachlesen

    Frage 56Benutzer & RechteSchwer
    Wann können direkte Grants statt Rollen besonders relevant sein?
    Lösung und Begründung

    Richtige Antwort: Bei bestimmten PL/SQL-Definer-Rights-Abhängigkeiten

    PL/SQL-Objekte können für Kompilierung/Ausführung direkte Objektprivilegien benötigen.

    Im Fachkapitel nachlesen

    Frage 57Benutzer & RechteLeicht
    Was steuert eine Tablespace-Quota?
    Lösung und Begründung

    Richtige Antwort: Wie viel Platz ein Benutzer in einem permanenten Tablespace belegen darf

    Quotas begrenzen Segmentplatz eines Users im Tablespace.

    Im Fachkapitel nachlesen

    Frage 58Benutzer & RechteMittel
    Wozu dient ein Profile?
    Lösung und Begründung

    Richtige Antwort: Unter anderem zur Definition von Passwort- und Accountregeln

    Profiles können Passwort-Lifetime, Fehlversuche, Lock-Zeiten und Ressourcengrenzen definieren.

    Im Fachkapitel nachlesen

    Frage 59UNDO & FlashbackLeicht
    Wofür wird UNDO benötigt?
    Lösung und Begründung

    Richtige Antwort: Rollback und Read Consistency

    UNDO enthält Informationen für Rollback und konsistente ältere Datenstände.

    Im Fachkapitel nachlesen

    Frage 60UNDO & FlashbackMittel
    Welche View zeigt intervallbasierte UNDO-Statistiken?
    Lösung und Begründung

    Richtige Antwort: V$UNDOSTAT

    V$UNDOSTAT liefert unter anderem UNDOBLKS, MAXQUERYLEN und TUNED_UNDORETENTION.

    Im Fachkapitel nachlesen

    Frage 61UNDO & FlashbackSchwer
    Was bedeutet EXPIRED bei DBA_UNDO_EXTENTS?
    Lösung und Begründung

    Richtige Antwort: Das Undo kann bei Platzbedarf wiederverwendet werden

    EXPIRED Undo muss für Retention nicht mehr geschützt werden und kann wiederverwendet werden.

    Im Fachkapitel nachlesen

    Frage 62UNDO & FlashbackMittel
    Was macht AS OF TIMESTAMP?
    Lösung und Begründung

    Richtige Antwort: Es liest einen konsistenten historischen Datenstand zu einem angegebenen Zeitpunkt, soweit die dafür erforderlichen Undo-Informationen noch verfügbar sind

    Flashback Query kann eine Tabelle zu einem früheren Zeitpunkt logisch lesen.

    Im Fachkapitel nachlesen

    Frage 63UNDO & FlashbackMittel
    Was zeigt eine Flashback Versions Query?
    Lösung und Begründung

    Richtige Antwort: Mehrere Versionen einer Zeile über einen Zeitraum

    VERSIONS BETWEEN kann Änderungen an Zeilen über einen Zeitraum sichtbar machen.

    Im Fachkapitel nachlesen

    Frage 64UNDO & FlashbackSchwer
    Welche Daten benötigt Flashback Database im Unterschied zu Flashback Query?
    Lösung und Begründung

    Richtige Antwort: Flashback Logs sowie erforderliches Redo für den Zielzeitpunkt

    Flashback Database setzt Datenblöcke mithilfe von Flashback Logs zurück und verwendet Redo für den Zielstand. Flashback Query liest dagegen frühere Zeilenversionen aus Undo. Voraussetzungen, verfügbare Historie und Edition sind vor dem Einsatz zu prüfen.

    Im Fachkapitel nachlesen

    Frage 65UNDO & FlashbackMittel
    Was ist TUNED_UNDORETENTION?
    Lösung und Begründung

    Richtige Antwort: Von Oracle automatisch ermittelte Undo-Retention-Dauer in Sekunden

    TUNED_UNDORETENTION ist Oracles ermittelte Aufbewahrungsdauer in Sekunden. Sie ist keine allgemeine Zusage, dass jede gewünschte historische Version verfügbar ist; Platz, Last, Retention Guarantee und die konkrete Undo-Situation bleiben relevant.

    Im Fachkapitel nachlesen

    Frage 66UNDO & FlashbackSchwer
    Welche Kombination ist bei ORA-01555 besonders wichtig?
    Lösung und Begründung

    Richtige Antwort: Lange Abfrage, Undo-Verbrauch und verfügbare Retention

    Snapshot too old muss mit Query-Laufzeit und Undo-Wiederverwendung korreliert werden.

    Im Fachkapitel nachlesen

    Frage 67UNDO & FlashbackLeicht
    Was bedeutet ACTIVE bei einem UNDO-Extent?
    Lösung und Begründung

    Richtige Antwort: Undo wird noch von einer aktiven Transaktion benötigt

    ACTIVE Undo darf nicht überschrieben werden, solange die Transaktion es benötigt.

    Im Fachkapitel nachlesen

    Frage 68UNDO & FlashbackMittel
    Wofür kann CURRENT_SCN verwendet werden?
    Lösung und Begründung

    Richtige Antwort: Als logischer Datenbankzeitpunkt für Analyse und Flashback-Bezug

    SCNs ordnen Datenbankänderungen logisch zeitlich ein.

    Im Fachkapitel nachlesen

    Frage 69UNDO & FlashbackSchwer
    Warum garantiert UNDO_RETENTION allein keine feste Aufbewahrungsdauer?
    Lösung und Begründung

    Richtige Antwort: Weil Workload, Platz und Retention-Garantie die tatsächliche Verfügbarkeit beeinflussen

    UNDO_RETENTION ist grundsätzlich ein Zielwert; verfügbare Undo-Kapazität bleibt entscheidend.

    Im Fachkapitel nachlesen

    Frage 70Data PumpLeicht
    Welches Werkzeug führt einen Data-Pump-Export aus?
    Lösung und Begründung

    Richtige Antwort: expdp

    expdp ist der Data-Pump-Export-Client.

    Im Fachkapitel nachlesen

    Frage 71Data PumpLeicht
    Welches Werkzeug führt einen Data-Pump-Import aus?
    Lösung und Begründung

    Richtige Antwort: impdp

    impdp startet einen Data-Pump-Import. Die Quelle kann ein Dump-Dateisatz oder bei einem Netzwerkimport eine Datenbankverbindung über NETWORK_LINK sein. expdp ist das Exportwerkzeug.

    Im Fachkapitel nachlesen

    Frage 72Data PumpMittel
    Wozu dient ein Directory Object?
    Lösung und Begründung

    Richtige Antwort: Es verweist auf einen serverseitigen OS-Pfad für Data Pump

    Data Pump arbeitet serverseitig über Oracle Directory Objects.

    Im Fachkapitel nachlesen

    Frage 73Data PumpMittel
    Was macht REMAP_SCHEMA?
    Lösung und Begründung

    Richtige Antwort: Es importiert Objekte eines Quellschemas in ein anderes Zielschema

    REMAP_SCHEMA ordnet Schema-Owner beim Import neu zu.

    Im Fachkapitel nachlesen

    Frage 74Data PumpMittel
    Was macht REMAP_TABLESPACE?
    Lösung und Begründung

    Richtige Antwort: Es lenkt importierte Objekte in einen anderen Tablespace

    REMAP_TABLESPACE ändert das Ziel für betroffene Objekte.

    Im Fachkapitel nachlesen

    Frage 75Data PumpSchwer
    Wozu dient SQLFILE bei impdp?
    Lösung und Begründung

    Richtige Antwort: DDL aus dem Dump in eine Datei schreiben, ohne es auszuführen

    SQLFILE schreibt die für den Import vorbereitete DDL in eine Datei, ohne diese DDL auszuführen. Das ist eine Vorabprüfung, aber kein vollständiger Probelauf: Die Datei wird tatsächlich angelegt, und spätere Ausführungsfehler sind damit nicht ausgeschlossen.

    Im Fachkapitel nachlesen

    Frage 76Data PumpMittel
    Was bedeutet CONTENT=METADATA_ONLY?
    Lösung und Begründung

    Richtige Antwort: Nur Metadaten/Objektdefinitionen exportieren oder importieren

    METADATA_ONLY schließt die eigentlichen Tabellendaten aus.

    Im Fachkapitel nachlesen

    Frage 77Data PumpMittel
    Wozu dient %U im DUMPFILE-Namen?
    Lösung und Begründung

    Richtige Antwort: Zur Erzeugung mehrerer Dump-Dateien, etwa bei Parallelisierung

    %U wird durch eine laufende Nummer ersetzt und unterstützt Dumpfile-Sets.

    Im Fachkapitel nachlesen

    Frage 78Data PumpSchwer
    Was ist bei TABLE_EXISTS_ACTION=REPLACE wichtig?
    Lösung und Begründung

    Richtige Antwort: Die vorhandene Tabelle kann ersetzt werden und das ist eine verändernde Aktion

    Bei REPLACE wird eine passende vorhandene Tabelle gelöscht und aus dem Dump neu angelegt. Dadurch können Daten und Objektdefinitionen betroffen sein. Das ist eine schreibende Importaktion und muss vorab einschließlich abhängiger Objekte geprüft werden.

    Im Fachkapitel nachlesen

    Frage 79Data PumpMittel
    Welche View zeigt Data-Pump-Jobs?
    Lösung und Begründung

    Richtige Antwort: DBA_DATAPUMP_JOBS

    DBA_DATAPUMP_JOBS zeigt Zustand, Modus und Sessions von Data-Pump-Jobs.

    Im Fachkapitel nachlesen

    Frage 80Data PumpSchwer
    Warum ist Data Pump kein Ersatz für RMAN?
    Lösung und Begründung

    Richtige Antwort: Data Pump ist logisch; RMAN dient physischem Backup und Recovery

    Die Werkzeuge lösen unterschiedliche Aufgaben und ergänzen sich.

    Im Fachkapitel nachlesen

    Frage 81Data PumpMittel
    Was bewirkt QUERY bei Data Pump?
    Lösung und Begründung

    Richtige Antwort: Es kann die zu exportierende Zeilenmenge filtern

    QUERY schränkt Tabellenzeilen anhand einer Bedingung ein.

    Im Fachkapitel nachlesen

    Frage 82PatchmanagementLeicht
    Welches Werkzeug zeigt den Oracle-Home-Patchbestand mit lsinventory?
    Lösung und Begründung

    Richtige Antwort: OPatch

    opatch lsinventory zeigt installierte Komponenten und Patches im Oracle Home.

    Im Fachkapitel nachlesen

    Frage 83PatchmanagementMittel
    Was ist die Aufgabe von datapatch?
    Lösung und Begründung

    Richtige Antwort: Erforderliche SQL-Patchanpassungen in Datenbanken anwenden

    datapatch ergänzt Binary Patches um erforderliche SQL-Änderungen und Registry-Einträge.

    Im Fachkapitel nachlesen

    Frage 84PatchmanagementMittel
    Welche View zeigt SQL-Patchregistrierungen?
    Lösung und Begründung

    Richtige Antwort: DBA_REGISTRY_SQLPATCH

    DBA_REGISTRY_SQLPATCH dokumentiert Aktionen und Status von SQL-Patches.

    Im Fachkapitel nachlesen

    Frage 85PatchmanagementSchwer
    Warum muss vor einem RU nach One-off-Konflikten gesucht werden?
    Lösung und Begründung

    Richtige Antwort: Vorhandene One-offs können mit dem neuen Patch kollidieren oder bereits enthalten sein

    Patchkonflikte gehören in die Vorbereitung und sollten nicht erst im Wartungsfenster auffallen.

    Im Fachkapitel nachlesen

    Frage 86PatchmanagementMittel
    OPatch zeigt das vorgesehene RU im verwendeten Oracle Home. DBA_REGISTRY_SQLPATCH meldet für dessen APPLY jedoch WITH ERRORS. Was ist zu tun?
    Lösung und Begründung

    Richtige Antwort: Datapatch-Protokolle und den Status der betroffenen Datenbank beziehungsweise PDB prüfen und die SQL-Patchphase gemäß Patch-Readme korrigieren.

    Binary- und SQL-Patchphase sind getrennt zu prüfen. WITH ERRORS ist kein erfolgreicher SQL-Patchabschluss. Die Registry dokumentiert Versuche; zugehörige Logs, Container und Patch-Readme bestimmen das weitere Vorgehen.

    Im Fachkapitel nachlesen

    Frage 87PatchmanagementLeicht
    Was sollte vor und nach einem Patch gesichert werden?
    Lösung und Begründung

    Richtige Antwort: Der Inventory-/Patchbestand

    Vorher/Nachher-Inventarisierung schafft einen überprüfbaren Patchnachweis.

    Im Fachkapitel nachlesen

    Frage 88PatchmanagementMittel
    Welche View zeigt Status installierter Datenbankkomponenten?
    Lösung und Begründung

    Richtige Antwort: DBA_REGISTRY

    DBA_REGISTRY zeigt Komponenten, Versionen und Status.

    Im Fachkapitel nachlesen

    Frage 89PatchmanagementSchwer
    Warum ist ein Rollback-Plan Teil des Patchmanagements?
    Lösung und Begründung

    Richtige Antwort: Weil bei Fehlern ein definierter Rückweg benötigt wird

    Wartungsarbeiten brauchen Entscheidungspunkte und einen dokumentierten Rückweg.

    Im Fachkapitel nachlesen

    Frage 90PatchmanagementMittel
    Was sollte nach einer Patchwartung zusätzlich geprüft werden?
    Lösung und Begründung

    Richtige Antwort: Alert Log, Invalid Objects und Registry-Status

    Nachkontrolle muss technische Fehler, Komponentenstatus und Objektzustand abdecken.

    Im Fachkapitel nachlesen

    Frage 91PatchmanagementMittel
    Warum ist ORACLE_HOME bei mehreren Homes kritisch?
    Lösung und Begründung

    Richtige Antwort: Patchwerkzeuge müssen auf das tatsächlich verwendete Home zeigen

    Falsches Home kann zu falscher Bestandsaufnahme oder Wartung am falschen Softwarebestand führen.

    Im Fachkapitel nachlesen

    Frage 92PatchmanagementMittel
    Was ist ein One-off Patch?
    Lösung und Begründung

    Richtige Antwort: Ein Patch für einen spezifischen Fehler/Bug

    One-off Patches adressieren einzelne spezifische Probleme und müssen gegen RUs geprüft werden.

    Im Fachkapitel nachlesen

    Frage 93PraxisSchwer
    Welche Reihenfolge ist für eine neue Applikationsmigration am saubersten?
    Lösung und Begründung

    Richtige Antwort: Rechte-/Schema-Konzept prüfen, Data Pump planen, Zielstorage/Quotas prüfen, Import testen und validieren

    Migrationen sollten Rechte, Storage, Data Pump und Validierung als zusammenhängenden Prozess behandeln.

    Im Fachkapitel nachlesen

    Frage 94PraxisSchwer
    Welche Kombination hilft bei einem fehlgeschlagenen Patch am meisten?
    Lösung und Begründung

    Richtige Antwort: lsinventory, Patch-Logs, DBA_REGISTRY_SQLPATCH, Alert Log und Rollback-Plan

    Patchanalyse muss Softwarebestand, SQL-Patchstatus, Logs und Rückweg zusammenführen.

    Im Fachkapitel nachlesen

    Frage 95SQLLeicht
    Welche Klausel begrenzt bei einem SELECT die Zeilen anhand einer Bedingung?
    Lösung und Begründung

    Richtige Antwort: WHERE

    Warum die anderen Antworten falsch sind: ORDER BY sortiert bereits ausgewählte Ergebniszeilen; es legt keine Auswahlbedingung fest. GROUP BY fasst Zeilen zu Gruppen zusammen; es ersetzt keinen Zeilenfilter.

    Im Fachkapitel nachlesen

    Frage 96SQLLeicht
    Was bewirkt DISTINCT in einer SELECT-Abfrage?
    Lösung und Begründung

    Richtige Antwort: Es entfernt doppelte Kombinationen der ausgewählten Ausdrücke.

    Warum die anderen Antworten falsch sind: DISTINCT entfernt doppelte Ergebniskombinationen. Eine garantierte Reihenfolge erfordert zusätzlich ORDER BY. NULL wird durch DISTINCT nicht pauschal entfernt. Mehrfach gleiche Ergebniskombinationen werden zusammengefasst.

    Im Fachkapitel nachlesen

    Frage 97SQLLeicht
    Welche Bedingung prüft korrekt auf einen NULL-Wert?
    Lösung und Begründung

    Richtige Antwort: spalte IS NULL

    Warum die anderen Antworten falsch sind: Ein Vergleich mit NULL ergibt UNKNOWN. WHERE übernimmt nur TRUE; verwende IS NULL. NULL(spalte) ist kein Oracle-Prädikat zur NULL-Prüfung. Die Schreibweise lautet spalte IS NULL.

    Im Fachkapitel nachlesen

    Frage 98SQLMittel
    Was ist der wesentliche Unterschied zwischen COUNT(*) und COUNT(spalte)?
    Lösung und Begründung

    Richtige Antwort: COUNT(*) zählt Zeilen; COUNT(spalte) nur nicht-NULL-Werte.

    Warum die anderen Antworten falsch sind: COUNT(spalte) lässt Zeilen mit NULL in dieser Spalte ungezählt. COUNT(*) zählt auch diese Zeilen. Nur wenn alle betrachteten Spaltenwerte belegt sind, liefern beide dieselbe Zahl. Bei NULL unterscheiden sie sich.

    Im Fachkapitel nachlesen

    Frage 99SQLMittel
    Welche Klausel filtert Gruppen nach einer Aggregation wie COUNT(*)?
    Lösung und Begründung

    Richtige Antwort: HAVING

    Warum die anderen Antworten falsch sind: WHERE wird vor der Gruppierung ausgewertet. Eine Bedingung über das Gruppenergebnis gehört nach HAVING. ORDER BY legt die Ausgabereihenfolge fest. Gruppen herausfiltern kann es nicht.

    Im Fachkapitel nachlesen

    Frage 100SQLMittel
    Was liefert ein INNER JOIN?
    Lösung und Begründung

    Richtige Antwort: Passende Zeilenkombinationen, für die die JOIN-Bedingung erfüllt ist.

    Warum die anderen Antworten falsch sind: Alle linken Zeilen zu erhalten, auch ohne rechten Treffer, ist die Aufgabe eines LEFT OUTER JOIN. Ein INNER JOIN liefert die Kombinationen, deren Joinbedingung TRUE ist. NULL in einer Gleichheitsbedingung erzeugt keinen normalen Gleichheitstreffer.

    Im Fachkapitel nachlesen

    Frage 101SQLMittel
    Was gilt bei BETWEEN für die beiden Grenzwerte?
    Lösung und Begründung

    Richtige Antwort: Beide Grenzwerte sind eingeschlossen.

    Warum die anderen Antworten falsch sind: BETWEEN schließt beide angegebenen Grenzwerte ein; für offene Grenzen sind > und < erforderlich. Auch die untere Grenze ist eingeschlossen. BETWEEN entspricht hier einer unteren und einer oberen inklusiven Vergleichsgrenze.

    Im Fachkapitel nachlesen

    Frage 102SQLLeicht
    Welcher LIKE-Platzhalter steht für beliebig viele Zeichen?
    Lösung und Begründung

    Richtige Antwort: %

    Warum die anderen Antworten falsch sind: Der Unterstrich steht bei LIKE für genau ein Zeichen. Prozent steht für null oder mehr Zeichen. Das Sternchen ist bei SQL LIKE kein Platzhalter für beliebig viele Zeichen. Verwende %.

    Im Fachkapitel nachlesen

    Frage 103SQLMittel
    Warum sollte man sich bei Vergleichen nicht unnötig auf implizite Datentypkonvertierungen verlassen?
    Lösung und Begründung

    Richtige Antwort: Sie können Fehler verursachen und Index-/Zugriffswege beeinflussen.

    Warum die anderen Antworten falsch sind: Eine implizite Typkonvertierung führt nicht automatisch COMMIT aus. Das Problem betrifft Wertinterpretation und Ausführung, nicht die Transaktionsbestätigung. Oracle unterstützt implizite Konvertierungen. Gerade deren vom Kontext abhängiges Verhalten ist der Grund, passende Datentypen und explizite Formate zu verwenden.

    Im Fachkapitel nachlesen

    Frage 104SQLMittel
    Was ist der Unterschied zwischen UNION und UNION ALL?
    Lösung und Begründung

    Richtige Antwort: UNION entfernt Duplikate; UNION ALL behält sie bei.

    Warum die anderen Antworten falsch sind: UNION ALL behält Duplikate. UNION entfernt doppelte vollständige Ergebniszeilen. UNION ist nicht auf NUMBER beschränkt. Die korrespondierenden Spalten müssen hinsichtlich Zahl und Datentypgruppen kompatibel sein.

    Im Fachkapitel nachlesen

    Frage 105SQLMittel
    Welche Aussage zu ORDER BY ist korrekt?
    Lösung und Begründung

    Richtige Antwort: Ohne ORDER BY ist die Ergebnisreihenfolge nicht garantiert.

    Warum die anderen Antworten falsch sind: Ein Primärschlüssel erzwingt keine SELECT-Ausgabereihenfolge. Der Zugriffspfad kann sich ändern. DISTINCT garantiert Eindeutigkeit der Ergebniskombinationen, keine Sortierreihenfolge.

    Im Fachkapitel nachlesen

    Frage 106SQLMittel
    Welche Aussage zu einer skalaren Subquery ist korrekt?
    Lösung und Begründung

    Richtige Antwort: Sie liefert für die Auswertung höchstens eine Zeile mit einer Spalte.

    Warum die anderen Antworten falsch sind: Mehr als eine Ergebniszeile führt bei einer skalaren Subquery zu einem Fehler. Bei null Zeilen ist das skalare Ergebnis NULL. Eine skalare Subquery ist nicht auf Dictionary-Views beschränkt. Entscheidend sind eine Spalte und höchstens eine Zeile.

    Im Fachkapitel nachlesen

    Frage 107SQLMittel
    Wofür eignet sich EXISTS besonders?
    Lösung und Begründung

    Richtige Antwort: Zur Prüfung, ob eine Subquery mindestens eine passende Zeile liefert.

    Warum die anderen Antworten falsch sind: EXISTS prüft das Vorhandensein eines Treffers. Für alphabetische Ausgabe ist ORDER BY zuständig. NULL-Ersatz lässt sich etwa mit NVL oder COALESCE ausdrücken. EXISTS beantwortet eine Existenzfrage.

    Im Fachkapitel nachlesen

    Frage 108SQLMittel
    Welche View-Familie zeigt im Allgemeinen Objekte, auf die der aktuelle Benutzer zugreifen kann?
    Lösung und Begründung

    Richtige Antwort: ALL_*

    Warum die anderen Antworten falsch sind: DBA_-Views bieten bei passenden Rechten den administrativen Blick im jeweiligen Container. Sie sind nicht die allgemeine Liste der dem Benutzer zugänglichen Objekte. V$-Views beschreiben Laufzeit- und Instanzinformationen. Für zugängliche Objektmetadaten ist allgemein die ALL_-Familie zuständig.

    Im Fachkapitel nachlesen

    Frage 109SQLMittel
    Warum kann SELECT * in dauerhaft gepflegten DBA-Abfragen ungünstig sein?
    Lösung und Begründung

    Richtige Antwort: Es bindet die Abfrage unnötig an alle Spalten und kann mehr Daten liefern als benötigt.

    Warum die anderen Antworten falsch sind: SELECT * ist eine Abfrage und führt allein kein DDL aus. Das Wartungsproblem sind unnötige beziehungsweise später hinzukommende Ergebnisspalten. Ein Indexzugriff ist mit SELECT * nicht generell ausgeschlossen. Welche Zugriffe sinnvoll sind, entscheidet unter anderem die benötigte Datenmenge.

    Im Fachkapitel nachlesen

    Frage 110SQLMittel
    Welche Aussage zu CASE mit mehreren WHEN-Bedingungen ist korrekt?
    Lösung und Begründung

    Richtige Antwort: Bei searched CASE bestimmt die erste zutreffende WHEN-Bedingung das Ergebnis.

    Warum die anderen Antworten falsch sind: ELSE ist optional. Trifft keine WHEN-Bedingung zu und fehlt ELSE, ist das CASE-Ergebnis NULL. CASE ist ein Ausdruck und darf in der SELECT-Liste verwendet werden.

    Im Fachkapitel nachlesen

    Frage 111SQLMittel
    Was ist bei GROUP BY für eine nicht aggregierte Spalte in der SELECT-Liste grundsätzlich erforderlich?
    Lösung und Begründung

    Richtige Antwort: Sie muss Teil der Gruppierungslogik sein.

    Warum die anderen Antworten falsch sind: NVL ersetzt NULL-Werte, löst aber keinen Konflikt zwischen Gruppierung und nicht aggregierter Ergebnisspalte. Die Spalte muss kein Primärschlüssel sein. Entscheidend ist ihre zulässige Einbindung in den Gruppierungsausdruck.

    Im Fachkapitel nachlesen

    Frage 112SQLSchwer
    Warum ist bei DATE-Spalten datum BETWEEN DATE '2026-08-01' AND DATE '2026-08-31' für den kompletten August problematisch?
    Lösung und Begründung

    Richtige Antwort: Die obere Grenze ist 31.08.2026 00:00:00; spätere Uhrzeiten dieses Tages fehlen.

    Warum die anderen Antworten falsch sind: Oracle DATE enthält Datum und Uhrzeit bis auf Sekunden. Ein Datumsliteral ohne Uhrzeit bezeichnet Mitternacht. BETWEEN schließt die obere Grenze ein. Das Problem ist deren Uhrzeit 00:00:00. Für den ganzen Monat eignet sich datum >= DATE '2026-08-01' AND datum < DATE '2026-09-01'.

    Im Fachkapitel nachlesen

    Frage 113SolarisLeicht
    Welcher Befehl gibt gezielt nur den Hostnamen aus?
    Lösung und Begründung

    Richtige Antwort: hostname

    hostname zeigt den Hostnamen. whoami zeigt den effektiven Benutzernamen; pwd das aktuelle Verzeichnis. uname -a wäre als Gegenantwort ungeeignet, weil dessen Gesamtausgabe ebenfalls den Hostnamen enthalten kann.

    Im Fachkapitel nachlesen

    Frage 114SolarisMittel
    Welche Aussage zu df und du ist korrekt?
    Lösung und Begründung

    Richtige Antwort: df zeigt primär Filesystembelegung; du summiert Platzverbrauch von Dateien/Verzeichnissen.

    df und du betrachten Speicherverbrauch aus unterschiedlichen Perspektiven.

    Im Fachkapitel nachlesen

    Frage 115SolarisLeicht
    Welcher Befehl eignet sich unter Solaris zur laufenden Prozess-/Ressourcenbeobachtung?
    Lösung und Begründung

    Richtige Antwort: prstat

    prstat zeigt Prozess- und Ressourcennutzung fortlaufend an.

    Im Fachkapitel nachlesen

    Frage 116SolarisMittel
    Wozu dient pargs -e PID?
    Lösung und Begründung

    Richtige Antwort: Zum Anzeigen der Umgebung des angegebenen Prozesses.

    pargs unterstützt die Prozessdiagnose; mit -e kann die Prozessumgebung angezeigt werden.

    Im Fachkapitel nachlesen

    Frage 117SolarisMittel
    Welche Aussage zu svcs -xv ist richtig?
    Lösung und Begründung

    Richtige Antwort: Es zeigt Diagnoseinformationen zu problematischen SMF-Services.

    svcs -xv ist ein Diagnosebefehl für Services mit Problemen.

    Im Fachkapitel nachlesen

    Frage 118SolarisMittel
    Welcher Solaris-11.4-Befehl zeigt konfigurierte IP-Adressen an?
    Lösung und Begründung

    Richtige Antwort: ipadm show-addr

    ipadm show-addr zeigt die konfigurierten IP-Adressen.

    Im Fachkapitel nachlesen

    Frage 119SolarisMittel
    Was zeigt dladm show-link?
    Lösung und Begründung

    Richtige Antwort: Datalinks des Systems.

    dladm show-link zeigt physische und virtuelle Datalinks.

    Im Fachkapitel nachlesen

    Frage 120SolarisSchwer
    Warum sollte ein Load Average nicht direkt als CPU-Prozentwert interpretiert werden?
    Lösung und Begründung

    Richtige Antwort: Weil Load Average eine andere Metrik ist und im Kontext von CPUs und Workload bewertet werden muss.

    Load Average ist keine CPU-Prozentanzeige. Für eine Diagnose sind CPU-Anzahl und weitere Systemmetriken nötig.

    Im Fachkapitel nachlesen

    Frage 121viLeicht
    In welchem Modus startet vi normalerweise?
    Lösung und Begründung

    Richtige Antwort: Kommandomodus

    vi startet im Kommandomodus; mit i wechselt man in den Insert Mode.

    Im Fachkapitel nachlesen

    Frage 122viLeicht
    Welche Taste wechselt aus dem Insert Mode zurück in den vi-Kommandomodus?
    Lösung und Begründung

    Richtige Antwort: Esc

    Esc beendet den Insert Mode und kehrt zum Kommandomodus zurück.

    Im Fachkapitel nachlesen

    Frage 123viLeicht
    Welcher vi-Befehl speichert die Datei, ohne den Editor zu verlassen?
    Lösung und Begründung

    Richtige Antwort: :w

    :w schreibt die Datei und lässt vi geöffnet.

    Im Fachkapitel nachlesen

    Frage 124viMittel
    Was bewirkt :q! in vi?
    Lösung und Begründung

    Richtige Antwort: Ohne Speichern beenden und ungespeicherte Änderungen verwerfen.

    :q! beendet vi trotz ungespeicherter Änderungen und verwirft diese Änderungen.

    Im Fachkapitel nachlesen

    Frage 125viMittel
    Welcher vi-Befehl zeigt Zeilennummern an?
    Lösung und Begründung

    Richtige Antwort: :set nu

    :set nu aktiviert die Anzeige von Zeilennummern.

    Im Fachkapitel nachlesen

    Frage 126viMittel
    Was bewirkt dd im vi-Kommandomodus?
    Lösung und Begründung

    Richtige Antwort: Die aktuelle Zeile wird gelöscht und in den vi-Puffer übernommen.

    dd löscht die aktuelle Zeile; der Inhalt kann anschließend beispielsweise mit p wieder eingefügt werden.

    Im Fachkapitel nachlesen

    Frage 127crontabLeicht
    Welcher Befehl zeigt die eigene crontab an, ohne sie zu bearbeiten?
    Lösung und Begründung

    Richtige Antwort: crontab -l

    crontab -l listet die crontab des aufrufenden Benutzers.

    Im Fachkapitel nachlesen

    Frage 128crontabMittel
    Wofür stehen die fünf Zeitfelder einer Solaris-crontab in der richtigen Reihenfolge?
    Lösung und Begründung

    Richtige Antwort: Minute, Stunde, Tag des Monats, Monat, Wochentag

    Die fünf Felder sind Minute, Stunde, Tag des Monats, Monat und Wochentag.

    Im Fachkapitel nachlesen

    Frage 129crontabMittel
    Welche dokumentierte Solaris-Schreibweise führt einen Job zu Minute 0, 15, 30 und 45 jeder Stunde aus?
    Lösung und Begründung

    Richtige Antwort: 0,15,30,45 * * * *

    Oracle Solaris 11.4 dokumentiert Komma, Bindestrich und Stern als Sonderzeichen in den Zeitfeldern; die explizite Minutenliste ist dokumentationskonform.

    Im Fachkapitel nachlesen

    Frage 130crontabMittel
    Was bedeutet 15 3 * * 0 in einer Solaris-crontab?
    Lösung und Begründung

    Richtige Antwort: Jeden Sonntag um 03:15 Uhr.

    Minute 15, Stunde 3 und Wochentag 0 bedeuten Sonntag um 03:15 Uhr.

    Im Fachkapitel nachlesen

    Frage 131crontabSchwer
    Warum kann ein Oracle-Script interaktiv funktionieren, aber aus cron scheitern?
    Lösung und Begründung

    Richtige Antwort: cron verwendet nicht automatisch dieselbe Login-Umgebung; PATH und Oracle-Variablen können fehlen.

    Cron-Jobs sollten benötigte Umgebung und absolute Pfade kontrolliert bereitstellen, weil die interaktive Login-Umgebung nicht automatisch identisch ist.

    Im Fachkapitel nachlesen

    Frage 132crontabMittel
    Warum sollte man bei einem neuen cron-Job die Ausgabe zunächst in ein Log umleiten?
    Lösung und Begründung

    Richtige Antwort: Damit Fehler wie fehlende Programme, Variablen oder Rechte sichtbar bleiben.

    Ein Log erhält Standardausgabe und Standardfehler für die Diagnose. Eine sofortige Umleitung nach /dev/null kann wichtige Hinweise verbergen.

    Im Fachkapitel nachlesen

    Frage 133LinuxLeicht
    Welcher Befehl zeigt auf systemd-Systemen den Status eines Services read-only an?
    Lösung und Begründung

    Richtige Antwort: systemctl status SERVICE

    systemctl status liest den Servicezustand; restart würde ihn verändern.

    Im Fachkapitel nachlesen

    Frage 134LinuxLeicht
    Welcher Befehl zeigt auf modernen Linux-Systemen IP-Adressen an?
    Lösung und Begründung

    Richtige Antwort: ip addr

    ip addr zeigt die IP-Adresskonfiguration.

    Im Fachkapitel nachlesen

    Frage 135LinuxLeicht
    Wozu dient journalctl -u SERVICE?
    Lösung und Begründung

    Richtige Antwort: Zum Lesen von Journalmeldungen einer systemd-Unit.

    journalctl liest das systemd-Journal.

    Im Fachkapitel nachlesen

    Frage 136LinuxMittel
    Warum sollten Solaris-Kommandos nicht blind auf Linux übertragen werden?
    Lösung und Begründung

    Richtige Antwort: Werkzeuge und Optionen können sich unterscheiden.

    Unix-Konzepte ähneln sich, Implementierungen und Administration unterscheiden sich.

    Im Fachkapitel nachlesen

    Frage 137DictionaryLeicht
    Welche View-Familie zeigt typischerweise Objekte des aktuellen Benutzers?
    Lösung und Begründung

    Richtige Antwort: USER_*

    USER_* fokussiert auf Objekte des aktuellen Benutzers.

    Im Fachkapitel nachlesen

    Frage 138DictionaryLeicht
    Was ist eine V$-View primär?
    Lösung und Begründung

    Richtige Antwort: Eine dynamische Performance-Sicht auf laufzeitnahe Informationen.

    V$-Views werden aus internen laufzeitnahen Strukturen gespeist.

    Im Fachkapitel nachlesen

    Frage 139DictionaryMittel
    Ist Read Consistency für Dynamic Performance Views wie bei normalen Tabellen garantiert?
    Lösung und Begründung

    Richtige Antwort: Nein, die Daten werden dynamisch aktualisiert.

    Oracle weist darauf hin, dass diese dynamischen Sichten keine normalen Tabellen sind und laufend aktualisiert werden.

    Im Fachkapitel nachlesen

    Frage 140NetzwerkLeicht
    Welcher Prozess registriert in Oracle 19c Services dynamisch beim Listener?
    Lösung und Begründung

    Richtige Antwort: LREG

    LREG übernimmt die Listener-Registrierung.

    Im Fachkapitel nachlesen

    Frage 141NetzwerkLeicht
    Welche Datei enthält typischerweise Net Service Names?
    Lösung und Begründung

    Richtige Antwort: tnsnames.ora

    tnsnames.ora ist ein Repository für Net Service Names.

    Im Fachkapitel nachlesen

    Frage 142NetzwerkMittel
    Was bedeutet ORA-12514 typischerweise?
    Lösung und Begründung

    Richtige Antwort: Der Listener kennt den angeforderten Service derzeit nicht.

    ORA-12514 betrifft die Servicekenntnis des Listeners; Registrierung und Connect Descriptor prüfen.

    Im Fachkapitel nachlesen

    Frage 143NetzwerkMittel
    Welche Voraussetzung gilt für dynamische Service-Registrierung durch LREG?
    Lösung und Begründung

    Richtige Antwort: Ein erreichbarer, passend konfigurierter Listener genügt grundsätzlich ohne statischen Serviceeintrag.

    LREG meldet Services dynamisch beim Listener an. Die passenden Listeneradressen und Registrierungsregeln müssen stimmen; ein statischer SID_LIST-Eintrag ist dafür nicht generell Voraussetzung.

    Im Fachkapitel nachlesen

    Frage 144SecurityLeicht
    Welche View zeigt Systemprivileg-Grants?
    Lösung und Begründung

    Richtige Antwort: DBA_SYS_PRIVS

    DBA_SYS_PRIVS zeigt Systemprivileg-Zuweisungen.

    Im Fachkapitel nachlesen

    Frage 145SecurityMittel
    Warum sind ANY-Systemprivilegien besonders kritisch?
    Lösung und Begründung

    Richtige Antwort: Sie können sehr weitreichende Aktionen auf Objektklassen erlauben.

    ANY-Privilegien sind weitreichend und sollten restriktiv vergeben werden.

    Im Fachkapitel nachlesen

    Frage 146UNDO/TEMPMittel
    Welche View hilft, aktuelle TEMP-Segmentnutzung Sessions zuzuordnen?
    Lösung und Begründung

    Richtige Antwort: V$TEMPSEG_USAGE

    V$TEMPSEG_USAGE zeigt temporäre Segmentnutzung.

    Im Fachkapitel nachlesen

    Frage 147LocksLeicht
    Welche View ist zentral für Session-Blocking-Beziehungen?
    Lösung und Begründung

    Richtige Antwort: V$SESSION

    V$SESSION enthält relevante Blocking-/Waiting-Sessioninformationen.

    Im Fachkapitel nachlesen

    Frage 148LocksLeicht
    Welche View zeigt Lock-Strukturen und Requests?
    Lösung und Begründung

    Richtige Antwort: V$LOCK

    V$LOCK ist eine zentrale Lock-Diagnosesicht.

    Im Fachkapitel nachlesen

    Frage 149LocksLeicht
    Wie reagiert Oracle auf einen erkannten Deadlock?
    Lösung und Begründung

    Richtige Antwort: Oracle löst den Zyklus, indem eine beteiligte Anweisung mit Fehler beendet wird.

    Oracle erkennt Deadlocks und beendet eine beteiligte Anweisung, sodass der Zyklus aufgelöst wird.

    Im Fachkapitel nachlesen

    Frage 150PerformanceMittel
    Was ist der erste Schritt einer sauberen Performanceanalyse?
    Lösung und Begründung

    Richtige Antwort: Symptom und Zeitraum eindeutig eingrenzen.

    Ohne klaren Zeitraum und Betroffenheit sind Messwerte schwer belastbar.

    Im Fachkapitel nachlesen

    Frage 151PerformanceMittel
    Wie ist ein Full Table Scan fachlich zu bewerten?
    Lösung und Begründung

    Richtige Antwort: Er kann für die benötigte Datenmenge günstiger als ein Indexzugriff sein.

    Ein Scan ist zunächst ein Zugriffsweg. Erst benötigte Zeilenmenge, Selektivität, I/O und gemessener Aufwand zeigen, ob dieser Weg für die konkrete Abfrage ungünstig ist.

    Im Fachkapitel nachlesen

    Frage 152PerformanceMittel
    Wann ist ein Engpass bei der Host-CPU als Ursache überzeugend?
    Lösung und Begründung

    Richtige Antwort: Wenn Datenbank-Zeitverbrauch und Host-Sättigung dazu passen.

    Eine hohe DB-CPU-Zeit zeigt zunächst geleistete Datenbankarbeit. Für den Verdacht auf knappe Host-CPU müssen zeitgleiche Hostmessungen und das betroffene Anwendungsproblem dazu passen. Unnötig teure SQL kann auch ohne ausgelasteten Host langsam sein; Host-Sättigung ist deshalb keine Voraussetzung für jede CPU-bezogene SQL-Optimierung.

    Im Fachkapitel nachlesen

    Frage 153StartupLeicht
    Was kennzeichnet NOMOUNT?
    Lösung und Begründung

    Richtige Antwort: Instanz läuft, Datenbank ist noch nicht gemountet.

    NOMOUNT bedeutet gestartete Instanz vor dem Mount der Datenbank.

    Im Fachkapitel nachlesen

    Frage 154StartupLeicht
    Was geschieht fachlich beim MOUNT?
    Lösung und Begründung

    Richtige Antwort: Das Controlfile wird geöffnet und die Datenbankstruktur bekannt.

    MOUNT bindet die Datenbank über das Controlfile an die Instanz.

    Im Fachkapitel nachlesen

    Frage 155StartupLeicht
    Was kennzeichnet OPEN?
    Lösung und Begründung

    Richtige Antwort: Datenbank ist für den Betrieb entsprechend OPEN_MODE geöffnet.

    OPEN ist die Stufe für normalen Datenbankzugriff entsprechend dem Open Mode.

    Im Fachkapitel nachlesen

    Frage 156StartupMittel
    Warum ist SHUTDOWN ABORT kein normaler Standard-Shutdown?
    Lösung und Begründung

    Richtige Antwort: Er beendet die Instanz abrupt; beim nächsten Start kann Instance Recovery nötig sein.

    ABORT beendet ohne den normalen sauberen Shutdown-Ablauf.

    Im Fachkapitel nachlesen

    Frage 157StartupLeicht
    Welche View hilft read-only beim Prüfen des Instanzstatus?
    Lösung und Begründung

    Richtige Antwort: V$INSTANCE

    V$INSTANCE zeigt Instanzinformationen und Status.

    Im Fachkapitel nachlesen

    Frage 158DiagnoseMittel
    Was ist der erste sinnvolle Zweig bei 'Datenbank nicht erreichbar'?
    Lösung und Begründung

    Richtige Antwort: Ebenen trennen: Host/Prozess/Listener/Service/DB/Login prüfen.

    Die Verbindungskette muss systematisch eingegrenzt werden.

    Im Fachkapitel nachlesen

    Frage 159DiagnoseMittel
    Welche Frage gehört in einen Tablespace-Entscheidungsbaum?
    Lösung und Begründung

    Richtige Antwort: Autoextend/Maxsize und – bei filesystembasierten Datafiles – freien Platz im zugrunde liegenden Filesystem prüfen.

    Oracle- und OS-Kapazität müssen zusammen bewertet werden.

    Im Fachkapitel nachlesen

    Frage 160DiagnoseMittel
    Was ist bei einem Backup-Incident wichtiger als nur 'Job SUCCESS'?
    Lösung und Begründung

    Richtige Antwort: Ob die benötigten Backupbestandteile und Recovery-Kette für das Ziel vorhanden sind.

    Backup-Erfolg und tatsächliche Recovery-Fähigkeit sind nicht identisch.

    Im Fachkapitel nachlesen

    Frage 161DiagnoseMittel
    Was sollte bei einem ORA-Fehler zuerst gesichert werden?
    Lösung und Begründung

    Richtige Antwort: Vollständiger Fehlerstack, Zeitpunkt und Kontext.

    Der vollständige Stack und Kontext sind die Grundlage einer belastbaren Diagnose.

    Im Fachkapitel nachlesen

    Frage 162MultitenantLeicht
    Was ist eine PDB in der Oracle-Multitenant-Architektur?
    Lösung und Begründung

    Richtige Antwort: Eine logisch abgegrenzte Pluggable Database innerhalb einer CDB.

    Eine PDB ist ein logisch abgegrenzter Datenbankcontainer innerhalb einer CDB.

    Im Fachkapitel nachlesen

    Frage 163MultitenantLeicht
    Welche Aufgabe hat PDB$SEED?
    Lösung und Begründung

    Richtige Antwort: Sie dient als Oracle-bereitgestellte Vorlage für neue PDBs.

    PDB$SEED ist die systembereitgestellte Vorlage, aus der neue PDBs erzeugt werden können.

    Im Fachkapitel nachlesen

    Frage 164MultitenantMittel
    Welche read-only Abfrage zeigt zuverlässig den Namen des aktuellen Containers?
    Lösung und Begründung

    Richtige Antwort: SELECT SYS_CONTEXT('USERENV','CON_NAME') FROM dual;

    SYS_CONTEXT mit USERENV/CON_NAME liefert den aktuellen Container der Sitzung.

    Im Fachkapitel nachlesen

    Frage 165MultitenantMittel
    Welche View zeigt Container einschließlich ihres Open Mode?
    Lösung und Begründung

    Richtige Antwort: V$CONTAINERS

    V$CONTAINERS enthält Containerinformationen einschließlich NAME und OPEN_MODE.

    Im Fachkapitel nachlesen

    Frage 166MultitenantMittel
    Was bedeutet CON_ID in multitenant-fähigen Views?
    Lösung und Begründung

    Richtige Antwort: Sie ordnet eine Zeile einem Container-Kontext zu.

    CON_ID stellt den Containerbezug einer Zeile her und ist für die korrekte Interpretation vieler CDB-/V$-Sichten entscheidend.

    Im Fachkapitel nachlesen

    Frage 167MultitenantMittel
    Was unterscheidet einen Local User grundsätzlich von einem Common User?
    Lösung und Begründung

    Richtige Antwort: Ein Local User existiert nur in einem bestimmten PDB-Kontext; ein Common User besitzt eine gemeinsame Identität über Container hinweg.

    Local User sind containerlokal; Common User besitzen eine gemeinsame Identität im Multitenant-Umfeld.

    Im Fachkapitel nachlesen

    Frage 168MultitenantMittel
    Warum kann eine Anwendung trotz erreichbarem Listener ihre PDB nicht erreichen?
    Lösung und Begründung

    Richtige Antwort: Weil der benötigte PDB-Service fehlen/falsch sein oder die PDB nicht passend geöffnet sein kann.

    Listener-Erreichbarkeit allein beweist weder die korrekte Service-Zuordnung noch den Open Mode der Ziel-PDB.

    Im Fachkapitel nachlesen

    Frage 169MultitenantMittel
    Welche View ist besonders geeignet, um PDB-Namen und Open Mode read-only zu prüfen?
    Lösung und Begründung

    Richtige Antwort: V$PDBS

    V$PDBS zeigt PDB-spezifische Informationen wie NAME und OPEN_MODE.

    Im Fachkapitel nachlesen

    Frage 170MultitenantMittel
    Ein Objekt ist laut Anwendung vorhanden, dein SELECT findet es aber nicht. Was ist im Multitenant-Umfeld ein sinnvoller erster Prüfschritt?
    Lösung und Begründung

    Richtige Antwort: Aktuellen Container und verwendeten Service prüfen.

    Ein falscher Container oder Service ist eine typische Ursache für scheinbar fehlende Objekte. Diagnose kommt vor Änderung.

    Im Fachkapitel nachlesen

    Frage 171MultitenantSchwer
    Welche Aussage zu CDB_-Dictionary-Views ist fachlich am treffendsten?
    Lösung und Begründung

    Richtige Antwort: Im Root können entsprechend berechtigte Common User damit containerübergreifende Metadaten sehen; CON_ID liefert den Containerbezug.

    CDB_-Views können im Root containerübergreifende Metadaten mit CON_ID liefern. Sichtbarkeit hängt unter anderem von Rechten, CONTAINER_DATA und erreichbaren beziehungsweise geöffneten Containern ab. Sie sind keine Garantie für einen vollständigen Bestand unter jedem Benutzerkontext.

    Im Fachkapitel nachlesen

    Frage 172BetriebssystemLeicht
    Welche Oracle-Logquelle ist für chronologische Datenbankereignisse besonders wichtig?
    Lösung und Begründung

    Richtige Antwort: Alert Log

    Das Alert Log dokumentiert zentrale Datenbankereignisse und viele ORA-/Warnmeldungen.

    Im Fachkapitel nachlesen

    Frage 173BetriebssystemSchwer
    Wie wird ein vermutetes I/O-Problem belastbar diagnostiziert?
    Lösung und Begründung

    Richtige Antwort: Oracle-Waits mit Host-I/O im selben Zeitraum korrelieren

    DB- und Host-/Storagewerte müssen zeitlich korreliert werden.

    Im Fachkapitel nachlesen

    Frage 174IndizesLeicht
    Welcher Indextyp ist Oracles Standardindextyp und für viele selektive OLTP-Zugriffe typisch?
    Lösung und Begründung

    Richtige Antwort: B-Tree

    B-Tree ist die übliche Standardstruktur.

    Im Fachkapitel nachlesen

    Frage 175IndizesMittel
    Wie unterscheiden sich UNIQUE Constraint und Unique Index?
    Lösung und Begründung

    Richtige Antwort: Das Constraint definiert die Datenregel; ein Index ist eine mögliche Struktur zu ihrer Durchsetzung.

    Eine Datenregel und ihre technische Durchsetzung sind getrennte Objekte. Oracle kann unter passenden Voraussetzungen auch einen vorhandenen nicht eindeutigen Index zur Durchsetzung eines UNIQUE Constraints verwenden, etwa bei aufschiebbaren Constraints.

    Im Fachkapitel nachlesen

    Frage 176IndizesMittel
    Was gilt für den Index auf den Spalten eines Foreign Keys in der Child-Tabelle?
    Lösung und Begründung

    Richtige Antwort: Er wird nicht automatisch für jeden Foreign Key erzeugt und muss bei Bedarf geplant werden.

    Ein Foreign Key prüft die referenzielle Beziehung. Ein passender Child-Index kann Zugriffe und bestimmte Sperrsituationen bei Änderungen am Parent beeinflussen; seine Anlage ist eine separate Entwurfsentscheidung.

    Im Fachkapitel nachlesen

    Frage 177IndizesMittel
    Wie behandelt der Optimizer einen INVISIBLE Index standardmäßig?
    Lösung und Begründung

    Richtige Antwort: Er berücksichtigt ihn normalerweise nicht für die Planauswahl, obwohl DML ihn weiter pflegt.

    Unsichtbarkeit betrifft standardmäßig die Optimizer-Nutzung und lässt sich im passenden Kontext über OPTIMIZER_USE_INVISIBLE_INDEXES steuern. Der Index bleibt vorhanden und verursacht weiterhin Pflegeaufwand bei relevanten Datenänderungen.

    Im Fachkapitel nachlesen

    Frage 178IndizesSchwer
    Was beschreibt der Clustering Factor?
    Lösung und Begründung

    Richtige Antwort: Zusammenhang von Indexreihenfolge und Tabellenblockverteilung

    Er beeinflusst erwartete Tabellenblockzugriffe eines Indexpfads.

    Im Fachkapitel nachlesen

    Frage 179StatistikenMittel
    Warum kann Oracle für eine Spalte ein Histogramm verwenden?
    Lösung und Begründung

    Richtige Antwort: Ungleichmäßige Werteverteilung beschreiben

    Histogramme verbessern selektivitätsabhängige Schätzungen bei ungleich verteilten Werten.

    Im Fachkapitel nachlesen

    Frage 180StatistikenMittel
    Was bedeutet estimate_percent => 10?
    Lösung und Begründung

    Richtige Antwort: 10 Prozent Sampling

    ESTIMATE_PERCENT legt bei passenden DBMS_STATS-Aufrufen den Stichprobenanteil fest. 10 bedeutet einen Anteil von zehn Prozent und keine Zusage von zehn oder hundert Prozent Schätzgenauigkeit; AUTO_SAMPLE_SIZE lässt Oracle einen geeigneten Anteil bestimmen.

    Im Fachkapitel nachlesen

    Frage 181StatistikenSchwer
    Eine SQL-Anweisung ist plötzlich langsam. Was sollte ein DBA zuerst tun, bevor er neue Statistiken sammelt?
    Lösung und Begründung

    Richtige Antwort: Den betroffenen Plan, die Kardinalitätsschätzungen und die Datenverteilung prüfen

    Erst Ursache diagnostizieren, dann Statistiken administrativ ändern.

    Im Fachkapitel nachlesen

    Frage 182JSONLeicht
    Welche Schreibweise enthält einen JSON-Zahlenwert?
    Lösung und Begründung

    Richtige Antwort: {"menge":2}

    2 ohne Anführungszeichen ist eine Zahl. "2" ist Text und true ein Wahrheitswert. Diese Unterschiede sind für Berechnungen und Validierungen relevant.

    Im Fachkapitel nachlesen

    Frage 183JSONLeicht
    Welche Struktur beschreibt eine geordnete JSON-Liste?
    Lösung und Begründung

    Richtige Antwort: Ein Array in eckigen Klammern

    Ein Array besitzt geordnete Positionen. Ein Objekt ordnet Namen Werte zu; ein String bleibt Text, auch wenn er Kommas enthält.

    Im Fachkapitel nachlesen

    Frage 184JSONLeicht
    Welcher Pfad liest den ersten Artikel aus dem Array positionen?
    Lösung und Begründung

    Richtige Antwort: $.positionen[0].artikel

    Arraypositionen beginnen im JSON-Pfad bei 0. Index 1 bezeichnet den zweiten Eintrag; die Feldreihenfolge des Pfades muss der Verschachtelung entsprechen.

    Im Fachkapitel nachlesen

    Frage 185JSONMittel
    Was bedeutet "lieferdatum":"2026-02-31" für einen reinen JSON-Syntaxprüfer?
    Lösung und Begründung

    Richtige Antwort: Es ist ein gültiger Textwert; das Kalenderdatum muss fachlich geprüft werden

    JSON kennt im grundlegenden Format keinen eigenen Datumsdatentyp. Eine syntaktisch gültige Zeichenfolge kann ein fachlich unmögliches Datum enthalten.

    Im Fachkapitel nachlesen

    Frage 186JSONMittel
    Welche Spaltentypen können JSON-Text in Oracle 19c speichern?
    Lösung und Begründung

    Richtige Antwort: VARCHAR2, CLOB oder BLOB mit geeigneter JSON-Prüfung

    Die Beispiele verwenden die textuelle JSON-Speicherung von 19c. Ein BLOB speichert Bytes; eine BLOB-Spalte allein garantiert weder JSON-Syntax noch ein besonderes binäres JSON-Format.

    Im Fachkapitel nachlesen

    Frage 187JSONMittel
    Was prüft IS JSON STRICT WITH UNIQUE KEYS zusätzlich zur strikten Syntax?
    Lösung und Begründung

    Richtige Antwort: Eindeutige Feldnamen innerhalb jedes Objekts

    WITH UNIQUE KEYS prüft die Feldnamen auf Eindeutigkeit innerhalb eines Objekts. Pflichtfelder und positive Mengen sind zusätzliche fachliche Regeln.

    Im Fachkapitel nachlesen

    Frage 188JSONLeicht
    Welche Funktion liest einen einzelnen skalaren Wert aus einem JSON-Dokument?
    Lösung und Begründung

    Richtige Antwort: JSON_VALUE

    JSON_VALUE liefert einen skalaren SQL-Wert. JSON_TABLE stellt Zeilen und Spalten bereit; JSON_OBJECT dient der Erzeugung eines Objekts.

    Im Fachkapitel nachlesen

    Frage 189JSONMittel
    JSON_VALUE liefert mit Standardfehlerbehandlung SQL-NULL. Was folgt daraus?
    Lösung und Begründung

    Richtige Antwort: Mehrere Ursachen sind möglich, etwa fehlender Pfad, JSON-null oder ein behandelter Fehler

    NULL ON ERROR ist der Standard. Ein einzelnes NULL-Ergebnis unterscheidet diese Fälle nicht zuverlässig; Pfad und Fehlerbehandlung müssen gezielt geprüft werden.

    Im Fachkapitel nachlesen

    Frage 190JSONMittel
    Wie lässt sich ein JSON_VALUE-Konvertierungsfehler bei einem Diagnosetest sichtbar machen?
    Lösung und Begründung

    Richtige Antwort: Mit passendem RETURNING-Typ und ERROR ON ERROR

    ERROR ON ERROR macht passende Fehler sichtbar, statt sie als NULL zu behandeln. Ein Alias ändert die Auswertung nicht; ein Nullersatz würde die Ursache eher verdecken.

    Im Fachkapitel nachlesen

    Frage 191JSONMittel
    Ein Objekt enthält "rabatt":null. Was prüft JSON_EXISTS für $.rabatt?
    Lösung und Begründung

    Richtige Antwort: Ob das Feld vorhanden ist; JSON-null kann dabei ein vorhandener Wert sein

    Existenz und Wert sind verschiedene Fragen. Ein vorhandenes Feld mit JSON-null kann die Existenzprüfung erfüllen, während JSON_VALUE dafür SQL-NULL liefert.

    Im Fachkapitel nachlesen

    Frage 192JSONMittel
    Ein JSON-Array enthält zwei Artikel. JSON_TABLE verwendet den Zeilenpfad $.positionen[*]. Was ist ohne weitere Verschachtelung zu erwarten?
    Lösung und Begründung

    Richtige Antwort: Eine Ergebniszeile je passendem Arrayelement

    JSON_TABLE projiziert passende Arrayelemente auf virtuelle Tabellenzeilen. Es legt durch diesen SELECT keine permanente Tabelle an.

    Im Fachkapitel nachlesen

    Frage 193JSONMittel
    Womit beginnt eine FOR ORDINALITY-Spalte von JSON_TABLE?
    Lösung und Begründung

    Richtige Antwort: Mit 1

    FOR ORDINALITY erzeugt Zeilennummern ab 1. Die Nummerierung ist von den bei 0 beginnenden Arraypositionen im JSON-Pfad zu unterscheiden.

    Im Fachkapitel nachlesen

    Frage 194APIs / RESTLeicht
    Welche Aufgabe hat ORDS im vereinfachten REST-Verbindungsweg?
    Lösung und Begründung

    Richtige Antwort: HTTP-Anfragen zu definierten Datenbankdiensten vermitteln

    ORDS stellt HTTP-basierte Dienste bereit. Oracle Net und Listener erfüllen weiterhin ihre eigene Aufgabe; eine REST-Antwort ist kein Backup. Die konkrete ORDS-Version besitzt einen eigenen Releasezyklus; sie ist nicht aus der Datenbankversion 19c abzuleiten.

    Im Fachkapitel nachlesen

    Frage 195APIs / RESTLeicht
    Was beschreibt bei einer HTTP-Schnittstelle der Header Content-Type?
    Lösung und Begründung

    Richtige Antwort: Den Medientyp des übertragenen Inhalts

    Content-Type beschreibt etwa application/json. Daraus folgt weder eine erfolgreiche Anmeldung noch fachliche Richtigkeit des Dokuments.

    Im Fachkapitel nachlesen

    Frage 196APIs / RESTMittel
    Ein HTTP-Aufruf erhält 404. Welche Aussage ist belastbar?
    Lösung und Begründung

    Richtige Antwort: Die angefragte Ressource wurde aus Sicht der antwortenden Komponente nicht gefunden; URL und Routing prüfen

    Ein HTTP-Status ist im Kontext der antwortenden Komponente zu lesen. Ein falscher Pfad, eine fehlende Zuordnung oder andere Schnittstellenregeln sind von einem Datenbankausfall zu trennen.

    Im Fachkapitel nachlesen

    Frage 197APIs / RESTMittel
    Welche Aussage zu HTTP GET ist für einen Client fachlich richtig?
    Lösung und Begründung

    Richtige Antwort: GET ist für lesende Abfragen vorgesehen; der Server muss dieses Verhalten korrekt implementieren

    Eine lesende HTTP-Operation kann SQL, CPU, I/O und Protokollierung verursachen. Die Methodensemantik ersetzt keine Prüfung der tatsächlichen Serverimplementierung.

    Im Fachkapitel nachlesen

    Frage 198APIs / RESTMittel
    Eine Antwort trägt HTTP 200, enthält aber fachlich falsche Summen. Was ist bewiesen?
    Lösung und Begründung

    Richtige Antwort: Der HTTP-Aufruf wurde erfolgreich beantwortet, nicht die fachliche Richtigkeit der Zahlen

    Transporterfolg und fachliche Validierung sind getrennt. Erwartete Datensätze, Filter, Berechtigungen und Rechenregeln müssen zusätzlich stimmen.

    Im Fachkapitel nachlesen

    Frage 199APIs / RESTMittel
    Eine REST-Abfrage ist langsam, das zugehörige SQL dauert kurz. Was sollte zusätzlich gemessen werden?
    Lösung und Begründung

    Richtige Antwort: Poolwartezeit, Übertragung und Verarbeitung außerhalb des SQL

    Die gesamte Antwortzeit umfasst mehrere Phasen. Ein kurzer SQL-Anteil schließt Wartezeiten im Dienst, Pool oder Netzweg nicht aus.

    Im Fachkapitel nachlesen

    Frage 200APIs / RESTLeicht
    Warum sind Request-IDs bei einer Untersuchung hilfreich?
    Lösung und Begründung

    Richtige Antwort: Sie können denselben Aufruf über mehrere Protokolle hinweg zuordnen

    Eine konsistent weitergegebene Request-ID erleichtert die Zuordnung über Komponenten. Zeitbezug bleibt nötig; SQL_ID bezeichnet einen SQL-Text und keine universelle HTTP-Anfrage.

    Im Fachkapitel nachlesen

    Frage 201APIs / RESTMittel
    Was sollte beim Lesen einer paginierten REST-Antwort geprüft werden?
    Lösung und Begründung

    Richtige Antwort: Ob weitere Seiten existieren und welche Begrenzung angewendet wurde

    Eine Teilseite ist kein vollständiger Datenbestand. Fortsetzungsinformationen und vereinbarte Sortierung gehören zur Interpretation.

    Im Fachkapitel nachlesen

    Frage 202Connection PoolsLeicht
    Was geschieht normalerweise beim close() einer ausgeliehenen UCP-Verbindung?
    Lösung und Begründung

    Richtige Antwort: Die logische Verbindung wird an den Pool zurückgegeben

    Die Rückgabe ermöglicht Wiederverwendung. Ein Pool kann physische Verbindungen aufgrund seiner Regeln später schließen; close() ist nicht mit einem Instanzende gleichzusetzen.

    Im Fachkapitel nachlesen

    Frage 203Connection PoolsMittel
    Beweist V$SESSION.STATUS='INACTIVE', dass die Verbindung im Anwendungspool frei ist?
    Lösung und Begründung

    Richtige Antwort: Nein; der Ausleihzustand muss auf der Poolseite ermittelt werden

    Datenbankaktivität und Poolausleihe sind verschiedene Zustände. Eine Anwendung kann eine Verbindung halten, ohne gerade einen Datenbankaufruf auszuführen.

    Im Fachkapitel nachlesen

    Frage 204Connection PoolsMittel
    Ein Pool hat Maximum 20, davon 20 ausgeliehen. Weitere Anfragen warten. Welche Ursache ist zuerst zu untersuchen?
    Lösung und Begründung

    Richtige Antwort: Haltedauer, Rückgabe der Verbindungen und Arbeit der Ausleiher

    Ein ausgeschöpfter Pool kann durch langsame Arbeit oder nicht zurückgegebene Verbindungen entstehen. Eine pauschale Vergrößerung kann das Problem nur verschieben.

    Im Fachkapitel nachlesen

    Frage 205Connection PoolsMittel
    Worauf bezieht sich UCP Connection Wait Timeout?
    Lösung und Begründung

    Richtige Antwort: Auf das Warten des Clients auf eine verfügbare Poolverbindung

    Die Ausleihe ist eine eigene Phase. SQL-Ausführungs- und Netzwerkzeitlimits müssen getrennt betrachtet werden.

    Im Fachkapitel nachlesen

    Frage 206Connection PoolsMittel
    Welche Verbindungen betrifft UCP Inactive Connection Timeout?
    Lösung und Begründung

    Richtige Antwort: Verfügbare, ungenutzte Verbindungen im Pool

    UCP meint mit inactive hier verfügbare Poolverbindungen. Das ist nicht dasselbe wie der STATUS-Wert in V$SESSION.

    Im Fachkapitel nachlesen

    Frage 207Connection PoolsMittel
    Vier Anwendungsknoten haben je einen Pool mit Maximum 30. Welche Größenordnung muss die Kapazitätsplanung berücksichtigen?
    Lösung und Begründung

    Richtige Antwort: Bis zu 120 Verbindungen aus diesen vier Pools zusammen

    Poolgrenzen gelten pro Pool. Weitere Dienste und administrative Verbindungen kommen zur gemeinsamen Datenbanklast hinzu; das Maximum ist keine Aussage über die aktuelle Nutzung.

    Im Fachkapitel nachlesen

    Frage 208Connection PoolsMittel
    Was kann bei einer wiederverwendeten Verbindung problematisch sein?
    Lösung und Begründung

    Richtige Antwort: Nicht zurückgesetzter Sessionzustand wie NLS-Einstellungen oder Anwendungskontext

    Sessionzustand kann den nächsten Ausleiher beeinflussen. Anwendung und Pool müssen einen definierten Zustand herstellen; Wiederverwendung ist nicht automatisch ein neuer Login.

    Im Fachkapitel nachlesen

    Frage 209Connection PoolsMittel
    Warum ist MODULE allein kein sicherer Nachweis des aktuellen Poolnutzers?
    Lösung und Begründung

    Richtige Antwort: Die Anwendung muss die Kennzeichnung korrekt setzen und bei Wiederverwendung aktualisieren

    MODULE ist eine Anwendungskennzeichnung. Alte oder fehlende Werte können die Zuordnung verfälschen; Request- und Poolinformationen ergänzen.

    Im Fachkapitel nachlesen

    Frage 210Connection PoolsMittel
    Was ist ein typisches Indiz für ein Connection Leak?
    Lösung und Begründung

    Richtige Antwort: Ausgeliehene Verbindungen werden nach abgeschlossenen Anfragen nicht ordnungsgemäß zurückgegeben

    Freie vorgehaltene Verbindungen sind normale Poolfunktion. Für ein Leak muss die fehlende Rückgabe oder ungewöhnliche Haltedauer nachgewiesen werden.

    Im Fachkapitel nachlesen

    Frage 211Connection PoolsMittel
    Warum hilft ein größerer Pool nicht zwingend bei einer überlasteten Datenbank?
    Lösung und Begründung

    Richtige Antwort: Mehr gleichzeitige Arbeit kann die Konkurrenz um dieselben Ressourcen erhöhen

    Die Grenze sollte anhand Durchsatz, Antwortzeit und Ressourcen gewählt werden. Mehr Parallelität kann zusätzliche Wartezeiten verursachen, ohne den Durchsatz zu erhöhen.

    Im Fachkapitel nachlesen

    Frage 212Database LinksLeicht
    Was bedeutet KATALOG.ARTIKEL@STAMMDATEN_LINK?
    Lösung und Begründung

    Richtige Antwort: Zugriff auf ARTIKEL im entfernten Schema KATALOG über den Link

    Der Ausdruck benennt Schema, Objekt und Verbindungsweg. Er kopiert durch die Namensangabe keine Tabelle dauerhaft in die Quelldatenbank.

    Im Fachkapitel nachlesen

    Frage 213Database LinksMittel
    Wo wird ein vom Database Link verwendeter Net-Alias aufgelöst?
    Lösung und Begründung

    Richtige Antwort: Im wirksamen Oracle-Net-Kontext des Quell-Datenbankprozesses

    Der entfernte Zugriff geht vom Datenbankserver aus. Ein funktionierender PC-Login prüft deshalb nicht denselben Auflösungs- und Netzwerkweg.

    Im Fachkapitel nachlesen

    Frage 214Database LinksLeicht
    Was unterscheidet einen PUBLIC Database Link von einem privaten Link?
    Lösung und Begründung

    Richtige Antwort: Der PUBLIC Link ist für andere Benutzer verfügbar; Zielrechte bleiben separat maßgeblich

    Sichtbarkeit des Links und Berechtigungen des Zielkontos sind getrennt. PUBLIC macht den entfernten Datenbestand nicht automatisch uneingeschränkt zugänglich.

    Im Fachkapitel nachlesen

    Frage 215Database LinksMittel
    Was bedeutet HOST in ALL_DB_LINKS?
    Lösung und Begründung

    Richtige Antwort: Die Oracle-Net-Verbindungsangabe des Links

    Der Inhalt kann ein Alias oder eine andere Verbindungsangabe sein. Der Spaltenname darf nicht zu einer falschen Beschränkung auf Hostnamen verleiten.

    Im Fachkapitel nachlesen

    Frage 216Database LinksMittel
    SELECT dummy FROM dual@LINK funktioniert, eine Fachobjektabfrage liefert ORA-00942. Was ist als Nächstes sinnvoll?
    Lösung und Begründung

    Richtige Antwort: Zielschema, Objektname und Rechte des tatsächlich verwendeten Zielkontos prüfen

    Der kleine Test belegt einen erfolgreichen entfernten Zugriff, aber kein Recht auf jedes Zielobjekt. ORA-00942 kann ein fehlendes Objekt oder fehlenden Zugriff bedeuten.

    Im Fachkapitel nachlesen

    Frage 217Database LinksMittel
    Welche Links beschreibt V$DBLINK laut Oracle-Referenz?
    Lösung und Begründung

    Richtige Antwort: Von der abfragenden Session geöffnete Links im Transaktionskontext

    V$DBLINK ist keine globale Linknutzerliste. Für Definitionen dienen USER_/ALL_/DBA_DB_LINKS; die fehlende Zeile in einer anderen Diagnosesession beweist keine Nichtnutzung.

    Im Fachkapitel nachlesen

    Frage 218Database LinksMittel
    Was bewirkt GLOBAL_NAMES=TRUE grundsätzlich bei Database Links?
    Lösung und Begründung

    Richtige Antwort: Der Linkname muss zu den geltenden Regeln für den globalen Zielnamen passen

    Ein Namenskonflikt kann ORA-02085 auslösen. Dies ist eine Namensregel, keine Freigabe zusätzlicher Zielrechte.

    Im Fachkapitel nachlesen

    Frage 219Database LinksMittel
    Ein Fixed-User-Link meldet nach einem Zielkennwortwechsel einen Anmeldefehler. Was ist eine passende Hypothese?
    Lösung und Begründung

    Richtige Antwort: Die gespeicherte Zugangskonfiguration passt nicht mehr zum Zielkonto

    Der Fehler betrifft möglicherweise die Anmeldung des festgelegten Zielbenutzers. Konto, vollständige Meldung und hinterlegte Zugangskonfiguration sind zu prüfen.

    Im Fachkapitel nachlesen

    Frage 220Database LinksMittel
    Ein Bericht führt 1.000 entfernte Einzelaufrufe aus; jeder benötigt zusätzlich 5 ms Kommunikationszeit. Welcher Anteil ergibt sich vereinfacht?
    Lösung und Begründung

    Richtige Antwort: 5 Sekunden allein für diese Kommunikationsanteile

    1.000 mal 5 ms sind 5.000 ms, also 5 Sekunden. Zielverarbeitung und weitere Arbeit kommen hinzu; die Rechnung ist ein Lernmodell, keine Messung.

    Im Fachkapitel nachlesen

    Frage 221Database LinksMittel
    Ein lokales Synonym hat einen gefüllten DB_LINK-Wert. Was folgt daraus?
    Lösung und Begründung

    Richtige Antwort: Der Namensverweis führt über einen Database Link

    Ein Synonym ist ein alternativer Name. Entfernte Lage, Datenkopie und Zugriffsrecht sind unterschiedliche Eigenschaften.

    Im Fachkapitel nachlesen

    Frage 222Security / AuditMittel
    V$OPTION zeigt Unified Auditing = FALSE. Welche Folgerung ist zulässig?
    Lösung und Begründung

    Richtige Antwort: Pure Unified Auditing ist nicht aktiviert; Mixed Mode und weitere Auditquellen müssen geprüft werden

    FALSE ist kein allgemeiner Schalter für alle Auditmechanismen. Datenbankmodus, Richtlinien und Betriebssystem-Auditing sind getrennt zu betrachten.

    Im Fachkapitel nachlesen

    Frage 223Security / AuditMittel
    Was beschreibt AUDIT_FILE_DEST nicht automatisch?
    Lösung und Begründung

    Richtige Antwort: Den Speicherort des regulären Unified Audit Trails in der Datenbank

    Für Unified Auditing und traditionelle dateibasierte Auditquellen gelten verschiedene Ablage- und Verwaltungsregeln. Ein einzelner Parameter beschreibt nicht sämtliche Auditdaten.

    Im Fachkapitel nachlesen

    Frage 224Security / AuditMittel
    Was bewirkt SET_LAST_ARCHIVE_TIMESTAMP selbst?
    Lösung und Begründung

    Richtige Antwort: Es setzt eine für die Bereinigung verwendbare Zeitmarke

    Der Administrator setzt die Marke. Sie ersetzt weder die eigentliche Archivierung noch deren Kontrolle; CLEAN_AUDIT_TRAIL kann sie zur Auswahl verwenden.

    Im Fachkapitel nachlesen

    Frage 225Security / AuditMittel
    Wovon unterscheidet sich ein Purge-Intervall?
    Lösung und Begründung

    Richtige Antwort: Von der fachlich vorgesehenen Aufbewahrungsdauer

    Das Intervall bestimmt, wann ein Job läuft. Welche Datensätze gelöscht werden dürfen, hängt zusätzlich von Trail, Zeitgrenze und Aufbewahrungsvorgaben ab.

    Im Fachkapitel nachlesen

    Frage 226Security / AuditMittel
    Welche View hilft bei der Prüfung eingerichteter Audit-Bereinigungsjobs?
    Lösung und Begründung

    Richtige Antwort: DBA_AUDIT_MGMT_CLEANUP_JOBS

    Die View beschreibt die Audit-Cleanup-Jobs. Das Vorhandensein eines Jobs beweist allein noch keine richtige Archivierungsgrenze oder erfolgreiche Ausführung.

    Im Fachkapitel nachlesen

    Frage 227Security / AuditMittel
    Warum gehört PUBLIC in eine vollständige Rechteanalyse?
    Lösung und Begründung

    Richtige Antwort: Ein Benutzer kann Rechte auch über PUBLIC erhalten

    Die Suche nach direkten Benutzergrants und fachlichen Rollen reicht nicht immer. Rechte für PUBLIC können den effektiven Zugriff erweitern.

    Im Fachkapitel nachlesen

    Frage 228Security / AuditMittel
    Was unterscheidet SESSION_ROLES von DBA_ROLE_PRIVS?
    Lösung und Begründung

    Richtige Antwort: SESSION_ROLES zeigt aktuell aktivierte Rollen der eigenen Session

    Eine Rollenzuweisung und die aktuelle Aktivierung sind verschiedene Fragen. Gespeicherte Programme können außerdem einen anderen Rechtekontext verwenden.

    Im Fachkapitel nachlesen

    Frage 229Security / AuditMittel
    Ein Benutzer darf sich anmelden, aber kein Segment anlegen. Was muss zusätzlich zum Loginrecht geprüft werden?
    Lösung und Begründung

    Richtige Antwort: Objektanlageprivilegien, Quota und vorgesehener Tablespace

    CREATE SESSION allein verleiht keine Objektanlage- oder Speicherrechte. Der konkrete Fehler und das betroffene Ziel bestimmen den nächsten Schritt.

    Im Fachkapitel nachlesen

    Frage 230PL/SQLMittel
    Welche Aufgabe hat eine Package Specification?
    Lösung und Begründung

    Richtige Antwort: Die öffentliche Schnittstelle des Packages beschreiben

    Die Specification legt öffentlich sichtbare Typen und Routinen fest. Der Body enthält deren Umsetzung; beide sind getrennt zu betrachten.

    Im Fachkapitel nachlesen

    Frage 231PL/SQLMittel
    Was unterscheidet eine Funktion grundsätzlich von einer Prozedur?
    Lösung und Begründung

    Richtige Antwort: Eine Funktion besitzt einen ausdrücklich definierten Rückgabewert

    Prozeduren können OUT-Parameter liefern. Eine Funktionssignatur ist kein Beweis, dass die Implementierung ausschließlich liest.

    Im Fachkapitel nachlesen

    Frage 232PL/SQLMittel
    Ein Package Body ist INVALID. Welche lesende Quelle ist für Compilerdiagnosen passend?
    Lösung und Begründung

    Richtige Antwort: ALL_ERRORS beziehungsweise bei passenden Rechten DBA_ERRORS

    Compilerfehler nennen Typ, Zeile und Meldung. Owner, Objektname und PACKAGE BODY müssen passend gefiltert werden, bevor eine Korrektur geplant wird.

    Im Fachkapitel nachlesen

    Frage 233PL/SQLMittel
    Was passiert bei einem einfachen SELECT INTO ohne Aggregation, wenn die Abfrage keine Ergebniszeile liefert?
    Lösung und Begründung

    Richtige Antwort: NO_DATA_FOUND wird ausgelöst

    SELECT INTO erwartet hier eine Zeile. Ein gewöhnlicher SELECT ohne Treffer ist dagegen allein kein NO_DATA_FOUND-Fehler.

    Im Fachkapitel nachlesen

    Frage 234PL/SQLMittel
    Was passiert bei einem einfachen SELECT INTO, wenn mehrere Zeilen geliefert werden?
    Lösung und Begründung

    Richtige Antwort: TOO_MANY_ROWS wird ausgelöst

    Die erwartete Kardinalität wird verletzt. Fachlich eindeutige Bedingungen oder eine passende Verarbeitung mehrerer Zeilen sind nötig.

    Im Fachkapitel nachlesen

    Frage 235PL/SQLMittel
    Warum ist WHEN OTHERS THEN NULL in einem Diagnosepfad problematisch?
    Lösung und Begründung

    Richtige Antwort: Es kann einen Fehler verschlucken und dem Aufrufer Erfolg vortäuschen

    Ein leerer Handler verbirgt Fehler. Nach geeigneter Behandlung sollte die Ausnahme nachvollziehbar weitergegeben werden, etwa mit RAISE.

    Im Fachkapitel nachlesen

    Frage 236PL/SQLMittel
    Was macht RAISE ohne Ausnahmenamen innerhalb eines Exception Handlers?
    Lösung und Begründung

    Richtige Antwort: Die aktuell behandelte Ausnahme erneut auslösen

    RAISE gibt die Ausnahme weiter. Es ist kein globaler Transaktionsbefehl und soll den ursprünglichen Fehler nicht unbemerkt ersetzen.

    Im Fachkapitel nachlesen

    Frage 237PL/SQLMittel
    Was beeinflusst AUTHID CURRENT_USER hauptsächlich?
    Lösung und Begründung

    Richtige Antwort: Namensauflösung und Rechteprüfung zur Laufzeit im Aufruferkontext

    AUTHID steuert den Laufzeitkontext. Für statisches SQL bleiben Prüfungen bei der Kompilierung erforderlich; Invoker Rights bedeutet keine Befreiung von Rechten.

    Im Fachkapitel nachlesen

    Frage 238SchedulerMittel
    Ein Scheduler-Job ist ENABLED. Was ist damit noch nicht bewiesen?
    Lösung und Begründung

    Richtige Antwort: Dass sein letzter Lauf erfolgreich war

    Aktivierung ist ein Konfigurationszustand. Für Ergebnisse einzelner Läufe die Laufhistorie, Status und Fehlermeldungen auswerten.

    Im Fachkapitel nachlesen

    Frage 239SchedulerMittel
    Welche View zeigt Ergebnisse einzelner Scheduler-Läufe?
    Lösung und Begründung

    Richtige Antwort: DBA_SCHEDULER_JOB_RUN_DETAILS

    Die Laufhistorie unterscheidet einzelne Ausführungen. JOB_NAME und OWNER allein beschreiben noch keinen bestimmten Lauf; LOG_ID und Zeitstempel helfen bei der Zuordnung.

    Im Fachkapitel nachlesen

    Frage 240SchedulerMittel
    Ein historischer Lauf ist FAILED, ein späterer Retry SUCCEEDED. Wie wird das kommuniziert?
    Lösung und Begründung

    Richtige Antwort: Der frühere Fehler und der erfolgreiche Wiederholungslauf werden zeitlich getrennt beschrieben

    Historie und aktueller Endzustand dürfen nicht verwechselt werden. Ob fachliche Nacharbeiten nötig sind, muss zusätzlich beurteilt werden.

    Im Fachkapitel nachlesen

    Frage 241SchedulerMittel
    RUN_DURATION eines Jobs enthält ein Intervall. Was ist bei der Auswertung wichtig?
    Lösung und Begründung

    Richtige Antwort: Dauer einschließlich Tagesanteil und Zeitkomponenten korrekt auswerten

    Ein Intervall ist eine Dauer. Wer nur Sekunden innerhalb einer Minute ausliest, kann lange Läufe drastisch unterschätzen.

    Im Fachkapitel nachlesen

    Frage 242SchedulerMittel
    Was beantwortet NEXT_RUN_DATE?
    Lösung und Begründung

    Richtige Antwort: Den geplanten nächsten Start, sofern bestimmt

    Planung und tatsächliche Ausführung sind verschieden. Auslastung, Zustand und weitere Voraussetzungen können die Ausführung beeinflussen.

    Im Fachkapitel nachlesen

    Frage 243SchedulerMittel
    Warum muss bei externen Scheduler-Jobs auch die OS-Seite untersucht werden?
    Lösung und Begründung

    Richtige Antwort: Ausführungsumgebung, Programmrechte und OS-Exitcode können den Fehler erklären

    Ein externer Job startet ein Betriebssystemprogramm. Datenbankstatus und OS-Ausgabe ergänzen sich; keine der beiden Ebenen erklärt automatisch alles.

    Im Fachkapitel nachlesen

    Frage 244NLS / ZeichensatzMittel
    Was beschreibt der Zeichensatzteil von NLS_LANG bei passenden OCI-Clients?
    Lösung und Begründung

    Richtige Antwort: Die verwendete Textkodierung auf der Clientseite

    NLS_LANG muss die tatsächlichen Clientbytes passend beschreiben. Ein blindes Gleichsetzen mit dem Datenbankzeichensatz kann falsche Konvertierung begünstigen.

    Im Fachkapitel nachlesen

    Frage 245NLS / ZeichensatzMittel
    Ändert NLS_DATE_FORMAT den intern gespeicherten DATE-Wert?
    Lösung und Begründung

    Richtige Antwort: Nein, es beeinflusst bestimmte Darstellungen und implizite Konvertierungen

    Format und gespeicherter Wert sind getrennt. Oracle DATE enthält weiterhin Datum und Uhrzeit; explizite Formatmasken machen Ein-/Ausgabe verständlicher.

    Im Fachkapitel nachlesen

    Frage 246NLS / ZeichensatzMittel
    Warum ist TO_DATE('07.10.2026','DD.MM.YYYY') bei bekannten Eingabedaten hilfreich?
    Lösung und Begründung

    Richtige Antwort: Die erwartete Textform wird ausdrücklich angegeben

    Eine Formatmaske vermeidet die Abhängigkeit von einem zufälligen Session-Standard. Sie verleiht dem DATE-Datentyp keine Zeitzone.

    Im Fachkapitel nachlesen

    Frage 247NLS / ZeichensatzMittel
    Was ist der Unterschied zwischen CURRENT_TIMESTAMP und SYSTIMESTAMP?
    Lösung und Begründung

    Richtige Antwort: CURRENT_TIMESTAMP verwendet die Sessionzeitzone; SYSTIMESTAMP den Zeitkontext des Datenbanksystems

    Die Funktionen haben unterschiedliche Zeitkontexte. Beim Vergleichen von Logs und Anwendungsmeldungen müssen Zeitzonen und Formatangaben berücksichtigt werden.

    Im Fachkapitel nachlesen

    Frage 248NLS / ZeichensatzMittel
    Beweist DBTIMEZONE die Betriebssystem-Zeitzone des Hosts?
    Lösung und Begründung

    Richtige Antwort: Nein, es ist eine eigene Datenbank-Zeitzoneneinstellung

    DBTIMEZONE, SESSIONTIMEZONE und der Hostzeitkontext sind getrennt. DBTIMEZONE spielt insbesondere bei TIMESTAMP WITH LOCAL TIME ZONE eine Rolle.

    Im Fachkapitel nachlesen

    Frage 249NLS / ZeichensatzMittel
    Warum können LENGTH und LENGTHB bei einem Text verschieden sein?
    Lösung und Begründung

    Richtige Antwort: Zeichen können in einer Mehrbytekodierung mehr als ein Byte benötigen

    LENGTH misst Zeichen, LENGTHB Bytes. Welche Unterschiede auftreten, hängt vom Text und dessen Kodierung ab.

    Im Fachkapitel nachlesen

    Frage 250PerformanceMittel
    DB time steigt in 60 Sekunden um 180 Sekunden. Ist das möglich?
    Lösung und Begründung

    Richtige Antwort: Ja; die Datenbankzeit mehrerer Sessions wird aufsummiert

    180 Sekunden DB time in 60 Sekunden Messzeit entsprechen im Mittel drei aktiven Sessions. Aufsummierte Sessionzeit ist nicht dieselbe Größe wie Wanduhrzeit.

    Im Fachkapitel nachlesen

    Frage 251PerformanceMittel
    DB time nimmt um 120 s und DB CPU um 90 s zu. Was beschreibt die Differenz näherungsweise?
    Lösung und Begründung

    Richtige Antwort: 30 s nicht auf CPU verbrachte Datenbankzeit im selben Messfenster

    Die Zeitmodellwerte müssen im gleichen Zeitraum verglichen werden. Die Differenz ist kein direktes Maß für Host-Idle oder gesamte End-to-End-Antwortzeit.

    Im Fachkapitel nachlesen

    Frage 252PerformanceMittel
    Ein kumulierter Zähler ist nach dem zweiten Messpunkt kleiner. Was muss zuerst geprüft werden?
    Lösung und Begründung

    Richtige Antwort: Neustart, Reset oder Wechsel der Identität der gemessenen Struktur

    Differenzen sind nur bei vergleichbarer Zählerbasis sinnvoll. Ein neuer Cursor oder Instanzstart kann den bisherigen Zähler ersetzen.

    Im Fachkapitel nachlesen

    Frage 253PerformanceMittel
    Welche Einheit hat ELAPSED_TIME in V$SQL?
    Lösung und Begründung

    Richtige Antwort: Mikrosekunden

    Für Sekunden wird durch 1.000.000 geteilt. Das Feld ist kumulierte Cursorzeit und nicht automatisch die Antwortzeit eines einzelnen Clientaufrufs.

    Im Fachkapitel nachlesen

    Frage 254PerformanceMittel
    ELAPSED_TIME steigt um 8.000.000 µs, EXECUTIONS um 40. Was ergibt die vereinfachte mittlere Zeit pro zusätzlicher Ausführung?
    Lösung und Begründung

    Richtige Antwort: 0,2 Sekunden

    8.000.000 µs sind 8 s; 8 geteilt durch 40 ergibt 0,2 s. Die Rechnung setzt vergleichbare Cursoridentität voraus und bleibt bei laufenden oder abgebrochenen Ausführungen begrenzt.

    Im Fachkapitel nachlesen

    Frage 255PerformanceMittel
    Warum ist END_OF_FETCH_COUNT neben EXECUTIONS bei SELECT-Cursorn nützlich?
    Lösung und Begründung

    Richtige Antwort: Es zeigt, wie oft die Abfrage vollständig ausgeführt beziehungsweise bis zum Ende abgerufen wurde

    EXECUTIONS und vollständig abgeschlossene Abrufe sind nicht dasselbe. Teilabrufe beeinflussen die Interpretation von Durchschnittswerten.

    Im Fachkapitel nachlesen

    Frage 256PerformanceMittel
    Zwei Messungen betreffen dieselbe SQL_ID, aber andere Child Cursor. Was ist zu beachten?
    Lösung und Begründung

    Richtige Antwort: Die Werte dürfen nicht unbesehen als Differenz desselben Cursors gerechnet werden

    V$SQL liefert Statistiken je Child Cursor. Container, Child-Nummer und Lebenszyklus müssen zur Messfrage passen.

    Im Fachkapitel nachlesen

    Frage 257PerformanceMittel
    Was liefert EXPLAIN PLAN grundsätzlich nicht?
    Lösung und Begründung

    Richtige Antwort: Einen Nachweis der tatsächlich gemessenen Laufzeit dieses konkreten Aufrufs

    Ein geschätzter Plan und tatsächlich ausgeführte Cursorstatistiken sind verschieden. Laufzeitwerte erfordern passende Erfassung und Zuordnung.

    Im Fachkapitel nachlesen

    Frage 258PerformanceMittel
    A-Rows=10.000 und Starts=100 an einem inneren Planschritt: Welcher Vergleich hilft bei E-Rows pro Start?
    Lösung und Begründung

    Richtige Antwort: Näherungsweise 100 tatsächliche Zeilen pro Start betrachten

    10.000 durch 100 ergibt im Mittel 100 Zeilen pro Start. Der genaue Plan- und Statistikbezug bleibt wichtig; pauschale Vergleiche können Abweichungen überzeichnen.

    Im Fachkapitel nachlesen

    Frage 259PerformanceMittel
    Warum dürfen A-Time-Werte aller Planschritte nicht einfach addiert werden?
    Lösung und Begründung

    Richtige Antwort: Übergeordnete Zeiten können Arbeit untergeordneter Schritte enthalten

    Planzeiten sind keine zwingend disjunkten Zeitabschnitte. Eine Summe kann dieselbe Arbeit mehrfach zählen.

    Im Fachkapitel nachlesen

    Frage 260PerformanceMittel
    Welchen Unterschied beschreiben Buffers und Reads in der Plananalyse?
    Lösung und Begründung

    Richtige Antwort: Logische Blockarbeit gegenüber physischen Lesezugriffen im jeweiligen Statistikbezug

    Viele logische Zugriffe können auch bei wenigen physischen Reads Aufwand verursachen. Die beiden Werte beantworten unterschiedliche Fragen.

    Im Fachkapitel nachlesen

    Frage 261PerformanceMittel
    AVERAGE_WAIT in V$SYSTEM_EVENT beträgt 0,5. Welche Zeit entspricht dem Wert?
    Lösung und Begründung

    Richtige Antwort: 5 Millisekunden

    AVERAGE_WAIT wird in Hundertstelsekunden angegeben. 0,5 Hundertstelsekunden sind 0,005 Sekunden, also 5 ms.

    Im Fachkapitel nachlesen

    Frage 262PerformanceMittel
    Welche Ergänzung braucht EVENT aus V$SESSION, um einen aktuell laufenden Wait zu belegen?
    Lösung und Begründung

    Richtige Antwort: STATE='WAITING'

    EVENT kann auch den zuletzt abgeschlossenen Wait bezeichnen. STATE beschreibt, ob gerade gewartet wird; ACTIVE allein wäre ebenfalls nicht ausreichend.

    Im Fachkapitel nachlesen

    Frage 263PerformanceMittel
    Eine ACTIVE-Session hat LAST_CALL_ET=600. Was bedeutet das zunächst?
    Lösung und Begründung

    Richtige Antwort: 600 Sekunden seit Beginn ihres aktiven Zustands

    LAST_CALL_ET bezieht sich auf den Sessionzustand. Ein aktiver Call kann mehrere SQLs oder andere Arbeit enthalten; die aktuelle Waitdauer ist gesondert zu lesen.

    Im Fachkapitel nachlesen

    Frage 264PerformanceMittel
    Ein SELECT auf V$SESSION_LONGOPS findet keine RMAN-Zeile. Was ist daraus ableitbar?
    Lösung und Begründung

    Richtige Antwort: Kein passender erfasster Longops-Eintrag wurde gefunden

    Nicht jede Phase wird als passende Long Operation sichtbar. Session-, Prozess- und RMAN-Statusinformationen ergänzen die Momentaufnahme.

    Im Fachkapitel nachlesen

    Frage 265PerformanceMittel
    Warum müssen Foreground-Waits und Background-Waits getrennt bewertet werden?
    Lösung und Begründung

    Richtige Antwort: Foreground-DB-time und Background-Zeiten haben unterschiedliche Bezugsgrößen

    Eine pauschale Summe sämtlicher Waits als Anteil der Foreground-DB-time kann irreführen. Scope und Messzeitraum müssen übereinstimmen.

    Im Fachkapitel nachlesen

    Frage 266PerformanceMittel
    Welcher exakte Filter passt zum dedizierten Wait Event für Cache-Buffer-Chains-Latches?
    Lösung und Begründung

    Richtige Antwort: event = 'latch: cache buffers chains'

    Latch-Name und Event-Name sind nicht identisch. Vor exakten Filtern kann V$EVENT_NAME die in der Zielversion vorhandenen Namen bestätigen.

    Im Fachkapitel nachlesen

    Frage 267PerformanceMittel
    Worauf deutet enq: JI - contention fachlich hin?
    Lösung und Begründung

    Richtige Antwort: Serialisierung konkurrierender Materialized-View-Refresh-Vorgänge

    JI ist ein Materialized-View-Refresh-Lock. Ein Job kann den Refresh auslösen, aber der Event-Name beschreibt keinen allgemeinen Schedulerfehler.

    Im Fachkapitel nachlesen

    Frage 268PerformanceMittel
    Ein Request dauert 10 s, davon 2 s SQL. Die SQL-Zeit wird halbiert. Wie lang dauert der Request bei sonst gleichen Anteilen?
    Lösung und Begründung

    Richtige Antwort: 9 Sekunden

    Die übrigen 8 s bleiben bestehen; SQL benötigt danach 1 s. Die gesamte Zeit beträgt 9 s. Verbesserungen sind am tatsächlich betroffenen Anteil zu bewerten.

    Im Fachkapitel nachlesen

    Frage 269PerformanceMittel
    Welche Aussage zu AWR und ASH ist für ein SE2-orientiertes Wiki richtig?
    Lösung und Begründung

    Richtige Antwort: Lizenz- und Editionsvoraussetzungen vor Nutzung klären; keine allgemeine SE2-Diagnosequelle voraussetzen

    Technische Sichtbarkeit und Nutzungsrecht sind verschieden. Ein Parameterwert ersetzt keine Lizenz; das Wiki muss geeignete Diagnosewege für den Geltungsbereich verwenden.

    Im Fachkapitel nachlesen

    Frage 270Bash / SQL*PlusMittel
    Was unterscheidet eine SQL*Plus-Substitutionsvariable &NAME von einem Bind-Wert?
    Lösung und Begründung

    Richtige Antwort: Sie ersetzt Text vor der SQL-Auswertung

    Textsubstitution kann SQL-Syntax verändern. Für unbekannte Eingaben sind kontrollierte Werte beziehungsweise passend gebundene Parameter erforderlich.

    Im Fachkapitel nachlesen

    Frage 271Bash / SQL*PlusMittel
    Wozu dient WHENEVER SQLERROR EXIT FAILURE ROLLBACK in einem SQL*Plus-Skript?
    Lösung und Begründung

    Richtige Antwort: Bei SQL- oder PL/SQL-Fehlern mit Fehlerstatus abbrechen und offene Änderungen zurückrollen

    Die Regel betrifft SQL-/PLSQL-Fehler. Für Betriebssystemfehler und Clientmeldungen sind passende zusätzliche Kontrollen nötig; sie ist kein vollständiger Ersatz für die Logauswertung.

    Im Fachkapitel nachlesen

    Frage 272Bash / SQL*PlusMittel
    Was macht SPOOL in SQL*Plus?
    Lösung und Begründung

    Richtige Antwort: Clientausgaben in eine Datei schreiben

    SPOOL erzeugt eine Ausgabedatei im Clientkontext. Das ist weder eine physische Datensicherung noch eine Kontrolle der fachlichen Richtigkeit des Inhalts.

    Im Fachkapitel nachlesen

    Frage 273Bash / SQL*PlusMittel
    Warum sollten Shellvariablen wie "$DATEIPFAD" meist in Anführungszeichen stehen?
    Lösung und Begründung

    Richtige Antwort: Damit Leerzeichen und Sonderzeichen nicht ungewollt in mehrere Argumente zerlegt werden

    Quoting steuert die Verarbeitung durch die Shell. Es verschlüsselt nicht und ersetzt keine Prüfung von Rechten oder Eingaben.

    Im Fachkapitel nachlesen

    Frage 274Bash / SQL*PlusMittel
    Ein Bash-Skript wird mit sh skript.sh gestartet. Was ist das Risiko?
    Lösung und Begründung

    Richtige Antwort: Der ausgewählte sh-Interpreter muss die verwendete Bash-Syntax nicht unterstützen

    Bei explizitem Interpreteraufruf verarbeitet dieser das Skript. Die Bash-Shebang wird dadurch nicht automatisch zur Ausführungsentscheidung.

    Im Fachkapitel nachlesen

    Frage 275Bash / SQL*PlusMittel
    Warum sollte ein Rückgabestatus unmittelbar nach dem relevanten Befehl gesichert werden?
    Lösung und Begründung

    Richtige Antwort: Ein nachfolgender Befehl überschreibt den Wert von $?

    $? gehört zum zuletzt ausgeführten Befehl. Ein nachfolgendes echo oder ein anderer Aufruf kann die ursprüngliche Information ersetzen.

    Im Fachkapitel nachlesen

    Frage 276Bash / SQL*PlusMittel
    Was bedeutet 2>&1 bei einer Shellumleitung?
    Lösung und Begründung

    Richtige Antwort: Standardfehler auf das zu diesem Zeitpunkt gültige Ziel der Standardausgabe umleiten

    Die Reihenfolge von Umleitungen zählt. cmd >log 2>&1 leitet beide Ausgabeströme in log; die umgekehrte Reihenfolge kann anders wirken.

    Im Fachkapitel nachlesen

    Frage 277Bash / SQL*PlusMittel
    Warum sollte ein Diagnose-Skript keine Zugangsdaten im Klartext ausgeben?
    Lösung und Begründung

    Richtige Antwort: Logs und Prozessausgaben können von weiteren Personen oder Werkzeugen gelesen werden

    Geheimnisse gehören nicht in allgemeine Diagnoseausgaben. Geeignete Authentifizierung und restriktive Berechtigungen sind getrennt vom fachlichen Monitoring zu planen.

    Im Fachkapitel nachlesen

    Frage 278SchemaobjekteMittel
    Wie hängen Benutzer und Schema in Oracle zusammen?
    Lösung und Begründung

    Richtige Antwort: Das gleichnamige Schema enthält die dem Benutzer gehörenden Objekte

    Identität, Objekteigentum und Speicher sind verschiedene Ebenen. Ein Benutzer kann ein leeres Schema besitzen und auf freigegebene fremde Objekte zugreifen.

    Im Fachkapitel nachlesen

    Frage 279SchemaobjekteMittel
    Was speichert eine normale View selbst im Gegensatz zu einer Materialized View?
    Lösung und Begründung

    Richtige Antwort: Die Abfragedefinition, kein eigenes gespeichertes Ergebnis dieser View

    Die normale View beschreibt eine Abfrage. Eine Materialized View hält ein Ergebnis vor; dessen Aktualität hängt vom Refresh ab.

    Im Fachkapitel nachlesen

    Frage 280SchemaobjekteMittel
    Eine Materialized View wurde um 02:00 aktualisiert, neue Bestellungen wurden um 09:00 bestätigt. Was ist um 10:00 ohne weiteren Refresh möglich?
    Lösung und Begründung

    Richtige Antwort: Die Materialized View zeigt noch den Stand des letzten Refreshs

    Refresh-Verfahren und Zeitpunkt bestimmen die Aktualität. Ein on-demand gespeicherter Stand wird nicht durch jeden Lesezugriff automatisch neu berechnet.

    Im Fachkapitel nachlesen

    Frage 281SchemaobjekteMittel
    Warum ist eine normale View nicht grundsätzlich langsam?
    Lösung und Begründung

    Richtige Antwort: Aufwand hängt von Abfrage, Datenmenge, Zugriffswegen und Optimierung ab

    Die Objektart allein bestimmt keine Laufzeit. Ein geeignetes Prädikat und ein effizienter Plan können einen Viewzugriff schnell machen.

    Im Fachkapitel nachlesen

    Frage 282SchemaobjekteMittel
    Welche Zusicherung gibt eine Sequenz nicht?
    Lösung und Begründung

    Richtige Antwort: Lückenlose Nummern ohne Ausfälle oder Rollbacks

    Reservierte oder bereits abgefragte Werte können ungenutzt bleiben. Eine Sequenz ist deshalb kein allgemeines Instrument für rechtlich oder fachlich lückenlose Belegnummern.

    Im Fachkapitel nachlesen

    Frage 283SchemaobjekteMittel
    Welche Aussage zu einem Synonym ist korrekt?
    Lösung und Begründung

    Richtige Antwort: Es bietet einen alternativen Objektnamen, ohne selbst Objektprivilegien zu vergeben

    Namensauflösung und Berechtigung sind getrennt. Hinter dem Synonym kann auch ein entfernter Zugriff liegen.

    Im Fachkapitel nachlesen

    Frage 284SchemaobjekteMittel
    Warum kann ein Tabellen-DML zusätzliche Arbeit auslösen, die im ursprünglichen SQL nicht sichtbar ist?
    Lösung und Begründung

    Richtige Antwort: Ein passender Trigger kann automatisch weiteren Code ausführen

    Trigger reagieren auf definierte Ereignisse. Für Laufzeit- und Fehleranalysen ist deshalb die tatsächlich ausgelöste Verarbeitung relevant.

    Im Fachkapitel nachlesen

    Frage 285SchemaobjekteMittel
    Warum ist ein hoher INVALID-Zähler allein keine vollständige Fehlerdiagnose?
    Lösung und Begründung

    Richtige Antwort: Objektart, Abhängigkeiten, konkrete Fehler und Änderung gegenüber dem Ausgangszustand fehlen

    Ein Status weist auf Prüfbedarf hin. Compilerdiagnosen, betroffene Anwendung und zeitlicher Kontext machen daraus einen belastbaren Befund.

    Im Fachkapitel nachlesen

    Frage 286RMANMittel
    Was ist der Unterschied zwischen EXPIRED und OBSOLETE bei RMAN?
    Lösung und Begründung

    Richtige Antwort: EXPIRED betrifft festgestellte Nichtverfügbarkeit; OBSOLETE den Bedarf nach Retention Policy

    CROSSCHECK kann den Verfügbarkeitsstatus ändern. Die Retention Policy beurteilt dagegen den Recovery-Bedarf; diese Aussagen dürfen nicht vermischt werden.

    Im Fachkapitel nachlesen

    Frage 287RMANMittel
    Was unterscheidet RESTORE von RECOVER?
    Lösung und Begründung

    Richtige Antwort: RESTORE stellt Dateien aus Sicherungen bereit; RECOVER wendet benötigte Änderungen an

    Wiederhergestellte Dateien können noch nicht am gewünschten Zielstand sein. Backupbestand und benötigtes Redo müssen zusammenpassen.

    Im Fachkapitel nachlesen

    Frage 288RMANMittel
    Ein inkrementelles Level-1-Backup ist cumulative. Auf welchen Basisstand bezieht es sich grundsätzlich?
    Lösung und Begründung

    Richtige Antwort: Das letzte geeignete Level-0-Backup

    Cumulative sammelt Änderungen seit Level 0. Differential bezieht sich grundsätzlich auf das letzte geeignete inkrementelle Backup auf Level 0 oder 1.

    Im Fachkapitel nachlesen

    Frage 289RMANMittel
    Beweist ein erfolgreiches CROSSCHECK die inhaltliche Lesbarkeit aller Backupblöcke?
    Lösung und Begründung

    Richtige Antwort: Nein; Verfügbarkeitsprüfung und Validierung sind unterschiedliche Prüfungen

    CROSSCHECK aktualisiert den Repository-Status zur Verfügbarkeit. Validierung und ein geprobter Restore-/Recovery-Ablauf prüfen andere Eigenschaften.

    Im Fachkapitel nachlesen

    Frage 290RMANMittel
    Was zeigt INPUT_TYPE='DB INCR' in V$RMAN_BACKUP_JOB_DETAILS nicht?
    Lösung und Begründung

    Richtige Antwort: Das genaue Incremental-Level 0 oder 1

    Für das Level sind passende Backup-Set-Metadaten erforderlich. Ein zusammenfassender Jobtyp ist kein vollständiges Inventar aller gesicherten Bestandteile.

    Im Fachkapitel nachlesen

    Frage 291RMANMittel
    Ein Archivelog-Job läuft alle 15 Minuten. Warum ist damit RPO 15 Minuten nicht automatisch garantiert?
    Lösung und Begründung

    Richtige Antwort: Erfolg, Redo-Abdeckung und Verfügbarkeit am Recovery-Ziel müssen tatsächlich gegeben sein

    Ein Solltermin ist keine garantierte nutzbare Sicherung. Ausfälle, Verzögerungen und fehlende Übertragung können die wiederherstellbare Grenze verschieben.

    Im Fachkapitel nachlesen

    Frage 292RMANMittel
    Warum werden Online-Redo-Dateien nicht wie Datafiles in ein gewöhnliches RMAN-Datenbankbackup aufgenommen?
    Lösung und Begründung

    Richtige Antwort: RMAN sichert dafür die erforderlichen Archived Logs; Online Redo hat eine eigene Rolle im Recovery

    Das Sicherungskonzept muss Redo-Abdeckung sicherstellen. Vorhandenes Online Redo kann beim Recovery zusätzlich wichtig sein, ist aber kein normales Datafile-Backupobjekt.

    Im Fachkapitel nachlesen

    Frage 293RMANMittel
    Was bedeutet ein Restore-Test für den Backupnachweis?
    Lösung und Begründung

    Richtige Antwort: Er prüft die praktische Wiederherstellung unter den getesteten Bedingungen

    Ein Test ist ein starker Nachweis für das konkrete Szenario. Andere Ausfallarten, Zeitpunkte oder fehlende Komponenten müssen weiterhin berücksichtigt werden.

    Im Fachkapitel nachlesen

    Frage 294MultitenantMittel
    Was bewirkt SAVE STATE für eine PDB grundsätzlich?
    Lösung und Begründung

    Richtige Antwort: Den Öffnungszustand für folgende CDB-Starts merken

    SAVE STATE ist eine administrative Zustandskonfiguration. Es ersetzt keine Datensicherung und verändert nicht das Benutzergrundmodell.

    Im Fachkapitel nachlesen

    Frage 295MultitenantMittel
    Warum garantiert ein SELECT aus CDB_-Views im Root nicht die Sicht auf jede PDB-Zeile?
    Lösung und Begründung

    Richtige Antwort: Rechte, CONTAINER_DATA und Zugänglichkeit der Container begrenzen den Sichtbereich

    Ein fehlender Treffer ist kein sicherer Beweis für ein fehlendes Objekt oder eine fehlende PDB. Bestand und tatsächlich sichtbarer Objektkontext müssen getrennt geprüft werden.

    Im Fachkapitel nachlesen

    Frage 296MultitenantMittel
    Was bewirkt ALTER SESSION SET CONTAINER im passenden administrativen Kontext?
    Lösung und Begründung

    Richtige Antwort: Wechsel des aktuellen Containers derselben Session

    Der Befehl setzt geeignete Rechte voraus und ändert den Sessionkontext. Er ist keine lesende Diagnoseabfrage und keine Datenbankkopie.

    Im Fachkapitel nachlesen

    Frage 297MultitenantMittel
    Warum kann ein im Root erfolgreich registrierter SQL-Patch noch keine vollständige PDB-Nachkontrolle ersetzen?
    Lösung und Begründung

    Richtige Antwort: Der erforderliche SQL-Patchzustand muss für die betroffenen Container geprüft werden

    Binary- und SQL-Patchzustand sowie Erreichbarkeit der erforderlichen Container gehören zusammen. Ein einzelner Root-Befund beweist nicht den Zustand jeder PDB.

    Im Fachkapitel nachlesen

    Frage 298HintergrundprozesseMittel
    Welche Arbeit delegiert PMON in Oracle 19c an CLMN und gegebenenfalls CLnn?
    Lösung und Begründung

    Richtige Antwort: Cleanup-Arbeit nach beendeten Prozessen oder Sessions

    PMON erkennt und koordiniert; die Cleanup-Prozesse übernehmen Bereinigungsarbeit. LGWR und Optimizer haben andere Aufgaben.

    Im Fachkapitel nachlesen

    Frage 299RedoMittel
    Was passiert beim Rollforward der Instance Recovery?
    Lösung und Begründung

    Richtige Antwort: Benötigte Redo-Änderungen werden erneut angewendet, auch solche nicht bestätigter Transaktionen

    Nach dem Rollforward werden nicht bestätigte Änderungen mithilfe von Undo zurückgerollt. Redo-Anwendung und Transaktionsrollback sind getrennte Phasen.

    Im Fachkapitel nachlesen

    Frage 300RedoMittel
    Worin liegt die wichtige Grenze einer COMMIT-WRITE-NOWAIT-Rückmeldung?
    Lösung und Begründung

    Richtige Antwort: Sie kann vor dem dauerhaften Schreiben von Redo zum Client zurückkehren

    Asynchrone Bestätigung ist von einem synchron bestätigten Commit zu unterscheiden. Ein Erfolg beim Client darf hier nicht mit bereits dauerhaft gespeichertem Redo gleichgesetzt werden.

    Im Fachkapitel nachlesen

    Frage 301VerschlüsselungLeicht
    Ein Tablespace ist mit TDE verschlüsselt. Welche Aussage folgt daraus für eine exportierte CSV-Datei?
    Lösung und Begründung

    Richtige Antwort: Der Schutz der CSV-Datei muss unabhängig geprüft werden.

    TDE schützt die dafür eingerichtete Speicherung. Eine Anwendung kann berechtigt Klartext lesen und ihn in eine neue Datei schreiben; für diese Datei gilt ein eigenes Schutzkonzept.

    Im Fachkapitel nachlesen

    Frage 302VerschlüsselungLeicht
    Welche Aufgabe hat Verschlüsselung auf dem Transportweg?
    Lösung und Begründung

    Richtige Antwort: Sie schützt übertragene Daten auf der betrachteten Verbindung.

    Transportverschlüsselung betrifft den Datenweg zwischen den beteiligten Endpunkten. Berechtigungen, Speicherung und Sicherung bleiben eigene Aufgaben.

    Im Fachkapitel nachlesen

    Frage 303VerschlüsselungLeicht
    Welche Aussage zu einem Base64-kodierten Passwort ist richtig?
    Lösung und Begründung

    Richtige Antwort: Die Kodierung allein ist keine Verschlüsselung.

    Base64 ist eine Darstellung von Daten. Daraus folgt kein kryptografischer Schutz vor einem Leser der Datei.

    Im Fachkapitel nachlesen

    Frage 304VerschlüsselungMittel
    Client und Server stehen für NNE beide auf ACCEPTED. Was kann daraus geschlossen werden?
    Lösung und Begründung

    Richtige Antwort: Diese Kombination fordert NNE nicht von sich aus an.

    ACCEPTED erlaubt eine Anforderung der Gegenseite. Zwei ausschließlich akzeptierende Seiten erzwingen keine Verschlüsselung.

    Im Fachkapitel nachlesen

    Frage 305VerschlüsselungMittel
    Ein NNE-Testserver verlangt REQUIRED, der Testclient steht auf REJECTED. Was ist die richtige Erwartung?
    Lösung und Begründung

    Richtige Antwort: Die Verbindung scheitert wegen unvereinbarer Schutzanforderungen.

    REQUIRED darf bei ablehnender Gegenstelle nicht durch eine unverschlüsselte Verbindung erfüllt werden. Ein solcher Negativtest prüft die Durchsetzung im vorgesehenen Testziel.

    Im Fachkapitel nachlesen

    Frage 306VerschlüsselungMittel
    V$SESSION_CONNECT_INFO zeigt nur die allgemeine Zeile „Encryption service“. Ist NNE damit nachgewiesen?
    Lösung und Begründung

    Richtige Antwort: Nein; ein konkreter verwendeter Verschlüsselungsadapter ist der entscheidende Befund.

    Der allgemeine Dienstbanner allein kann auch ohne konkret verwendeten NNE-Adapter erscheinen. Außerdem betrifft ein Sitzungsbefund nur die geprüfte Verbindung.

    Im Fachkapitel nachlesen

    Frage 307VerschlüsselungLeicht
    Wozu dient bei TLS die Prüfung der erwarteten Serveridentität?
    Lösung und Begründung

    Richtige Antwort: Sie prüft, ob das Zertifikat zum vorgesehenen Ziel gehört.

    Ein vertrauenswürdiger Aussteller allein genügt nicht, wenn das Zertifikat zu einem anderen Server gehört. Vertrauen und Zielidentität sind getrennte Aspekte.

    Im Fachkapitel nachlesen

    Frage 308VerschlüsselungMittel
    V$ENCRYPTION_WALLET meldet OPEN_NO_MASTER_KEY. Was bedeutet das?
    Lösung und Begründung

    Richtige Antwort: Der TDE-Keystore ist geöffnet, aber kein Master-Schlüssel ist gesetzt.

    Die View beschreibt TDE. Der Status unterscheidet das Öffnen des Behälters vom Vorhandensein eines Master-Schlüssels; er ist keine SEPS-Diagnose. Eine Statusabfrage kann ein Auto-Login-TDE-Wallet öffnen. Sie beweist daher nicht den Öffnungszustand vor der Abfrage; Container und Keystore-Modus gehören zur Einordnung.

    Im Fachkapitel nachlesen

    Frage 309VerschlüsselungLeicht
    DBA_TABLESPACES zeigt für APP_DATA ENCRYPTED=YES. Was ist damit direkt belegt?
    Lösung und Begründung

    Richtige Antwort: APP_DATA ist als verschlüsselter Tablespace ausgewiesen.

    Die Spalte beschreibt den betreffenden Tablespace im abgefragten Kontext. Sie trifft keine allgemeine Aussage zu Clients, Exporten oder anderen Containern.

    Im Fachkapitel nachlesen

    Frage 310VerschlüsselungMittel
    Warum dürfen ältere TDE-Schlüssel nach einem Master-Schlüsselwechsel nicht pauschal gelöscht werden?
    Lösung und Begründung

    Richtige Antwort: Vorhandene historische Sicherungen können weiterhin ältere Schlüssel benötigen.

    Die Wiederherstellbarkeit muss einschließlich der erforderlichen Schlüssel erhalten bleiben. Ein neuer aktiver Schlüssel macht frühere Sicherungen nicht automatisch unabhängig von älteren Schlüsseln.

    Im Fachkapitel nachlesen

    Frage 311Oracle WalletLeicht
    Wo wird das SEPS-Wallet für einen SQL*Plus-Berichtsjob benötigt?
    Lösung und Begründung

    Richtige Antwort: Auf der Clientseite, von der der Job die Verbindung aufbaut.

    Client bezeichnet hier den verbindungsaufbauenden Prozess. Das kann auch ein Jobrechner sein; entscheidend ist dessen Zugriff auf das konfigurierte Wallet.

    Im Fachkapitel nachlesen

    Frage 312Oracle WalletLeicht
    Was bewirkt mkstore -createCredential im beschriebenen SEPS-Beispiel?
    Lösung und Begründung

    Richtige Antwort: Es hinterlegt Zugangsdaten für den angegebenen Verbindungsnamen im Wallet.

    Das Speichern eines Zugangs ersetzt weder die Anlage eines Kontos noch die Vergabe fachlich benötigter Rechte.

    Im Fachkapitel nachlesen

    Frage 313Oracle WalletLeicht
    Warum muss REPORTDB im Wallet zum verwendeten CONNECT /@REPORTDB passen?
    Lösung und Begründung

    Richtige Antwort: Der Verbindungsname ordnet die Anmeldung dem gespeicherten Zugang zu.

    Alias, Service und Benutzername erfüllen unterschiedliche Aufgaben. Im Beispiel wird derselbe Verbindungsname für den Wallet-Eintrag und den Verbindungsaufruf verwendet.

    Im Fachkapitel nachlesen

    Frage 314Oracle WalletLeicht
    Welchen Zweck erfüllt TNS_ADMIN im Wallet-Beispiel?
    Lösung und Begründung

    Richtige Antwort: Es verweist den Client auf das vorgesehene Verzeichnis der Oracle-Net-Konfiguration.

    TNS_ADMIN hilft, die tatsächlich verwendeten Konfigurationsdateien festzulegen. Es ist keine Rechtevergabe und keine Verschlüsselungsfunktion.

    Im Fachkapitel nachlesen

    Frage 315Oracle WalletLeicht
    Was zeigt mkstore -listCredential im beschriebenen Ablauf?
    Lösung und Begründung

    Richtige Antwort: Gespeicherte Verbindungsnamen und Benutzernamen, keine Passwörter.

    Die Liste dient zur Zuordnung der SEPS-Einträge. Sie beweist für sich allein weder einen erfolgreichen Login noch die Richtigkeit des gespeicherten Passworts.

    Im Fachkapitel nachlesen

    Frage 316Oracle WalletMittel
    Warum ist der Schutz einer für Auto-Login nutzbaren Wallet-Datei wichtig?
    Lösung und Begründung

    Richtige Antwort: Ein unberechtigter nutzbarer Dateizugang kann die Ausübung der gespeicherten Datenbankrechte ermöglichen.

    Auto-Login ermöglicht die Nutzung ohne interaktive Wallet-Passworteingabe. Daher gehören Eigentümer, Dateirechte, Umgebung und Sicherung zum Schutzkonzept.

    Im Fachkapitel nachlesen

    Frage 317Oracle WalletMittel
    Was ändert mkstore -modifyCredential allein nicht?
    Lösung und Begründung

    Richtige Antwort: Das Passwort des Benutzerkontos in der Zieldatenbank.

    Wallet und Datenbankkonto werden in einem abgestimmten Passwortwechsel getrennt aktualisiert. Anschließend ist ein Verbindungstest erforderlich.

    Im Fachkapitel nachlesen

    Frage 318Oracle WalletMittel
    Ein Wallet-Job funktioniert im Terminal, aber nicht über cron. Was prüfst du zuerst?
    Lösung und Begründung

    Richtige Antwort: Jobkonto, absolute Pfade, TNS_ADMIN und ORACLE_HOME des geplanten Laufs.

    cron übernimmt nicht automatisch die vollständige interaktive Shellumgebung. Die Prüfung beginnt bei den tatsächlich verwendeten Laufbedingungen und der konkreten Fehlermeldung.

    Im Fachkapitel nachlesen

    Frage 319Oracle WalletLeicht
    Was belegt die Ausgabe DB_USER=REPORT_READER; CON_NAME=APPDB im Login-Test?
    Lösung und Begründung

    Richtige Antwort: Benutzer und Container der getesteten Sitzung.

    Identität, fachliche Rechte und Verschlüsselung brauchen unterschiedliche Nachweise. Der kleine Login-Test prüft bewusst nur einen Teil davon.

    Im Fachkapitel nachlesen

    Frage 320Oracle WalletMittel
    Ein SEPS-Eintrag ist vorhanden, die Anmeldung wird aber abgewiesen. Welche Schlussfolgerung ist sinnvoll?
    Lösung und Begründung

    Richtige Antwort: Ziel, Konto, Kontostatus und gespeicherten Zugang gezielt prüfen.

    Ein vorhandener Eintrag kann veraltete oder zum falschen Ziel gehörende Zugangsdaten enthalten. Die konkrete Fehlermeldung steuert die nächste Prüfung.

    Im Fachkapitel nachlesen

    Frage 321HardeningLeicht
    Welche Anforderung ist als Hardening-Ziel am besten prüfbar?
    Lösung und Begründung

    Richtige Antwort: Nur das vorgesehene Jobkonto darf das private Berichtsskript verändern.

    Ein konkreter Sollzustand nennt Objekt, erlaubten Zugriff und Zuständigkeit. So lassen sich Abweichung und Erfolg nachvollziehbar belegen.

    Im Fachkapitel nachlesen

    Frage 322HardeningLeicht
    Warum ist ein für fremde Benutzer änderbares Jobskript kritisch?
    Lösung und Begründung

    Richtige Antwort: Ein späterer Lauf könnte fremd veränderten Code unter dem Jobkonto ausführen.

    Der Schutz betrifft nicht nur lesbare Inhalte. Fremde Änderbarkeit kann den späteren Ablauf unter dem berechtigten Dienstkonto beeinflussen.

    Im Fachkapitel nachlesen

    Frage 323HardeningMittel
    Warum reicht der Dateimodus eines Skripts allein nicht immer aus?
    Lösung und Begründung

    Richtige Antwort: Auch Elternverzeichnisse, Eigentümer und zusätzliche ACLs können relevant sein.

    Ein kontrollierter Dateipfad und dessen Zugriffswege gehören zusammen. Prüfe mögliche Dateiersetzung und zusätzliche Zugriffsregeln im jeweiligen Dateisystem.

    Im Fachkapitel nachlesen

    Frage 324HardeningLeicht
    OLD_BATCH hat gerade keine aktive Session. Darf daraus seine Entbehrlichkeit abgeleitet werden?
    Lösung und Begründung

    Richtige Antwort: Nein; beispielsweise ein monatlicher Job könnte das Konto weiterhin benötigen.

    Ein Zeitpunkt ohne Nutzung ersetzt kein Inventar und keine fachliche Abstimmung. Zweck, Verantwortlichkeit und periodische Abläufe müssen geklärt werden.

    Im Fachkapitel nachlesen

    Frage 325HardeningLeicht
    Welche Rolle spielt eine Firewall gegenüber der Datenbankanmeldung?
    Lösung und Begründung

    Richtige Antwort: Sie begrenzt Netzwerkwege und ergänzt die Datenbankauthentifizierung.

    Netzerreichbarkeit und Datenbankidentität sind getrennte Schutzschichten. Ein zugelassener Netzwerkweg ist noch keine Zugriffserlaubnis auf Daten.

    Im Fachkapitel nachlesen

    Frage 326HardeningMittel
    Ein Sicherheitsbefund betrifft ein gemeinsam genutztes Oracle Home. Was ist der passende nächste Schritt?
    Lösung und Begründung

    Richtige Antwort: Zweck, Eigentümer und Abhängigkeiten prüfen, bevor Rechte gezielt geändert werden.

    Ein gemeinsames Softwareverzeichnis kann andere Anforderungen haben als ein privater Jobordner. Pauschale Änderungen können benötigte Abläufe beschädigen.

    Im Fachkapitel nachlesen

    Frage 327HardeningLeicht
    Was gehört zu einer dokumentierten befristeten Sicherheitsausnahme?
    Lösung und Begründung

    Richtige Antwort: Grund, Umfang, Verantwortlichkeit und Termin zur erneuten Bewertung.

    Eine Ausnahme muss nachvollziehbar begrenzt und erneut überprüfbar sein. Sie darf nicht als unsichtbarer Dauerzustand bestehen bleiben.

    Im Fachkapitel nachlesen

    Frage 328HardeningMittel
    Warum reicht ein erfolgreicher manueller Lauf nach einer Rechteänderung nicht immer als Abnahme?
    Lösung und Begründung

    Richtige Antwort: Der geplante Job kann unter einem anderen Konto oder mit anderer Umgebung laufen.

    Die Prüfung muss den realen Ablauf einschließen. Konto, Pfade, Logzugriff und der nächste geplante Lauf können zusätzliche Abweichungen zeigen.

    Im Fachkapitel nachlesen

    Frage 329HardeningLeicht
    Welche Information gehört nicht in ein frei zugängliches Diagnoseprotokoll?
    Lösung und Begründung

    Richtige Antwort: Ein nutzbares Datenbankpasswort.

    Protokolle sollen die Fehlersuche ermöglichen, ohne Geheimnisse offenzulegen. Ihr Inhalt und Zugriff werden passend zum Einsatzzweck begrenzt.

    Im Fachkapitel nachlesen

    Frage 330HardeningMittel
    Warum wird Hardening regelmäßig erneut bewertet?
    Lösung und Begründung

    Richtige Antwort: Neue Clients, Rollen und Jobs können den bereits geprüften Zustand verändern.

    Der Soll-Ist-Vergleich muss Veränderungen erfassen. Eine frühere Abnahme beschreibt einen bekannten Umfang zu einem bestimmten Zeitpunkt, nicht jede spätere Erweiterung.

    Im Fachkapitel nachlesen

    Teil B – Prüfungssimulation

    Prüfungssimulation: Die Prüfung verwendet ausschließlich Multiple-Choice-Fragen mit genau drei vollständigen Antwortmöglichkeiten. Unvollständige oder binäre Altfragen sind nicht Bestandteil des Fragenpools.

    Der Fragenpool enthält aktuell 0 Fragen. Eine reguläre Prüfung zieht 60 Fragen aus dem bereinigten Drei-Antworten-Fragenpool. Fixierte, für die Prüfung geeignete Fragen werden beim nächsten Lauf wieder aufgenommen; die restlichen Plätze werden thematisch gemischt und zufällig aus dem geeigneten Pool aufgefüllt.

    Wiederholungsprinzip: Markiere eine Frage mit ★ Fixieren, wenn du sie beim nächsten Lauf erneut sehen willst. Optional werden falsch oder nicht beantwortete Fragen bei der Abgabe automatisch fixiert. Die Fixierungen bleiben lokal in diesem Browser gespeichert.
    StatusNicht gestartet
    Restzeit--:--
    Beantwortet0
    Richtig--
    Falsch--
    Offen--
    Ergebnis--
    Fragen0 / 60
    Fixiert0
    Pool0
    Eine Antwort ist erst verstanden, wenn auch erklärt werden kann, warum die anderen Antworten falsch sind.

    Zur SELECT-INTO-Lernkontrolle: NO_DATA_FOUND betrifft eine Anweisung, die keine Ergebniszeile liefert. Eine skalare Aggregation ohne GROUP BY kann dagegen auch ohne passende Eingangszeilen eine Ergebniszeile liefern. Unterscheide diese Fälle bei der Antwort.

    Weiterbildung: Fachwissen und selbstständige Fähigkeiten getrennt nachweisen

    Ein richtig beantwortetes Quiz zeigt etwas anderes als ein selbstständig gelöstes Laborproblem. Nutze deshalb je Themengebiet drei Nachweise: verständlich erklären, einen angeleiteten Fall durchführen und einen veränderten Fall ohne fertige Lösung bearbeiten. Die vorhandenen Lernstatus-Schaltflächen bleiben eine Selbsteinschätzung; sie prüfen keine Datenbank und bestätigen keine produktive Handlungsbefugnis. Die folgenden Nachweise werden als eigenes Lernprotokoll geführt.

    KompetenzFachkapitel / ÜbungÜberprüfbares Ergebnis
    SQL formulieren36 und 42NULL, Aggregation und Joins erklären; eine passende Abfrage ohne Antwortoptionen schreiben.
    Datenbank aufbauen5: Labor DatenbankaufbauHome, CDB, PDB und Service unterscheiden; Erstellung und Zugriff unabhängig nachweisen.
    Storage verwalten8: Labor StorageDatei, Segment, Quota und physische Kapazität auseinanderhalten; Änderung vorher/nachher belegen.
    Rechte vergeben12: Labor AnwendungszugangFehlenden Zugriff gezielt ermöglichen und wirksamen Rechtepfad erklären.
    PDBs verwalten13: PDB-LebenszyklusErstellung, Klon, Unplug und Plug mit Dateien und Zuständen nachvollziehen.
    Daten laden24: Datenlade-LaborPassendes Werkzeug wählen; erfolgreiche, abgewiesene und ausgeschlossene Datensätze unterscheiden.
    Recovery durchführen25: Recovery-RunbooksZum Schaden passenden Ablauf wählen und den Datenzustand nachweisen.
    Upgrade beurteilen26: Upgrade-LaborVorprüfung, Durchführung, Nachkontrolle und Rückfall als getrennte Ergebnisse dokumentieren.
    Störung untersuchen19/20/30/33/45Hypothesen mit aktuellen, eindeutig zugeordneten Befunden prüfen; Wirkungsprüfung durchführen.
    Betrieb übergeben29/35/45Befund, Unsicherheit, nächsten Schritt und Rückweg verständlich dokumentieren.

    Ein einheitlicher Bewertungsmaßstab

    StufeWann sie erreicht ist
    Noch offenDie Erklärung oder ein notwendiger Nachweis fehlt; zufällig richtige Antwort genügt nicht.
    Mit AnleitungDer bereitgestellte Fall gelingt, aber wesentliche Schritte werden noch aus der Lösung übernommen.
    Selbstständig im LaborDer veränderte Fall gelingt ohne fertige Befehlsfolge; Kontext, Ergebnis und Rückweg werden erklärt.
    Betrieblich freigegebenZusätzliche Entscheidung des zuständigen Teams nach lokalen Verfahren und Erfahrung; wird vom Wiki nicht vergeben.

    Pro Versuch notierst du Datum, Umgebung/Edition/RU, Ausgangszustand, eigene Vorhersage, ausgeführte Schritte, beobachtetes Ergebnis und Rückweg. Eine Fehlermeldung mit richtiger Diagnose kann wertvoller sein als ein zufällig erfolgreicher Befehl. Wiederhole einen zunächst angeleiteten Fall später mit anderen Werten oder einem veränderten Symptom.

    Abgleich mit einem konkreten Oracle-Prüfungsziel

    Wähle zuerst den tatsächlichen Prüfungscode und übertrage seine aktuelle offizielle Themenliste in dein Lernprotokoll. Die folgende Zuordnung ist eine Arbeitshilfe für den 19c-Schwerpunkt, keine Bestätigung vollständiger Prüfungsabdeckung. Benennung und Umfang einer Prüfung können sich ändern. Ein vorhandenes Kapitel gilt erst dann als ausreichend vorbereitet, wenn du die konkrete geforderte Tätigkeit erklären und gegebenenfalls im passenden Labor nachweisen kannst.

    ThemenbereichVorhandene GrundlageZusätzlich zu prüfen
    Administration I / SQL1–24, 28, 36, 42; neue Storage-, Rechte- und LadeübungenJedes aktuelle Einzelziel der offiziellen Liste; weitere SQL-Funktionen und Verwaltungsvarianten gezielt zuordnen.
    Administration II / Aufbau, Multitenant, Upgrade, Recovery5, 13, 23, 25, 26 und neue LaborfälleInstallation und Optionen der konkreten Plattform; weiterführende CDB-/PDB-Verfahren und aktuelle Prüfungsziele.
    Performance und Diagnose9/10, 18–23, 29–35, 43–50Methoden unabhängig von Werkzeugnamen erklären; editionsgebundene Advisor-/Pack-Themen gesondert behandeln.
    Weitere Betriebsmodelle52 als OrientierungASM/Grid Infrastructure/Oracle Restart und andere im gewählten Prüfungsplan verlangte Spezialthemen sind durch die Einstiegslabore nicht vollständig praktisch abgedeckt.

    Die SE2-Labore geben keine Nutzungsfreigabe für EE-Optionen oder Management Packs. Wo eine Funktion in der eigenen Umgebung fehlt, trenne die theoretische Erklärung vom ausstehenden praktischen Nachweis. Die vertiefte Arbeit in einer berechtigten passenden Umgebung kann dadurch nicht als bereits absolviert gelten.

    Mehrfachauswahl als zusätzliche Denkaufgabe

    Der bestehende Fragenpool mit genau einer richtigen Antwort bleibt unverändert. Bearbeite zusätzlich diese Aufgabe ohne Antwortbuchstaben auswendig zu lernen: Welche zwei Aussagen sind richtig? A: Ein erfolgreicher Backupjob beweist jeden Recovery-Fall. B: Eine PDB besitzt einen eigenen Open Mode. C: Der Zustand der CDB beweist den Zustand jeder PDB. D: Ein geprüftes Recovery-Szenario belegt genau den untersuchten Wiederherstellungsfall. Begründe alle vier Aussagen, bevor du die Lösung öffnest.

    Musterlösung und Abnahmekriterien

    Richtig sind B und D. A und C überschreiten die Aussagekraft ihres jeweiligen Nachweises. Das Beispiel trainiert Mehrfachauswahl, ist aber keine echte oder rekonstruierte Oracle-Prüfungsfrage. Für den Prüfungsabgleich zählen die aktuellen offiziellen Vorgaben; die Wiki-Simulation wird dadurch nicht zu einer offiziellen Prüfung.

    Offizielle Prüfungseinträge: Administration I · Administration II

    47. Oracle Wait Event Lexikon – Ursachen, Analyse, Views, SQL und Diagnosewege

    Interaktives Nachschlagewerk mit 108 Oracle Wait Events, einheitlicher Bewertung und read-only Diagnoseabfragen.

    Lernkompass
    Einfach gesagt Dieses Kapitel ist ein Nachschlagewerk für konkrete Wait Events.
    Warum ist das wichtig? Nutze es erst, nachdem du das Grundprinzip aus dem Wait-Event-Kapitel verstanden hast.
    Nach diesem Kapitel Du kannst einen Wait-Namen schnell zu Bedeutung, typischen Ursachen und ersten Checks zuordnen.
    Lesetipp: Du musst diesen Abschnitt nicht auswendig lernen. Verstehe zuerst die Aufgabe und merke dir, wo du die Details später nachschlagen kannst.

    Einführung: Das Wait-Event-Lexikon hilft, einen beobachteten Oracle-Wartegrund fachlich einzuordnen. Der Eventname bezeichnet den gemeldeten Wartezustand, nicht automatisch den verantwortlichen Fehler. Deshalb verbindet jede Karte die Bedeutung mit möglichen Ursachen, passenden Messquellen und den nächsten Prüfungen. Für die Grundlagen des Wartemodells bleibt Kapitel 30 der Ausgangspunkt.

    Suche das tatsächlich beobachtete Event und lies zunächst seine Aufgabe. Vergleiche danach Zeitraum, betroffene Arbeit und Messumfang mit deinem Befund, bevor du eine mögliche Ursache übernimmst. Die folgenden Abschnitte erklären die Verwendung der Karten und die Interpretation aktueller Waits. Die Einstufungen des Wikis sind Orientierungshilfen und keine von Oracle vergebenen Incident-Schweregrade.

    Oracle 19c: fachliche Grundlage

    Event-Namen und Wait Class in der eigenen Datenbank nachschlagen

    Die SQL-Filter verwenden NAME aus V$EVENT_NAME. Ein Latch-Name ohne Präfix ist nicht automatisch ein Wait-Event-Name. Für vorhandene Events und deren Klasse ist die folgende Abfrage maßgeblich. Kein Treffer kann auch einen in dieser Version nicht vorhandenen Namen bedeuten.

    Read-only SQL
    SELECT name, wait_class, parameter1, parameter2, parameter3
    FROM v$event_name
    WHERE name IN ('latch: cache buffers chains',
                   'latch: cache buffers lru chain',
                   'latch: redo allocation', 'latch: redo copy',
                   'enq: JI - contention', 'direct path write')
    ORDER BY name;

    Die allgemeinen Bewertungen des Wikis sind keine Oracle-Schweregrade. Erst Zeitpunkt, Umfang und betroffene Arbeit machen aus einem Wait eine belastbare Diagnose.

    Aktuelle Waits: Die Session-Abfragen in den Event-Karten filtern STATE = WAITING. EVENT allein könnte auch den zuletzt beendeten Wait bezeichnen. WAIT_TIME_MICRO beschreibt bei diesen gefilterten Zeilen die bisherige Dauer des aktuellen Waits; TIME_SINCE_LAST_WAIT_MICRO ist dagegen keine aktuelle Wartedauer. Leere Ergebnisse schließen frühere oder sehr kurze Waits nicht aus.

    1. Empfohlener Analyseablauf

    1. Zeitraum Wann trat das Problem auf?
    →
    2. Wait Class I/O, Commit, Application, Concurrency oder Idle?
    →
    3. Sessions Wie viele Sessions sind betroffen?
    →
    4. SQL und Objekt SQL_ID, Plan, Segment und Blocker bestimmen
    →
    5. Maßnahme Ursache beheben und Wirkung messen
    Idle-Waits sind in vielen Fällen normal und dürfen nicht mit aktiven Engpässen gleichgesetzt werden. Besonders SQL*Net message from client, pmon timer, smon timer und viele Background-Idle-Waits gehören zum normalen Betrieb.

    2. So benutzt du das Wait-Event-Lexikon

    Wichtig: Die Einstufungen in den Karten sind Orientierungshilfen dieses Wikis und keine Oracle-Schweregrade. Ein häufiges Event kann für eine Workload normal sein; ein seltenes Event kann in einem konkreten Incident entscheidend sein.

    Ein Wait als kurze Geschichte

    Eine Session wartet in einer Momentaufnahme seit 12 Sekunden auf enq: TX - row lock contention. Der Zustand WAITING bestätigt, dass es ein aktueller Wait ist. Als Nächstes brauchst du den gültig gemeldeten Blocker und dessen Transaktionskontext. Der Eventname allein nennt weder die verantwortliche Fachaktion noch eine erlaubte Behebung.

    Ein später leeres Ergebnis bedeutet nur, dass die Abfrage jetzt keinen passenden Wait findet. Bewahre den ersten Befund mit Zeitpunkt und Sessionidentität auf. Kumulierte Wartezeiten auf den Karten werden für ein Intervall aus zwei Messpunkten berechnet; sie sind keine aktuelle Einzelwartedauer.

    Was sehe ich in den Diagnose-SQL?

    WAIT_TIME_MICRO und TIME_SINCE_LAST_WAIT_MICRO müssen zusammen mit STATE gelesen werden. Eine einzelne Momentaufnahme ersetzt keine Zeitreihen- oder Deltaanalyse. Für die Bedeutung von P1/P2/P3 ist V$EVENT_NAME die Referenz.

    db file sequential read Einzelblock-Lesezugriff, häufig über Indexzugriffe oder Rowid. User I/O Analyse erforderlich

    1. Typische Ursache

    Indexzugriffe, zufällige I/O oder langsames Storage.

    2. Analyse

    SQL_ID, Objekt und durchschnittliche Latenz prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$SESSION, V$SQL, V$SEGMENT_STATISTICS

    4. Nächster Diagnoseweg

    Top SQL und Storage-Latenz prüfen; unnötige Einzelblockzugriffe reduzieren.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    db file sequential read – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'db file sequential read'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDSERIAL#CON_IDTYPESQL_IDEVENTSTATEWAIT_MSBLOCKING_SESSION_STATUSBLOCKING_SESSION
    1534123USERNULLdb file sequential readWAITING12.5UNKNOWNNULL

    Was sehe ich hier? Die erfundene Session wartet im Moment der Abfrage seit 12,5 ms auf dieses Event. UNKNOWN liefert keinen bestätigten Blocker. Ein fehlender SQL_ID-Wert ist möglich. Der Wert ist weder eine durchschnittliche Latenz noch die gesamte Dauer einer Störung.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    db file scattered read Mehrblock-Lesezugriff, häufig bei Full Table Scans. User I/O Analyse erforderlich

    1. Typische Ursache

    Große Scans, fehlende Selektivität oder Storage-Latenz.

    2. Analyse

    Top SQL, Plan und gelesene Objekte prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$SESSION, V$SQL_PLAN, V$FILESTAT

    4. Nächster Diagnoseweg

    Ausführungsplan, Filter, Partition Pruning und I/O-Leistung prüfen.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    db file scattered read – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'db file scattered read'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDSERIAL#CON_IDTYPESQL_IDEVENTSTATEWAIT_MSBLOCKING_SESSION_STATUSBLOCKING_SESSION
    1534123USERNULLdb file scattered readWAITING12.5UNKNOWNNULL

    Was sehe ich hier? Die erfundene Session wartet im Moment der Abfrage seit 12,5 ms auf dieses Event. UNKNOWN liefert keinen bestätigten Blocker. Ein fehlender SQL_ID-Wert ist möglich. Der Wert ist weder eine durchschnittliche Latenz noch die gesamte Dauer einer Störung.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    direct path read Direkte Lesezugriffe an der Buffer Cache-Struktur vorbei. User I/O Analyse erforderlich

    1. Typische Ursache

    Große Scans, parallele Abfragen, Sorts oder Exadata-/PGA-Verhalten.

    2. Analyse

    SQL, TEMP-Verbrauch und Parallelität prüfen.

    3. Relevante Views

    V$SESSION, V$SQL, V$SQL_WORKAREA, V$TEMPSEG_USAGE

    4. Nächster Diagnoseweg

    Große Scans und Workareas analysieren; Parallelität und Storage prüfen.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    direct path read – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'direct path read'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    direct path read temp Direkte Reads aus TEMP bei Sort- oder Hash-Operationen. User I/O Analyse erforderlich

    1. Typische Ursache

    Die Workarea verwendet TEMP. Das kann bei großen Operationen auch ohne allgemeinen PGA-Mangel auftreten; Ausführungsart und TEMP-I/O müssen gemeinsam bewertet werden.

    2. Analyse

    Onepass/Multipass, SQL_ID und TEMP-I/O prüfen.

    3. Relevante Views

    V$SQL_WORKAREA, V$SQL_WORKAREA_HISTOGRAM, V$SESSION

    4. Nächster Diagnoseweg

    PGA-Ziel, SQL-Plan und Datenmenge prüfen.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    direct path read temp – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'direct path read temp'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDSERIAL#CON_IDTYPESQL_IDEVENTSTATEWAIT_MSBLOCKING_SESSION_STATUSBLOCKING_SESSION
    1534123USERNULLdirect path read tempWAITING12.5UNKNOWNNULL

    Was sehe ich hier? Die erfundene Session wartet im Moment der Abfrage seit 12,5 ms auf dieses Event. UNKNOWN liefert keinen bestätigten Blocker. Ein fehlender SQL_ID-Wert ist möglich. Der Wert ist weder eine durchschnittliche Latenz noch die gesamte Dauer einer Störung.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    direct path write Direkte Schreibzugriffe, häufig bei Parallel DML oder CTAS. User I/O Analyse erforderlich

    1. Typische Ursache

    Große direkte Writes oder langsames Storage.

    2. Analyse

    SQL, Dateipfad und Latenz prüfen.

    3. Relevante Views

    V$SESSION, V$SQL, V$FILESTAT

    4. Nächster Diagnoseweg

    Storage und SQL-Operation bewerten.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    direct path write – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'direct path write'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    direct path write temp Direkte Writes nach TEMP. User I/O Analyse erforderlich

    1. Typische Ursache

    Sorts/Hash Joins spillen aus PGA nach TEMP.

    2. Analyse

    Workarea und TEMP-Latenz prüfen.

    3. Relevante Views

    V$SQL_WORKAREA, V$TEMPSEG_USAGE, V$SESSION

    4. Nächster Diagnoseweg

    PGA, SQL-Plan und TEMP-Storage prüfen.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    direct path write temp – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'direct path write temp'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    db file parallel read Parallele Einzelblock-Reads durch eine Session. User I/O Analyse erforderlich

    1. Typische Ursache

    Batch-Zugriffe, Recovery oder Optimizer-Zugriffe.

    2. Analyse

    SQL und Dateilatenz prüfen.

    3. Relevante Views

    V$SESSION, V$SQL, V$FILESTAT

    4. Nächster Diagnoseweg

    Storage und SQL-Zugriffsmuster analysieren.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    db file parallel read – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'db file parallel read'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    db file parallel write DBWR wartet auf parallele Datafile-Writes. System I/O Analyse erforderlich

    1. Typische Ursache

    Langsames Datafile-Storage oder hohe Dirty-Buffer-Last.

    2. Analyse

    Write-Latenz, DBWR und Checkpoints prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$FILESTAT, V$SYSMETRIC

    4. Nächster Diagnoseweg

    Storage-Latenz, DBWR und Checkpoint-Druck prüfen.

    Wait Class:
    System I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    db file parallel write – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'db file parallel write'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    control file sequential read Sequentieller Zugriff auf Controlfiles. System I/O Analyse erforderlich

    1. Typische Ursache

    Häufige Metadatenzugriffe oder langsames Controlfile-Storage.

    2. Analyse

    Latenz und Controlfile-Pfade prüfen.

    3. Relevante Views

    V$CONTROLFILE, V$SYSTEM_EVENT

    4. Nächster Diagnoseweg

    Controlfiles auf zuverlässigem, schnellem Storage halten.

    Wait Class:
    System I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    control file sequential read – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'control file sequential read'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    control file parallel write Paralleles Schreiben aller Controlfile-Kopien. System I/O Analyse erforderlich

    1. Typische Ursache

    Langsame oder unterschiedlich schnelle Controlfile-Member.

    2. Analyse

    Member-Latenz und Pfade prüfen.

    3. Relevante Views

    V$CONTROLFILE, V$SYSTEM_EVENT

    4. Nächster Diagnoseweg

    Controlfile-Member auf vergleichbar schnellem Storage platzieren.

    Wait Class:
    System I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    control file parallel write – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'control file parallel write'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    log file sync Session wartet auf LGWR-Bestätigung beim COMMIT. Commit Analyse erforderlich

    1. Typische Ursache

    Redo-I/O, Commit-Frequenz sowie Scheduling und Benachrichtigung können beitragen. Nicht automatisch allein Storage-Latenz.

    2. Analyse

    Commit-Rate, LGWR-Latenz und SQL prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$SESSION, V$SYSMETRIC

    4. Nächster Diagnoseweg

    Commit-Frequenz, Redo-Menge und log file parallel write im selben Zeitraum vergleichen. Erst unterscheiden, ob viele Bestätigungen oder eine hohe Zeit je Bestätigung dominieren; die fachlichen Transaktionsgrenzen nicht allein zur Senkung des Wait-Zählers ändern.

    Wait Class:
    Commit
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    log file sync – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'log file sync'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDSERIAL#CON_IDTYPESQL_IDEVENTSTATEWAIT_MSBLOCKING_SESSION_STATUSBLOCKING_SESSION
    1534123USERNULLlog file syncWAITING12.5UNKNOWNNULL

    Was sehe ich hier? Die erfundene Session wartet im Moment der Abfrage seit 12,5 ms auf dieses Event. UNKNOWN liefert keinen bestätigten Blocker. Ein fehlender SQL_ID-Wert ist möglich. Der Wert ist weder eine durchschnittliche Latenz noch die gesamte Dauer einer Störung.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    log file parallel write LGWR wartet auf Writes in alle Redo-Member. System I/O Analyse erforderlich

    1. Typische Ursache

    Langsame Redo-Member oder Storage-Latenz.

    2. Analyse

    Durchschnittliche Wait-Zeit und Member prüfen.

    3. Relevante Views

    V$LOGFILE, V$SYSTEM_EVENT, V$SYSMETRIC

    4. Nächster Diagnoseweg

    Latenzen und Fehler der Redo-Member im Problemzeitraum mit Storage- und LGWR-Messungen vergleichen. Erst danach eine Änderung der Ablage planen.

    Wait Class:
    System I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    log file parallel write – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'log file parallel write'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    log buffer space Session findet keinen freien Platz im Redo Log Buffer. Configuration Analyse erforderlich

    1. Typische Ursache

    LGWR kommt nicht nach oder Redo Buffer zu klein.

    2. Analyse

    Redo-Rate und LGWR-Waits prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$SGAINFO, V$SYSSTAT

    4. Nächster Diagnoseweg

    Redo-Storage, Commit-/Redo-Last und LOG_BUFFER prüfen.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    log buffer space – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'log buffer space'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    log file switch (checkpoint incomplete) Log Switch wartet auf Abschluss eines Checkpoints. Configuration Analyse erforderlich

    1. Typische Ursache

    DBWR/Storage zu langsam oder Redo Logs zu klein.

    2. Analyse

    Switch-Frequenz, Checkpoint und Datafile-Writes prüfen.

    3. Relevante Views

    V$LOG_HISTORY, V$INSTANCE_RECOVERY, V$SYSTEM_EVENT

    4. Nächster Diagnoseweg

    Switch-Abstände, Log-Konfiguration und Datafile-Schreibleistung gemeinsam bewerten; eine Größenänderung erst nach Ursachenprüfung planen.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    log file switch (checkpoint incomplete) – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'log file switch (checkpoint incomplete)'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    log file switch (archiving needed) Log Switch wartet auf Archivierung. Configuration Analyse erforderlich

    1. Typische Ursache

    ARCn oder Archive-Ziel zu langsam/voll.

    2. Analyse

    Archive-Ziele und ARCn-Fehler prüfen.

    3. Relevante Views

    V$ARCHIVE_DEST_STATUS, V$LOG, V$SYSTEM_EVENT

    4. Nächster Diagnoseweg

    Fehlermeldung, Archive-Ziel, Kapazität und Archivfortschritt zusammen prüfen. Bei Platzmangel die Sicherungs- und Aufbewahrungsabhängigkeiten klären; aus dem Wait folgt keine Freigabe zum Löschen von Archivelogs.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    log file switch (archiving needed) – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'log file switch (archiving needed)'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    log file switch completion Session wartet auf Abschluss eines Log Switches. Configuration Analyse erforderlich

    1. Typische Ursache

    Hohe Switch-Frequenz oder Folgeprobleme bei Checkpoint/Archivierung.

    2. Analyse

    Log History und begleitende Events prüfen.

    3. Relevante Views

    V$LOG_HISTORY, V$SYSTEM_EVENT

    4. Nächster Diagnoseweg

    Redo-Größe und Ursachen des Switch-Delays prüfen.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    log file switch completion – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'log file switch completion'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    log file single write Einzelner Write in Redo-Strukturen. System I/O Analyse erforderlich

    1. Typische Ursache

    Log-Header- oder Sonderoperation auf langsamem Storage.

    2. Analyse

    Latenz und Zeitpunkt prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$LOG

    4. Nächster Diagnoseweg

    Redo-Storage und Begleitmeldungen prüfen.

    Wait Class:
    System I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    log file single write – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'log file single write'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    latch: redo allocation Warten auf Allokation im Redo Log Buffer. Other Analyse erforderlich

    1. Typische Ursache

    Hohe Redo-Konkurrenz.

    2. Analyse

    Redo-Rate und CPU/Konkurrenz prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$SYSSTAT

    4. Nächster Diagnoseweg

    Redo-intensive Workloads und LOG_BUFFER prüfen.

    Wait Class:
    Other
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    latch: redo allocation – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'latch: redo allocation'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    latch: redo copy Warten auf Redo Copy Latch. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hohe parallele Redo-Erzeugung.

    2. Analyse

    Sessions und Redo-Rate prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$SYSSTAT

    4. Nächster Diagnoseweg

    Hotspot und sehr hohe DML-Konkurrenz analysieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    latch: redo copy – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'latch: redo copy'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    buffer busy waits Block kann wegen konkurrierendem Zugriff nicht verwendet werden. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hot Blocks, Segment Header oder konkurrierende Änderungen.

    2. Analyse

    P1/P2, Objekt und Segmentstatistiken prüfen.

    3. Relevante Views

    V$SESSION, V$SEGMENT_STATISTICS, V$WAITSTAT

    4. Nächster Diagnoseweg

    Betroffene Datei, Block und Objekt sowie gleichzeitig zugreifende Sessions zuordnen. Ein stark umkämpfter Block kann viele kurze Zugriffe bündeln; erst nach dieser Zuordnung Zugriffsmuster und mögliche Änderungen bewerten.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    buffer busy waits – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'buffer busy waits'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    read by other session Session wartet, weil eine andere Session denselben Block einliest. User I/O Analyse erforderlich

    1. Typische Ursache

    Viele Sessions lesen denselben nicht gecachten Block.

    2. Analyse

    Objekt und SQL prüfen.

    3. Relevante Views

    V$SESSION, V$SQL, V$SEGMENT_STATISTICS

    4. Nächster Diagnoseweg

    I/O-Latenz und Hot-Block-Zugriffsmuster prüfen.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    read by other session – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'read by other session'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    free buffer waits Für den Zugriff ist kein wiederverwendbarer Buffer verfügbar; die Ursache muss eingegrenzt werden. Configuration Analyse erforderlich

    1. Typische Ursache

    Mögliche Zusammenhänge sind verzögerte DBWn-Schreibarbeit, hohe Änderungsraten, Cache-Druck oder besondere Zustandswechsel. Der Eventname allein beweist keinen zu kleinen Cache.

    2. Analyse

    DBWR-Waits und Dirty Buffer prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$SGAINFO, V$SYSMETRIC

    4. Nächster Diagnoseweg

    Datafile-Storage, DBWR und Cache-Druck prüfen.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    free buffer waits – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'free buffer waits'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    write complete waits Session wartet auf Abschluss eines Buffer-Writes. Configuration Analyse erforderlich

    1. Typische Ursache

    DBWR schreibt den benötigten Block noch.

    2. Analyse

    DBWR- und Storage-Latenz prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$FILESTAT

    4. Nächster Diagnoseweg

    Write-I/O und Hot Blocks analysieren.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    write complete waits – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'write complete waits'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    buffer deadlock Die Cache-Schicht vermutet einen internen Buffer-Konflikt; der Foreground gibt kurz CPU ab. Concurrency Analyse erforderlich

    1. Typische Ursache

    Kein Anwendungsdeadlock. Der Event ist gewöhnlich sehr kurz und in Momentaufnahmen schwer zu erfassen.

    2. Analyse

    Alertlog, Stack und Oracle Support prüfen.

    3. Relevante Views

    V$SYSTEM_EVENT, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Bei Häufung Patchstand und Support prüfen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    buffer deadlock – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'buffer deadlock'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    latch: cache buffers chains Warten auf einen Latch zum Schutz einer Buffer-Hash-Kette. Concurrency Analyse erforderlich

    1. Typische Ursache

    Häufige konkurrierende Zugriffe auf dieselbe Hash-Kette; der Latch ist kein Cursor-Mutex.

    2. Analyse

    Latch-Statistik und Segment prüfen.

    3. Relevante Views

    V$LATCH, V$SESSION, V$SEGMENT_STATISTICS

    4. Nächster Diagnoseweg

    Hot Block, SQL und Datenverteilung analysieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    latch: cache buffers chains – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'latch: cache buffers chains'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    latch: cache buffers lru chain Warten auf LRU-Verwaltung im Buffer Cache. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hoher Cache-Druck oder aggressive Scans.

    2. Analyse

    Cache-Größe und Scanlast prüfen.

    3. Relevante Views

    V$LATCH, V$SGAINFO, V$SQL

    4. Nächster Diagnoseweg

    Buffer Cache und Scanlast analysieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    latch: cache buffers lru chain – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'latch: cache buffers lru chain'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    latch free Session wartet auf einen Oracle-Latch. Concurrency Analyse erforderlich

    1. Typische Ursache

    Interne Konkurrenz auf gemeinsamer Struktur.

    2. Analyse

    Latchname und Sleeps prüfen.

    3. Relevante Views

    V$LATCH, V$LATCHNAME, V$SESSION

    4. Nächster Diagnoseweg

    Konkreten Latch und verursachende Workload identifizieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    latch free – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'latch free'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cursor: pin S wait on X Shared Pin wartet auf exklusiven Cursor-Pin. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hard Parse, Cursor-Invalidierung oder DDL.

    2. Analyse

    SQL_ID, Child Cursor und Parse-Last prüfen.

    3. Relevante Views

    V$SESSION, V$SQL, V$SQL_SHARED_CURSOR

    4. Nächster Diagnoseweg

    Betroffenen Cursor und zeitgleiche Parse-, Lade- oder Invalidierungsaktivität untersuchen. Der Wait zeigt eine Cursor-Synchronisation; er beweist allein weder eine bestimmte Invalidierungsursache noch die Notwendigkeit einer Shared-Pool-Änderung.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cursor: pin S wait on X – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cursor: pin S wait on X'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cursor: pin S Warten auf Shared Cursor Pin. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hohe Konkurrenz auf demselben Cursor.

    2. Analyse

    SQL_ID und Sessionzahl prüfen.

    3. Relevante Views

    V$SESSION, V$SQL

    4. Nächster Diagnoseweg

    Parsing- und Ausführungskonkurrenz prüfen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cursor: pin S – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cursor: pin S'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cursor: pin X Exklusiver Cursor-Pin wird benötigt. Concurrency Analyse erforderlich

    1. Typische Ursache

    Cursor-Neukompilierung oder Invalidierung.

    2. Analyse

    SQL und DDL-Zeitpunkt prüfen.

    3. Relevante Views

    V$SESSION, V$SQL_SHARED_CURSOR

    4. Nächster Diagnoseweg

    Ursache der Invalidierung beheben.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cursor: pin X – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cursor: pin X'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cursor: mutex S Shared Mutex auf Cursor. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hohe Cursor-Konkurrenz.

    2. Analyse

    SQL_ID und Child Cursor prüfen.

    3. Relevante Views

    V$SESSION, V$SQL, V$MUTEX_SLEEP

    4. Nächster Diagnoseweg

    Cursor Sharing und Parse-Last prüfen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cursor: mutex S – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cursor: mutex S'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cursor: mutex X Exklusiver Cursor-Mutex. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hard Parse oder Cursor-Aufbau.

    2. Analyse

    SQL_ID, Parse Calls und Child Cursor prüfen.

    3. Relevante Views

    V$SESSION, V$SQL, V$SQL_SHARED_CURSOR

    4. Nächster Diagnoseweg

    Hard Parses und Child-Cursor-Ursachen reduzieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cursor: mutex X – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cursor: mutex X'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    library cache lock Library-Cache-Objekt kann nicht gesperrt werden. Concurrency Analyse erforderlich

    1. Typische Ursache

    DDL, Compile oder abhängige Objekte in Benutzung.

    2. Analyse

    Objekt und blockierende Session prüfen.

    3. Relevante Views

    V$SESSION, DBA_DDL_LOCKS, V$ACCESS

    4. Nächster Diagnoseweg

    DDL-Zeitpunkt und Blocker analysieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    library cache lock – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'library cache lock'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    library cache pin Warten auf einen benötigten Pin eines Library-Cache-Objekts; ein bereits gehaltener inkompatibler Pin kann den Zugriff verzögern. Concurrency Analyse erforderlich

    1. Typische Ursache

    Compile/DDL gegen aktives PL/SQL-Objekt.

    2. Analyse

    Blocker und Objekt prüfen.

    3. Relevante Views

    V$SESSION, V$ACCESS, DBA_DDL_LOCKS

    4. Nächster Diagnoseweg

    Deployments koordinieren; aktive Nutzung beachten.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    library cache pin – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'library cache pin'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    library cache: mutex X Exklusiver Mutex im Library Cache. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hard Parse, Invalidierung oder Child-Cursor-Konkurrenz.

    2. Analyse

    SQL_ID und Shared-Cursor-Gründe prüfen.

    3. Relevante Views

    V$SESSION, V$SQL_SHARED_CURSOR

    4. Nächster Diagnoseweg

    Parsing reduzieren und Cursorprobleme beheben.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    library cache: mutex X – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'library cache: mutex X'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    library cache load lock Objekt wird gerade in den Library Cache geladen. Concurrency Analyse erforderlich

    1. Typische Ursache

    Gleichzeitiges Laden/Compilieren desselben Objekts.

    2. Analyse

    Objekt und Sessions prüfen.

    3. Relevante Views

    V$SESSION, V$ACCESS

    4. Nächster Diagnoseweg

    Compile-/Load-Konkurrenz reduzieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    library cache load lock – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'library cache load lock'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    row cache lock Warten auf Data Dictionary Cache Lock. Concurrency Analyse erforderlich

    1. Typische Ursache

    DDL, Sequenzen oder Dictionary-Konkurrenz.

    2. Analyse

    P1 und Row-Cache-Statistik prüfen.

    3. Relevante Views

    V$ROWCACHE, V$SESSION

    4. Nächster Diagnoseweg

    Betroffene Dictionary-Struktur identifizieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    row cache lock – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'row cache lock'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    row cache mutex Mutex auf Dictionary Cache. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hohe Konkurrenz in Dictionary-Strukturen.

    2. Analyse

    Cache und SQL/DDL prüfen.

    3. Relevante Views

    V$ROWCACHE, V$MUTEX_SLEEP

    4. Nächster Diagnoseweg

    DDL-/Parse-Konkurrenz reduzieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    row cache mutex – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'row cache mutex'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: TX - row lock contention Warten auf eine andere Transaktion, etwa wegen einer gesperrten Zeile. Application Analyse erforderlich

    1. Typische Ursache

    Auch konkurrierende eindeutige Indexschlüssel oder ein gemeinsames Bitmap-Fragment können diesen Wait auslösen.

    2. Analyse

    Blocker, Objekt und SQL ermitteln.

    3. Relevante Views

    V$SESSION, V$LOCK, DBA_BLOCKERS, DBA_WAITERS

    4. Nächster Diagnoseweg

    Blockierende Transaktion fachlich klären; Commit-Logik prüfen.

    Wait Class:
    Application
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: TX - row lock contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: TX - row lock contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDSERIAL#CON_IDTYPESQL_IDEVENTSTATEWAIT_MSBLOCKING_SESSION_STATUSBLOCKING_SESSION
    1534123USERNULLenq: TX - row lock contentionWAITING12.5UNKNOWNNULL

    Was sehe ich hier? Die erfundene Session wartet im Moment der Abfrage seit 12,5 ms auf dieses Event. UNKNOWN liefert keinen bestätigten Blocker. Ein fehlender SQL_ID-Wert ist möglich. Der Wert ist weder eine durchschnittliche Latenz noch die gesamte Dauer einer Störung.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: TX - allocate ITL entry Kein freier ITL-Slot im Block. Concurrency Analyse erforderlich

    1. Typische Ursache

    Viele parallele Transaktionen auf demselben Block.

    2. Analyse

    Objekt, Segment und Blockkonkurrenz prüfen.

    3. Relevante Views

    V$SESSION, V$SEGMENT_STATISTICS

    4. Nächster Diagnoseweg

    Betroffenes Segment, freie Blockkapazität und INITRANS prüfen; eine Änderung setzt einen bestätigten ITL-Engpass voraus.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: TX - allocate ITL entry – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: TX - allocate ITL entry'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: TX - index contention Warten auf den Abschluss eines Indexblock-Splits durch eine andere Transaktion. Concurrency Analyse erforderlich

    1. Typische Ursache

    Ein konkurrierender Indexblock-Split; nicht jeder Index-Hotspot oder ITL-Mangel ist dieser Event.

    2. Analyse

    Index und SQL prüfen.

    3. Relevante Views

    V$SESSION, V$SEGMENT_STATISTICS, DBA_INDEXES

    4. Nächster Diagnoseweg

    Indexdesign, Partitionierung oder Schlüsselfolge prüfen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: TX - index contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: TX - index contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: TX - contention Allgemeine TX-Enqueue-Konkurrenz. Concurrency Analyse erforderlich

    1. Typische Ursache

    Transaktions- oder Segmentkonflikt.

    2. Analyse

    P1/P2 und Lockkette analysieren.

    3. Relevante Views

    V$SESSION, V$LOCK

    4. Nächster Diagnoseweg

    Konkreten TX-Untertyp und Blocker bestimmen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: TX - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: TX - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: TM - contention Warten auf Table-Enqueue. Application Analyse erforderlich

    1. Typische Ursache

    Fehlender FK-Index, DDL oder Lock-Modus-Konflikt.

    2. Analyse

    Objekt und Lock-Modi prüfen.

    3. Relevante Views

    V$LOCK, V$SESSION, DBA_CONSTRAINTS

    4. Nächster Diagnoseweg

    Foreign-Key-Indizes und DDL-Konflikte prüfen.

    Wait Class:
    Application
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: TM - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: TM - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDSERIAL#CON_IDTYPESQL_IDEVENTSTATEWAIT_MSBLOCKING_SESSION_STATUSBLOCKING_SESSION
    1534123USERNULLenq: TM - contentionWAITING12.5UNKNOWNNULL

    Was sehe ich hier? Die erfundene Session wartet im Moment der Abfrage seit 12,5 ms auf dieses Event. UNKNOWN liefert keinen bestätigten Blocker. Ein fehlender SQL_ID-Wert ist möglich. Der Wert ist weder eine durchschnittliche Latenz noch die gesamte Dauer einer Störung.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: UL - contention User Lock-Konkurrenz. Application Analyse erforderlich

    1. Typische Ursache

    DBMS_LOCK oder anwendungseigene Locks.

    2. Analyse

    Lock-ID und Anwendung prüfen.

    3. Relevante Views

    V$LOCK, V$SESSION

    4. Nächster Diagnoseweg

    Anwendungslogik und Lock-Freigabe prüfen.

    Wait Class:
    Application
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: UL - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: UL - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: HW - contention Konkurrenz auf High Water Mark. Concurrency Analyse erforderlich

    1. Typische Ursache

    Viele parallele Inserts oder Segmenterweiterung.

    2. Analyse

    Segment und Insertmuster prüfen.

    3. Relevante Views

    V$SESSION, V$SEGMENT_STATISTICS

    4. Nächster Diagnoseweg

    ASSM, Segmentgröße und Insertverteilung prüfen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: HW - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: HW - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: SQ - contention Konkurrenz auf Sequence Enqueue. Concurrency Analyse erforderlich

    1. Typische Ursache

    NOCACHE oder ORDER bei hoher Parallelität.

    2. Analyse

    Betroffene Sequenz prüfen.

    3. Relevante Views

    DBA_SEQUENCES, V$SESSION

    4. Nächster Diagnoseweg

    Sequenzkonfiguration und Last prüfen; Cache-Änderungen erst nach Bewertung der fachlichen Anforderungen planen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: SQ - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: SQ - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: CF - contention Controlfile-Enqueue-Konkurrenz. Configuration Analyse erforderlich

    1. Typische Ursache

    Häufige Controlfile-Aktualisierung.

    2. Analyse

    Begleitende RMAN/Checkpoint-Aktivität prüfen.

    3. Relevante Views

    V$SESSION, V$CONTROLFILE

    4. Nächster Diagnoseweg

    Controlfile-I/O und verursachende Operation prüfen.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: CF - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: CF - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: ST - contention Space Transaction Enqueue. Configuration Analyse erforderlich

    1. Typische Ursache

    Dictionary-managed oder Space-Management-Konkurrenz.

    2. Analyse

    Tablespace und Segment prüfen.

    3. Relevante Views

    V$SESSION, DBA_TABLESPACES

    4. Nächster Diagnoseweg

    LMT/ASSM und Segmentwachstum prüfen.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: ST - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: ST - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: RO - fast object reuse Objekt wird für schnelle Wiederverwendung geschützt. Concurrency Analyse erforderlich

    1. Typische Ursache

    TRUNCATE/DROP/Segmentoperationen.

    2. Analyse

    DDL und Objekt prüfen.

    3. Relevante Views

    V$SESSION, DBA_OBJECTS

    4. Nächster Diagnoseweg

    DDL-Konkurrenz vermeiden.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: RO - fast object reuse – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: RO - fast object reuse'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: KO - fast object checkpoint Objektbezogener Checkpoint. Configuration Analyse erforderlich

    1. Typische Ursache

    Direct Path/DDL oder Objektoperation.

    2. Analyse

    SQL/DDL und DBWR prüfen.

    3. Relevante Views

    V$SESSION, V$SYSTEM_EVENT

    4. Nächster Diagnoseweg

    Storage und auslösende Operation analysieren.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: KO - fast object checkpoint – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: KO - fast object checkpoint'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    enq: JI - contention Serialisierung konkurrierender Materialized-View-Refresh-Vorgänge. Concurrency Im Messkontext bewerten

    1. Typische Ursache

    Ein Refresh wartet auf den Abschluss eines konkurrierenden Refreshs derselben Materialized View.

    2. Analyse

    Blockierende Session, betroffene Materialized View und gleichzeitig gestartete Refresh-Aufrufe zuordnen.

    3. Relevante Views

    V$SESSION, V$LOCK, DBA_MVIEWS

    4. Nächster Diagnoseweg

    Zuerst konkurrierende Refresh-Aufrufe und ihre Transaktionen untersuchen. Ein Concurrency-Job kann Auslöser sein; CJQ0 ist nicht die Bedeutung des JI-Locks.

    Wait Class:
    Concurrency
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: JI - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: JI - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    Oracle Ask TOM: JI als Materialized-View-Refresh-Lock

    enq: PS - contention Parallel Statement/Slave Enqueue. Concurrency Analyse erforderlich

    1. Typische Ursache

    Parallel Execution Koordination.

    2. Analyse

    PX-Sessions und DOP prüfen.

    3. Relevante Views

    V$PX_SESSION, V$PX_PROCESS, V$SESSION

    4. Nächster Diagnoseweg

    Beteiligte parallele Ausführung, Koordinator, Worker und Konkurrenz im selben Zeitraum zuordnen. DOP bezeichnet den Parallelitätsgrad. Eine Begrenzung wird erst nach Prüfung des tatsächlichen Engpasses bewertet; die Karte setzt eine Umgebung mit unterstützter paralleler Ausführung voraus.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    enq: PS - contention – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'enq: PS - contention'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    SQL*Net message from client Server wartet auf nächste Nachricht vom Client. Idle OK / normal möglich

    1. Typische Ursache

    Normaler Idle-Wait zwischen Clientaufrufen.

    2. Analyse

    Nur bei auffälligen langen Transaktionen fachlich prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal; offene Transaktionen und Connection Pools prüfen.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    SQL*Net message from client – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'SQL*Net message from client'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDSERIAL#CON_IDTYPESQL_IDEVENTSTATEWAIT_MSBLOCKING_SESSION_STATUSBLOCKING_SESSION
    1534123USERNULLSQL*Net message from clientWAITING12.5UNKNOWNNULL

    Was sehe ich hier? Die erfundene Session wartet im Moment der Abfrage seit 12,5 ms auf dieses Event. UNKNOWN liefert keinen bestätigten Blocker. Ein fehlender SQL_ID-Wert ist möglich. Der Wert ist weder eine durchschnittliche Latenz noch die gesamte Dauer einer Störung.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    SQL*Net message to client Server sendet Nachricht an Client. Network Im Messkontext bewerten

    1. Typische Ursache

    Die gemessene Sendezeit allein beweist weder ein langsames Netz noch einen langsamen Client.

    2. Analyse

    Bytes, Roundtrips und Client prüfen.

    3. Relevante Views

    V$SESSION, V$SESSTAT

    4. Nächster Diagnoseweg

    Netzwerk und Fetch-Größe prüfen.

    Wait Class:
    Network
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    SQL*Net message to client – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'SQL*Net message to client'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    SQL*Net more data from client Weitere Daten werden vom Client erwartet. Network Im Messkontext bewerten

    1. Typische Ursache

    Große Bind-Daten oder langsames Netzwerk.

    2. Analyse

    Client, Paketgröße und Latenz prüfen.

    3. Relevante Views

    V$SESSION, V$SESSTAT

    4. Nächster Diagnoseweg

    Netzwerk und Client-Bindeverhalten prüfen.

    Wait Class:
    Network
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    SQL*Net more data from client – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'SQL*Net more data from client'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    SQL*Net more data to client Weitere Ergebnisdaten werden gesendet. Network Im Messkontext bewerten

    1. Typische Ursache

    Große Resultsets oder kleiner Fetch Size.

    2. Analyse

    SQL, Rows und Fetch Calls prüfen.

    3. Relevante Views

    V$SESSION, V$SQL, V$SESSTAT

    4. Nächster Diagnoseweg

    Benötigte Ergebnismenge, Zeilenbreite, Fetch-Verhalten und Empfangsgeschwindigkeit des Clients gemeinsam prüfen. Eine größere Fetch Size verändert Speicherbedarf und Kommunikationsmuster; sie ist erst nach einem vergleichbaren Vorher-/Nachher-Befund eine begründete Maßnahme.

    Wait Class:
    Network
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    SQL*Net more data to client – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'SQL*Net more data to client'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDSERIAL#CON_IDTYPESQL_IDEVENTSTATEWAIT_MSBLOCKING_SESSION_STATUSBLOCKING_SESSION
    1534123USERNULLSQL*Net more data to clientWAITING12.5UNKNOWNNULL

    Was sehe ich hier? Die erfundene Session wartet im Moment der Abfrage seit 12,5 ms auf dieses Event. UNKNOWN liefert keinen bestätigten Blocker. Ein fehlender SQL_ID-Wert ist möglich. Der Wert ist weder eine durchschnittliche Latenz noch die gesamte Dauer einer Störung.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    SQL*Net break/reset to client Break oder Reset an Client. Network Im Messkontext bewerten

    1. Typische Ursache

    Abbruch, Fehler oder Timeout.

    2. Analyse

    Begleitfehler und Client prüfen.

    3. Relevante Views

    V$SESSION, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Netzwerk-/Clientfehler analysieren.

    Wait Class:
    Network
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    SQL*Net break/reset to client – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'SQL*Net break/reset to client'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    SQL*Net vector data to client Vektorisiertes Senden von Daten. Network Im Messkontext bewerten

    1. Typische Ursache

    Große Datenmengen/Client-Transfer.

    2. Analyse

    Netzwerk und Resultset prüfen.

    3. Relevante Views

    V$SESSION, V$SESSTAT

    4. Nächster Diagnoseweg

    Resultset und Netzwerk bewerten.

    Wait Class:
    Network
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    SQL*Net vector data to client – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'SQL*Net vector data to client'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    client message Warten auf Clientnachricht in bestimmten Servermodi. Idle OK / normal möglich

    1. Typische Ursache

    Meist Idle.

    2. Analyse

    Sessionstatus und Transaktion prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    client message – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'client message'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    pipe get Warten auf Nachricht aus DBMS_PIPE. Idle OK / normal möglich

    1. Typische Ursache

    Anwendung nutzt Pipes.

    2. Analyse

    Pipe-Name und Anwendung prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Anwendungslogik prüfen.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    pipe get – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'pipe get'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    pipe put Warten beim Schreiben in DBMS_PIPE. Application Analyse erforderlich

    1. Typische Ursache

    Pipe voll oder Empfänger langsam.

    2. Analyse

    Anwendung und Pipe prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Pipe-Verbraucher und Timeout prüfen.

    Wait Class:
    Application
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    pipe put – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'pipe put'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    queue messages AQ-Prozess wartet auf Queue-Nachrichten. Idle OK / normal möglich

    1. Typische Ursache

    Normaler Hintergrund-Idle-Wait.

    2. Analyse

    Nur bei AQ-Problemen untersuchen.

    3. Relevante Views

    V$SESSION, DBA_QUEUES

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    queue messages – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'queue messages'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    Streams AQ: waiting for messages in the queue AQ/Streams wartet auf Nachrichten. Idle OK / normal möglich

    1. Typische Ursache

    Normal bei leerer Queue.

    2. Analyse

    Queue-Backlog und Consumer prüfen.

    3. Relevante Views

    DBA_QUEUES, V$SESSION

    4. Nächster Diagnoseweg

    Nur bei verzögerter Verarbeitung analysieren.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    Streams AQ: waiting for messages in the queue – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'Streams AQ: waiting for messages in the queue'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    PX Deq: Execution Msg Parallel Slave wartet auf Koordinatornachricht. Idle OK / normal möglich

    1. Typische Ursache

    Normal im PX-Ablauf.

    2. Analyse

    Nur bei PX-Stall zusammen mit anderen Events prüfen.

    3. Relevante Views

    V$PX_SESSION, V$SESSION

    4. Nächster Diagnoseweg

    PX-Verteilung und QC prüfen.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    PX Deq: Execution Msg – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'PX Deq: Execution Msg'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    PX Deq: Table Q Normal Parallel Slave wartet auf Daten in Table Queue. Idle OK / normal möglich

    1. Typische Ursache

    Kann normal oder Skew sein.

    2. Analyse

    PX-Sessions und Datenverteilung prüfen.

    3. Relevante Views

    V$PX_SESSION, V$PQ_TQSTAT

    4. Nächster Diagnoseweg

    Daten-Skew und DOP prüfen.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    PX Deq: Table Q Normal – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'PX Deq: Table Q Normal'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    PX Deq Credit: send blkd PX-Sender hat keine Credits. Concurrency Analyse erforderlich

    1. Typische Ursache

    Empfänger langsamer oder Daten-Skew.

    2. Analyse

    PQ_TQSTAT und Slave-Waits prüfen.

    3. Relevante Views

    V$PX_SESSION, V$PQ_TQSTAT

    4. Nächster Diagnoseweg

    Skew, DOP und Plan analysieren.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    PX Deq Credit: send blkd – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'PX Deq Credit: send blkd'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    PX qref latch Konkurrenz auf PX Queue Reference Latch. Concurrency Analyse erforderlich

    1. Typische Ursache

    Hohe PX-Koordination.

    2. Analyse

    PX-Last und DOP prüfen.

    3. Relevante Views

    V$LATCH, V$PX_SESSION

    4. Nächster Diagnoseweg

    Parallelität begrenzen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    PX qref latch – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'PX qref latch'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    PX server shutdown PX-Slave wartet auf Shutdown. Idle OK / normal möglich

    1. Typische Ursache

    Normaler Lebenszyklus.

    2. Analyse

    Nur bei ungewöhnlicher Häufung prüfen.

    3. Relevante Views

    V$PX_PROCESS

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    PX server shutdown – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'PX server shutdown'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    parallel query dequeue wait PX-Prozess wartet auf Arbeit. Idle OK / normal möglich

    1. Typische Ursache

    Normaler Idle/PX-Wait.

    2. Analyse

    Begleitende PX-Waits prüfen.

    3. Relevante Views

    V$PX_SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    parallel query dequeue wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'parallel query dequeue wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    resmgr:cpu quantum Resource Manager begrenzt CPU-Zeit. Scheduler Im Messkontext bewerten

    1. Typische Ursache

    Consumer Group erhält CPU-Quantum nicht sofort.

    2. Analyse

    Resource Plan und Consumer Group prüfen.

    3. Relevante Views

    V$RSRC_CONSUMER_GROUP, V$SESSION

    4. Nächster Diagnoseweg

    Resource Plan und CPU-Zuweisung prüfen.

    Wait Class:
    Scheduler
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    resmgr:cpu quantum – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'resmgr:cpu quantum'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    resmgr:become active Session wartet auf aktiven Slot. Scheduler Im Messkontext bewerten

    1. Typische Ursache

    Active Session Pool begrenzt.

    2. Analyse

    Resource Manager-Konfiguration prüfen.

    3. Relevante Views

    V$RSRC_CONSUMER_GROUP, DBA_RSRC_PLAN_DIRECTIVES

    4. Nächster Diagnoseweg

    Active Session Pool und Plan prüfen.

    Wait Class:
    Scheduler
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    resmgr:become active – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'resmgr:become active'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    resmgr:internal state change Interne Resource-Manager-Statusänderung. Scheduler Im Messkontext bewerten

    1. Typische Ursache

    Planwechsel oder interne Koordination.

    2. Analyse

    Zeitpunkt und Plan prüfen.

    3. Relevante Views

    V$RSRC_PLAN, V$SESSION

    4. Nächster Diagnoseweg

    Nur bei Häufung untersuchen.

    Wait Class:
    Scheduler
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    resmgr:internal state change – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'resmgr:internal state change'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    ASM file metadata operation ASM-Metadatenoperation. System I/O Analyse erforderlich

    1. Typische Ursache

    Diskgroup-Metadatenzugriff oder Rebalance.

    2. Analyse

    ASM-Status und Storage prüfen.

    3. Relevante Views

    V$ASM_DISKGROUP, V$ASM_OPERATION

    4. Nächster Diagnoseweg

    ASM-Operation und Disk-Latenz prüfen.

    Wait Class:
    System I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    ASM file metadata operation – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'ASM file metadata operation'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    ASM rebalance completion Warten auf ASM-Rebalance-Abschluss. Administrative Im Messkontext bewerten

    1. Typische Ursache

    Disk hinzugefügt/entfernt oder POWER begrenzt.

    2. Analyse

    V$ASM_OPERATION prüfen.

    3. Relevante Views

    V$ASM_OPERATION, V$ASM_DISKGROUP

    4. Nächster Diagnoseweg

    Rebalance-Fortschritt und POWER prüfen.

    Wait Class:
    Administrative
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    ASM rebalance completion – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'ASM rebalance completion'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cell single block physical read Exadata Single Block Read. User I/O Analyse erforderlich

    1. Typische Ursache

    Storage Cell-Latenz oder Indexzugriff.

    2. Analyse

    SQL und Cell-Metriken prüfen.

    3. Relevante Views

    V$SQL, V$SESSION, V$CELL_EVENT

    4. Nächster Diagnoseweg

    SQL und Exadata-Storage analysieren.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cell single block physical read – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cell single block physical read'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cell multiblock physical read Exadata Multiblock Read. User I/O Analyse erforderlich

    1. Typische Ursache

    Große Scans.

    2. Analyse

    SQL, Smart Scan und Cell prüfen.

    3. Relevante Views

    V$SQL, V$CELL_EVENT

    4. Nächster Diagnoseweg

    Scanlast und Smart Scan bewerten.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cell multiblock physical read – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cell multiblock physical read'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cell smart table scan Exadata Smart Scan. User I/O Analyse erforderlich

    1. Typische Ursache

    Große Full Scans mit Offload.

    2. Analyse

    Offload-Werte und SQL prüfen.

    3. Relevante Views

    V$SQL, V$CELL_EVENT

    4. Nächster Diagnoseweg

    Smart Scan-Effizienz prüfen.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cell smart table scan – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cell smart table scan'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    cell smart index scan Exadata Smart Index Scan. User I/O Analyse erforderlich

    1. Typische Ursache

    Indexzugriff mit Cell-Offload.

    2. Analyse

    SQL und Cell-Metriken prüfen.

    3. Relevante Views

    V$SQL, V$CELL_EVENT

    4. Nächster Diagnoseweg

    Offload und Plan prüfen.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    cell smart index scan – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'cell smart index scan'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    rdbms ipc message Background Process wartet auf IPC-Nachricht. Idle OK / normal möglich

    1. Typische Ursache

    Normaler Idle-Wait.

    2. Analyse

    Nur im Kontext eines hängenden Prozesses prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    rdbms ipc message – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'rdbms ipc message'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    pmon timer PMON wartet auf nächsten Arbeitszyklus. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Keine Analyse erforderlich.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Normaler Idle-Wait.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    pmon timer – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'pmon timer'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    smon timer SMON wartet auf nächsten Arbeitszyklus. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Keine Analyse erforderlich.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Normaler Idle-Wait.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    smon timer – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'smon timer'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    jobq slave wait Job-Slave wartet auf Arbeit. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Nur bei Schedulerproblemen prüfen.

    3. Relevante Views

    V$SESSION, DBA_SCHEDULER_JOBS

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    jobq slave wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'jobq slave wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    class slave wait Hintergrund-Slave wartet auf Arbeit. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Nur bei Funktionsstörung prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    class slave wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'class slave wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    Space Manager: slave idle wait Space-Management-Slave wartet. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Nur bei Segmentproblemen prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    Space Manager: slave idle wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'Space Manager: slave idle wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    DIAG idle wait DIAG-Prozess wartet. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Nur bei Diagnosefehlern prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    DIAG idle wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'DIAG idle wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    watchdog main loop Watchdog wartet. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Nur bei Instanzproblemen prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    watchdog main loop – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'watchdog main loop'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    VKTM Logical Idle Wait Virtual Keeper of Time wartet. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Nur bei Zeitproblemen prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    VKTM Logical Idle Wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'VKTM Logical Idle Wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    LGWR worker group idle LGWR-Worker wartet auf Arbeit. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Bei Redo-Problemen mit anderen Events prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    LGWR worker group idle – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'LGWR worker group idle'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    ARCH wait on SENDREQ ARCn wartet auf Archivanfrage. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Nur bei Archivierungsproblemen prüfen.

    3. Relevante Views

    V$SESSION, V$ARCHIVE_DEST_STATUS

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    ARCH wait on SENDREQ – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'ARCH wait on SENDREQ'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    Data Guard: Gap Manager Gap Manager wartet. Idle OK / normal möglich

    1. Typische Ursache

    Normal im Data-Guard-Betrieb.

    2. Analyse

    Bei Apply Gap prüfen.

    3. Relevante Views

    V$ARCHIVE_GAP, V$MANAGED_STANDBY

    4. Nächster Diagnoseweg

    Bei auffälligem Transport- oder Apply-Fortschritt zunächst prüfen, ob eine Redo-Lücke vorliegt. Das Wait Event allein belegt weder eine Lücke noch einen fehlerfreien Zustand.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    Data Guard: Gap Manager – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'Data Guard: Gap Manager'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    MRP redo arrival Managed Recovery wartet auf Redo. Idle OK / normal möglich

    1. Typische Ursache

    Das Warten auf weiteres Redo kann erwartetes Verhalten sein. Prüfe Transport Lag, Apply Lag und die Aktualität der zugrunde liegenden Messdaten, bevor du daraus einen unauffälligen Zustand ableitest. Ein über mehrere Messungen unverändertes DATUM_TIME in V$DATAGUARD_STATS kann auf ausbleibende Daten vom Quellsystem hinweisen. Das Wait Event allein belegt keinen aktuellen Standby-Zustand.

    2. Analyse

    Transport-/Apply-Lag prüfen.

    3. Relevante Views

    V$MANAGED_STANDBY, V$DATAGUARD_STATS

    4. Nächster Diagnoseweg

    Bei Lag Transport prüfen.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    MRP redo arrival – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'MRP redo arrival'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    RFS write Remote File Server schreibt Redo auf Standby. Network Im Messkontext bewerten

    1. Typische Ursache

    Data Guard Redo Transport.

    2. Analyse

    Latenz und Standby Redo Logs prüfen.

    3. Relevante Views

    V$MANAGED_STANDBY, V$STANDBY_LOG

    4. Nächster Diagnoseweg

    Netzwerk und Standby-I/O prüfen.

    Wait Class:
    Network
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    RFS write – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'RFS write'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    LNS wait on SENDREQ Log Network Server wartet auf Send Request. Idle OK / normal möglich

    1. Typische Ursache

    Normal zwischen Redo-Transfers.

    2. Analyse

    Nur bei Transportlag prüfen.

    3. Relevante Views

    V$DATAGUARD_STATS

    4. Nächster Diagnoseweg

    Bei Lag Netzwerk prüfen.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    LNS wait on SENDREQ – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'LNS wait on SENDREQ'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    LNS wait on full LNS buffer LNS-Puffer voll. Network Im Messkontext bewerten

    1. Typische Ursache

    Standby/Netzwerk kommt nicht nach.

    2. Analyse

    Transportlag und Netzwerk prüfen.

    3. Relevante Views

    V$DATAGUARD_STATS, V$MANAGED_STANDBY

    4. Nächster Diagnoseweg

    Netzwerk und Standby-I/O prüfen.

    Wait Class:
    Network
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    LNS wait on full LNS buffer – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'LNS wait on full LNS buffer'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    redo transport worker Redo-Transport-Arbeiter wartet/arbeitet. Network Im Messkontext bewerten

    1. Typische Ursache

    Data Guard Transport.

    2. Analyse

    Lag und Fehler prüfen.

    3. Relevante Views

    V$DATAGUARD_STATS, V$ARCHIVE_DEST_STATUS

    4. Nächster Diagnoseweg

    Transportpfad prüfen.

    Wait Class:
    Network
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    redo transport worker – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'redo transport worker'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    undo segment extension Undo-Segment wird erweitert. Configuration Analyse erforderlich

    1. Typische Ursache

    Hohe Transaktionslast oder unzureichender Undo-Platz.

    2. Analyse

    Undo-Segmente und SQL prüfen.

    3. Relevante Views

    V$UNDOSTAT, DBA_UNDO_EXTENTS

    4. Nächster Diagnoseweg

    Undo-Größe und lange Transaktionen prüfen.

    Wait Class:
    Configuration
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    undo segment extension – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'undo segment extension'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    undo segment tx slot Warten auf Transaktionsslot im Undo-Segment. Concurrency Analyse erforderlich

    1. Typische Ursache

    Sehr hohe Transaktionskonkurrenz.

    2. Analyse

    V$UNDOSTAT und Sessions prüfen.

    3. Relevante Views

    V$UNDOSTAT, V$TRANSACTION

    4. Nächster Diagnoseweg

    Transaktionskonkurrenz und Undo-Konfiguration prüfen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    undo segment tx slot – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'undo segment tx slot'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    local write wait Session wartet auf lokale Writes, häufig bei Parallel DDL. User I/O Analyse erforderlich

    1. Typische Ursache

    Langsame Writes oder Segmentoperation.

    2. Analyse

    SQL und Files prüfen.

    3. Relevante Views

    V$SESSION, V$FILESTAT

    4. Nächster Diagnoseweg

    Storage und auslösende Operation prüfen.

    Wait Class:
    User I/O
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    local write wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'local write wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    reliable message Interprozess-Nachricht muss zuverlässig bestätigt werden. Concurrency Analyse erforderlich

    1. Ursache eingrenzen

    Der Eventname allein belegt keine konkrete Fehlerursache. Erfasse die betroffene Session, Prozessart und den Zeitraum. Prüfe anschließend die gleichzeitig laufende Arbeit und begleitende Meldungen. Eine auffällige Dauer ist ein Ausgangspunkt für diese Zuordnung, kein automatischer Nachweis eines SQL-Locks.

    2. Analyse

    Blockierende Prozesse und Ereigniskontext prüfen.

    3. Relevante Views

    V$SESSION, V$SYSTEM_EVENT

    4. Nächster Diagnoseweg

    Begleitende Events und Operation prüfen.

    Wait Class:
    Concurrency
    Bewertung:
    Im Messkontext bewerten
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    reliable message – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'reliable message'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    wait for unread message on broadcast channel Warten auf Broadcast-Nachricht. Idle OK / normal möglich

    1. Typische Ursache

    Meist interner Idle-Wait.

    2. Analyse

    Nur bei Hängern prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    wait for unread message on broadcast channel – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'wait for unread message on broadcast channel'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    wait for stopper event to be increased Warten auf interne Stopper-Synchronisation. Administrative Im Messkontext bewerten

    1. Typische Ursache

    Shutdown/Recovery/interne Koordination.

    2. Analyse

    Alertlog und Prozessstatus prüfen.

    3. Relevante Views

    V$SESSION, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Nur bei Hängern analysieren.

    Wait Class:
    Administrative
    Bewertung:
    Warnung
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    wait for stopper event to be increased – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'wait for stopper event to be increased'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    single-task message Single-Task-Prozess wartet auf Nachricht. Idle OK / normal möglich

    1. Typische Ursache

    Normaler Idle-Wait.

    2. Analyse

    Keine Aktion.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    single-task message – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'single-task message'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    dispatcher timer Dispatcher wartet auf Arbeit. Idle OK / normal möglich

    1. Typische Ursache

    Normal im Shared-Server-Betrieb.

    2. Analyse

    Dispatcher-Auslastung prüfen.

    3. Relevante Views

    V$DISPATCHER, V$QUEUE

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    dispatcher timer – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'dispatcher timer'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    virtual circuit wait Shared Server wartet auf Virtual Circuit. Idle OK / normal möglich

    1. Typische Ursache

    Normal oder Shared-Server-Engpass.

    2. Analyse

    Dispatcher/Shared Server prüfen.

    3. Relevante Views

    V$CIRCUIT, V$SHARED_SERVER

    4. Nächster Diagnoseweg

    Bei Engpass Shared Server dimensionieren.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    virtual circuit wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'virtual circuit wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    shared server idle wait Shared Server wartet auf Arbeit. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Queue und Busy-Zeit prüfen.

    3. Relevante Views

    V$SHARED_SERVER, V$QUEUE

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    shared server idle wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'shared server idle wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    PX Idle Wait Parallel-Prozess wartet. Idle OK / normal möglich

    1. Typische Ursache

    Normaler PX-Idle-Wait.

    2. Analyse

    Nur mit anderen PX-Waits bewerten.

    3. Relevante Views

    V$PX_SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    PX Idle Wait – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'PX Idle Wait'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    AQPC idle AQ Coordinator wartet. Idle OK / normal möglich

    1. Typische Ursache

    Normal.

    2. Analyse

    Nur bei AQ-Störung prüfen.

    3. Relevante Views

    V$SESSION

    4. Nächster Diagnoseweg

    Meist normal.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    AQPC idle – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'AQPC idle'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    Streams capture: waiting for archive log Capture wartet auf Archived Log. Idle OK / normal möglich

    1. Typische Ursache

    Normal oder Log fehlt.

    2. Analyse

    Archived Logs und Capture prüfen.

    3. Relevante Views

    DBA_CAPTURE, V$ARCHIVED_LOG

    4. Nächster Diagnoseweg

    Fehlende Logs bereitstellen.

    Wait Class:
    Idle
    Bewertung:
    OK / normal möglich
    Wichtig:
    Zuerst Foreground, Background und Idle unterscheiden. Dauer, Häufigkeit und betroffene Arbeit im gleichen Zeitfenster bewerten; Background- und Idle-Waits nicht pauschal als Anteil der Foreground-DB-Time lesen.

    5. Read-only Diagnoseabfrage

    Streams capture: waiting for archive log – betroffene Sessions
    SELECT sid, serial#, con_id, type, sql_id, event, state,
           ROUND(wait_time_micro/1000,3) AS wait_ms,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE state = 'WAITING'
      AND event = 'Streams capture: waiting for archive log'
    ORDER BY wait_time_micro DESC;
    Weiterarbeiten: Die allgemeine Wait-Methodik steht in Wait Events. Nutze danach das zuständige Fachkapitel für Redo, Locks, I/O, Memory oder Oracle Net.

    Oracle 19c: Wait-Event-Beschreibungen. Nicht jeder interne Event ist dort einzeln dokumentiert; Namen, Parameter und Klasse über V$EVENT_NAME der Zielversion prüfen.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Der Name eines Wait Events beschreibt einen Wartezustand, nicht automatisch dessen eigentliche Ursache. Das Lexikon liefert dafür Bedeutung und passende nächste Diagnosefragen.
    2. Wait Class und Sessionzustand helfen, den Event einzuordnen. Ein Idle-Wait ist anders zu bewerten als relevante Wartezeit während eines Datenbankaufrufs.
    3. Die Bedeutung von P1, P2 und P3 hängt vom Event ab. Parameterwerte dürfen deshalb nicht ohne die zugehörige Definition interpretiert werden.
    4. Wait-Anzahl, Gesamtzeit und Messzeitraum werden gemeinsam betrachtet. Der höchste Zähler allein zeigt weder die größte Verzögerung noch den wichtigsten Engpass.
    5. Ein Diagnoseweg verbindet Event, Session, SQL und betroffene Ressource. Empfehlungen aus einem Steckbrief werden erst durch passende Befunde zu einer begründeten Maßnahme.

    Lernzielkontrolle

    Erkläre zuerst deinen Befund und den nächsten Prüfschritt. Öffne danach die begründete Lösung.
    Frage 1: Eine Session meldet WAITING und 12 Sekunden TX-Wait. Was prüfst du als Nächstes?

    Lösung: Die gültigen Blockerangaben und den Transaktionskontext. Der Eventname allein benennt noch keine fehlerhafte Fachaktion.

    Frage 2: Ein kumulierter Zähler steigt in 60 Sekunden von 100 auf 112 Sekunden. Welches Delta ist relevant?

    Lösung: 12 Sekunden im beobachteten Intervall, sofern Instanzstart, Einheit und Messumfang zusammenpassen.

    Frage 3: Warum ersetzt eine Eventbewertung keine Ursachenprüfung?

    Lösung: Die Wiki-Einstufung ist eine Orientierung. Betroffene Arbeit, Dauer, Häufigkeit und Gegenmessung entscheiden über die Auswirkung.

    Frage 4: Was bedeutet eine später leere Momentaufnahme?

    Lösung: Jetzt wurde kein passender Wait gefunden. Ein zuvor gespeicherter Befund wird dadurch nicht widerlegt; kurze Waits können zwischen den Abfragen liegen.

    48. Oracle ORA-Fehler-Lexikon – Bedeutung, Ursache, Analyse, Views, SQL und Diagnosewege

    Interaktives Nachschlagewerk mit 82 häufigen Oracle- und RMAN-Fehlern, einheitlicher Einstufung und read-only Diagnoseabfragen.

    Lernkompass
    Einfach gesagt ORA-Fehler sind präzise Fehlermeldungen, aber der Fehlercode allein erklärt selten den gesamten Kontext.
    Warum ist das wichtig? Das Lexikon hilft beim Einordnen und zeigt passende erste Diagnosewege.
    Nach diesem Kapitel Du kannst Fehlercode, Ursache, Kontext und nächste read-only Prüfung zusammenführen.
    Lesetipp: Du musst diesen Abschnitt nicht auswendig lernen. Verstehe zuerst die Aufgabe und merke dir, wo du die Details später nachschlagen kannst.

    Einführung: Eine ORA-Meldung beschreibt einen von Oracle erkannten Fehlerzustand. Sie ist ein wichtiger Hinweis, aber nicht immer die erste Ursache einer Störung. Mehrere Meldungen können zusammen einen Fehlerstack bilden, in dem eine spätere Meldung die Folge eines früheren Problems beschreibt. Der vollständige Zusammenhang ist deshalb wichtiger als ein isolierter Fehlercode.

    Dieses Lexikon ordnet ausgewählte Meldungen ein und führt zu passenden Diagnosequellen. Beginne mit Nummer, vollständigem Meldungstext, Zeitpunkt und betroffener Operation. Die Karten zeigen mögliche Ursachen und deren Prüfung; die vorhandenen Beispiele erläutern den Weg vom Hinweis zum Befund. Die betriebliche Dringlichkeit ergibt sich aus der Auswirkung auf deine Umgebung, nicht allein aus der Nummer.

    Oracle 19c: fachliche Grundlage

    1. Empfohlener Diagnoseablauf

    1. Fehlerstack Alle ORA-, RMAN- und OS-Meldungen sichern
    →
    2. Zeitpunkt Alertlog und Trace zeitlich eingrenzen
    →
    3. Kontext Session, SQL_ID, Objekt, Datei oder Backupjob bestimmen
    →
    4. Ursache Storage, Memory, Lock, Netzwerk oder Anwendung trennen
    →
    5. Maßnahme Kontrolliert beheben und Ergebnis verifizieren
    ORA-00600 und ORA-07445 sind interne Fehler. Hier sollten Incident, Trace, Argumente, Patchstand und Reproduzierbarkeit gesichert werden. Keine ungezielten Parameter- oder Strukturänderungen durchführen.

    2. Fehlercode, Meldung und Kontext zusammen lesen

    Schweregrad: Die Kartenklassifikation ist eine betriebliche Orientierung dieses Wikis. Oracle selbst definiert aus dem ORA-Code allein keinen allgemeingültigen Incident-Schweregrad; die tatsächliche Auswirkung hängt vom Kontext ab.

    Einen Fehlerstack lesen: vom Hinweis zur prüfbaren Frage

    Im Lernfall meldet ein Backup ORA-19504 zusammen mit „No space left on device“. ORA-19504 bezeichnet die fehlgeschlagene Dateierzeugung; die Begleitmeldung lenkt die Prüfung auf das Ziel-Dateisystem. Sichere den vollständigen Stack und den genannten Pfad, bevor du die zugehörige Fehlerkarte öffnest.

    Ordne den Pfad seinem tatsächlichen Mount zu und prüfe dort die verfügbare Kapazität. Freie Extents in einem anderen Datenbank-Tablespace beantworten diese Frage nicht. Eine leere Alertlog-Suche widerlegt einen im RMAN-Joblog gesicherten Fehler nicht.

    Grenze der Alertlog-Abfragen: V$DIAG_ALERT_EXT zeigt Alertlog-Einträge, keine vollständige Liste aller SQL- und Anwendungsfehler. Ein clientseitiger Fehler wie ORA-00904 oder ORA-01403 muss dort nicht erscheinen. Keine Treffer bedeuten daher nur „in dieser Quelle und diesem Zeitfenster nichts gefunden“. Für solche Fehler sind der vollständige Client- beziehungsweise Anwendungsfehlerstack und passende Joblogs vorrangig.

    Versionsbezug: Die verlinkte Oracle Error Help kann mehrere Releases anzeigen. Für dieses Wiki ist der 19c-Eintrag maßgeblich; zusätzliche Detailfelder neuerer Meldungen werden nicht als 19c-Voraussetzung übernommen.

    ORA-00054 – Resource busy and acquire with NOWAIT specified or timeout expired Die angeforderte Ressource ist gesperrt und konnte innerhalb des vorgegebenen Zeitraums nicht exklusiv verwendet werden. Locks und Transaktionen Warnung

    1. Typische Ursachen

    Eine andere Session hält einen inkompatiblen Lock; häufig bei DDL gegen eine aktive Tabelle oder bei NOWAIT.

    2. Analyse

    Blockierende Session, Objekt, Lockmodus und laufendes SQL ermitteln.

    3. Relevante Views

    V$SESSION, V$LOCK, V$LOCKED_OBJECT, DBA_OBJECTS

    4. Nächster Diagnoseweg

    DDL zeitlich koordinieren, blockierende Transaktion fachlich klären und Lockdauer reduzieren.

    Fehler:
    ORA-00054
    Einstufung:
    Warnung
    Kategorie:
    Locks und Transaktionen
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00054 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00054%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: Locks & Blockierungen. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00054 (19c auswählen).

    ORA-00060 – Deadlock detected while waiting for resource Oracle hat einen zyklischen Sperrkonflikt erkannt und eine beteiligte Anweisung abgebrochen. Locks und Transaktionen Hoch

    1. Typische Ursachen

    Unterschiedliche DML-Reihenfolge, fehlende Foreign-Key-Indizes, Trigger oder Hot Rows.

    2. Analyse

    Deadlock-Trace, beteiligte SQL_IDs, Objekte und Lock-Reihenfolge analysieren.

    3. Relevante Views

    V$SESSION, V$LOCK, V$LOCKED_OBJECT, DBA_BLOCKERS, DBA_WAITERS, DBA_OBJECTS

    4. Nächster Diagnoseweg

    DML-Reihenfolge vereinheitlichen, Foreign-Key-Indizes prüfen und Transaktionen kürzer halten.

    Fehler:
    ORA-00060
    Einstufung:
    Hoch
    Kategorie:
    Locks und Transaktionen
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00060 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00060%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: Locks & Blockierungen. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Wichtige Grenze: Der Anweisungsrollback löst nicht automatisch die gesamte Transaktion auf. Die Anwendung muss ihren Transaktionszustand und die erforderliche Fehlerbehandlung klären; ein später fehlender Blocker widerlegt den bereits aufgelösten Deadlock nicht.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00060 (19c auswählen).

    ORA-00230 – Operation disallowed: snapshot control file enqueue unavailable RMAN oder eine andere Operation konnte die Snapshot-Controlfile-Enqueue nicht erhalten. Redo und Controlfile Hoch

    1. Typische Ursachen

    Parallele RMAN-Jobs, hängen gebliebene Backupoperation oder Zugriff auf denselben Snapshot-Controlfile-Pfad.

    2. Analyse

    Aktive RMAN-Sessions, Jobs, Locks und Snapshot-Controlfile-Konfiguration prüfen.

    3. Relevante Views

    V$SESSION, V$RMAN_STATUS, V$RMAN_BACKUP_JOB_DETAILS, V$LOCK

    4. Nächster Diagnoseweg

    Parallel laufende Jobs vermeiden und Snapshot-Controlfile-Pfad sowie Altprozesse prüfen.

    Fehler:
    ORA-00230
    Einstufung:
    Hoch
    Kategorie:
    Redo und Controlfile
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00230 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00230%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00230 (19c auswählen).

    ORA-00257 – Archiver error. Connect AS SYSDBA only until resolved ARCn kann Redo nicht mehr archivieren. Normale Benutzeranmeldungen werden eingeschränkt. Redo und Archivierung Kritisch

    1. Typische Ursachen

    Archive-Ziel voll, nicht erreichbar, fehlerhaft oder unzureichende Berechtigungen.

    2. Analyse

    Archive-Ziele, Fehlertext, Belegung und zuletzt archivierte Sequenz prüfen.

    3. Relevante Views

    V$ARCHIVE_DEST, V$ARCHIVE_DEST_STATUS, V$ARCHIVED_LOG, V$LOG

    4. Nächster Diagnoseweg

    Speicher im Archive-Ziel bereitstellen, Zielproblem beheben und ARCn-Status verifizieren.

    Fehler:
    ORA-00257
    Einstufung:
    Kritisch
    Kategorie:
    Redo und Archivierung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00257 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00257%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00257 (19c auswählen).

    ORA-00308 – Cannot open archived log Ein benötigtes Archived Log konnte nicht geöffnet werden. Redo und Recovery Hoch

    1. Typische Ursachen

    Datei fehlt, falscher Pfad, Berechtigungsproblem oder beschädigte Datei.

    2. Analyse

    Sequenz, Thread, Pfad und Recovery-Kontext prüfen.

    3. Relevante Views

    V$ARCHIVED_LOG, V$RECOVER_FILE, V$LOG_HISTORY

    4. Nächster Diagnoseweg

    Korrekte Datei bereitstellen, Pfad/Berechtigungen korrigieren oder Recovery-Strategie anpassen.

    Fehler:
    ORA-00308
    Einstufung:
    Hoch
    Kategorie:
    Redo und Recovery
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00308 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00308%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: Redo Logs. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00308 (19c auswählen).

    ORA-00312 – Online log string thread string Begleitmeldung, die den betroffenen Online-Redo-Log-Pfad nennt. Redo und Archivierung Information

    1. Typische Ursachen

    Wird zusammen mit einem eigentlichen Redo-Fehler ausgegeben.

    2. Analyse

    Immer die unmittelbar davor oder danach stehende ORA-Meldung auswerten.

    3. Relevante Views

    V$LOG, V$LOGFILE, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Die eigentliche Ursache anhand der Begleitmeldung analysieren.

    Fehler:
    ORA-00312
    Einstufung:
    Information
    Kategorie:
    Redo und Archivierung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00312 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00312%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00312 (19c auswählen).

    ORA-00313 – Open failed for members of log group Ein oder mehrere Member einer Redo-Log-Gruppe konnten nicht geöffnet werden. Redo und Archivierung Kritisch

    1. Typische Ursachen

    Datei fehlt, Storage nicht verfügbar, falsche Berechtigungen oder beschädigtes Member.

    2. Analyse

    Betroffene Group, Member, Status und Betriebssystemfehler prüfen.

    3. Relevante Views

    V$LOG, V$LOGFILE, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Storage/Pfad korrigieren und Redo-Multiplexing konsistent wiederherstellen.

    Fehler:
    ORA-00313
    Einstufung:
    Kritisch
    Kategorie:
    Redo und Archivierung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00313 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00313%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00313 (19c auswählen).

    ORA-00333 – Redo log read error block string count string Oracle konnte Redo-Blöcke nicht korrekt lesen. Redo und Recovery Kritisch

    1. Typische Ursachen

    Beschädigtes Redo, Storagefehler oder unvollständige Datei.

    2. Analyse

    Betroffene Datei, Blockbereich, Alertlog und Recovery-Anforderung prüfen.

    3. Relevante Views

    V$LOGFILE, V$LOG, V$RECOVER_FILE, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Storage prüfen und passende Recovery-/Restore-Maßnahmen planen.

    Fehler:
    ORA-00333
    Einstufung:
    Kritisch
    Kategorie:
    Redo und Recovery
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00333 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00333%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: Redo Logs. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00333 (19c auswählen).

    ORA-00600 – Internal error code Oracle hat einen internen Fehler festgestellt. Die Argumente identifizieren den internen Codepfad. Interne Fehler Kritisch

    1. Typische Ursachen

    Oracle-Bug, Datenkorruption, Speicherproblem oder seltene interne Inkonsistenz.

    2. Analyse

    Alertlog, Incident, Trace, Argumente, Patchstand und Reproduzierbarkeit erfassen.

    3. Relevante Views

    V$DIAG_ALERT_EXT, V$DIAG_INFO, V$VERSION, DBA_REGISTRY_SQLPATCH

    4. Nächster Diagnoseweg

    Keine vorschnelle Änderung; Incident sichern, Patchstand prüfen und Oracle Support einbeziehen.

    Fehler:
    ORA-00600
    Einstufung:
    Kritisch
    Kategorie:
    Interne Fehler
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-00600 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-00600%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00600 (19c auswählen).

    ORA-00904 – Invalid identifier Eine Spalte, ein Alias oder Identifier ist im SQL-Kontext ungültig. SQL und Objekte Anwendungsfehler

    1. Typische Ursachen

    Tippfehler, falscher Alias, nicht vorhandene Spalte oder reserviertes Wort.

    2. Analyse

    SQL-Text und Tabellenstruktur vergleichen.

    3. Relevante Views

    DBA_TAB_COLUMNS, DBA_OBJECTS, V$SQL

    4. Nächster Diagnoseweg

    Identifier korrigieren und Schema-/Aliasbezug prüfen.

    Fehler:
    ORA-00904
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und Objekte
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-00904 – erster passender Strukturcheck
    SELECT owner, table_name, column_name, data_type, data_length, nullable
    FROM dba_tab_columns
    WHERE owner = '&OWNER' AND table_name = '&TABLE_NAME'
    ORDER BY column_id;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: SQL-Grundlagen. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Spaltenname und Schreibweise mit der fehlerhaften SQL-Stelle vergleichen; Aliase und den gültigen Geltungsbereich der Spalte prüfen.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00904 (19c auswählen).

    ORA-00932 – Inconsistent datatypes Oracle hat nicht kompatible Datentypen in einem Ausdruck oder einer Zuweisung erkannt. SQL und Objekte Anwendungsfehler

    1. Typische Ursachen

    Implizite Konvertierung, falscher Bind-Datentyp oder unpassende Funktion.

    2. Analyse

    Datentypen der beteiligten Spalten und Bindvariablen prüfen.

    3. Relevante Views

    DBA_TAB_COLUMNS, V$SQL, V$SQL_BIND_CAPTURE

    4. Nächster Diagnoseweg

    Explizite, saubere Konvertierungen verwenden und Bindtypen korrigieren.

    Fehler:
    ORA-00932
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und Objekte
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-00932 – erster passender Strukturcheck
    SELECT owner, table_name, column_name, data_type, data_length, nullable
    FROM dba_tab_columns
    WHERE owner = '&OWNER' AND table_name = '&TABLE_NAME'
    ORDER BY column_id;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: SQL-Grundlagen. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Die Datentypen der beteiligten Spalten und Ausdrücke vergleichen. Implizite Konvertierungen und Bind-Variablentypen zusätzlich in der konkreten Anweisung prüfen.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00932 (19c auswählen).

    ORA-00942 – Table or view does not exist Das referenzierte Objekt existiert nicht oder ist für den Benutzer nicht sichtbar. SQL und Objekte Anwendungsfehler

    1. Typische Ursachen

    Falscher Owner, fehlendes Synonym, fehlendes Objektprivileg oder falscher Service/PDB.

    2. Analyse

    Objektbestand, Synonyme und Rechte prüfen.

    3. Relevante Views

    DBA_OBJECTS, DBA_SYNONYMS, DBA_TAB_PRIVS, V$SESSION

    4. Nächster Diagnoseweg

    Owner qualifizieren, Synonym/Rechte prüfen und Verbindungskontext verifizieren.

    Fehler:
    ORA-00942
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und Objekte
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-00942 – erster passender Strukturcheck
    SELECT owner, object_name, object_type, status
    FROM dba_objects
    WHERE owner = '&OWNER' AND object_name = '&OBJECT_NAME'
    ORDER BY object_type;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: SQL-Grundlagen. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Objektbestand prüfen; anschließend Besitzer, Synonyme und effektive Rechte des betroffenen Benutzers untersuchen. Ein sichtbares Objekt für den DBA beweist keinen Anwendungszugriff.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    OWNEROBJECT_NAMEOBJECT_TYPESTATUS
    APP_USERARTIKELTABLEVALID

    Was sehe ich hier? Das Objekt existiert aus Sicht des berechtigten Prüfers in diesem Container. Ob der betroffene Anwendungsbenutzer darauf zugreifen darf, ist damit noch offen; dessen Rechte und Verbindungskontext prüfen.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-00942 (19c auswählen).

    ORA-01017 – Invalid username/password; logon denied Benutzername oder Passwort wurde nicht akzeptiert. Benutzer und Anmeldung Hoch

    1. Typische Ursachen

    Falsche Zugangsdaten, falscher Service/PDB, Passwortversion oder Groß-/Kleinschreibung.

    2. Analyse

    Accountstatus, Authentifizierungstyp, Service und Clientkontext prüfen.

    3. Relevante Views

    DBA_USERS, V$SERVICES, V$PARAMETER

    4. Nächster Diagnoseweg

    Zugangsdaten und Service korrigieren; Accountstatus und Passwortversion prüfen.

    Fehler:
    ORA-01017
    Einstufung:
    Hoch
    Kategorie:
    Benutzer und Anmeldung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-01017 – erster passender Strukturcheck
    SELECT username, account_status, lock_date, expiry_date, profile
    FROM dba_users
    WHERE username = '&USERNAME';
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Kontonamen und Zielcontainer abgleichen. Die Abfrage prüft weder das übermittelte Passwort noch dessen Groß-/Kleinschreibung.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01017 (19c auswählen).

    ORA-01031 – Insufficient privileges Der Benutzer besitzt nicht die erforderlichen Rechte. Berechtigungen Hoch

    1. Typische Ursachen

    Fehlendes System- oder Objektprivileg, Rolle in PL/SQL nicht wirksam oder falscher Owner.

    2. Analyse

    Direkte Rechte, Rollen und Objektprivilegien prüfen.

    3. Relevante Views

    DBA_SYS_PRIVS, DBA_ROLE_PRIVS, DBA_TAB_PRIVS, DBA_USERS

    4. Nächster Diagnoseweg

    Fehlgeschlagene Operation, tatsächlichen Benutzer, Container sowie direkten oder rollenbasierten Rechtepfad feststellen. Bei gespeichertem PL/SQL zusätzlich Compile- und Laufzeitkontext unterscheiden. Erst daraus ergibt sich, ob überhaupt ein Grant fehlt und auf welchem Weg er erforderlich ist.

    Fehler:
    ORA-01031
    Einstufung:
    Hoch
    Kategorie:
    Berechtigungen
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-01031 – erster passender Strukturcheck
    SELECT grantee, privilege, admin_option
    FROM dba_sys_privs
    WHERE grantee = '&USERNAME'
    ORDER BY privilege;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Die direkten Systemrechte sind nur ein Teil des Befunds. Zusätzlich Objekt-/Spaltenrechte, Rollen und den Rechtekontext von PL/SQL prüfen.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01031 (19c auswählen).

    ORA-01092 – ORACLE instance terminated. Disconnection forced Die Instanz wurde beendet; die Verbindung wurde erzwungen getrennt. Instanz Kritisch

    1. Typische Ursachen

    Fataler Hintergrundprozessfehler, Shutdown abort oder interner Fehler.

    2. Analyse

    Alertlog und letzte kritische Meldungen unmittelbar vor ORA-01092 prüfen.

    3. Relevante Views

    V$DIAG_ALERT_EXT, V$INSTANCE, V$DIAG_INFO

    4. Nächster Diagnoseweg

    Ursache im Alertlog/Trace beheben und Instanzzustand kontrolliert wiederherstellen.

    Fehler:
    ORA-01092
    Einstufung:
    Kritisch
    Kategorie:
    Instanz
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01092 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01092%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01092 (19c auswählen).

    ORA-01110 – Data file string: 'string' Begleitmeldung, die das betroffene Datafile nennt. Datafiles und Recovery Information

    1. Typische Ursachen

    Wird zusammen mit einem eigentlichen Datafile- oder Recovery-Fehler ausgegeben.

    2. Analyse

    Die zugehörige Hauptmeldung und Datafile-Nummer auswerten.

    3. Relevante Views

    V$DATAFILE, V$DATAFILE_HEADER, V$RECOVER_FILE

    4. Nächster Diagnoseweg

    Maßnahme aus dem eigentlichen Datafile-Fehler ableiten.

    Fehler:
    ORA-01110
    Einstufung:
    Information
    Kategorie:
    Datafiles und Recovery
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01110 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01110%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01110 (19c auswählen).

    ORA-01157 – Cannot identify/lock data file Oracle kann ein Datafile nicht identifizieren, öffnen oder sperren. Datafiles und Recovery Kritisch

    1. Typische Ursachen

    Datei fehlt, Mountpoint nicht verfügbar, Berechtigungsproblem oder Storagefehler.

    2. Analyse

    Pfad, Dateistatus, Header und OS-Verfügbarkeit prüfen.

    3. Relevante Views

    V$DATAFILE, V$DATAFILE_HEADER, V$RECOVER_FILE

    4. Nächster Diagnoseweg

    Storage/Pfad korrigieren oder passende Restore-/Recovery-Maßnahme planen.

    Fehler:
    ORA-01157
    Einstufung:
    Kritisch
    Kategorie:
    Datafiles und Recovery
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01157 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01157%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01157 (19c auswählen).

    ORA-01219 – Database or pluggable database not open Die Datenbank oder PDB ist nicht in einem Modus geöffnet, der die Abfrage erlaubt. Instanz Hoch

    1. Typische Ursachen

    Mount-Modus, geschlossene PDB oder eingeschränkter Betriebszustand.

    2. Analyse

    OPEN_MODE, Container und Session-Context prüfen.

    3. Relevante Views

    V$DATABASE, V$PDBS, V$CONTAINERS, V$SESSION

    4. Nächster Diagnoseweg

    Mit korrektem Service verbinden und Betriebszustand prüfen.

    Fehler:
    ORA-01219
    Einstufung:
    Hoch
    Kategorie:
    Instanz
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01219 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01219%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01219 (19c auswählen).

    ORA-01400 – Cannot insert NULL Ein NULL-Wert soll in eine NOT-NULL-Spalte geschrieben werden. SQL und Objekte Anwendungsfehler

    1. Typische Ursachen

    Fehlende Pflichtangabe, Triggerlogik oder falsches Mapping.

    2. Analyse

    Tabellenspalte, SQL und Bindwerte prüfen.

    3. Relevante Views

    DBA_TAB_COLUMNS, DBA_CONSTRAINTS, V$SQL

    4. Nächster Diagnoseweg

    Anwendungslogik oder Mapping korrigieren.

    Fehler:
    ORA-01400
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und Objekte
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-01400 – erster passender Strukturcheck
    SELECT owner, table_name, column_name, data_type, data_length, nullable
    FROM dba_tab_columns
    WHERE owner = '&OWNER' AND table_name = '&TABLE_NAME'
    ORDER BY column_id;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: SQL-Grundlagen. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Die NOT-NULL-Spalte aus der Fehlermeldung suchen und prüfen, welcher Eingabewert beziehungsweise Default fehlt.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01400 (19c auswählen).

    ORA-01403 – No data found Im PL/SQL-Kontext erwartet SELECT INTO eine Zeile, fand aber keine. Auch andere NO_DATA_FOUND-Kontexte sind möglich; ein gewöhnlicher SELECT mit leerem Ergebnis ist allein kein ORA-01403. SQL und PL/SQL Anwendungsfehler

    1. Typische Ursachen

    Erwartete Daten fehlen oder Exception Handling ist unvollständig.

    2. Analyse

    Betroffene SQL-Anweisung und fachliche Erwartung prüfen.

    3. Relevante Views

    V$SQL, DBA_SOURCE, DBA_ERRORS

    4. Nächster Diagnoseweg

    NO_DATA_FOUND behandeln oder Abfragelogik korrigieren.

    Fehler:
    ORA-01403
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und PL/SQL
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01403 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01403%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01403 (19c auswählen).

    ORA-01422 – Exact fetch returns more than requested number of rows SELECT INTO lieferte mehr als eine Zeile. SQL und PL/SQL Anwendungsfehler

    1. Typische Ursachen

    Abfrage nicht eindeutig, fehlender Filter oder Dateninkonsistenz.

    2. Analyse

    SQL und erwartete Eindeutigkeit prüfen.

    3. Relevante Views

    V$SQL, DBA_CONSTRAINTS, DBA_INDEXES

    4. Nächster Diagnoseweg

    Filter/Eindeutigkeit korrigieren oder Cursor verwenden.

    Fehler:
    ORA-01422
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und PL/SQL
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01422 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01422%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01422 (19c auswählen).

    ORA-01427 – Single-row subquery returns more than one row Eine skalare Unterabfrage lieferte mehrere Zeilen. SQL und Objekte Anwendungsfehler

    1. Typische Ursachen

    Fehlende Eindeutigkeit oder unzureichender Filter.

    2. Analyse

    Unterabfrage separat ausführen und Datenverteilung prüfen.

    3. Relevante Views

    V$SQL, DBA_CONSTRAINTS

    4. Nächster Diagnoseweg

    Unterabfrage fachlich eindeutig machen.

    Fehler:
    ORA-01427
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und Objekte
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01427 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01427%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: SQL-Grundlagen. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01427 (19c auswählen).

    ORA-01555 – Snapshot too old Benötigte ältere Undo-Informationen sind nicht mehr verfügbar. Undo und Konsistenz Hoch

    1. Typische Ursachen

    Lange Abfrage, hohe DML-Rate, zu kleine Undo-Retention oder Commit-in-Loop.

    2. Analyse

    SQL-Laufzeit, Undo-Statistik und unexpired/expired Blöcke prüfen.

    3. Relevante Views

    V$UNDOSTAT, V$TRANSACTION, V$SQL, DBA_UNDO_EXTENTS

    4. Nächster Diagnoseweg

    Undo ausreichend dimensionieren, lange SQL optimieren und Commit-in-Loop vermeiden.

    Fehler:
    ORA-01555
    Einstufung:
    Hoch
    Kategorie:
    Undo und Konsistenz
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01555 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01555%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01555 (19c auswählen).

    ORA-01591 – Lock held by in-doubt distributed transaction Eine Ressource ist durch eine unentschiedene verteilte Transaktion gesperrt. Distributed Transactions Hoch

    1. Typische Ursachen

    Netzwerk- oder Systemfehler während Two-Phase Commit.

    2. Analyse

    Pending 2PC-Transaktion und Nachbarsysteme prüfen.

    3. Relevante Views

    DBA_2PC_PENDING, DBA_2PC_NEIGHBORS, DBA_DB_LINKS

    4. Nächster Diagnoseweg

    Remote-System wiederherstellen und verteilte Transaktion sauber auflösen.

    Fehler:
    ORA-01591
    Einstufung:
    Hoch
    Kategorie:
    Distributed Transactions
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01591 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01591%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01591 (19c auswählen).

    ORA-01652 – Unable to extend temp segment Ein temporäres Segment konnte nicht erweitert werden. Storage und Tablespaces Hoch

    1. Typische Ursachen

    Fehlender Platz für ein temporäres Segment im genannten Tablespace. Das kann TEMP, aber auch ein permanenter Tablespace während einer Objektanlage betreffen.

    2. Analyse

    Zuerst den Tablespace aus dem vollständigen Fehlertext und seinen Typ prüfen. Bei TEMP folgen aktive Verbraucher und Workareas; bei permanentem Storage Datafiles, freie Extents und Wachstumsspielraum.

    3. Relevante Views

    V$TEMPSEG_USAGE, V$TEMPFILE, V$SESSION, V$SQL_WORKAREA

    4. Nächster Diagnoseweg

    Den zum betroffenen Tablespace passenden Speicher- und SQL-Kontext untersuchen; nicht ungeprüft TEMP vergrößern.

    Fehler:
    ORA-01652
    Einstufung:
    Hoch
    Kategorie:
    Storage und Tablespaces
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01652 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01652%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: Data Dictionary. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01652 (19c auswählen).

    ORA-01653 – Unable to extend table Ein Tabellensegment konnte kein weiteres Extent erhalten. Storage und Tablespaces Kritisch

    1. Typische Ursachen

    Tablespace voll, Maxsize erreicht oder ungeeignete Autoextend-Konfiguration.

    2. Analyse

    Segment, Tablespace, Datafiles und freien Platz prüfen.

    3. Relevante Views

    DBA_SEGMENTS, DBA_DATA_FILES, DBA_FREE_SPACE, DBA_TABLESPACES

    4. Nächster Diagnoseweg

    Kapazität bereitstellen und Wachstum/Ursache analysieren.

    Fehler:
    ORA-01653
    Einstufung:
    Kritisch
    Kategorie:
    Storage und Tablespaces
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01653 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01653%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: Data Dictionary. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01653 (19c auswählen).

    ORA-01654 – Unable to extend index Ein Indexsegment konnte nicht erweitert werden. Storage und Tablespaces Kritisch

    1. Typische Ursachen

    Tablespace voll, Maxsize erreicht oder großer Indexaufbau.

    2. Analyse

    Index, Segmentgröße und Tablespace prüfen.

    3. Relevante Views

    DBA_INDEXES, DBA_SEGMENTS, DBA_DATA_FILES, DBA_FREE_SPACE

    4. Nächster Diagnoseweg

    Kapazität bereitstellen und Indexwachstum bewerten.

    Fehler:
    ORA-01654
    Einstufung:
    Kritisch
    Kategorie:
    Storage und Tablespaces
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01654 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01654%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: Data Dictionary. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01654 (19c auswählen).

    ORA-01658 – Unable to create INITIAL extent Das initiale Extent eines Segments konnte nicht angelegt werden. Storage und Tablespaces Kritisch

    1. Typische Ursachen

    Kein ausreichend großes freies Extent oder Tablespace voll.

    2. Analyse

    Largest Free Extent, Datafiles und Segmentdefinition prüfen.

    3. Relevante Views

    DBA_FREE_SPACE, DBA_DATA_FILES, DBA_TABLESPACES

    4. Nächster Diagnoseweg

    Ausreichend zusammenhängenden Speicher bereitstellen.

    Fehler:
    ORA-01658
    Einstufung:
    Kritisch
    Kategorie:
    Storage und Tablespaces
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01658 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01658%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: Data Dictionary. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01658 (19c auswählen).

    ORA-01722 – Invalid number Eine Zeichenfolge konnte nicht in eine Zahl konvertiert werden. SQL und Objekte Anwendungsfehler

    1. Typische Ursachen

    Implizite Konvertierung oder ungültiger Inhalt in Zeichenfeld.

    2. Analyse

    SQL, Datentypen und Datenwerte prüfen.

    3. Relevante Views

    DBA_TAB_COLUMNS, V$SQL

    4. Nächster Diagnoseweg

    Explizite Konvertierung und Datenbereinigung durchführen.

    Fehler:
    ORA-01722
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und Objekte
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01722 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01722%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: SQL-Grundlagen. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01722 (19c auswählen).

    ORA-01918 – User does not exist Der angegebene Benutzer existiert nicht. Benutzer und Anmeldung Warnung

    1. Typische Ursachen

    Falscher Benutzername, falsche PDB oder bereits gelöscht.

    2. Analyse

    DBA_USERS und Containerkontext prüfen.

    3. Relevante Views

    DBA_USERS, CDB_USERS, V$CONTAINERS

    4. Nächster Diagnoseweg

    Benutzername und PDB-/Servicekontext korrigieren.

    Fehler:
    ORA-01918
    Einstufung:
    Warnung
    Kategorie:
    Benutzer und Anmeldung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01918 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01918%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01918 (19c auswählen).

    ORA-01920 – User name conflicts with another user or role name Der gewünschte Name kollidiert mit einem bestehenden Benutzer oder einer Rolle. Benutzer und Anmeldung Warnung

    1. Typische Ursachen

    Name bereits als User oder Role vorhanden.

    2. Analyse

    DBA_USERS und DBA_ROLES prüfen.

    3. Relevante Views

    DBA_USERS, DBA_ROLES

    4. Nächster Diagnoseweg

    Eindeutigen Namen verwenden.

    Fehler:
    ORA-01920
    Einstufung:
    Warnung
    Kategorie:
    Benutzer und Anmeldung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-01920 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-01920%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01920 (19c auswählen).

    ORA-01940 – Cannot drop a user that is currently connected Ein angemeldeter Benutzer kann nicht gelöscht werden. Benutzer und Anmeldung Warnung

    1. Typische Ursachen

    Aktive Sessions des Benutzers.

    2. Analyse

    Sessions, Programme und Transaktionen prüfen.

    3. Relevante Views

    V$SESSION, V$TRANSACTION

    4. Nächster Diagnoseweg

    Sessions kontrolliert beenden lassen und fachlich abstimmen.

    Fehler:
    ORA-01940
    Einstufung:
    Warnung
    Kategorie:
    Benutzer und Anmeldung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-01940 – erster passender Strukturcheck
    SELECT sid, serial#, username, status, program, taddr
    FROM v$session
    WHERE username = '&USERNAME'
    ORDER BY sid;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Die Sessions des betreffenden Benutzers identifizieren und ihre Transaktionen bewerten; diese Abfrage beendet keine Verbindung.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-01940 (19c auswählen).

    ORA-02049 – Timeout: distributed transaction waiting for lock Eine verteilte Transaktion wartete zu lange auf einen Lock. Distributed Transactions Hoch

    1. Typische Ursachen

    Remote-Lock, Netzwerkverzögerung oder lange Transaktion.

    2. Analyse

    Lokale/Remote-Session und 2PC-Kontext prüfen.

    3. Relevante Views

    V$SESSION, V$LOCK, DBA_2PC_PENDING, DBA_DB_LINKS

    4. Nächster Diagnoseweg

    Blocker, wartende verteilte Transaktion und Timeoutzeit zuordnen. Den fachlichen Transaktionsabschluss mit dem zuständigen Ablauf klären. Ein Timeout beweist weder einen Deadlock noch, dass eine fremde Session beendet werden darf.

    Fehler:
    ORA-02049
    Einstufung:
    Hoch
    Kategorie:
    Distributed Transactions
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-02049 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-02049%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Wichtige Grenze: Ein Remote-Lock ist eine passende Hypothese; der Timeout beweist keine reine Netzwerkstörung. Eine verteilte Transaktion steht nicht zwangsläufig bereits als in-doubt-Fall in DBA_2PC_PENDING.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-02049 (19c auswählen).

    ORA-03113 – End-of-file on communication channel Die Serververbindung wurde unerwartet beendet. Netzwerk und Instanz Kritisch

    1. Typische Ursachen

    Serverprozess abgestürzt, Instanzabbruch, Netzwerkfehler oder ORA-00600/07445.

    2. Analyse

    Alertlog, Servertrace, Prozessstatus und Netzwerk prüfen.

    3. Relevante Views

    V$DIAG_ALERT_EXT, V$DIAG_INFO, V$INSTANCE

    4. Nächster Diagnoseweg

    Ursache im Servertrace/Alertlog beheben.

    Fehler:
    ORA-03113
    Einstufung:
    Kritisch
    Kategorie:
    Netzwerk und Instanz
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-03113 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-03113%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-03113 (19c auswählen).

    ORA-03114 – Not connected to ORACLE Die aktuelle Session ist nicht mehr mit Oracle verbunden. Netzwerk und Instanz Hoch

    1. Typische Ursachen

    Vorheriger Verbindungsabbruch, Instanzende oder Netzwerkproblem.

    2. Analyse

    Vorausgehende Fehlermeldung und Instanzstatus prüfen.

    3. Relevante Views

    V$INSTANCE, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Ursprüngliche Verbindungsursache analysieren und neu verbinden.

    Fehler:
    ORA-03114
    Einstufung:
    Hoch
    Kategorie:
    Netzwerk und Instanz
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-03114 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-03114%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-03114 (19c auswählen).

    ORA-04030 – Out of process memory Ein Oracle-Prozess konnte keinen weiteren privaten Speicher reservieren. Memory Kritisch

    1. Typische Ursachen

    PGA-Spitze, OS-Limit, sehr große Workarea oder Prozessleck.

    2. Analyse

    PGA, Prozessspeicher, SQL und OS-Limits prüfen.

    3. Relevante Views

    V$PROCESS_MEMORY, V$PGASTAT, V$SQL_WORKAREA, V$SESSION

    4. Nächster Diagnoseweg

    SQL/PGA-Verbrauch reduzieren und OS-/Oracle-Limits prüfen.

    Fehler:
    ORA-04030
    Einstufung:
    Kritisch
    Kategorie:
    Memory
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-04030 – erster passender Strukturcheck
    SELECT pid, spid, ROUND(pga_used_mem/1024/1024,2) AS used_mib,
           ROUND(pga_alloc_mem/1024/1024,2) AS allocated_mib
    FROM v$process
    ORDER BY pga_alloc_mem DESC
    FETCH FIRST 20 ROWS ONLY;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Den tatsächlich betroffenen Prozess aus dem Fehler-/Trace-Kontext zuordnen. PGA-Größen sind ein Indiz; OS-Adressraum und Prozesslimits gehören zur weiteren Prüfung.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-04030 (19c auswählen).

    ORA-04031 – Unable to allocate bytes of shared memory Eine Speicheranforderung in Shared Pool, Large Pool oder anderer SGA-Komponente schlug fehl. Memory Kritisch

    1. Typische Ursachen

    Fragmentierung, zu kleiner Pool, viele Child Cursor oder große Objekte.

    2. Analyse

    Fehlerargumente, Pool, Shared-Pool-Verbrauch und Cursor prüfen.

    3. Relevante Views

    V$SGASTAT, V$SGAINFO, V$SQLAREA, V$SQL_SHARED_CURSOR

    4. Nächster Diagnoseweg

    Ursache im betroffenen Pool beheben; Cursor-/Shared-Pool-Druck reduzieren.

    Fehler:
    ORA-04031
    Einstufung:
    Kritisch
    Kategorie:
    Memory
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-04031 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-04031%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-04031 (19c auswählen).

    ORA-04036 – PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT Der PGA-Verbrauch der Instanz oder PDB hat das geltende PGA_AGGREGATE_LIMIT überschritten. Memory Kritisch

    1. Typische Ursachen

    Viele große Workareas, Parallelität, Memory Leak oder zu niedriges Limit.

    2. Analyse

    PGA-Gesamtwerte, Top-Prozesse und aktive SQL prüfen.

    3. Relevante Views

    V$PGASTAT, V$PROCESS_MEMORY, V$SESSION, V$SQL_WORKAREA

    4. Nächster Diagnoseweg

    PGA-Verbraucher reduzieren, Parallelität prüfen und Limit fachlich bewerten.

    Fehler:
    ORA-04036
    Einstufung:
    Kritisch
    Kategorie:
    Memory
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-04036 – erster passender Strukturcheck
    SELECT name, value, unit
    FROM v$pgastat
    WHERE name IN ('total PGA allocated', 'maximum PGA allocated', 'over allocation count')
    ORDER BY name;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: PGA-Verbrauch und den wirksamen PGA_AGGREGATE_LIMIT vergleichen. Kumulierte Maximalwerte sind keine aktuelle Einzelprozessmessung.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-04036 (19c auswählen).

    ORA-04063 – Object has errors Ein referenziertes PL/SQL-Objekt oder eine View ist fehlerhaft/INVALID. SQL und PL/SQL Hoch

    1. Typische Ursachen

    Compile-Fehler, fehlende Abhängigkeit oder Deploymentproblem.

    2. Analyse

    DBA_ERRORS, DBA_OBJECTS und DBA_DEPENDENCIES prüfen.

    3. Relevante Views

    DBA_ERRORS, DBA_OBJECTS, DBA_SOURCE, DBA_DEPENDENCIES

    4. Nächster Diagnoseweg

    Eigentlichen Compile-Fehler beheben und Objekt kontrolliert revalidieren.

    Fehler:
    ORA-04063
    Einstufung:
    Hoch
    Kategorie:
    SQL und PL/SQL
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-04063 – erster passender Strukturcheck
    SELECT owner, name, type, line, position, attribute, text
    FROM dba_errors
    WHERE owner = '&OWNER' AND name = '&OBJECT_NAME'
    ORDER BY type, sequence;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Die ERROR-Zeilen des genannten Objekts nach TYPE und SEQUENCE lesen; zugrunde liegende Abhängigkeiten und Rechte klären.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-04063 (19c auswählen).

    ORA-06502 – PL/SQL numeric or value error PL/SQL hat einen Wert-, Längen- oder Konvertierungsfehler erkannt. SQL und PL/SQL Anwendungsfehler

    1. Typische Ursachen

    Zu kleine Variable, ungültige Zahl oder Zeichenkettenüberlauf.

    2. Analyse

    Stack, Zeile, Variablentypen und Eingabedaten prüfen.

    3. Relevante Views

    DBA_SOURCE, DBA_ERRORS, V$SQL

    4. Nächster Diagnoseweg

    Datentypen, Längen und Exception Handling korrigieren.

    Fehler:
    ORA-06502
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und PL/SQL
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-06502 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-06502%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-06502 (19c auswählen).

    ORA-06512 – At line string Begleitmeldung mit PL/SQL-Stackzeile. SQL und PL/SQL Information

    1. Typische Ursachen

    Wird zusammen mit dem eigentlichen Fehler ausgegeben.

    2. Analyse

    Die erste fachliche ORA-Meldung und die genannten Source-Zeilen analysieren.

    3. Relevante Views

    DBA_SOURCE, DBA_ERRORS

    4. Nächster Diagnoseweg

    Die zugehörige eigentliche Fehlermeldung und den vollständigen PL/SQL-Stack lesen. ORA-06512 zeigt eine Stackposition, die auch eine aufrufende oder weiterreichende Stelle sein kann; nicht jede genannte Zeile ist die ursprüngliche Fehlerursache.

    Fehler:
    ORA-06512
    Einstufung:
    Information
    Kategorie:
    SQL und PL/SQL
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-06512 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-06512%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Wichtige Grenze: Dies ist eine Stackzeilenangabe. Ein Fehler kann in aufgerufenem Code entstehen und durch diese Zeile weitergereicht werden. Die Zeile allein nennt deshalb nicht zwingend den fachlichen Ursprung.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-06512 (19c auswählen).

    ORA-06550 – PL/SQL compilation unit analysis terminated PL/SQL-Kompilierung wurde wegen Syntax- oder semantischem Fehler beendet. SQL und PL/SQL Anwendungsfehler

    1. Typische Ursachen

    Syntaxfehler, fehlendes Objekt/Recht oder falsche Deklaration.

    2. Analyse

    Nachfolgende PLS-/ORA-Meldungen und Source-Zeile prüfen.

    3. Relevante Views

    DBA_ERRORS, DBA_SOURCE

    4. Nächster Diagnoseweg

    Konkreten Compile-Fehler korrigieren.

    Fehler:
    ORA-06550
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und PL/SQL
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-06550 – erster passender Strukturcheck
    SELECT owner, name, type, line, position, attribute, text
    FROM dba_errors
    WHERE owner = '&OWNER' AND name = '&OBJECT_NAME'
    ORDER BY type, sequence;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Vollständigen Compilertext und Zeilen-/Spaltenposition lesen. DBA_ERRORS enthält gespeicherte Objekte; Fehler eines anonymen Blocks müssen aus dem Clientprotokoll gelesen werden.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-06550 (19c auswählen).

    ORA-07445 – Exception encountered: core dump Ein Oracle-Prozess ist durch ein Betriebssystemsignal oder eine Exception abgestürzt. Interne Fehler Kritisch

    1. Typische Ursachen

    Oracle-Bug, Speicherfehler, defekte Bibliothek oder Datenkorruption.

    2. Analyse

    Incident, Trace, Funktion, Signal, Patchstand und OS prüfen.

    3. Relevante Views

    V$DIAG_ALERT_EXT, V$DIAG_INFO, V$VERSION, DBA_REGISTRY_SQLPATCH

    4. Nächster Diagnoseweg

    Incident sichern und Oracle Support/Patchanalyse durchführen.

    Fehler:
    ORA-07445
    Einstufung:
    Kritisch
    Kategorie:
    Interne Fehler
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-07445 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-07445%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-07445 (19c auswählen).

    ORA-12012 – Error on auto execute of job Ein automatisch ausgeführter Job ist fehlgeschlagen. Scheduler Hoch

    1. Typische Ursachen

    Fehler in Job Action, Berechtigung, Objekt oder Anwendungscode.

    2. Analyse

    Nachfolgende ORA-Meldungen und Job Run Details prüfen.

    3. Relevante Views

    DBA_SCHEDULER_JOB_RUN_DETAILS, DBA_SCHEDULER_JOBS, DBA_JOBS

    4. Nächster Diagnoseweg

    Eigentliche Folgemeldung beheben und Job erneut überwachen.

    Fehler:
    ORA-12012
    Einstufung:
    Hoch
    Kategorie:
    Scheduler
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-12012 – erster passender Strukturcheck
    SELECT owner, job_name, status, actual_start_date, run_duration, error#, additional_info
    FROM dba_scheduler_job_run_details
    WHERE actual_start_date >= SYSTIMESTAMP - INTERVAL '1' DAY
    ORDER BY actual_start_date DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Zuerst den vollständigen Folgestack lesen. Für Scheduler-Jobs ERROR# und ADDITIONAL_INFO vergleichen; ältere DBMS_JOB-Aufträge benötigen zusätzlich DBA_JOBS und den passenden Trace.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12012 (19c auswählen).

    ORA-12154 – TNS: could not resolve the connect identifier specified Der Connect Identifier konnte nicht aufgelöst werden. Oracle Net Hoch

    1. Typische Ursachen

    Fehlender/falscher TNS-Alias, falscher TNS_ADMIN oder Syntaxfehler.

    2. Analyse

    Clientseitige sqlnet.ora/tnsnames.ora und verwendete Umgebung prüfen.

    3. Relevante Views

    V$DIAG_INFO, V$PARAMETER

    4. Nächster Diagnoseweg

    TNS-Alias, TNS_ADMIN und Namensauflösung korrigieren.

    Fehler:
    ORA-12154
    Einstufung:
    Hoch
    Kategorie:
    Oracle Net
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-12154 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-12154%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Wichtige Grenze: Bei einem Database Link ist der Oracle-Net-Kontext des Quell-Datenbankprozesses maßgeblich. Für eine Arbeitsplatzverbindung ist es der Clientkontext. Eine lesende DB-Abfrage ersetzt hier keine Prüfung des tatsächlich verwendeten Namensauflösungswegs.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12154 (19c auswählen).

    ORA-12514 – TNS: listener does not currently know of service requested Der Listener kennt den angeforderten Service nicht. Oracle Net Hoch

    1. Typische Ursachen

    Falscher SERVICE_NAME, fehlende LREG-Registrierung oder falscher Listener.

    2. Analyse

    Listener Services, V$SERVICES und Listenerparameter prüfen.

    3. Relevante Views

    V$SERVICES, V$INSTANCE, V$PARAMETER

    4. Nächster Diagnoseweg

    Service korrigieren und dynamische Registrierung prüfen.

    Fehler:
    ORA-12514
    Einstufung:
    Hoch
    Kategorie:
    Oracle Net
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-12514 – erster passender Strukturcheck
    SELECT name, network_name
    FROM v$services
    ORDER BY name;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Gewünschten Servicenamen mit NETWORK_NAME vergleichen. Zusätzlich die Registrierung am tatsächlich angesprochenen Listener prüfen; diese View zeigt keine Listener-Endpunkte.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12514 (19c auswählen).

    ORA-12516 – TNS: listener could not find available handler Für den Service ist aktuell kein geeigneter Handler verfügbar. Oracle Net Kritisch

    1. Typische Ursachen

    Processes-Limit erreicht, Dispatcher/Handler erschöpft oder Servicezustand.

    2. Analyse

    RESOURCE_LIMIT, Sessions, Prozesse und Listener Services prüfen.

    3. Relevante Views

    V$RESOURCE_LIMIT, V$SESSION, V$PROCESS, V$SERVICES

    4. Nächster Diagnoseweg

    Prozess-/Sessiondruck reduzieren und Limit/Handler prüfen.

    Fehler:
    ORA-12516
    Einstufung:
    Kritisch
    Kategorie:
    Oracle Net
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-12516 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-12516%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12516 (19c auswählen).

    ORA-12518 – TNS: listener could not hand off client connection Der Listener konnte die Verbindung nicht an einen Serverprozess übergeben. Oracle Net Kritisch

    1. Typische Ursachen

    OS-Prozesslimit, Ressourcenmangel oder Spawn-/Berechtigungsproblem.

    2. Analyse

    Listenerlog, OS-Limits, Prozesse und Oracle-Ressourcen prüfen.

    3. Relevante Views

    V$RESOURCE_LIMIT, V$PROCESS, V$SESSION

    4. Nächster Diagnoseweg

    OS-/Oracle-Ressourcen und Listener-/Serverprozessproblem beheben.

    Fehler:
    ORA-12518
    Einstufung:
    Kritisch
    Kategorie:
    Oracle Net
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-12518 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-12518%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12518 (19c auswählen).

    ORA-12520 – TNS: listener could not find available handler for requested type Kein Handler des angeforderten Typs war verfügbar. Oracle Net Kritisch

    1. Typische Ursachen

    Shared/Dedicated-Konfiguration, Processes-Limit oder Serviceproblem.

    2. Analyse

    Listener Services und Handlerzustand prüfen.

    3. Relevante Views

    V$SERVICES, V$DISPATCHER, V$RESOURCE_LIMIT

    4. Nächster Diagnoseweg

    Connect Descriptor und Handler-/Prozesskapazität korrigieren.

    Fehler:
    ORA-12520
    Einstufung:
    Kritisch
    Kategorie:
    Oracle Net
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-12520 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-12520%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12520 (19c auswählen).

    ORA-12537 – TNS: connection closed Die Netzwerkverbindung wurde geschlossen. Oracle Net Hoch

    1. Typische Ursachen

    Serverprozessabbruch, Firewall, Timeout oder Listener-/OS-Problem.

    2. Analyse

    Listener-/Serverlog, Alertlog und Netzwerkpfad prüfen.

    3. Relevante Views

    V$DIAG_ALERT_EXT, V$SESSION

    4. Nächster Diagnoseweg

    Ursache im Netzwerk oder Serverprozess beheben.

    Fehler:
    ORA-12537
    Einstufung:
    Hoch
    Kategorie:
    Oracle Net
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-12537 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-12537%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12537 (19c auswählen).

    ORA-12541 – TNS: no listener Am angegebenen Host/Port ist kein Listener erreichbar. Oracle Net Hoch

    1. Typische Ursachen

    Listener gestoppt, falscher Port/Host oder Firewall.

    2. Analyse

    Host, Port, Listenerstatus und Netzwerk prüfen.

    3. Relevante Views

    V$LISTENER_NETWORK, V$SERVICES

    4. Nächster Diagnoseweg

    Listener/Port/Firewall korrigieren.

    Fehler:
    ORA-12541
    Einstufung:
    Hoch
    Kategorie:
    Oracle Net
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-12541 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-12541%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Wichtige Grenze: Wenn die Verbindung schon beim Aufbau scheitert, ist die lokale Clientmeldung der erste Nachweis. Datenbank-Views benötigen eine funktionierende alternative Verbindung und prüfen nicht automatisch denselben Netzwerkweg.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12541 (19c auswählen).

    ORA-12547 – TNS: lost contact Der Kontakt zum Serverprozess ging beim Verbindungsaufbau verloren. Oracle Net Hoch

    1. Typische Ursachen

    Berechtigungs-/Binaryproblem, OS-Limit, falsche Library oder Serverabbruch.

    2. Analyse

    Listenerlog, Oracle-Binary-Rechte und OS prüfen.

    3. Relevante Views

    V$DIAG_ALERT_EXT, V$VERSION

    4. Nächster Diagnoseweg

    OS-/Oracle-Installation und Servertrace prüfen.

    Fehler:
    ORA-12547
    Einstufung:
    Hoch
    Kategorie:
    Oracle Net
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-12547 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-12547%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-12547 (19c auswählen).

    ORA-16014 – Log string sequence# string not archived, no available destinations Ein Redo Log konnte an kein Ziel archiviert werden. Redo und Archivierung Kritisch

    1. Typische Ursachen

    Alle Archive-Ziele fehlerhaft, voll oder deaktiviert.

    2. Analyse

    DEST_STATUS und Fehler je Ziel prüfen.

    3. Relevante Views

    V$ARCHIVE_DEST, V$ARCHIVE_DEST_STATUS, V$LOG

    4. Nächster Diagnoseweg

    Mindestens ein gültiges Archive-Ziel wiederherstellen.

    Fehler:
    ORA-16014
    Einstufung:
    Kritisch
    Kategorie:
    Redo und Archivierung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-16014 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-16014%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-16014 (19c auswählen).

    ORA-16038 – Log cannot be archived Ein Redo Log konnte nicht archiviert werden. Redo und Archivierung Kritisch

    1. Typische Ursachen

    Ziel-, Datei-, Berechtigungs- oder Storageproblem.

    2. Analyse

    ARCn-Fehler und betroffene Sequenz prüfen.

    3. Relevante Views

    V$ARCHIVE_DEST_STATUS, V$ARCHIVED_LOG, V$LOG

    4. Nächster Diagnoseweg

    Archive-Ziel und Storageproblem beheben.

    Fehler:
    ORA-16038
    Einstufung:
    Kritisch
    Kategorie:
    Redo und Archivierung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-16038 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-16038%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-16038 (19c auswählen).

    ORA-19502 – Write error on file Oracle/RMAN konnte eine Datei nicht vollständig schreiben. RMAN und Backup Kritisch

    1. Typische Ursachen

    Filesystem/NFS voll, I/O-Fehler, Berechtigung oder Verbindungsproblem.

    2. Analyse

    OS-Fehler, Zielpfad, Mount und RMAN-Job prüfen.

    3. Relevante Views

    V$RMAN_BACKUP_JOB_DETAILS, V$BACKUP_PIECE, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Storage, NFS und Berechtigungen korrigieren.

    Fehler:
    ORA-19502
    Einstufung:
    Kritisch
    Kategorie:
    RMAN und Backup
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19502 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19502%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19502 (19c auswählen).

    ORA-19504 – Failed to create file Eine Backup-, Restore- oder Recovery-Datei konnte nicht erstellt werden. RMAN und Backup Kritisch

    1. Typische Ursachen

    Pfad fehlt, Berechtigung, Platzmangel oder ungültiger Dateiname.

    2. Analyse

    Pfad, Benutzerrechte und begleitenden OS-Fehler prüfen.

    3. Relevante Views

    V$RMAN_STATUS, V$DIAG_ALERT_EXT

    4. Nächster Diagnoseweg

    Zielpfad/Berechtigung/Platz korrigieren.

    Fehler:
    ORA-19504
    Einstufung:
    Kritisch
    Kategorie:
    RMAN und Backup
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19504 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19504%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19504 (19c auswählen).

    ORA-19505 – Failed to identify file Eine angegebene Datei konnte nicht identifiziert werden. RMAN und Backup Hoch

    1. Typische Ursachen

    Falscher Pfad, fehlende Datei oder NFS-/Storageproblem.

    2. Analyse

    Dateiname, Katalogeintrag und Mount prüfen.

    3. Relevante Views

    V$BACKUP_PIECE, V$ARCHIVED_LOG, V$DATAFILE_COPY

    4. Nächster Diagnoseweg

    Korrekte Datei bereitstellen oder Metadaten abgleichen.

    Fehler:
    ORA-19505
    Einstufung:
    Hoch
    Kategorie:
    RMAN und Backup
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19505 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19505%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19505 (19c auswählen).

    ORA-19506 – Failed to create sequential file RMAN konnte ein sequentielles Backupmedium nicht erzeugen. RMAN und Backup Kritisch

    1. Typische Ursachen

    SBT-/Media-Manager-Fehler, Pluginproblem oder Rechte.

    2. Analyse

    RMAN-Ausgabe und Media-Manager-Log prüfen.

    3. Relevante Views

    V$RMAN_OUTPUT, V$RMAN_STATUS

    4. Nächster Diagnoseweg

    SBT-/Plugin-Konfiguration und Zielsystem prüfen.

    Fehler:
    ORA-19506
    Einstufung:
    Kritisch
    Kategorie:
    RMAN und Backup
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19506 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19506%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19506 (19c auswählen).

    ORA-19511 – Non RMAN, but media manager or vendor specific failure Der externe Media Manager hat einen herstellerspezifischen Fehler geliefert. RMAN und Backup Kritisch

    1. Typische Ursachen

    SBT-/Media-Manager-Problem, Netzwerk oder Repository.

    2. Analyse

    Vendor-Fehlertext, Pluginlog und RMAN-Kanal prüfen.

    3. Relevante Views

    V$RMAN_OUTPUT, V$RMAN_BACKUP_JOB_DETAILS

    4. Nächster Diagnoseweg

    Vendor-/Pluginfehler gezielt beheben.

    Fehler:
    ORA-19511
    Einstufung:
    Kritisch
    Kategorie:
    RMAN und Backup
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19511 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19511%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19511 (19c auswählen).

    ORA-19625 – Error identifying file Eine für Backup oder Recovery benötigte Datei konnte nicht identifiziert werden. RMAN und Backup Hoch

    1. Typische Ursachen

    Datei fehlt, Pfad falsch oder Metadaten inkonsistent.

    2. Analyse

    Betroffene Datei und Katalog/controlfile-Metadaten prüfen.

    3. Relevante Views

    V$BACKUP_PIECE, V$ARCHIVED_LOG, V$DATAFILE_COPY

    4. Nächster Diagnoseweg

    Datei bereitstellen oder RMAN-Metadaten abgleichen.

    Fehler:
    ORA-19625
    Einstufung:
    Hoch
    Kategorie:
    RMAN und Backup
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19625 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19625%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19625 (19c auswählen).

    ORA-19804 – Cannot reclaim bytes disk space from recovery area Oracle konnte in der Recovery Area nicht genügend Platz freigeben. Recovery Area Kritisch

    1. Typische Ursachen

    Gesicherte/obsolete Dateien nicht löschbar oder Retention blockiert.

    2. Analyse

    Recovery Area Usage und RMAN-Status prüfen.

    3. Relevante Views

    V$RECOVERY_AREA_USAGE, V$FLASH_RECOVERY_AREA_USAGE, V$RMAN_BACKUP_JOB_DETAILS

    4. Nächster Diagnoseweg

    Retention/Backups prüfen und gezielt Platz schaffen.

    Fehler:
    ORA-19804
    Einstufung:
    Kritisch
    Kategorie:
    Recovery Area
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19804 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19804%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19804 (19c auswählen).

    ORA-19809 – Limit exceeded for recovery files Die konfigurierte Recovery-Area-Grenze wurde überschritten. Recovery Area Kritisch

    1. Typische Ursachen

    Zu viele Archive Logs/Backups/Flashback Logs oder zu kleine Grenze.

    2. Analyse

    Recovery Area Usage nach Dateityp prüfen.

    3. Relevante Views

    V$RECOVERY_FILE_DEST, V$RECOVERY_AREA_USAGE

    4. Nächster Diagnoseweg

    Platz schaffen, Retention prüfen oder Grenze fachlich anpassen.

    Fehler:
    ORA-19809
    Einstufung:
    Kritisch
    Kategorie:
    Recovery Area
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19809 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19809%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19809 (19c auswählen).

    ORA-19815 – Warning: db_recovery_file_dest_size is bytes used and percent used Die Recovery Area ist nahezu oder vollständig belegt. Recovery Area Warnung

    1. Typische Ursachen

    Archive Logs, Backups oder Flashback Logs verbrauchen den Platz.

    2. Analyse

    Belegung je Dateityp und RMAN-Backupstatus prüfen.

    3. Relevante Views

    V$RECOVERY_FILE_DEST, V$RECOVERY_AREA_USAGE

    4. Nächster Diagnoseweg

    Zeitnah Platz schaffen und Backup-/Löschkonzept prüfen.

    Fehler:
    ORA-19815
    Einstufung:
    Warnung
    Kategorie:
    Recovery Area
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-19815 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-19815%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-19815 (19c auswählen).

    ORA-24756 – Transaction does not exist Eine verteilte oder XA-Transaktion ist nicht mehr bekannt. Distributed Transactions Hoch

    1. Typische Ursachen

    XA-/Application-Server-Problem, Timeout oder bereits abgeschlossene Transaktion.

    2. Analyse

    Anwendung, XA-Logs und 2PC-Metadaten prüfen.

    3. Relevante Views

    DBA_2PC_PENDING, V$GLOBAL_TRANSACTION

    4. Nächster Diagnoseweg

    XA-/Application-Transaktionsmanagement korrigieren.

    Fehler:
    ORA-24756
    Einstufung:
    Hoch
    Kategorie:
    Distributed Transactions
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-24756 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-24756%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-24756 (19c auswählen).

    ORA-27369 – Job of type EXECUTABLE failed with exit code Ein externer Scheduler-Job wurde mit einem OS-Exitcode beendet. Scheduler Hoch

    1. Typische Ursachen

    Programmfehler, fehlende Rechte, Pfad oder Umgebung.

    2. Analyse

    Job Run Details, Additional Info und OS-Log prüfen.

    3. Relevante Views

    DBA_SCHEDULER_JOB_RUN_DETAILS, DBA_SCHEDULER_JOBS

    4. Nächster Diagnoseweg

    Externes Programm und Ausführungsumgebung korrigieren.

    Fehler:
    ORA-27369
    Einstufung:
    Hoch
    Kategorie:
    Scheduler
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-27369 – erster passender Strukturcheck
    SELECT owner, job_name, status, actual_start_date, run_duration, error#, additional_info
    FROM dba_scheduler_job_run_details
    WHERE actual_start_date >= SYSTIMESTAMP - INTERVAL '1' DAY
    ORDER BY actual_start_date DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Exitcode und ADDITIONAL_INFO des externen Jobs prüfen; danach Betriebssystemprogramm, Credentials und dessen Log untersuchen.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-27369 (19c auswählen).

    ORA-27475 – Unknown job Das angegebene Scheduler-Objekt fehlt, hat den falschen Typ oder ist mangels Rechten nicht nutzbar. Scheduler Warnung

    1. Typische Ursachen

    Falscher Owner/Name, gelöschtes Objekt, falscher Objekttyp oder fehlende Berechtigung.

    2. Analyse

    Schema, erforderlichen Scheduler-Objekttyp und Rechte prüfen; DBA_SCHEDULER_JOBS allein erfasst nicht jeden Scheduler-Objekttyp.

    3. Relevante Views

    DBA_SCHEDULER_JOBS

    4. Nächster Diagnoseweg

    Voll qualifizierten Jobnamen verwenden.

    Fehler:
    ORA-27475
    Einstufung:
    Warnung
    Kategorie:
    Scheduler
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-27475 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-27475%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-27475 (19c auswählen).

    ORA-27476 – Unknown name for string Ein Scheduler-Objektname ist unbekannt. Scheduler Warnung

    1. Typische Ursachen

    Fehlendes Programm, Schedule, Credential oder Job Class.

    2. Analyse

    Abhängige Scheduler-Objekte prüfen.

    3. Relevante Views

    DBA_SCHEDULER_PROGRAMS, DBA_SCHEDULER_SCHEDULES, DBA_SCHEDULER_CREDENTIALS

    4. Nächster Diagnoseweg

    Fehlendes Scheduler-Objekt korrigieren.

    Fehler:
    ORA-27476
    Einstufung:
    Warnung
    Kategorie:
    Scheduler
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-27476 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-27476%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-27476 (19c auswählen).

    ORA-27477 – Object already exists Ein Scheduler-Objekt mit diesem Namen existiert bereits. Scheduler Warnung

    1. Typische Ursachen

    Doppelte Anlage oder falscher Owner.

    2. Analyse

    Bestehende Scheduler-Objekte prüfen.

    3. Relevante Views

    DBA_SCHEDULER_JOBS, DBA_SCHEDULER_PROGRAMS

    4. Nächster Diagnoseweg

    Vorhandenes Objekt verwenden oder eindeutigen Namen wählen.

    Fehler:
    ORA-27477
    Einstufung:
    Warnung
    Kategorie:
    Scheduler
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-27477 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-27477%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-27477 (19c auswählen).

    ORA-27486 – Insufficient privileges Für die Scheduler-Operation fehlen Rechte. Scheduler Hoch

    1. Typische Ursachen

    Fehlendes CREATE JOB, CREATE EXTERNAL JOB oder Objektprivileg.

    2. Analyse

    Direkte Systemrechte und Job-Owner prüfen.

    3. Relevante Views

    DBA_SYS_PRIVS, DBA_SCHEDULER_JOBS

    4. Nächster Diagnoseweg

    Minimal erforderliche Scheduler-Rechte direkt vergeben.

    Fehler:
    ORA-27486
    Einstufung:
    Hoch
    Kategorie:
    Scheduler
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-27486 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-27486%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-27486 (19c auswählen).

    ORA-28000 – Account is locked Der Datenbankaccount ist gesperrt. Benutzer und Anmeldung Hoch

    1. Typische Ursachen

    Fehlanmeldungen, manuelle Sperre oder Profilregel.

    2. Analyse

    ACCOUNT_STATUS, LOCK_DATE und Profil prüfen.

    3. Relevante Views

    DBA_USERS, DBA_PROFILES

    4. Nächster Diagnoseweg

    Ursache der Sperre beheben und Account kontrolliert entsperren.

    Fehler:
    ORA-28000
    Einstufung:
    Hoch
    Kategorie:
    Benutzer und Anmeldung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-28000 – erster passender Strukturcheck
    SELECT username, account_status, lock_date, expiry_date, profile
    FROM dba_users
    WHERE username = '&USERNAME';
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: ACCOUNT_STATUS und LOCK_DATE auswerten. Die Ursache der Sperre klären, bevor eine Entsperrung separat geplant wird.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-28000 (19c auswählen).

    ORA-28001 – Password has expired Das Passwort ist abgelaufen. Benutzer und Anmeldung Hoch

    1. Typische Ursachen

    PASSWORD_LIFE_TIME oder manuell erzwungener Ablauf.

    2. Analyse

    Accountstatus und Profil prüfen.

    3. Relevante Views

    DBA_USERS, DBA_PROFILES

    4. Nächster Diagnoseweg

    Passwort gemäß Verfahren erneuern.

    Fehler:
    ORA-28001
    Einstufung:
    Hoch
    Kategorie:
    Benutzer und Anmeldung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-28001 – erster passender Strukturcheck
    SELECT username, account_status, lock_date, expiry_date, profile
    FROM dba_users
    WHERE username = '&USERNAME';
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: EXPIRED-Status und Ablaufdatum prüfen; den Passwortwechsel mit dem betroffenen Benutzer und den nutzenden Anwendungen abstimmen.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-28001 (19c auswählen).

    ORA-28002 – Password will expire within string days Die reguläre Passwortlebensdauer ist abgelaufen; die Anmeldung gelingt noch während der Grace Period. Benutzer und Anmeldung Warnung

    1. Typische Ursachen

    Begrenzte PASSWORD_LIFE_TIME und noch laufende PASSWORD_GRACE_TIME.

    2. Analyse

    ACCOUNT_STATUS, EXPIRY_DATE und wirksame Profilwerte prüfen; ORA-28002 ist eine Warnung bei noch erfolgreicher Anmeldung.

    3. Relevante Views

    DBA_USERS, DBA_PROFILES

    4. Nächster Diagnoseweg

    Passwortwechsel rechtzeitig planen.

    Fehler:
    ORA-28002
    Einstufung:
    Warnung
    Kategorie:
    Benutzer und Anmeldung
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-28002 – erster passender Strukturcheck
    SELECT username, account_status, lock_date, expiry_date, profile
    FROM dba_users
    WHERE username = '&USERNAME';
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Vorgehen: Verbleibende Grace-Phase über Profil und Kontostatus prüfen; einen rechtzeitigen Passwortwechsel planen.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-28002 (19c auswählen).

    ORA-30013 – Undo tablespace is currently in use Der Undo-Tablespace kann wegen aktiver Nutzung nicht wie angefordert geändert werden. Undo und Konsistenz Hoch

    1. Typische Ursachen

    Aktive Transaktionen oder aktuelle Instanzzuordnung.

    2. Analyse

    Aktive Transaktionen und UNDO_TABLESPACE prüfen.

    3. Relevante Views

    V$TRANSACTION, V$PARAMETER, DBA_TABLESPACES

    4. Nächster Diagnoseweg

    Transaktionen abwarten und Änderung kontrolliert planen.

    Fehler:
    ORA-30013
    Einstufung:
    Hoch
    Kategorie:
    Undo und Konsistenz
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-30013 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-30013%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-30013 (19c auswählen).

    ORA-30027 – Undo quota violation Die Undo-Zuweisung der Resource-Manager-Consumer-Group dieser Session wurde überschritten. Undo und Konsistenz Hoch

    1. Typische Ursachen

    UNDO_POOL der Consumer Group und deren gesamte aktive Undo-Nutzung; nicht eine gewöhnliche Tablespace-Quota des Benutzers.

    2. Analyse

    Aktiven Resource-Manager-Plan, Consumer Group und UNDO_POOL prüfen. Transaktionsnutzung ergänzt die Diagnose; ein Benutzerprofil erklärt diese Gruppengrenze nicht.

    3. Relevante Views

    V$TRANSACTION, V$SESSION, DBA_RSRC_PLAN_DIRECTIVES

    4. Nächster Diagnoseweg

    Transaktionsgröße und Konfiguration prüfen.

    Fehler:
    ORA-30027
    Einstufung:
    Hoch
    Kategorie:
    Undo und Konsistenz
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-30027 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-30027%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-30027 (19c auswählen).

    ORA-30036 – Unable to extend segment by string in undo tablespace Im Undo-Tablespace konnte kein weiteres Extent angelegt werden. Undo und Konsistenz Kritisch

    1. Typische Ursachen

    Undo voll, Maxsize erreicht oder sehr hohe Transaktionslast.

    2. Analyse

    Undo-Dateien, V$UNDOSTAT und aktive Transaktionen prüfen.

    3. Relevante Views

    V$UNDOSTAT, V$TRANSACTION, DBA_DATA_FILES, DBA_UNDO_EXTENTS

    4. Nächster Diagnoseweg

    Undo-Kapazität und große/lange Transaktionen prüfen.

    Fehler:
    ORA-30036
    Einstufung:
    Kritisch
    Kategorie:
    Undo und Konsistenz
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Alertlog-Abfrage

    ORA-30036 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%ORA-30036%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Offizielle Meldungsreferenz: Oracle Error Help – ORA-30036 (19c auswählen).

    RMAN-03002 – Failure of command at date/time Der angegebene RMAN-Befehl ist fehlgeschlagen. RMAN und Backup Hoch

    1. Typische Ursachen

    Sammelmeldung; die eigentliche Ursache steht in den folgenden ORA-/RMAN-Meldungen.

    2. Analyse

    Gesamten RMAN-Fehlerstack von unten nach oben auswerten.

    3. Relevante Views

    V$RMAN_STATUS, V$RMAN_OUTPUT, V$RMAN_BACKUP_JOB_DETAILS

    4. Nächster Diagnoseweg

    Die konkrete Folgemeldung beheben.

    Fehler:
    RMAN-03002
    Einstufung:
    Hoch
    Kategorie:
    RMAN und Backup
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Zusätzliche Alertlog-Suche

    Beginne mit dem vollständigen Protokoll dieses RMAN-Laufs. Die Alertlog-Suche ist kein vollständiger RMAN-Fehlernachweis; ein leeres Ergebnis widerlegt den Fehler nicht. V$RMAN_OUTPUT ist eine begrenzte In-Memory-Quelle, kein dauerhaftes Protokollarchiv. Die folgende MESSAGE_TEXT-Ausgabe ist auf 1000 Zeichen gekürzt.

    RMAN-03002 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%RMAN-03002%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Oracle Error Help – RMAN-03002 (19c auswählen)

    RMAN-06054 – Media recovery requesting unknown archived log Recovery benötigt ein Archived Log, das RMAN nicht kennt. RMAN und Recovery Kritisch

    1. Typische Ursachen

    Log fehlt, nicht katalogisiert oder nie archiviert.

    2. Analyse

    Thread, Sequence, Resetlogs und vorhandene Backups prüfen.

    3. Relevante Views

    V$ARCHIVED_LOG, V$LOG_HISTORY, V$DATABASE_INCARNATION

    4. Nächster Diagnoseweg

    Fehlendes Log bereitstellen/katalogisieren oder Recovery-Endpunkt anpassen.

    Fehler:
    RMAN-06054
    Einstufung:
    Kritisch
    Kategorie:
    RMAN und Recovery
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Zusätzliche Alertlog-Suche

    Beginne mit dem vollständigen Protokoll dieses RMAN-Laufs. Die Alertlog-Suche ist kein vollständiger RMAN-Fehlernachweis; ein leeres Ergebnis widerlegt den Fehler nicht. V$RMAN_OUTPUT ist eine begrenzte In-Memory-Quelle, kein dauerhaftes Protokollarchiv. Die folgende MESSAGE_TEXT-Ausgabe ist auf 1000 Zeichen gekürzt.

    RMAN-06054 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%RMAN-06054%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Wichtige Grenze: Unbekannt im RMAN-Repository bedeutet nicht zwingend physisch fehlend. Thread, Sequence, Resetlogs und vorhandene Kopien prüfen. Ein geänderter Recovery-Endpunkt bedeutet möglichen Datenverlust und ist eine fachliche Entscheidung, kein automatischer Ausweg.

    Oracle Error Help – RMAN-06054 (19c auswählen)

    RMAN-06091 – No channel allocated for maintenance Für DELETE/CROSSCHECK wurde kein passender Maintenance Channel allokiert. RMAN und Backup Hoch

    1. Typische Ursachen

    SBT-Backups sollen ohne SBT-Maintenance-Channel bearbeitet werden.

    2. Analyse

    Device Type der Pieces und aktuelle RMAN-Konfiguration prüfen.

    3. Relevante Views

    V$BACKUP_PIECE, V$RMAN_CONFIGURATION, V$RMAN_OUTPUT

    4. Nächster Diagnoseweg

    Passenden Maintenance Channel für DISK oder SBT verwenden.

    Fehler:
    RMAN-06091
    Einstufung:
    Hoch
    Kategorie:
    RMAN und Backup
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Zusätzliche Alertlog-Suche

    Beginne mit dem vollständigen Protokoll dieses RMAN-Laufs. Die Alertlog-Suche ist kein vollständiger RMAN-Fehlernachweis; ein leeres Ergebnis widerlegt den Fehler nicht. V$RMAN_OUTPUT ist eine begrenzte In-Memory-Quelle, kein dauerhaftes Protokollarchiv. Die folgende MESSAGE_TEXT-Ausgabe ist auf 1000 Zeichen gekürzt.

    RMAN-06091 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%RMAN-06091%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Oracle Error Help – RMAN-06091 (19c auswählen)

    RMAN-20001 – Target database not found in recovery catalog Die Zieldatenbank ist im Recovery Catalog nicht registriert. RMAN Catalog Hoch

    1. Typische Ursachen

    REGISTER DATABASE fehlt, falscher Catalog oder DBID.

    2. Analyse

    Catalog-Verbindung, DBID und Registrierung prüfen.

    3. Relevante Views

    RC_DATABASE, V$DATABASE

    4. Nächster Diagnoseweg

    Zuerst Target-DBID, verbundene Catalog-Datenbank, Catalog-Owner und erwartete Registrierung prüfen. Eine Verbindung zum falschen Catalog erklärt den Befund ebenfalls; erst bei bestätigter fehlender Registrierung deren Einrichtung planen.

    Fehler:
    RMAN-20001
    Einstufung:
    Hoch
    Kategorie:
    RMAN Catalog
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Zusätzliche Alertlog-Suche

    Beginne mit dem vollständigen Protokoll dieses RMAN-Laufs. Die Alertlog-Suche ist kein vollständiger RMAN-Fehlernachweis; ein leeres Ergebnis widerlegt den Fehler nicht. V$RMAN_OUTPUT ist eine begrenzte In-Memory-Quelle, kein dauerhaftes Protokollarchiv. Die folgende MESSAGE_TEXT-Ausgabe ist auf 1000 Zeichen gekürzt.

    RMAN-20001 – Meldungen der letzten 24 Stunden
    SELECT
        originating_timestamp,
        message_type,
        message_level,
        component_id,
        problem_key,
        SUBSTR(message_text,1,1000) AS message_text
    FROM v$diag_alert_ext
    WHERE originating_timestamp >= SYSTIMESTAMP - INTERVAL '1' DAY
      AND UPPER(message_text) LIKE UPPER('%RMAN-20001%')
    ORDER BY originating_timestamp DESC;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.
    Fachkapitel: DBA Troubleshooting. Das Lexikon ordnet den Fehler ein; die Fachmechanik und systematische Diagnose stehen dort.

    Wichtige Grenze: Auch der falsche Catalog oder eine falsche DBID kann den Befund erklären. RC_DATABASE ist im Recovery-Catalog-Kontext abzufragen, nicht als gewöhnliche View der Target-Datenbank.

    Oracle 19c: Database Error Messages – RMAN-20001

    ORA-02063 – Preceding error from database linkBegleitmeldung: Der vorausgehende Fehler stammt vom genannten Database Link. Distributed TransactionsAnwendungsfehler

    1. Typische Ursachen

    Ein Fehler wurde von der entfernten Datenbank zurückgemeldet.

    2. Analyse

    Zuerst den vorausgehenden Fehlercode und den Linknamen auswerten. Die lokale Linkdefinition erklärt keine fehlenden Zielrechte.

    3. Relevante Views

    DBA_DB_LINKS, V$PARAMETER

    4. Nächster Diagnoseweg

    Befund im zuständigen Fachkapitel einordnen und Änderung getrennt planen.

    Fehler:
    ORA-00942
    Einstufung:
    Anwendungsfehler
    Kategorie:
    Distributed Transactions
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-02063 – lesender erster Check
    SELECT owner, db_link, username, host
    FROM dba_db_links
    WHERE db_link = '&DB_LINK'
    ORDER BY owner;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.

    Passendes Fachkapitel

    Oracle Error Help – ORA-02063 (19c auswählen)

    ORA-02085 – Database link connects to different global nameLinkname und globaler Zielname passen nicht zu der geltenden Namensprüfung. Distributed TransactionsAnwendungsfehler

    1. Typische Ursachen

    Bei GLOBAL_NAMES=TRUE wird die passende Benennung geprüft.

    2. Analyse

    Beide Namen aus dem vollständigen Fehler und den wirksamen Parameter abgleichen. Die Namensprüfung nicht pauschal abschalten.

    3. Relevante Views

    DBA_DB_LINKS, V$PARAMETER

    4. Nächster Diagnoseweg

    Befund im zuständigen Fachkapitel einordnen und Änderung getrennt planen.

    Fehler:
    ORA-00942
    Einstufung:
    Anwendungsfehler
    Kategorie:
    Distributed Transactions
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-02085 – lesender erster Check
    SELECT name, value
    FROM v$parameter
    WHERE name = 'global_names';
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.

    Passendes Fachkapitel

    Oracle Error Help – ORA-02085 (19c auswählen)

    ORA-40441 – JSON syntax errorDas übergebene JSON besitzt ungültige Syntax. SQL und ObjekteAnwendungsfehler

    1. Typische Ursachen

    Die Eingabe kann nicht als JSON geparst werden.

    2. Analyse

    Das konkrete Dokument syntaktisch prüfen. Eine erfolgreiche Syntaxprüfung ersetzt keine Prüfung von Pflichtfeldern oder Datumswerten.

    3. Relevante Views

    SQL/JSON-Prüfung des konkreten Eingabedokuments

    4. Nächster Diagnoseweg

    Befund im zuständigen Fachkapitel einordnen und Änderung getrennt planen.

    Fehler:
    ORA-00942
    Einstufung:
    Anwendungsfehler
    Kategorie:
    SQL und Objekte
    Grundsatz:
    Immer vollständigen Fehlerstack und Begleitmeldungen auswerten.

    5. Read-only Diagnoseabfrage

    ORA-40441 – lesender erster Check
    SELECT CASE WHEN '{"artikel":}' IS JSON STRICT
                THEN 'GUELTIG' ELSE 'UNGUELTIG' END AS json_status
    FROM dual;
    Read-only-Garantie: Die Diagnosebeispiele führen ausschließlich SELECT-Abfragen aus. Es werden keine Sessions beendet, keine Parameter geändert und keine automatischen Korrekturen ausgeführt.

    Passendes Fachkapitel

    Oracle Error Help – ORA-40441 (19c auswählen)

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Ein Fehlercode ist der Einstieg in die Untersuchung. Vollständiger Meldungstext, Fehlerstack und Ausführungskontext bestimmen seine konkrete Bedeutung.
    2. Nicht jede Zeile im Stack benennt die Ursache. Begleitmeldungen können lediglich Aufrufstelle, fehlgeschlagenen Gesamtauftrag oder entfernte Herkunft anzeigen.
    3. Verbindungs-, Berechtigungs-, Platz-, Daten- und Backupfehler erfordern unterschiedliche Prüfungen. Die Diagnose richtet sich nach der gescheiterten Phase.
    4. Alert Log, Anwendungs-, Scheduler- oder RMAN-Protokolle ergänzen sich je nach Fehler. Der gleiche Zeitbezug verhindert, dass unzusammengehörige Ereignisse vermischt werden.
    5. Ein im Lexikon genannter Lösungsweg muss zur tatsächlichen Ursache passen. Rechtevergabe, Löschungen oder andere Eingriffe folgen erst nach dieser Prüfung.

    Lernzielkontrolle

    Erkläre zuerst deinen Befund und den nächsten Prüfschritt. Öffne danach die begründete Lösung.
    Frage 1: ORA-19504 wird von No space left on device begleitet. Wo setzt du an?

    Lösung: Beim vollständigen Fehlerstack und dem genannten Dateipfad. Ordne ihn dem betroffenen Dateisystem zu und prüfe dessen Kapazität.

    Frage 2: Beweist eine leere Alertlog-Suche, dass der Clientfehler nicht auftrat?

    Lösung: Nein. Nicht jeder Client- oder SQL-Fehler erscheint im Alert Log. Der Originalstack aus Anwendung oder Job ist eine eigene Diagnosequelle.

    Frage 3: Was unterscheidet Fehlercode und Ursache?

    Lösung: Der Code beschreibt einen gemeldeten Fehlerzustand. Die konkrete Ursache ergibt sich erst aus Operation, Kontext und Begleitmeldungen.

    Frage 4: Warum muss der 19c-Eintrag der Fehlerreferenz gelesen werden?

    Lösung: Meldungstexte und zusätzliche Angaben können zwischen Releases abweichen. Das Beispiel muss zur tatsächlich untersuchten Version passen.

    49. Oracle Data Dictionary Explorer – Metadaten zu Objekten, Storage, Benutzern und Rechten

    Ausführliches Nachschlagewerk für DBA_*, ALL_*, USER_* und CDB_*-Views mit Spalten, Zusammenhängen und Praxis-SQL.

    Lernkompass
    Einfach gesagt Das Data Dictionary beschreibt die Datenbank selbst: Objekte, Benutzer, Rechte, Storage und Metadaten.
    Warum ist das wichtig? Es ist die wichtigste Quelle für Fragen nach 'Was ist definiert?'.
    Nach diesem Kapitel Du kannst DBA_-, ALL_- und USER_-Sichten gezielter auswählen.
    Lesetipp: Du musst diesen Abschnitt nicht auswendig lernen. Verstehe zuerst die Aufgabe und merke dir, wo du die Details später nachschlagen kannst.

    Das Data Dictionary ist das Inhaltsverzeichnis der Datenbank. Es beschreibt beispielsweise, welche Objekte definiert sind und wem sie gehören. Die View-Familien USER_, ALL_ und DBA_ haben unterschiedliche Sichtbereiche; einzelne Views besitzen zusätzlich eigene Regeln. DBA_-Informationen gelten im aktuellen Container und setzen passende Leserechte voraus. CDB_-Sichten können im Root containerübergreifende Daten liefern, deren Sichtbarkeit unter anderem von Rechten, CONTAINER_DATA und erreichbaren Containern abhängt. Ein fehlender Treffer beweist deshalb erst nach Prüfung des Kontexts, dass die gesuchte Definition fehlt.

    Die Ergebniszeile bestimmt den Join-Schlüssel. Eine Zeile in einer Objektübersicht beschreibt nicht automatisch dieselbe Einheit wie eine Zeile in einer Spalten-, Partitions- oder Rechteübersicht. Ein Tabellenname allein reicht beispielsweise nicht für die Verbindung mit seinen Spalten: Der Owner gehört dazu; bei containerübergreifenden Ergebnissen auch CON_ID. Andernfalls können gleichnamige Objekte vermischt oder Zeilen vervielfacht werden. Lies deshalb vor dem Zusammenführen, wofür genau eine Zeile jeder beteiligten View steht.

    Eine Objektdefinition vollständig zuordnen

    Im Beispiel suchst du BESTELLUNGEN im Schema APP_DEMO. Die folgenden Angaben beschreiben eine Definition; sie zählen keine Bestellungen.

    READ ONLY – in SQL*Plus oder einem Oracle-SQL-Arbeitsblatt
    SELECT owner, object_name, object_type, status
    FROM all_objects
    WHERE owner = 'APP_DEMO'
      AND object_name = 'BESTELLUNGEN'
    ORDER BY object_type;
    Fiktive Beispielausgabe:
    OWNEROBJECT_NAMEOBJECT_TYPESTATUS
    APP_DEMOBESTELLUNGENTABLEVALID

    Was sehe ich hier? Die sichtbare Tabelle gehört APP_DEMO. VALID ist ein Objektstatus und keine Prüfung aller fachlichen Daten. Ohne Treffer prüfst du zuerst Container, Sichtbarkeit und Namen. APP_DEMO ist ein Beispiel; die Abfrage legt das Objekt nicht an. Die Karten darunter vertiefen die passenden Spalten.

    Abgrenzung: Fachwissen steht in den jeweiligen Fachkapiteln. Fertige Diagnose-SQL steht im SQL-Rezeptbuch. Der Dictionary Explorer bleibt ein View-Nachschlagewerk.
    DBA_OBJECTS – Alle Datenbankobjekte mit Typ, Status und Zeitstempeln. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Invalid Objects und letzte DDL-Änderungen prüfen.
    Verwendet in:
    Health Check, Invalid Objects

    1. Verwandte Views

    DBA_OBJECTS → DBA_ERRORS, DBA_DEPENDENCIES

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    OBJECT_NAMEName des beschriebenen Datenbankobjekts.
    OBJECT_TYPEObjektart, zum Beispiel TABLE, VIEW oder PACKAGE BODY.
    CREATEDZeitpunkt der Erstellung des beschriebenen Objekts.
    LAST_DDL_TIMEZeitpunkt der letzten relevanten DDL-Änderung; keine Historie der Änderungen an Tabellenzeilen.
    STATUSVALID, INVALID oder N/A im Objektkontext; INVALID bedeutet nicht automatisch physische Dateikorruption.

    3. Alle Spalten der View

    DBA_OBJECTS vollständig anzeigen
    SELECT *
    FROM dba_objects;

    4. Praxisabfrage

    DBA_OBJECTS - typisches Beispiel
    SELECT owner, object_type, object_name, status, last_ddl_time FROM dba_objects WHERE status<>'VALID' ORDER BY owner, object_type, object_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_OBJECTS.

    Weiterlernen: Verwandte Abfrage zu DBA_OBJECTS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_TABLES – Tabellenmetadaten aller Schemas. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Tabelleneigenschaften, Rows, Blocks und Statistiken prüfen.
    Verwendet in:
    Tablespace, Capacity

    1. Verwandte Views

    DBA_TABLES → DBA_TAB_COLUMNS, DBA_INDEXES, DBA_SEGMENTS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    NUM_ROWSGeschätzte Zeilenzahl aus den Optimizer-Statistiken, kein aktuelles COUNT(*). LAST_ANALYZED beachten.
    BLOCKSBelegte Tabellenblöcke laut Statistik; nicht die gesamte allokierte Dateigröße.
    AVG_ROW_LENDurchschnittliche Zeilenlänge in Bytes aus den Statistiken.
    LAST_ANALYZEDZeitpunkt der letzten Statistikermittlung für diesen Eintrag.
    PARTITIONEDKennzeichen, ob das Objekt partitioniert ist.

    3. Alle Spalten der View

    DBA_TABLES vollständig anzeigen
    SELECT *
    FROM dba_tables;

    4. Praxisabfrage

    DBA_TABLES - typisches Beispiel
    SELECT owner, table_name, tablespace_name, num_rows, blocks, avg_row_len, last_analyzed FROM dba_tables ORDER BY owner, table_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Was bedeutet das Ergebnis? NUM_ROWS und BLOCKS stammen aus Statistiken und können fehlen oder veraltet sein. Bei partitionierten Tabellen liefern Partitions-/Segmentviews den nötigen zusätzlichen Kontext.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_TABLES.

    Weiterlernen: Verwandte Abfrage zu DBA_TABLES mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_TAB_COLUMNS – Spalten aller Tabellen und Views. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Datentypen, Nullability und Spaltenpositionen anzeigen.
    Verwendet in:
    SQL-Rezeptbuch

    1. Verwandte Views

    DBA_TAB_COLUMNS → DBA_TABLES, DBA_CONS_COLUMNS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    COLUMN_NAMEName der beschriebenen Spalte.
    DATA_TYPEOracle-Datentyp der Spalte.
    DATA_LENGTHMaximale Länge in Bytes; nicht mit der Zeichenzahl gleichsetzen.
    NULLABLEY: NULL zulässig; N: NULL durch die Definition ausgeschlossen.
    COLUMN_IDPosition der Spalte in der Tabellen-/Viewdefinition.
    DATA_DEFAULTIn der Definition hinterlegter Standardausdruck für die Spalte.
    NUM_DISTINCTStatistisch ermittelte Zahl unterschiedlicher Spaltenwerte.

    3. Alle Spalten der View

    DBA_TAB_COLUMNS vollständig anzeigen
    SELECT *
    FROM dba_tab_columns;

    4. Praxisabfrage

    DBA_TAB_COLUMNS - typisches Beispiel
    SELECT owner, table_name, column_id, column_name, data_type, data_length, nullable FROM dba_tab_columns WHERE owner='&OWNER' AND table_name='&TABLE_NAME' ORDER BY column_id;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_TAB_COLUMNS.

    Weiterlernen: Verwandte Abfrage zu DBA_TAB_COLUMNS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_INDEXES – Indexdefinitionen und Status. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    UNUSABLE-Indizes, BLEVEL und Clustering Factor prüfen.
    Verwendet in:
    Health Check, Performance

    1. Verwandte Views

    DBA_INDEXES → DBA_IND_COLUMNS, DBA_IND_EXPRESSIONS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    INDEX_NAMEName des Index.
    TABLE_OWNERSchema der zugehörigen Tabelle.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    INDEX_TYPEIndexart, beispielsweise NORMAL oder BITMAP.
    UNIQUENESSUNIQUE oder NONUNIQUE: Eindeutigkeitsmerkmal des Index.
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    BLEVELTiefe des B-Tree-Index ohne Blattebene; 0 bedeutet, dass Wurzel und Blatt zusammenfallen.
    LEAF_BLOCKSAnzahl der Index-Blattblöcke laut Statistik.
    CLUSTERING_FACTORStatistik zum Zusammenhang zwischen Indexreihenfolge und Tabellenblöcken. Im Verhältnis zu Tabellenblöcken und Zeilenzahl bewerten.
    LAST_ANALYZEDZeitpunkt der letzten Statistikermittlung für diesen Eintrag.

    3. Alle Spalten der View

    DBA_INDEXES vollständig anzeigen
    SELECT *
    FROM dba_indexes;

    4. Praxisabfrage

    DBA_INDEXES - typisches Beispiel
    SELECT owner, index_name, table_owner, table_name, index_type, uniqueness, status, blevel, leaf_blocks, clustering_factor, last_analyzed FROM dba_indexes ORDER BY owner, index_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_INDEXES.

    Weiterlernen: Verwandte Abfrage zu DBA_INDEXES mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_IND_COLUMNS – Indexspalten und Reihenfolge. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Indexdefinition je Tabelle anzeigen.
    Verwendet in:
    SQL-Rezeptbuch

    1. Verwandte Views

    DBA_IND_COLUMNS → DBA_INDEXES, DBA_IND_EXPRESSIONS

    2. Wichtige Spalten

    SpalteBedeutung
    INDEX_OWNERSchema des Index.
    INDEX_NAMEName des Index.
    TABLE_OWNERSchema der zugehörigen Tabelle.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    COLUMN_NAMEName der beschriebenen Spalte.
    COLUMN_POSITIONPosition der Spalte innerhalb dieses Index; keine Rangfolge zwischen Indizes.
    DESCENDASC oder DESC: Sortierrichtung dieser Indexspalte.

    3. Alle Spalten der View

    DBA_IND_COLUMNS vollständig anzeigen
    SELECT *
    FROM dba_ind_columns;

    4. Praxisabfrage

    DBA_IND_COLUMNS - typisches Beispiel
    SELECT index_owner, index_name, column_position, column_name, descend FROM dba_ind_columns WHERE table_owner='&OWNER' AND table_name='&TABLE_NAME' ORDER BY index_owner, index_name, column_position;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_IND_COLUMNS.

    Weiterlernen: Verwandte Abfrage zu DBA_IND_COLUMNS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_CONSTRAINTS – Constraints aller Schemas. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Primary Keys, Foreign Keys und Status prüfen.
    Verwendet in:
    Health Check

    1. Verwandte Views

    DBA_CONSTRAINTS → DBA_CONS_COLUMNS, DBA_INDEXES

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    CONSTRAINT_NAMEName der Integritätsbedingung.
    CONSTRAINT_TYPEArt der Bedingung, zum Beispiel P: Primärschlüssel, U: Unique, R: Fremdschlüssel, C: Check.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    R_OWNERSchema der referenzierten Primär-/Unique-Bedingung.
    R_CONSTRAINT_NAMEName der vom Fremdschlüssel referenzierten Bedingung.
    DELETE_RULERegel für das Löschen referenzierter Datensätze, zum Beispiel CASCADE oder NO ACTION.
    VALIDATEDGibt an, ob vorhandene Daten gegen die Bedingung validiert wurden.
    INDEX_NAMEBei passenden Primär-/Unique-Bedingungen verwendeter Index; bei anderen Constraint-Arten nicht allgemein gefüllt.

    3. Alle Spalten der View

    DBA_CONSTRAINTS vollständig anzeigen
    SELECT *
    FROM dba_constraints;

    4. Praxisabfrage

    DBA_CONSTRAINTS - typisches Beispiel
    SELECT owner, table_name, constraint_name, constraint_type, status, validated FROM dba_constraints ORDER BY owner, table_name, constraint_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_CONSTRAINTS.

    Weiterlernen: Verwandte Abfrage zu DBA_CONSTRAINTS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_CONS_COLUMNS – Spalten von Constraints. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Constraint-Spalten und Positionen anzeigen.
    Verwendet in:
    SQL-Rezeptbuch

    1. Verwandte Views

    DBA_CONS_COLUMNS → DBA_CONSTRAINTS, DBA_TAB_COLUMNS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    CONSTRAINT_NAMEName der Integritätsbedingung.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    COLUMN_NAMEName der beschriebenen Spalte.
    POSITIONSpaltenposition innerhalb der Integritätsbedingung.

    3. Alle Spalten der View

    DBA_CONS_COLUMNS vollständig anzeigen
    SELECT *
    FROM dba_cons_columns;

    4. Praxisabfrage

    DBA_CONS_COLUMNS - typisches Beispiel
    SELECT owner, table_name, constraint_name, position, column_name FROM dba_cons_columns ORDER BY owner, table_name, constraint_name, position;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_CONS_COLUMNS.

    Weiterlernen: Verwandte Abfrage zu DBA_CONS_COLUMNS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_VIEWS – Definitionen und Eigenschaften aller Views. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    View-Bestand und Read-only-Status prüfen.
    Verwendet in:
    Data Dictionary

    1. Verwandte Views

    DBA_VIEWS → DBA_DEPENDENCIES, DBA_OBJECTS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TEXTGespeicherte Abfragedefinition als LONG; kein Ergebnisdatensatz der View.
    VIEW_NAMEName der normalen View.
    READ_ONLYY: als read-only definiert; N garantiert nicht, dass jedes DML zulässig ist.

    3. Alle Spalten der View

    DBA_VIEWS vollständig anzeigen
    SELECT *
    FROM dba_views;

    4. Praxisabfrage

    DBA_VIEWS - typisches Beispiel
    SELECT owner, view_name, text_length, read_only FROM dba_views ORDER BY owner, view_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_VIEWS.

    DBA_SYNONYMS – Private und Public Synonyme. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Namensauflösung und Zielobjekte prüfen.
    Verwendet in:
    Oracle Net

    1. Verwandte Views

    DBA_SYNONYMS → DBA_OBJECTS, DBA_DB_LINKS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    SYNONYM_NAMEAlternativer Objektname. Ein Synonym erteilt selbst keine Zugriffsrechte.
    TABLE_OWNEROwner des referenzierten Zielobjekts, nicht zwingend eine Tabelle.
    TABLE_NAMEName des Zielobjekts; dieses muss keine Tabelle sein.
    DB_LINKName des Database Links; gegebenenfalls einschließlich Domain.

    3. Alle Spalten der View

    DBA_SYNONYMS vollständig anzeigen
    SELECT *
    FROM dba_synonyms;

    4. Praxisabfrage

    DBA_SYNONYMS - typisches Beispiel
    SELECT owner, synonym_name, table_owner, table_name, db_link FROM dba_synonyms ORDER BY owner, synonym_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_SYNONYMS.

    DBA_SEQUENCES – Sequenzen aller Schemas. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Cache, Cycle, Increment und Last Number prüfen.
    Verwendet in:
    Data Dictionary

    1. Verwandte Views

    DBA_SEQUENCES → DBA_OBJECTS

    2. Wichtige Spalten

    SpalteBedeutung
    SEQUENCE_NAMEName der Sequenz.
    CYCLE_FLAGKennzeichnet, ob die Sequenz nach Erreichen einer Grenze umlaufen darf.
    ORDER_FLAGKennzeichen für die zugesicherte Anforderungsreihenfolge der Sequenzwerte.
    CACHE_SIZEAnzahl der vorab bereitgestellten Sequenzwerte.
    LAST_NUMBERAuf Datenträger hinterlegter Sequenzstand; bei Caching nicht mit dem zuletzt vergebenen Wert gleichsetzen.

    3. Alle Spalten der View

    DBA_SEQUENCES vollständig anzeigen
    SELECT *
    FROM dba_sequences;

    4. Praxisabfrage

    DBA_SEQUENCES - typisches Beispiel
    SELECT sequence_owner, sequence_name, increment_by, cache_size, cycle_flag, order_flag, last_number FROM dba_sequences ORDER BY sequence_owner, sequence_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_SEQUENCES.

    DBA_LOBS – LOB-Spalten und Segmente. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    LOB-Segment, Tablespace und SecureFile-Eigenschaften prüfen.
    Verwendet in:
    Capacity, Tablespace

    1. Verwandte Views

    DBA_LOBS → DBA_SEGMENTS, DBA_INDEXES

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    COLUMN_NAMEName der beschriebenen Spalte.
    SEGMENT_NAMEName des Segments; für eindeutige Zuordnung auch Owner und gegebenenfalls Partition beachten.
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    INDEX_NAMEName des Index.

    3. Alle Spalten der View

    DBA_LOBS vollständig anzeigen
    SELECT *
    FROM dba_lobs;

    4. Praxisabfrage

    DBA_LOBS - typisches Beispiel
    SELECT owner, table_name, column_name, segment_name, tablespace_name, securefile, retention, cache, logging FROM dba_lobs ORDER BY owner, table_name, column_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_LOBS.

    DBA_PART_TABLES – Partitionierte Tabellen. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Partitionierungstyp und Partition Count prüfen.
    Verwendet in:
    Capacity

    1. Verwandte Views

    DBA_PART_TABLES → DBA_TAB_PARTITIONS, DBA_PART_KEY_COLUMNS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.

    3. Alle Spalten der View

    DBA_PART_TABLES vollständig anzeigen
    SELECT *
    FROM dba_part_tables;

    4. Praxisabfrage

    DBA_PART_TABLES - typisches Beispiel
    SELECT owner, table_name, partitioning_type, subpartitioning_type, partition_count, def_tablespace_name FROM dba_part_tables ORDER BY owner, table_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_PART_TABLES.

    DBA_TAB_PARTITIONS – Tabellenpartitionen. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. ObjekteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Objekte
    Typische Verwendung:
    Partitionen, Tablespaces und Statistiken anzeigen.
    Verwendet in:
    Capacity

    1. Verwandte Views

    DBA_TAB_PARTITIONS → DBA_PART_TABLES, DBA_SEGMENTS

    2. Wichtige Spalten

    SpalteBedeutung
    TABLE_OWNERSchema der zugehörigen Tabelle.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    NUM_ROWSGeschätzte Zeilenzahl aus den Optimizer-Statistiken, kein aktuelles COUNT(*). LAST_ANALYZED beachten.
    LAST_ANALYZEDZeitpunkt der letzten Statistikermittlung für diesen Eintrag.

    3. Alle Spalten der View

    DBA_TAB_PARTITIONS vollständig anzeigen
    SELECT *
    FROM dba_tab_partitions;

    4. Praxisabfrage

    DBA_TAB_PARTITIONS - typisches Beispiel
    SELECT table_owner, table_name, partition_name, partition_position, tablespace_name, num_rows, blocks, last_analyzed FROM dba_tab_partitions ORDER BY table_owner, table_name, partition_position;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_TAB_PARTITIONS.

    DBA_TABLESPACES – Tablespaces und deren Eigenschaften. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. StorageDBA
    Sichtbereich:
    DBA
    Kategorie:
    Storage
    Typische Verwendung:
    Status, Contents, Extent- und Segment-Space-Management prüfen.
    Verwendet in:
    Tablespace, Capacity

    1. Verwandte Views

    DBA_TABLESPACES → DBA_DATA_FILES, DBA_TEMP_FILES, DBA_FREE_SPACE

    2. Wichtige Spalten

    SpalteBedeutung
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    BLOCK_SIZEGröße eines Datenblocks in Bytes.
    CONTENTSTablespace-Inhalt: PERMANENT, TEMPORARY oder UNDO.
    EXTENT_MANAGEMENTLOCAL oder DICTIONARY: Art der Extentverwaltung.
    SEGMENT_SPACE_MANAGEMENTAUTO oder MANUAL: Freiplatzverwaltung innerhalb von Segmenten.
    BIGFILEYES: Bigfile-Tablespace; NO: Smallfile-Tablespace.

    3. Alle Spalten der View

    DBA_TABLESPACES vollständig anzeigen
    SELECT *
    FROM dba_tablespaces;

    4. Praxisabfrage

    DBA_TABLESPACES - typisches Beispiel
    SELECT tablespace_name, status, contents, logging, extent_management, allocation_type, segment_space_management, bigfile FROM dba_tablespaces ORDER BY tablespace_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_TABLESPACES.

    Weiterlernen: Verwandte Abfrage zu DBA_TABLESPACES mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_DATA_FILES – Datafiles permanenter Tablespaces. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. StorageDBA
    Sichtbereich:
    DBA
    Kategorie:
    Storage
    Typische Verwendung:
    Dateipfade, Größe, Autoextend und Maxsize prüfen.
    Verwendet in:
    Tablespace, Capacity

    1. Verwandte Views

    DBA_DATA_FILES → DBA_TABLESPACES, DBA_FREE_SPACE

    2. Wichtige Spalten

    SpalteBedeutung
    FILE_NAMEPfad beziehungsweise Oracle-Dateiname. Nicht mit dem Tablespace-Namen verwechseln.
    FILE_IDKennnummer des Datafiles im jeweiligen Datenbankkontext.
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    BYTESGröße in Bytes. Für MiB durch 1.048.576 teilen.
    AUTOEXTENSIBLEYES: automatische Dateierweiterung erlaubt. Maximalgröße und Storage-Reserve zusätzlich prüfen.
    MAXBYTESKonfigurierte maximale Dateigröße in Bytes; garantiert keinen freien Platz im darunterliegenden Storage.

    3. Alle Spalten der View

    DBA_DATA_FILES vollständig anzeigen
    SELECT *
    FROM dba_data_files;

    4. Praxisabfrage

    DBA_DATA_FILES - typisches Beispiel
    SELECT tablespace_name, file_id, file_name, ROUND(bytes/1024/1024,2) size_mb, autoextensible, ROUND(maxbytes/1024/1024,2) max_mb, online_status FROM dba_data_files ORDER BY tablespace_name, file_id;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_DATA_FILES.

    Weiterlernen: Verwandte Abfrage zu DBA_DATA_FILES mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_FREE_SPACE – Freie Extents permanenter Tablespaces. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. StorageDBA
    Sichtbereich:
    DBA
    Kategorie:
    Storage
    Typische Verwendung:
    Freien Speicher und größtes freies Extent berechnen.
    Verwendet in:
    Tablespace, Capacity

    1. Verwandte Views

    DBA_FREE_SPACE → DBA_DATA_FILES, DBA_TABLESPACES

    2. Wichtige Spalten

    SpalteBedeutung
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    FILE_IDKennnummer des Datafiles im jeweiligen Datenbankkontext.
    BLOCK_IDStartblock des beschriebenen Extents.
    BYTESGröße in Bytes. Für MiB durch 1.048.576 teilen.
    BLOCKSZahl der allokierten beziehungsweise in DBA_FREE_SPACE freien Blöcke dieses Eintrags.

    3. Alle Spalten der View

    DBA_FREE_SPACE vollständig anzeigen
    SELECT *
    FROM dba_free_space;

    4. Praxisabfrage

    DBA_FREE_SPACE - typisches Beispiel
    SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024,2) free_mb, COUNT(*) free_extents, ROUND(MAX(bytes)/1024/1024,2) largest_extent_mb FROM dba_free_space GROUP BY tablespace_name ORDER BY tablespace_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Was bedeutet das Ergebnis? Keine Zeile kann unter anderem bedeuten, dass kein freies Extent vorhanden ist oder die Datei im abgefragten Zustand nicht sichtbar ist. Diese View misst keinen freien Platz im Filesystem und ist keine TEMP-Belegungsquelle.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_FREE_SPACE.

    Weiterlernen: Verwandte Abfrage zu DBA_FREE_SPACE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_SEGMENTS – Belegter Speicher je Segment. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. StorageDBA
    Sichtbereich:
    DBA
    Kategorie:
    Storage
    Typische Verwendung:
    Größte Tabellen, Indizes und LOBs finden.
    Verwendet in:
    Capacity, Tablespace

    1. Verwandte Views

    DBA_SEGMENTS → DBA_EXTENTS, DBA_OBJECTS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    SEGMENT_NAMEName des Segments; für eindeutige Zuordnung auch Owner und gegebenenfalls Partition beachten.
    SEGMENT_TYPESegmentart, etwa TABLE, INDEX oder LOBSEGMENT.
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    BYTESGröße in Bytes. Für MiB durch 1.048.576 teilen.
    BLOCKSZahl der allokierten beziehungsweise in DBA_FREE_SPACE freien Blöcke dieses Eintrags.
    EXTENTSZahl der allokierten Extents des Segments.

    3. Alle Spalten der View

    DBA_SEGMENTS vollständig anzeigen
    SELECT *
    FROM dba_segments;

    4. Praxisabfrage

    DBA_SEGMENTS - typisches Beispiel
    SELECT * FROM (SELECT owner, segment_name, partition_name, segment_type, tablespace_name, ROUND(bytes/1024/1024,2) size_mb, extents FROM dba_segments ORDER BY bytes DESC) WHERE ROWNUM<=50;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_SEGMENTS.

    Weiterlernen: Verwandte Abfrage zu DBA_SEGMENTS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_EXTENTS – Einzelne Extents der Segmente. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. StorageDBA
    Sichtbereich:
    DBA
    Kategorie:
    Storage
    Typische Verwendung:
    Extent-Anzahl und Speicherverteilung analysieren.
    Verwendet in:
    Capacity, Troubleshooting

    1. Verwandte Views

    DBA_EXTENTS → DBA_SEGMENTS, DBA_DATA_FILES

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    SEGMENT_NAMEName des Segments; für eindeutige Zuordnung auch Owner und gegebenenfalls Partition beachten.
    SEGMENT_TYPESegmentart, etwa TABLE, INDEX oder LOBSEGMENT.
    TABLESPACE_NAMELogischer Speicherbereich, dem die beschriebene Struktur zugeordnet ist.
    EXTENT_IDNummer des Extents innerhalb des Segments.
    FILE_IDKennnummer des Datafiles im jeweiligen Datenbankkontext.
    BLOCK_IDStartblock des beschriebenen Extents.
    BYTESGröße in Bytes. Für MiB durch 1.048.576 teilen.
    BLOCKSZahl der allokierten beziehungsweise in DBA_FREE_SPACE freien Blöcke dieses Eintrags.

    3. Alle Spalten der View

    DBA_EXTENTS vollständig anzeigen
    SELECT *
    FROM dba_extents;

    4. Praxisabfrage

    DBA_EXTENTS - typisches Beispiel
    SELECT owner, segment_name, partition_name, segment_type,
           tablespace_name, COUNT(*) AS extent_count,
           ROUND(SUM(bytes)/1024/1024,2) AS allocated_mib
    FROM dba_extents
    GROUP BY owner, segment_name, partition_name, segment_type, tablespace_name
    ORDER BY allocated_mib DESC, owner, segment_name, partition_name;

    PARTITION_NAME verhindert die unbeabsichtigte Zusammenfassung mehrerer Partitionen. ALLOCATED_MIB beschreibt zugewiesene Extents, nicht die tatsächliche Nutzdatenfüllung der Blöcke.

    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_EXTENTS.

    DBA_USERS – Datenbankbenutzer und Accountstatus. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Benutzer und RechteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Benutzer und Rechte
    Typische Verwendung:
    Gesperrte Benutzer, Profile und Tablespaces prüfen.
    Verwendet in:
    Health Check, Security

    1. Verwandte Views

    DBA_USERS → DBA_PROFILES, DBA_ROLE_PRIVS, DBA_SYS_PRIVS

    2. Wichtige Spalten

    SpalteBedeutung
    USERNAMEName des in dieser View beschriebenen Benutzers.
    USER_IDNumerische Benutzerkennung im Datenbankkontext.
    ACCOUNT_STATUSKontostatus, etwa OPEN, LOCKED oder EXPIRED; ersetzt keine Prüfung der Objektrechte.
    LOCK_DATEZeitpunkt der Kontosperre, sofern vorhanden.
    EXPIRY_DATEZeitpunkt des Passwortablaufs gemäß Kontoinformationen.
    CREATEDZeitpunkt der Erstellung des beschriebenen Objekts.
    PROFILEZugeordnetes Profil für Passwort- und Ressourcenregeln.
    AUTHENTICATION_TYPEVerfahren der Authentifizierung, etwa PASSWORD, EXTERNAL oder GLOBAL.
    COMMONKennzeichen eines Common Grants beziehungsweise Common Users/Role im jeweiligen View-Kontext.
    ORACLE_MAINTAINEDY: von Oracle bereitgestellt und verwaltet; nicht wie ein frei veränderbares Anwendungskonto behandeln.

    3. Alle Spalten der View

    DBA_USERS vollständig anzeigen
    SELECT *
    FROM dba_users;

    4. Praxisabfrage

    DBA_USERS - typisches Beispiel
    SELECT username, account_status, lock_date, expiry_date, default_tablespace, temporary_tablespace, profile, authentication_type, created FROM dba_users ORDER BY username;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_USERS.

    Weiterlernen: Verwandte Abfrage zu DBA_USERS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_PROFILES – Profile und Limits. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Benutzer und RechteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Benutzer und Rechte
    Typische Verwendung:
    Passwort- und Ressourcenlimits prüfen.
    Verwendet in:
    Security

    1. Verwandte Views

    DBA_PROFILES → DBA_USERS

    2. Wichtige Spalten

    SpalteBedeutung
    PROFILEZugeordnetes Profil für Passwort- und Ressourcenregeln.
    COMMONYES: gemeinsames Profil; NO: lokales Profil. Kein Common-Grant-Kennzeichen.
    INHERITEDKennzeichnet eine aus einem anderen Container geerbte Profildefinition.
    RESOURCE_NAMEName der Profilregel, etwa PASSWORD_LIFE_TIME oder SESSIONS_PER_USER.
    RESOURCE_TYPEPASSWORD für Passwortregeln, KERNEL für Ressourcenregeln.
    LIMITGrenzwert oder Schlüsselwort wie DEFAULT beziehungsweise UNLIMITED.

    3. Alle Spalten der View

    DBA_PROFILES vollständig anzeigen
    SELECT *
    FROM dba_profiles;

    4. Praxisabfrage

    DBA_PROFILES - typisches Beispiel
    SELECT profile, resource_name, resource_type, limit FROM dba_profiles ORDER BY profile, resource_type, resource_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Was bedeutet das Ergebnis? DEFAULT muss über das entsprechende DEFAULT-Profil aufgelöst werden. Ressourcenregeln und Passwortregeln haben unterschiedliche Voraussetzungen; Profilzuweisung allein beweist nicht die Durchsetzung jeder Ressourcenregel.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_PROFILES.

    DBA_ROLES – Definierte Rollen. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Benutzer und RechteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Benutzer und Rechte
    Typische Verwendung:
    Rollen und Authentication Type prüfen.
    Verwendet in:
    Security

    1. Verwandte Views

    DBA_ROLES → DBA_ROLE_PRIVS

    2. Wichtige Spalten

    SpalteBedeutung
    AUTHENTICATION_TYPEVerfahren der Authentifizierung, etwa PASSWORD, EXTERNAL oder GLOBAL.
    COMMONKennzeichen eines Common Grants beziehungsweise Common Users/Role im jeweiligen View-Kontext.
    ORACLE_MAINTAINEDY: von Oracle bereitgestellt und verwaltet; nicht wie ein frei veränderbares Anwendungskonto behandeln.

    3. Alle Spalten der View

    DBA_ROLES vollständig anzeigen
    SELECT *
    FROM dba_roles;

    4. Praxisabfrage

    DBA_ROLES - typisches Beispiel
    SELECT role, authentication_type, common, oracle_maintained FROM dba_roles ORDER BY role;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_ROLES.

    DBA_ROLE_PRIVS – Vergebene Rollen. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Benutzer und RechteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Benutzer und Rechte
    Typische Verwendung:
    Rollenketten und Admin Option prüfen.
    Verwendet in:
    Security

    1. Verwandte Views

    DBA_ROLE_PRIVS → DBA_ROLES, DBA_USERS

    2. Wichtige Spalten

    SpalteBedeutung
    GRANTEEEmpfänger des Privilegs oder der Rolle.
    GRANTED_ROLEName der erteilten Rolle.
    ADMIN_OPTIONYES erlaubt die Weitergabe dieser Rolle beziehungsweise dieses Systemprivilegs.
    DEFAULT_ROLEKennzeichnet eine standardmäßig aktivierte Rolle; tatsächlichen Sessionkontext separat prüfen.
    COMMONKennzeichen eines Common Grants beziehungsweise Common Users/Role im jeweiligen View-Kontext.
    INHERITEDKennzeichen, ob die Zuweisung aus einem anderen Container geerbt wurde.

    3. Alle Spalten der View

    DBA_ROLE_PRIVS vollständig anzeigen
    SELECT *
    FROM dba_role_privs;

    4. Praxisabfrage

    DBA_ROLE_PRIVS - typisches Beispiel
    SELECT grantee, granted_role, admin_option, default_role, common, inherited FROM dba_role_privs ORDER BY grantee, granted_role;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_ROLE_PRIVS.

    Weiterlernen: Verwandte Abfrage zu DBA_ROLE_PRIVS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_SYS_PRIVS – Vergebene Systemprivilegien. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Benutzer und RechteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Benutzer und Rechte
    Typische Verwendung:
    Direkte Systemrechte und Admin Option prüfen.
    Verwendet in:
    Security

    1. Verwandte Views

    DBA_SYS_PRIVS → DBA_ROLE_PRIVS

    2. Wichtige Spalten

    SpalteBedeutung
    GRANTEEEmpfänger des Privilegs oder der Rolle.
    PRIVILEGEName des erteilten Privilegs.
    ADMIN_OPTIONYES erlaubt die Weitergabe dieser Rolle beziehungsweise dieses Systemprivilegs.
    COMMONKennzeichen eines Common Grants beziehungsweise Common Users/Role im jeweiligen View-Kontext.
    INHERITEDKennzeichen, ob die Zuweisung aus einem anderen Container geerbt wurde.

    3. Alle Spalten der View

    DBA_SYS_PRIVS vollständig anzeigen
    SELECT *
    FROM dba_sys_privs;

    4. Praxisabfrage

    DBA_SYS_PRIVS - typisches Beispiel
    SELECT grantee, privilege, admin_option, common, inherited FROM dba_sys_privs ORDER BY grantee, privilege;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_SYS_PRIVS.

    Weiterlernen: Verwandte Abfrage zu DBA_SYS_PRIVS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_TAB_PRIVS – Objektprivilegien. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Benutzer und RechteDBA
    Sichtbereich:
    DBA
    Kategorie:
    Benutzer und Rechte
    Typische Verwendung:
    Direkte Rechte auf Tabellen, Views und andere Objekte prüfen.
    Verwendet in:
    Security

    1. Verwandte Views

    DBA_TAB_PRIVS → DBA_COL_PRIVS, DBA_OBJECTS

    2. Wichtige Spalten

    SpalteBedeutung
    GRANTEEEmpfänger des Privilegs oder der Rolle.
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_NAMEName des berechtigten Objekts, auch etwa Package oder Sequenz; nicht nur Tabellen.
    GRANTORErteiler des Objektprivilegs.
    PRIVILEGEName des erteilten Privilegs.
    GRANTABLEYES erlaubt die Weitergabe des Objektprivilegs.
    TYPEObjektart des Grants.

    3. Alle Spalten der View

    DBA_TAB_PRIVS vollständig anzeigen
    SELECT *
    FROM dba_tab_privs;

    4. Praxisabfrage

    DBA_TAB_PRIVS - typisches Beispiel
    SELECT grantee, owner, table_name, privilege, grantable, type FROM dba_tab_privs ORDER BY grantee, owner, table_name, privilege;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Was bedeutet das Ergebnis? Empfänger können Benutzer, Rollen oder PUBLIC sein. Spaltengrants stehen gesondert in DBA_COL_PRIVS; effektive Rechte sind nicht allein aus dieser Liste ableitbar.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_TAB_PRIVS.

    Weiterlernen: Verwandte Abfrage zu DBA_TAB_PRIVS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_SOURCE – PL/SQL- und Java-Quelltext. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Code und AbhängigkeitenDBA
    Sichtbereich:
    DBA
    Kategorie:
    Code und Abhängigkeiten
    Typische Verwendung:
    Packages, Procedures und Trigger durchsuchen.
    Verwendet in:
    Troubleshooting

    1. Verwandte Views

    DBA_SOURCE → DBA_OBJECTS, DBA_ERRORS, DBA_DEPENDENCIES

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    LINEZeilennummer in Quelltext oder Compilerdiagnose.
    TEXTQuelltext beziehungsweise Diagnoseinhalt der jeweiligen View.

    3. Alle Spalten der View

    DBA_SOURCE vollständig anzeigen
    SELECT *
    FROM dba_source;

    4. Praxisabfrage

    DBA_SOURCE - typisches Beispiel
    SELECT owner, name, type, line, text FROM dba_source WHERE owner='&OWNER' AND name='&OBJECT_NAME' ORDER BY type, line;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_SOURCE.

    DBA_ERRORS – Compile-Fehler von Objekten. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Code und AbhängigkeitenDBA
    Sichtbereich:
    DBA
    Kategorie:
    Code und Abhängigkeiten
    Typische Verwendung:
    Fehlerzeilen und Meldungen invalidierter Objekte prüfen.
    Verwendet in:
    Health Check, Troubleshooting

    1. Verwandte Views

    DBA_ERRORS → DBA_OBJECTS, DBA_SOURCE

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    LINEZeilennummer in Quelltext oder Compilerdiagnose.
    TEXTCompilerdiagnose des gespeicherten Objekts; keine Historie beliebiger Laufzeitfehler.
    ATTRIBUTEERROR oder WARNING: Art der Compilerdiagnose.
    SEQUENCEReihenfolge der Diagnosemeldungen desselben Objekts.

    3. Alle Spalten der View

    DBA_ERRORS vollständig anzeigen
    SELECT *
    FROM dba_errors;

    4. Praxisabfrage

    DBA_ERRORS - typisches Beispiel
    SELECT owner, name, type, line, position, text FROM dba_errors ORDER BY owner, name, sequence;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Was bedeutet das Ergebnis? Compilerwarnungen und Compilerfehler unterscheiden. Laufzeitfehler wie NO_DATA_FOUND oder VALUE_ERROR müssen aus dem tatsächlichen Ausführungskontext untersucht werden.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_ERRORS.

    DBA_DEPENDENCIES – Objektabhängigkeiten. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Code und AbhängigkeitenDBA
    Sichtbereich:
    DBA
    Kategorie:
    Code und Abhängigkeiten
    Typische Verwendung:
    Folgen von DDL und Invalidierungen analysieren.
    Verwendet in:
    Troubleshooting

    1. Verwandte Views

    DBA_DEPENDENCIES → DBA_OBJECTS, DBA_SOURCE

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    REFERENCED_OWNERSchema des referenzierten Objekts.
    REFERENCED_NAMEName des referenzierten Objekts.
    REFERENCED_TYPEObjektart der Referenz, zum Beispiel TABLE oder PACKAGE.

    3. Alle Spalten der View

    DBA_DEPENDENCIES vollständig anzeigen
    SELECT *
    FROM dba_dependencies;

    4. Praxisabfrage

    DBA_DEPENDENCIES - typisches Beispiel
    SELECT owner, name, type, referenced_owner, referenced_name, referenced_type, dependency_type FROM dba_dependencies WHERE owner='&OWNER' AND name='&OBJECT_NAME' ORDER BY referenced_owner, referenced_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_DEPENDENCIES.

    DBA_TRIGGERS – Triggerdefinitionen und Status. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Code und AbhängigkeitenDBA
    Sichtbereich:
    DBA
    Kategorie:
    Code und Abhängigkeiten
    Typische Verwendung:
    Events, Timing und Aktivierungsstatus prüfen.
    Verwendet in:
    Troubleshooting

    1. Verwandte Views

    DBA_TRIGGERS → DBA_SOURCE, DBA_OBJECTS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_OWNERSchema der zugehörigen Tabelle.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.

    3. Alle Spalten der View

    DBA_TRIGGERS vollständig anzeigen
    SELECT *
    FROM dba_triggers;

    4. Praxisabfrage

    DBA_TRIGGERS - typisches Beispiel
    SELECT owner, trigger_name, trigger_type, triggering_event, table_owner, table_name, status FROM dba_triggers ORDER BY owner, trigger_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_TRIGGERS.

    DBA_TAB_STATISTICS – Tabellenstatistiken. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Optimizer und StatistikenDBA
    Sichtbereich:
    DBA
    Kategorie:
    Optimizer und Statistiken
    Typische Verwendung:
    Stale Stats, Rows, Blocks und Last Analyzed prüfen.
    Verwendet in:
    Performance, Health Check

    1. Verwandte Views

    DBA_TAB_STATISTICS → DBA_IND_STATISTICS, DBA_TAB_COL_STATISTICS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    NUM_ROWSGeschätzte Zeilenzahl aus den Optimizer-Statistiken, kein aktuelles COUNT(*). LAST_ANALYZED beachten.
    SAMPLE_SIZEZahl der für die Statistik verwendeten Stichprobenzeilen.
    LAST_ANALYZEDZeitpunkt der letzten Statistikermittlung für diesen Eintrag.
    STALE_STATSKennzeichen, ob Oracle die Statistiken als veraltet einstuft. Kein unmittelbarer Beweis für einen schlechten Plan.

    3. Alle Spalten der View

    DBA_TAB_STATISTICS vollständig anzeigen
    SELECT *
    FROM dba_tab_statistics;

    4. Praxisabfrage

    DBA_TAB_STATISTICS - typisches Beispiel
    SELECT owner, table_name, partition_name, num_rows, blocks, sample_size, last_analyzed, stale_stats, global_stats FROM dba_tab_statistics ORDER BY owner, table_name, partition_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_TAB_STATISTICS.

    Weiterlernen: Verwandte Abfrage zu DBA_TAB_STATISTICS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_IND_STATISTICS – Indexstatistiken. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Optimizer und StatistikenDBA
    Sichtbereich:
    DBA
    Kategorie:
    Optimizer und Statistiken
    Typische Verwendung:
    BLEVEL, Leaf Blocks und Clustering Factor prüfen.
    Verwendet in:
    Performance

    1. Verwandte Views

    DBA_IND_STATISTICS → DBA_INDEXES, DBA_TAB_STATISTICS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    INDEX_NAMEName des Index.
    TABLE_OWNERSchema der zugehörigen Tabelle.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    BLEVELTiefe des B-Tree-Index ohne Blattebene; 0 bedeutet, dass Wurzel und Blatt zusammenfallen.
    LEAF_BLOCKSAnzahl der Index-Blattblöcke laut Statistik.
    DISTINCT_KEYSZahl unterschiedlicher Indexschlüssel laut Statistik.
    CLUSTERING_FACTORStatistik zum Zusammenhang zwischen Indexreihenfolge und Tabellenblöcken. Im Verhältnis zu Tabellenblöcken und Zeilenzahl bewerten.
    NUM_ROWSGeschätzte Zeilenzahl aus den Optimizer-Statistiken, kein aktuelles COUNT(*). LAST_ANALYZED beachten.
    LAST_ANALYZEDZeitpunkt der letzten Statistikermittlung für diesen Eintrag.
    STALE_STATSKennzeichen, ob Oracle die Statistiken als veraltet einstuft. Kein unmittelbarer Beweis für einen schlechten Plan.

    3. Alle Spalten der View

    DBA_IND_STATISTICS vollständig anzeigen
    SELECT *
    FROM dba_ind_statistics;

    4. Praxisabfrage

    DBA_IND_STATISTICS - typisches Beispiel
    SELECT owner, index_name, table_owner, table_name, blevel, leaf_blocks, distinct_keys, clustering_factor, num_rows, last_analyzed, stale_stats FROM dba_ind_statistics ORDER BY owner, index_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_IND_STATISTICS.

    Weiterlernen: Verwandte Abfrage zu DBA_IND_STATISTICS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_TAB_COL_STATISTICS – Spaltenstatistiken und Histogrammtypen. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Optimizer und StatistikenDBA
    Sichtbereich:
    DBA
    Kategorie:
    Optimizer und Statistiken
    Typische Verwendung:
    Distinct Values, Density, Nulls und Histogramme prüfen.
    Verwendet in:
    Performance

    1. Verwandte Views

    DBA_TAB_COL_STATISTICS → DBA_HISTOGRAMS, DBA_TAB_COLUMNS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    COLUMN_NAMEName der beschriebenen Spalte.
    NUM_DISTINCTStatistisch ermittelte Zahl unterschiedlicher Spaltenwerte.
    NUM_NULLSStatistisch ermittelte Zahl der NULL-Werte in der Spalte.
    LAST_ANALYZEDZeitpunkt der letzten Statistikermittlung für diesen Eintrag.

    3. Alle Spalten der View

    DBA_TAB_COL_STATISTICS vollständig anzeigen
    SELECT *
    FROM dba_tab_col_statistics;

    4. Praxisabfrage

    DBA_TAB_COL_STATISTICS - typisches Beispiel
    SELECT owner, table_name, column_name, num_distinct, density, num_nulls, num_buckets, histogram, last_analyzed FROM dba_tab_col_statistics ORDER BY owner, table_name, column_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_TAB_COL_STATISTICS.

    Weiterlernen: Verwandte Abfrage zu DBA_TAB_COL_STATISTICS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_HISTOGRAMS – Histogramm-Endpunkte. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. Optimizer und StatistikenDBA
    Sichtbereich:
    DBA
    Kategorie:
    Optimizer und Statistiken
    Typische Verwendung:
    Werteverteilung einzelner Spalten analysieren.
    Verwendet in:
    Performance

    1. Verwandte Views

    DBA_HISTOGRAMS → DBA_TAB_COL_STATISTICS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    TABLE_NAMEName der Tabelle. Bei fremden Schemas den Eigentümer mit berücksichtigen.
    COLUMN_NAMEName der beschriebenen Spalte.

    3. Alle Spalten der View

    DBA_HISTOGRAMS vollständig anzeigen
    SELECT *
    FROM dba_histograms;

    4. Praxisabfrage

    DBA_HISTOGRAMS - typisches Beispiel
    SELECT owner, table_name, column_name, endpoint_number, endpoint_value, endpoint_actual_value, endpoint_repeat_count FROM dba_histograms WHERE owner='&OWNER' AND table_name='&TABLE_NAME' ORDER BY column_name, endpoint_number;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_HISTOGRAMS.

    DBA_SCHEDULER_JOBS – Scheduler-Jobs und aktuelle Konfiguration. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. SchedulerDBA
    Sichtbereich:
    DBA
    Kategorie:
    Scheduler
    Typische Verwendung:
    Enabled, State, Job Action und Laufdaten prüfen.
    Verwendet in:
    Health Check, Scheduler

    1. Verwandte Views

    DBA_SCHEDULER_JOBS → DBA_SCHEDULER_JOB_RUN_DETAILS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    JOB_NAMEName des Scheduler-Jobs, zusammen mit OWNER zuordnen.
    JOB_TYPEArt des Jobs, etwa PLSQL_BLOCK, STORED_PROCEDURE oder EXECUTABLE.
    JOB_ACTIONAuszuführender Code beziehungsweise Programmbezug des Jobs.
    REPEAT_INTERVALScheduler-Ausdruck für wiederholte Ausführung.
    ENABLEDKennzeichen, ob das beschriebene Objekt aktiviert ist; Aktivierung allein beweist keinen erfolgreichen Lauf.
    RUN_COUNTErfasste Anzahl der Jobausführungen.
    FAILURE_COUNTErfasster Fehlerzähler; einzelne Läufe und Zeitfolge zur Bewertung heranziehen.
    LAST_START_DATEBeginn des letzten Joblaufs.
    LAST_RUN_DURATIONDauer des letzten Laufs als Intervall.
    NEXT_RUN_DATEGeplanter nächster Start, sofern bestimmt.

    3. Alle Spalten der View

    DBA_SCHEDULER_JOBS vollständig anzeigen
    SELECT *
    FROM dba_scheduler_jobs;

    4. Praxisabfrage

    DBA_SCHEDULER_JOBS - typisches Beispiel
    SELECT owner, job_name, enabled, state, job_type, job_action, repeat_interval, last_start_date, last_run_duration, next_run_date, failure_count FROM dba_scheduler_jobs ORDER BY owner, job_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_SCHEDULER_JOBS.

    Weiterlernen: Verwandte Abfrage zu DBA_SCHEDULER_JOBS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_SCHEDULER_JOB_RUN_DETAILS – Laufhistorie von Scheduler-Jobs. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. SchedulerDBA
    Sichtbereich:
    DBA
    Kategorie:
    Scheduler
    Typische Verwendung:
    Fehler, Laufdauer und Additional Info analysieren.
    Verwendet in:
    Health Check, Troubleshooting

    1. Verwandte Views

    DBA_SCHEDULER_JOB_RUN_DETAILS → DBA_SCHEDULER_JOBS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    JOB_NAMEName des Scheduler-Jobs, zusammen mit OWNER zuordnen.
    ERROR#Fehlernummer dieses protokollierten Laufs.
    ACTUAL_START_DATETatsächlicher Start dieses protokollierten Joblaufs.
    RUN_DURATIONDauer des protokollierten Laufs als Intervall.
    ADDITIONAL_INFOZusätzliche Angaben zum protokollierten Scheduler-Lauf.

    3. Alle Spalten der View

    DBA_SCHEDULER_JOB_RUN_DETAILS vollständig anzeigen
    SELECT *
    FROM dba_scheduler_job_run_details;

    4. Praxisabfrage

    DBA_SCHEDULER_JOB_RUN_DETAILS - typisches Beispiel
    SELECT owner, job_name, status, actual_start_date, run_duration, error#, additional_info FROM dba_scheduler_job_run_details WHERE actual_start_date>=SYSTIMESTAMP-INTERVAL '7' DAY ORDER BY actual_start_date DESC;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_SCHEDULER_JOB_RUN_DETAILS.

    Weiterlernen: Verwandte Abfrage zu DBA_SCHEDULER_JOB_RUN_DETAILS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    DBA_DIRECTORIES – Oracle Directory Objects. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. NetzwerkDBA
    Sichtbereich:
    DBA
    Kategorie:
    Netzwerk
    Typische Verwendung:
    Verzeichnisobjekte für Data Pump und externe Dateien prüfen.
    Verwendet in:
    Security, Data Pump

    1. Verwandte Views

    DBA_DIRECTORIES → DBA_TAB_PRIVS

    2. Wichtige Spalten

    SpalteBedeutung
    OWNERSchema, dem das Objekt gehört. Zusammen mit dem Objektnamen lesen.
    DIRECTORY_NAMEName des Oracle-DIRECTORY-Objekts.
    DIRECTORY_PATHServerseitiger Pfad des DIRECTORY-Objekts; kein Pfad auf dem Arbeitsplatzrechner.

    3. Alle Spalten der View

    DBA_DIRECTORIES vollständig anzeigen
    SELECT *
    FROM dba_directories;

    4. Praxisabfrage

    DBA_DIRECTORIES - typisches Beispiel
    SELECT owner, directory_name, directory_path FROM dba_directories ORDER BY owner, directory_name;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Was bedeutet das Ergebnis? Die Definition beweist weder die Existenz des OS-Verzeichnisses noch passende Dateirechte. Datenbank-Objektrechte und Betriebssystemrechte sind getrennte Voraussetzungen.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: DBA_DIRECTORIES.

    Weiterlernen: Verwandte Abfrage zu DBA_DIRECTORIES mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    CDB_PDBS – PDBs einer Container Database. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. MultitenantCDB
    Sichtbereich:
    CDB
    Kategorie:
    Multitenant
    Typische Verwendung:
    PDB-ID, Name und Status prüfen.
    Verwendet in:
    Multitenant

    1. Verwandte Views

    CDB_PDBS → V$PDBS, CDB_TABLESPACES

    2. Wichtige Spalten

    SpalteBedeutung
    PDB_IDNumerische Kennung der Pluggable Database.
    PDB_NAMEName der Pluggable Database.
    DBIDDatenbankkennung. Nicht mit dem Datenbanknamen oder einem Service gleichsetzen.
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB, 1 für Root, sonst zugehörige Container-ID.

    3. Alle Spalten der View

    CDB_PDBS vollständig anzeigen
    SELECT *
    FROM cdb_pdbs;

    4. Praxisabfrage

    CDB_PDBS - typisches Beispiel
    SELECT pdb_id, pdb_name, dbid, status, creation_scn, logging, force_logging FROM cdb_pdbs ORDER BY pdb_id;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: CDB_PDBS.

    CDB_USERS – Benutzer aller Container. Aufklappen für wichtige Spalten, verwandte Views, vollständige Abfrage und Praxisbeispiel. MultitenantCDB
    Sichtbereich:
    CDB
    Kategorie:
    Multitenant
    Typische Verwendung:
    Common und Local Users mit CON_ID prüfen.
    Verwendet in:
    Multitenant, Security

    1. Verwandte Views

    CDB_USERS → DBA_USERS, V$CONTAINERS

    2. Wichtige Spalten

    SpalteBedeutung
    USERNAMEName des in dieser View beschriebenen Benutzers.
    USER_IDNumerische Benutzerkennung im Datenbankkontext.
    ACCOUNT_STATUSKontostatus, etwa OPEN, LOCKED oder EXPIRED; ersetzt keine Prüfung der Objektrechte.
    PROFILEZugeordnetes Profil für Passwort- und Ressourcenregeln.
    COMMONKennzeichen eines Common Grants beziehungsweise Common Users/Role im jeweiligen View-Kontext.
    ORACLE_MAINTAINEDY: von Oracle bereitgestellt und verwaltet; nicht wie ein frei veränderbares Anwendungskonto behandeln.
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB, 1 für Root, sonst zugehörige Container-ID.

    3. Alle Spalten der View

    CDB_USERS vollständig anzeigen
    SELECT *
    FROM cdb_users;

    4. Praxisabfrage

    CDB_USERS - typisches Beispiel
    SELECT con_id, username, account_status, default_tablespace, profile, common, oracle_maintained FROM cdb_users ORDER BY con_id, username;
    Einordnung: Diese Karte beschreibt nur die View. Fachliche Grundlagen stehen im zuständigen Fachkapitel; fertige SQL-Beispiele im SQL-Rezeptbuch.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: CDB_USERS.

    DBA_MVIEWS – Definition und Aktualisierungsstand von Materialized Views.Objekte

    1. Wichtige Spalten

    SpalteBedeutung
    MVIEW_NAMEName der Materialized View.
    REFRESH_MODEKonfigurierter Aktualisierungsmodus, etwa DEMAND oder COMMIT.
    LAST_REFRESH_DATEZeitpunkt des letzten erfassten Refreshs.
    STALENESSMetadatenzustand der Aktualität; UNKNOWN ist keine Zusicherung aktueller Daten.

    2. Alle Spalten der View

    Alle Spalten
    SELECT *
    FROM dba_mviews;

    3. Praxisabfrage

    Praxisabfrage
    SELECT owner, mview_name, refresh_mode, refresh_method,
           last_refresh_type, last_refresh_date, staleness
    FROM dba_mviews
    ORDER BY owner, mview_name;

    Was bedeutet das Ergebnis? Definition, tatsächlicher Refresh und fachlich benötigter Stand sind getrennt. Es wird kein Refresh ausgeführt.

    Im Fachkapitel nachlesen

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    OWNERMVIEW_NAMEREFRESH_MODEREFRESH_METHODLAST_REFRESH_TYPELAST_REFRESH_DATESTALENESS
    APP_USERMV_UMSATZDEMANDCOMPLETECOMPLETE07.10.2026 02:00STALE

    Was sehe ich hier? Die View wird bei Bedarf aktualisiert. STALE weist auf einen veralteten Stand hin; die Abfrage startet keinen Refresh.

    Oracle 19c: DBA_MVIEWS

    DBA_PROCEDURES – Metadaten zu Funktionen, Prozeduren und Package-Routinen.Code und Abhängigkeiten

    1. Wichtige Spalten

    SpalteBedeutung
    OBJECT_NAMEName des Objekts, etwa des Packages.
    PROCEDURE_NAMEName einer Routine innerhalb eines Objekts; bei eigenständigen Objekten gegebenenfalls NULL.
    AUTHIDDEFINER oder CURRENT_USER: definierter Rechtekontext.

    2. Alle Spalten der View

    Alle Spalten
    SELECT *
    FROM dba_procedures;

    3. Praxisabfrage

    Praxisabfrage
    SELECT owner, object_name, procedure_name, object_type, authid
    FROM dba_procedures
    WHERE owner = '&OWNER'
    ORDER BY object_name, procedure_name;

    Was bedeutet das Ergebnis? Die Signatur beziehungsweise Metadaten führen keinen Code aus. Parameter stehen in DBA_ARGUMENTS, Quelltext in DBA_SOURCE.

    Im Fachkapitel nachlesen

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    OWNEROBJECT_NAMEPROCEDURE_NAMEOBJECT_TYPEAUTHID
    APP_USERARTIKEL_APILESENPACKAGEDEFINER

    Was sehe ich hier? LESEN ist eine Routine im Package ARTIKEL_API. Der Name beweist weder ihr Verhalten noch eine rein lesende Implementierung.

    Oracle 19c: DBA_PROCEDURES

    Weiterlernen: Verwandte Abfrage zu DBA_PROCEDURES mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    UNIFIED_AUDIT_TRAIL – Aufgezeichnete Ereignisse des Unified Audit Trails.Benutzer und Rechte

    1. Wichtige Spalten

    SpalteBedeutung
    EVENT_TIMESTAMPZeitstempel des Auditereignisses; Zeitbasis zur Untersuchung passend wählen.
    DBUSERNAMEDatenbankbenutzer der aufgezeichneten Aktion.
    RETURN_CODE0: Aktion erfolgreich; sonst zugehöriger Oracle-Fehlercode.

    2. Alle Spalten der View

    Alle Spalten
    SELECT *
    FROM unified_audit_trail;

    3. Praxisabfrage

    Praxisabfrage
    SELECT event_timestamp, dbusername, action_name, return_code
    FROM unified_audit_trail
    WHERE event_timestamp >= CAST(SYSTIMESTAMP AS TIMESTAMP) - INTERVAL '1' DAY
    ORDER BY event_timestamp DESC
    FETCH FIRST 20 ROWS ONLY;

    Was bedeutet das Ergebnis? Mode, Richtlinien und Leserechte bestimmen den Bestand. Mixed Mode kann Unified-Audit-Daten enthalten. Die View archiviert oder löscht nichts und zeigt nicht alle traditionellen oder OS-Auditquellen.

    Im Fachkapitel nachlesen

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    EVENT_TIMESTAMPDBUSERNAMEACTION_NAMERETURN_CODE
    07.10.2026 09:00APP_USERLOGON0

    Was sehe ich hier? Der protokollierte Login war erfolgreich. Das ist keine Zusicherung, dass jede andere Aktion auditiert oder erlaubt ist.

    Oracle 19c: UNIFIED_AUDIT_TRAIL

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Das Data Dictionary beschreibt unter anderem Objekte, Speicherzuordnung, Benutzer und Rechte. Es bildet damit die Metadatensicht auf die Datenbank.
    2. USER_, ALL_, DBA_ und CDB_ haben unterschiedliche Sichtbereiche. Fehlende Sichtbarkeit ist nicht dasselbe wie ein nachgewiesen fehlendes Objekt.
    3. Vor jeder Interpretation muss klar sein, ob eine Zeile ein Objekt, eine Spalte, eine Partition oder beispielsweise einen Grant beschreibt. Diese Granularität bestimmt die passenden Join-Schlüssel.
    4. Objektnamen allein sind häufig nicht eindeutig. Owner und bei containerübergreifenden Ergebnissen CON_ID verhindern eine falsche Zuordnung gleichnamiger Objekte.
    5. Ein Dictionary-Wert muss nach seiner dokumentierten Bedeutung gelesen werden. Definitionen und Statistikwerte sind nicht automatisch ein Echtzeitnachweis für aktuelle Nutzung oder Performance.

    Lernzielkontrolle

    Erkläre zuerst deinen Befund und den nächsten Prüfschritt. Öffne danach die begründete Lösung.
    Frage 1: Was sagt APP_DEMO / BESTELLUNGEN / TABLE / VALID aus?

    Lösung: Es beschreibt eine sichtbare gültige Tabellendefinition dieses Owners. Die Zeile zählt keine Bestellungen und bestätigt nicht deren fachliche Richtigkeit.

    Frage 2: Warum kann ALL_OBJECTS weniger zeigen als eine administrative Sicht?

    Lösung: Die Sichtbarkeit richtet sich nach dem verbundenen Benutzer und dem Container. Das Fehlen eines Treffers muss in diesem Kontext bewertet werden.

    Frage 3: Ist LAST_DDL_TIME eine Historie aller Datenänderungen?

    Lösung: Nein. Es betrifft relevante DDL-Änderungen am Objekt, keine vollständige Folge von INSERT-, UPDATE- oder DELETE-Vorgängen.

    Frage 4: Was ersetzt du im Beispiel vor einer eigenen Untersuchung?

    Lösung: Owner und Objektname durch die tatsächlich gesuchten Dictionary-Namen. Prüfe außerdem den Container; das Beispiel erstellt keine Demotabelle.

    50. Dynamic Performance Views – Laufzeitinformationen und Statistiken verstehen

    Interaktives Nachschlagewerk für aktuelle Instanzzustände, Sessions, SQL, Wait Events, Memory, Redo, RMAN und Recovery.

    Lernkompass
    Einfach gesagt V$-Views zeigen überwiegend den aktuellen Laufzeit- und Instanzzustand.
    Warum ist das wichtig? Sie beantworten andere Fragen als das Data Dictionary, das eher Definitionen und Metadaten beschreibt.
    Nach diesem Kapitel Du kannst Laufzeitfragen gezielt passenden V$-Views zuordnen.
    Lesetipp: Du musst diesen Abschnitt nicht auswendig lernen. Verstehe zuerst die Aufgabe und merke dir, wo du die Details später nachschlagen kannst.

    V$-Views sind Messfenster für den Datenbankbetrieb. Einige zeigen den jetzigen Zustand, andere Zähler seit einem Start oder historischen Datenbestand. Die Herkunft jeder Zahl steht in der Karte und bestimmt, wie sie gelesen werden darf. Eine laufende Session, ein seit Stunden summierter Wait und ein alter Backup-Eintrag sind unterschiedliche Beobachtungen. Für Zeitfenster werden vergleichbare Messpunkte und gegebenenfalls Zählerdifferenzen benötigt. Rechte, Container und die Verfügbarkeit der betreffenden Funktion begrenzen den sichtbaren Bestand.

    Eine Abfrage ist hier kein eingefrorenes Gesamtbild. Oracle garantiert für Dynamic Performance Views nicht dieselbe Read Consistency wie für gewöhnliche Tabellen. Während du Sessions und Prozesse verbindest, können sich die zugrunde liegenden Speicherstrukturen ändern. Eine Session kann enden oder ihren Zustand wechseln. Ein fehlender Join-Partner muss deshalb nicht eine beschädigte Datenbank bedeuten. Sichere Identität und Zeitpunkt und wiederhole einen widersprüchlichen Befund gezielt. Oracle 19c.

    Eine Momentaufnahme von einem Zeitintervall unterscheiden

    Ein Zähler steht um 10:00:00 auf 100 Sekunden und um 10:01:00 auf 112 Sekunden. Für dieselbe Instanz ohne Neustart sind 12 Sekunden hinzugekommen. 112 Sekunden wären der Gesamtstand, nicht die Wartezeit dieser Minute. Bei einer Session-Momentaufnahme liest du dagegen den gerade gemeldeten Zustand.

    Fiktive Beispielausgabe:
    MESSZEITKUMULIERTE ZEIT_SAUSWERTUNG
    10:00:00100Erster Messpunkt
    10:01:00112Delta: 12 Sekunden in 60 Sekunden

    Was sehe ich hier? Eine didaktische Auswertung zweier Messpunkte, keine zusätzliche View. Vor der Rechnung müssen Einheit, Container, Instanzstart und Zählerumfang übereinstimmen. Wähle danach unten eine Karte und prüfe, ob sie Momentwerte, Zähler oder Historie liefert.

    Abgrenzung: Fachliche Interpretation erfolgt im zuständigen Fachkapitel; fertige SQL-Abfragen stehen im SQL-Rezeptbuch.
    V$INSTANCE – Status und Identität der laufenden Instanz. Instanz und Datenbank Momentaufnahme
    Kategorie:
    Instanz und Datenbank
    Datencharakter:
    Momentaufnahme

    V$INSTANCE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Instanzstatus, Startzeit, Host und Version prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    INSTANCE_NAMEName der aktuellen Oracle-Instanz.
    HOST_NAMERechnername, auf dem die Instanz läuft.
    VERSIONVersionsangabe; vollständige Patchinventur zusätzlich über OPatch und SQL-Patchregistry.
    STARTUP_TIMEZeitpunkt des letzten Instanzstarts; keine Historie früherer Starts.

    2. Alle Spalten der View

    V$INSTANCE vollständig anzeigen
    SELECT *
    FROM v$instance;

    3. Praxisabfrage

    V$INSTANCE - typisches Beispiel
    SELECT instance_name, host_name, version, status, startup_time, database_status, instance_role FROM v$instance;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$INSTANCE.

    Weiterlernen: Verwandte Abfrage zu V$INSTANCE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$DATABASE – Grundzustand der Datenbank. Instanz und Datenbank Momentaufnahme
    Kategorie:
    Instanz und Datenbank
    Datencharakter:
    Momentaufnahme

    V$DATABASE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Open Mode, Rolle, Logging und DBID prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    DBIDDatenbankkennung. Nicht mit dem Datenbanknamen oder einem Service gleichsetzen.
    OPEN_MODEÖffnungszustand, etwa MOUNTED, READ ONLY oder READ WRITE.
    DATABASE_ROLEBetriebsrolle der Datenbank, zum Beispiel PRIMARY oder PHYSICAL STANDBY.
    LOG_MODEArchivierungsmodus der Datenbank, etwa ARCHIVELOG oder NOARCHIVELOG.

    2. Alle Spalten der View

    V$DATABASE vollständig anzeigen
    SELECT *
    FROM v$database;

    3. Praxisabfrage

    V$DATABASE - typisches Beispiel
    SELECT name, dbid, open_mode, database_role, log_mode, force_logging, created FROM v$database;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$DATABASE.

    Weiterlernen: Verwandte Abfrage zu V$DATABASE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$VERSION – Oracle-Komponenten und Versionsstände. Instanz und Datenbank Momentaufnahme
    Kategorie:
    Instanz und Datenbank
    Datencharakter:
    Momentaufnahme

    V$VERSION zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Datenbankversion und Release anzeigen; Patchinventar über OPatch, SQL-Patchregistry und Komponentenstatus ergänzen.

    1. Wichtige Spalten

    SpalteBedeutung
    BANNERProdukt-/Versionsbanner.
    BANNER_FULLAusführlicher Versionsbanner; kein vollständiges One-off-Patchinventar.
    BANNER_LEGACYÄlteres einzeiliges Format des Versionsbanners.
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB-Daten, 1 für Root, weitere IDs für passende Container.

    2. Alle Spalten der View

    V$VERSION vollständig anzeigen
    SELECT *
    FROM v$version;

    3. Praxisabfrage

    V$VERSION - typisches Beispiel
    SELECT banner_full FROM v$version ORDER BY banner_full;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$VERSION.

    V$OPTION – Status von Oracle-Optionen. Instanz und Datenbank Momentaufnahme
    Kategorie:
    Instanz und Datenbank
    Datencharakter:
    Momentaufnahme

    V$OPTION zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Aktivierte oder deaktivierte Optionen prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB-Daten, 1 für Root, weitere IDs für passende Container.

    2. Alle Spalten der View

    V$OPTION vollständig anzeigen
    SELECT *
    FROM v$option;

    3. Praxisabfrage

    V$OPTION - typisches Beispiel
    SELECT parameter, value FROM v$option ORDER BY parameter;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Was bedeutet das Ergebnis? TRUE beschreibt technische Verfügbarkeit beziehungsweise den entsprechenden Optionszustand. Der Wert erteilt keine Lizenz und beweist keine Nutzung jeder Funktion.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$OPTION.

    V$DIAG_INFO – ADR- und Trace-Pfade. Instanz und Datenbank Momentaufnahme
    Kategorie:
    Instanz und Datenbank
    Datencharakter:
    Momentaufnahme

    V$DIAG_INFO zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Alertlog-, Trace- und Incident-Pfade ermitteln.

    1. Wichtige Spalten

    SpalteBedeutung
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB-Daten, 1 für Root, weitere IDs für passende Container.

    2. Alle Spalten der View

    V$DIAG_INFO vollständig anzeigen
    SELECT *
    FROM v$diag_info;

    3. Praxisabfrage

    V$DIAG_INFO - typisches Beispiel
    SELECT name, value FROM v$diag_info ORDER BY name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$DIAG_INFO.

    Weiterlernen: Verwandte Abfrage zu V$DIAG_INFO mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SESSION – Aktuelle Sessions mit SQL, Status, Waits und Blockierungen. Sessions und Prozesse Momentaufnahme
    Kategorie:
    Sessions und Prozesse
    Datencharakter:
    Momentaufnahme

    V$SESSION zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Benutzersessions, SQL_ID, Client und Blocker analysieren.

    1. Wichtige Spalten

    SpalteBedeutung
    SIDSessionkennung; kann nach Ende einer Session wiederverwendet werden.
    SERIAL#Laufende Kennung zur Unterscheidung verschiedener Lebenszyklen derselben SID.
    USERNAMEName des in dieser View beschriebenen Benutzers.
    SQL_IDKennung des SQL-Statements; verschiedene Child Cursor können dieselbe SQL_ID besitzen.
    EVENTBei wartender Session aktueller Wait, sonst moeglicherweise letzter Wait; STATE mitlesen.
    WAIT_CLASSGruppe des Wait Events; Idle ist nicht automatisch ein Performanceproblem.
    STATEWAITING bedeutet aktuell wartend; zusammen mit EVENT lesen.
    SECONDS_IN_WAITÄlteres Feld mit zustandsabhängiger Bedeutung; für aktuelle Waitdauer STATE und WAIT_TIME_MICRO verwenden.
    WAIT_TIME_MICROBei STATE=WAITING Dauer des aktuellen Waits in Mikrosekunden, sonst Dauer des letzten Waits.
    BLOCKING_SESSION_STATUSNur bei VALID ist BLOCKING_SESSION eine gültige Blockerzuordnung.

    2. Alle Spalten der View

    V$SESSION vollständig anzeigen
    SELECT *
    FROM v$session;

    3. Praxisabfrage

    V$SESSION - typisches Beispiel
    SELECT sid, serial#, con_id, username, status, sql_id,
           event, state, wait_time_micro,
           blocking_session_status, blocking_session
    FROM v$session
    WHERE type = 'USER'
    ORDER BY status, username, sid;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SESSION.

    Weiterlernen: Verwandte Abfrage zu V$SESSION mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$PROCESS – Oracle-Prozesse und OS-Prozess-IDs. Sessions und Prozesse Momentaufnahme
    Kategorie:
    Sessions und Prozesse
    Datencharakter:
    Momentaufnahme

    V$PROCESS zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Session und Betriebssystemprozess zuordnen.

    1. Wichtige Spalten

    SpalteBedeutung
    PIDOracle-interne Prozessnummer, nicht die OS-Prozesskennung.
    SPIDBetriebssystem-Prozesskennung. Bei Thread-Modellen gegebenenfalls weitere Kennungen benötigt.
    PNAMEKurzname eines Oracle-Hintergrundprozesses; bei anderen Prozessarten nicht zwingend gefüllt.
    TRACEFILEPfad der Trace-Datei dieses Prozesses.
    PGA_USED_MEMVom Prozess aktuell genutzter PGA-Speicher in Bytes.
    PGA_ALLOC_MEMDem Prozess aktuell allokierter PGA-Speicher in Bytes.

    2. Alle Spalten der View

    V$PROCESS vollständig anzeigen
    SELECT *
    FROM v$process;

    3. Praxisabfrage

    V$PROCESS - typisches Beispiel
    SELECT pid, spid, pname, program, tracefile, pga_used_mem, pga_alloc_mem, pga_max_mem FROM v$process ORDER BY pid;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$PROCESS.

    Weiterlernen: Verwandte Abfrage zu V$PROCESS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$TRANSACTION – Aktive Transaktionen und Undo-Verbrauch. Sessions und Prozesse Momentaufnahme
    Kategorie:
    Sessions und Prozesse
    Datencharakter:
    Momentaufnahme

    V$TRANSACTION zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Lange oder große offene Transaktionen erkennen.

    1. Wichtige Spalten

    SpalteBedeutung
    ADDRAdresse des Transaktionszustands; zu V$SESSION.TADDR zuordenbar.
    XIDUSN, XIDSLOT, XIDSQNUndo-Segmentnummer, Slot und Sequenz bilden die Transaktionskennung.
    START_DATEBeginn der Transaktion als DATE; Anzeigeformat hängt vom Client ab.
    USED_UBLK, USED_URECVerwendete Undo-Blöcke beziehungsweise Undo-Datensätze; keine Bytewerte.
    STATUSAktueller Transaktionsstatus.

    2. Alle Spalten der View

    V$TRANSACTION vollständig anzeigen
    SELECT *
    FROM v$transaction;

    3. Praxisabfrage

    V$TRANSACTION - typisches Beispiel
    SELECT addr, xidusn, xidslot, xidsqn, start_date, used_ublk, used_urec, status FROM v$transaction ORDER BY start_date;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$TRANSACTION.

    Weiterlernen: Verwandte Abfrage zu V$TRANSACTION mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$LOCK – Gehaltene und angeforderte Enqueue-Locks. Sessions und Prozesse Momentaufnahme
    Kategorie:
    Sessions und Prozesse
    Datencharakter:
    Momentaufnahme

    V$LOCK zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Blocker-/Waiter-Ketten und Lock-Modi untersuchen.

    1. Wichtige Spalten

    SpalteBedeutung
    SIDSessionkennung; kann nach Ende einer Session wiederverwendet werden.

    2. Alle Spalten der View

    V$LOCK vollständig anzeigen
    SELECT *
    FROM v$lock;

    3. Praxisabfrage

    V$LOCK - typisches Beispiel
    SELECT sid, type, id1, id2, lmode, request, block, ctime FROM v$lock ORDER BY type, id1, id2, sid;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$LOCK.

    Weiterlernen: Verwandte Abfrage zu V$LOCK mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$LOCKED_OBJECT – Gesperrte Objekte und Sessions. Sessions und Prozesse Momentaufnahme
    Kategorie:
    Sessions und Prozesse
    Datencharakter:
    Momentaufnahme

    V$LOCKED_OBJECT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Objekt-Locks mit DBA_OBJECTS auflösen.

    1. Wichtige Spalten

    SpalteBedeutung
    SESSION_IDKennung der Session, die den Objektlock hält.
    ORACLE_USERNAME, OS_USER_NAMEDatenbankbenutzer und Betriebssystembenutzer.
    LOCKED_MODETM-Lockmodus: 0 angefordert, 1 Null, 2 Row Share, 3 Row Exclusive, 4 Share, 5 Share Row Exclusive, 6 Exclusive. Ein Lock allein beweist keine Blockierung.
    OBJECT_IDObjektkennung für den Join zu DBA_OBJECTS im passenden Container.
    OWNER, OBJECT_NAME, OBJECT_TYPEStammen in der Praxisabfrage aus DBA_OBJECTS, nicht aus V$LOCKED_OBJECT.

    2. Alle Spalten der View

    V$LOCKED_OBJECT vollständig anzeigen
    SELECT *
    FROM v$locked_object;

    3. Praxisabfrage

    V$LOCKED_OBJECT - typisches Beispiel
    SELECT lo.session_id, lo.oracle_username, lo.os_user_name, lo.locked_mode, o.owner, o.object_name, o.object_type FROM v$locked_object lo JOIN dba_objects o ON o.object_id=lo.object_id WHERE lo.con_id = TO_NUMBER(SYS_CONTEXT('USERENV', 'CON_ID'))
    ORDER BY lo.session_id, o.owner, o.object_name;

    Diese Fassung untersucht den aktuellen Container beziehungsweise die Non-CDB. Im Root ist dies keine Gesamtliste aller PDB-Objekte. Eine CDB-weite Variante benötigt CDB_OBJECTS und einen Join über CON_ID und OBJECT_ID. Ein Objekt-Lock allein beweist noch keine problematische Blockierung.

    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Was bedeutet das Ergebnis? Die View beschreibt DML-Objektsperren. Eine Zeile ist weder ein automatischer Blockerbeweis noch eine Liste einzelner gesperrter Tabellenzeilen. Container und Lockkette gehören zur Zuordnung.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$LOCKED_OBJECT.

    Weiterlernen: Verwandte Abfrage zu V$LOCKED_OBJECT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SESSION_LONGOPS – Fortschritt lang laufender Operationen. Sessions und Prozesse Momentaufnahme
    Kategorie:
    Sessions und Prozesse
    Datencharakter:
    Momentaufnahme

    V$SESSION_LONGOPS zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    RMAN, Scans, Sorts und andere Long Operations beobachten.

    1. Wichtige Spalten

    SpalteBedeutung
    SIDSessionkennung; kann nach Ende einer Session wiederverwendet werden.
    SERIAL#Laufende Kennung zur Unterscheidung verschiedener Lebenszyklen derselben SID.
    OPNAMEBezeichnung der beobachteten Long Operation.
    SOFARBisher erledigte Arbeit der Long Operation, in UNITS.
    TOTALWORKGeschätzte Gesamtarbeit der Long Operation, in UNITS.
    UNITSEinheit von SOFAR und TOTALWORK, beispielsweise Blocks.
    TIME_REMAININGGeschätzte verbleibende Dauer in Sekunden; keine feste Zusage.

    2. Alle Spalten der View

    V$SESSION_LONGOPS vollständig anzeigen
    SELECT *
    FROM v$session_longops;

    3. Praxisabfrage

    V$SESSION_LONGOPS - typisches Beispiel
    SELECT sid, serial#, opname, last_update_time, sofar, totalwork, units, ROUND(sofar/NULLIF(totalwork,0)*100,2) pct_done, elapsed_seconds, time_remaining FROM v$session_longops WHERE totalwork>0 AND sofar<totalwork ORDER BY start_time;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SESSION_LONGOPS.

    Weiterlernen: Verwandte Abfrage zu V$SESSION_LONGOPS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SQL – Detaillierte Cursor- und SQL-Laufzeitstatistiken. SQL und Pläne Seit Cursor-Laden
    Kategorie:
    SQL und Pläne
    Datencharakter:
    Seit Cursor-Laden

    V$SQL zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Top SQL, Child Cursor, Laufzeiten, Gets und Reads analysieren.

    1. Wichtige Spalten

    SpalteBedeutung
    SQL_IDKennung des SQL-Statements; verschiedene Child Cursor können dieselbe SQL_ID besitzen.
    CHILD_NUMBERNummer einer Child-Cursor-Variante unter derselben SQL_ID.
    PLAN_HASH_VALUEKennzahl der Planstruktur; allein kein Nachweis gleicher Laufzeiteigenschaften.
    EXECUTIONSRegistrierte Ausführungen im Cursor-Messumfang, kein Zeilenzähler.
    ELAPSED_TIMEKumulierte Datenbankzeit für Parse, Execute und Fetch in Mikrosekunden; bei Parallelverarbeitung inklusive Workerzeit, keine reine Wanduhrzeit.
    CPU_TIMEKumulierte CPU-Zeit in Mikrosekunden; für Zeitfenster werden Messdifferenzen gebraucht.
    BUFFER_GETSLogische Buffer-Zugriffe im Messumfang dieser View, keine Bytezahl.
    DISK_READSPhysische Reads im Messumfang dieser View; Einheit und Messumfang mit der Referenz abgleichen.

    2. Alle Spalten der View

    V$SQL vollständig anzeigen
    SELECT *
    FROM v$sql;

    3. Praxisabfrage

    V$SQL - typisches Beispiel
    SELECT * FROM (SELECT sql_id, child_number, plan_hash_value, executions, ROUND(elapsed_time/1000000,2) elapsed_seconds, ROUND(cpu_time/1000000,2) cpu_seconds, buffer_gets, disk_reads, SUBSTR(sql_text,1,180) sql_text FROM v$sql WHERE executions>0 ORDER BY elapsed_time DESC) WHERE ROWNUM<=20;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SQL.

    Weiterlernen: Verwandte Abfrage zu V$SQL mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SQLAREA – Aggregierte SQL-Werte über Child Cursor. SQL und Pläne Seit Cursor-Laden
    Kategorie:
    SQL und Pläne
    Datencharakter:
    Seit Cursor-Laden

    V$SQLAREA zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    SQL mit hoher Gesamtlast oder vielen Child Cursors finden.

    1. Wichtige Spalten

    SpalteBedeutung
    SQL_IDKennung des SQL-Statements; verschiedene Child Cursor können dieselbe SQL_ID besitzen.
    VERSION_COUNTZahl der Child Cursor dieses Parent Cursors.
    EXECUTIONSRegistrierte Ausführungen im Cursor-Messumfang, kein Zeilenzähler.
    ELAPSED_TIMEÜber zugehörige Cursor aggregierte Datenbankzeit in Mikrosekunden; keine letzte Einzel-Ausführungsdauer.
    BUFFER_GETSLogische Buffer-Zugriffe im Messumfang dieser View, keine Bytezahl.
    DISK_READSPhysische Reads im Messumfang dieser View; Einheit und Messumfang mit der Referenz abgleichen.

    2. Alle Spalten der View

    V$SQLAREA vollständig anzeigen
    SELECT *
    FROM v$sqlarea;

    3. Praxisabfrage

    V$SQLAREA - typisches Beispiel
    SELECT * FROM (SELECT sql_id, version_count, executions, ROUND(elapsed_time/1000000,2) elapsed_seconds, buffer_gets, disk_reads, SUBSTR(sql_text,1,180) sql_text FROM v$sqlarea ORDER BY elapsed_time DESC) WHERE ROWNUM<=20;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SQLAREA.

    Weiterlernen: Verwandte Abfrage zu V$SQLAREA mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SQLSTATS – Kompakte SQL-Laufzeitstatistiken. SQL und Pläne SQL-Statistikbestand; begrenzt vorgehalten
    Kategorie:
    SQL und Pläne
    Datencharakter:
    SQL-Statistikbestand; begrenzt vorgehalten

    V$SQLSTATS zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Top SQL mit geringerer Cursor-Detailtiefe auswerten.

    1. Wichtige Spalten

    SpalteBedeutung
    SQL_IDKennung des SQL-Statements; verschiedene Child Cursor können dieselbe SQL_ID besitzen.
    PLAN_HASH_VALUEKennzahl der Planstruktur; allein kein Nachweis gleicher Laufzeiteigenschaften.
    EXECUTIONSRegistrierte Ausführungen im Cursor-Messumfang, kein Zeilenzähler.
    ELAPSED_TIMEAkkumulierte SQL-Zeit in Mikrosekunden; der Statistikbestand kann länger als die Cache-Präsenz der Cursor bestehen bleiben.
    CPU_TIMEKumulierte CPU-Zeit in Mikrosekunden; für Zeitfenster werden Messdifferenzen gebraucht.
    BUFFER_GETSLogische Buffer-Zugriffe im Messumfang dieser View, keine Bytezahl.
    DISK_READSPhysische Reads im Messumfang dieser View; Einheit und Messumfang mit der Referenz abgleichen.

    2. Alle Spalten der View

    V$SQLSTATS vollständig anzeigen
    SELECT *
    FROM v$sqlstats;

    3. Praxisabfrage

    V$SQLSTATS - typisches Beispiel
    SELECT * FROM (SELECT sql_id, plan_hash_value, executions, ROUND(elapsed_time/1000000,2) elapsed_seconds, ROUND(cpu_time/1000000,2) cpu_seconds, buffer_gets, disk_reads FROM v$sqlstats ORDER BY elapsed_time DESC) WHERE ROWNUM<=20;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Was bedeutet das Ergebnis? Die View fasst SQL-Statistiken zusammen und kann Daten nach dem Altern eines Cursors weiter vorhalten. Sie ist kein dauerhaftes, vollständiges SQL-Archiv; Zählerdifferenzen benötigen eine vergleichbare Basis.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SQLSTATS.

    V$SQL_PLAN – Planzeilen aktuell geladener Cursor. SQL und Pläne Seit Cursor-Laden
    Kategorie:
    SQL und Pläne
    Datencharakter:
    Seit Cursor-Laden

    V$SQL_PLAN zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Operationen, Objekte, Kosten und Kardinalitäten prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    SQL_IDKennung des SQL-Statements; verschiedene Child Cursor können dieselbe SQL_ID besitzen.
    CHILD_NUMBERNummer einer Child-Cursor-Variante unter derselben SQL_ID.
    OBJECT_NAMEName des beschriebenen Datenbankobjekts.
    COSTOptimizer-Kostenschätzung; keine gemessenen Millisekunden.
    CARDINALITYVom Optimizer geschätzte Zahl ausgegebener Zeilen für diesen Planschritt.

    2. Alle Spalten der View

    V$SQL_PLAN vollständig anzeigen
    SELECT *
    FROM v$sql_plan;

    3. Praxisabfrage

    V$SQL_PLAN - typisches Beispiel
    SELECT sql_id, child_number, id, parent_id, operation, options, object_owner, object_name, cost, cardinality, bytes FROM v$sql_plan WHERE sql_id='&SQL_ID' ORDER BY child_number, id;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SQL_PLAN.

    V$SQL_PLAN_STATISTICS_ALL – Planzeilen mit tatsächlichen Laufzeitwerten. SQL und Pläne Seit Cursor-Laden
    Kategorie:
    SQL und Pläne
    Datencharakter:
    Seit Cursor-Laden

    V$SQL_PLAN_STATISTICS_ALL zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Schätzungen mit echten Starts, Rows, Gets und Reads vergleichen.

    1. Wichtige Spalten

    SpalteBedeutung
    SQL_IDKennung des SQL-Statements; verschiedene Child Cursor können dieselbe SQL_ID besitzen.
    CHILD_NUMBERNummer einer Child-Cursor-Variante unter derselben SQL_ID.
    STARTSZahl der Starts des Planschritts im jeweiligen Statistikbezug.
    LAST_OUTPUT_ROWSTatsächlich ausgegebene Zeilen des Planschritts für die letzte erfasste Ausführung.
    DISK_READSPhysische Reads im Messumfang dieser View; Einheit und Messumfang mit der Referenz abgleichen.

    2. Alle Spalten der View

    V$SQL_PLAN_STATISTICS_ALL vollständig anzeigen
    SELECT *
    FROM v$sql_plan_statistics_all;

    3. Praxisabfrage

    V$SQL_PLAN_STATISTICS_ALL - typisches Beispiel
    SELECT con_id, sql_id, child_number, id, operation, options,
           object_owner, object_name, last_starts, last_output_rows,
           last_cr_buffer_gets + last_cu_buffer_gets AS last_buffer_gets,
           last_disk_reads,
           ROUND(last_elapsed_time/1000000,6) AS last_elapsed_seconds
    FROM v$sql_plan_statistics_all
    WHERE sql_id = '&SQL_ID'
      AND child_number = &CHILD_NUMBER
      AND con_id = TO_NUMBER(SYS_CONTEXT('USERENV', 'CON_ID'))
    ORDER BY id;

    Diese lokale Ansicht verwendet durchgängig Werte der letzten Ausführung. SQL*Plus fragt SQL_ID und eine numerische CHILD_NUMBER ab. Laufzeitstatistiken müssen erfasst worden sein; fehlende Werte sind keine gemessenen Nullen. Laufende oder nicht vollständig abgeholte Ausführungen zusätzlich berücksichtigen.

    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Was bedeutet das Ergebnis? STARTS, OUTPUT_ROWS und ELAPSED_TIME sind kumuliert; LAST_-Spalten beziehen sich auf die letzte erfasste Ausführung. Laufzeitwerte müssen zuvor passend erfasst worden sein. Fehlende Werte sind kein Nachweis für eine kostenlose Operation.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SQL_PLAN_STATISTICS_ALL.

    V$OPEN_CURSOR – Offene und gecachte Cursor je Session. SQL und Pläne Momentaufnahme
    Kategorie:
    SQL und Pläne
    Datencharakter:
    Momentaufnahme

    V$OPEN_CURSOR zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Cursor-Leaks und hohe Open-Cursor-Zahlen untersuchen.

    1. Wichtige Spalten

    SpalteBedeutung
    SIDSessionkennung; kann nach Ende einer Session wiederverwendet werden.
    SQL_IDKennung des SQL-Statements; verschiedene Child Cursor können dieselbe SQL_ID besitzen.
    SQL_TEXTSQL-Text in der von der View angebotenen begrenzten Länge.

    2. Alle Spalten der View

    V$OPEN_CURSOR vollständig anzeigen
    SELECT *
    FROM v$open_cursor;

    3. Praxisabfrage

    V$OPEN_CURSOR - typisches Beispiel
    SELECT sid, user_name, sql_id, cursor_type, SUBSTR(sql_text,1,180) sql_text FROM v$open_cursor ORDER BY sid, sql_id;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$OPEN_CURSOR.

    Weiterlernen: Verwandte Abfrage zu V$OPEN_CURSOR mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SYSTEM_EVENT – Instanzweite kumulierte Wait Events. Performance und Waits Kumuliert seit Instanzstart
    Kategorie:
    Performance und Waits
    Datencharakter:
    Kumuliert seit Instanzstart

    V$SYSTEM_EVENT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Dominierende Non-Idle-Waits priorisieren.

    1. Wichtige Spalten

    SpalteBedeutung
    EVENTName des Events, für das diese Zeile kumulierte Instanzstatistiken enthält. Kein aktueller Session-Wait.
    TOTAL_WAITSAnzahl der Waits im jeweiligen System- oder Session-Messumfang.
    TIME_WAITEDWartezeit in Hundertstelsekunden; für Sekunden durch 100 teilen.
    TIME_WAITED_MICROWartezeit in Mikrosekunden; für Sekunden durch 1000000 teilen.
    WAIT_CLASSGruppe des Wait Events; Idle ist nicht automatisch ein Performanceproblem.
    TIME_WAITED_MICRO_FGKumulierte Wartezeit der Foreground-Sessions in Mikrosekunden.

    2. Alle Spalten der View

    V$SYSTEM_EVENT vollständig anzeigen
    SELECT *
    FROM v$system_event;

    3. Praxisabfrage

    V$SYSTEM_EVENT - typisches Beispiel
    SELECT event, wait_class, total_waits, ROUND(time_waited_micro/1000000,2) waited_seconds, ROUND(time_waited_micro/NULLIF(total_waits,0)/1000,3) avg_wait_ms FROM v$system_event WHERE wait_class<>'Idle' ORDER BY time_waited_micro DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SYSTEM_EVENT.

    Weiterlernen: Verwandte Abfrage zu V$SYSTEM_EVENT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SESSION_EVENT – Kumulierte Wait Events je Session. Performance und Waits Seit Sessionstart
    Kategorie:
    Performance und Waits
    Datencharakter:
    Seit Sessionstart

    V$SESSION_EVENT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Wait-Schwerpunkte einer Session analysieren.

    1. Wichtige Spalten

    SpalteBedeutung
    SIDSessionkennung; kann nach Ende einer Session wiederverwendet werden.
    EVENTName des Events mit kumulierten Waits dieser Session. Kein Nachweis, dass sie gerade darauf wartet.
    TOTAL_WAITSAnzahl der Waits im jeweiligen System- oder Session-Messumfang.
    TIME_WAITEDWartezeit in Hundertstelsekunden; für Sekunden durch 100 teilen.
    WAIT_CLASSGruppe des Wait Events; Idle ist nicht automatisch ein Performanceproblem.

    2. Alle Spalten der View

    V$SESSION_EVENT vollständig anzeigen
    SELECT *
    FROM v$session_event;

    3. Praxisabfrage

    V$SESSION_EVENT - typisches Beispiel
    SELECT sid, event, wait_class, total_waits, ROUND(time_waited_micro/1000000,2) waited_seconds FROM v$session_event WHERE wait_class<>'Idle' ORDER BY sid, time_waited_micro DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SESSION_EVENT.

    Weiterlernen: Verwandte Abfrage zu V$SESSION_EVENT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SESSION_WAIT – Aktueller oder letzter Wait je Session. Performance und Waits Momentaufnahme
    Kategorie:
    Performance und Waits
    Datencharakter:
    Momentaufnahme

    V$SESSION_WAIT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    P1-, P2- und P3-Parameter eines Waits anzeigen.

    1. Wichtige Spalten

    SpalteBedeutung
    SIDSessionkennung; kann nach Ende einer Session wiederverwendet werden.
    EVENTBei wartender Session aktueller Wait, sonst moeglicherweise letzter Wait; STATE mitlesen.
    WAIT_TIME_MICROBei STATE=WAITING bisherige Dauer des aktuellen Waits in Mikrosekunden; sonst Dauer des letzten Waits.

    2. Alle Spalten der View

    V$SESSION_WAIT vollständig anzeigen
    SELECT *
    FROM v$session_wait;

    3. Praxisabfrage

    V$SESSION_WAIT - typisches Beispiel
    SELECT sid, seq#, event, p1text, p1, p2text, p2, p3text, p3, state, wait_time_micro FROM v$session_wait ORDER BY sid;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SESSION_WAIT.

    V$EVENT_NAME – Katalog der bekannten Wait Events. Performance und Waits Statisch zur Version
    Kategorie:
    Performance und Waits
    Datencharakter:
    Statisch zur Version

    V$EVENT_NAME zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Wait Event und Parameterbedeutung nachschlagen.

    1. Wichtige Spalten

    SpalteBedeutung
    WAIT_CLASSGruppe des Wait Events; Idle ist nicht automatisch ein Performanceproblem.

    2. Alle Spalten der View

    V$EVENT_NAME vollständig anzeigen
    SELECT *
    FROM v$event_name;

    3. Praxisabfrage

    V$EVENT_NAME - typisches Beispiel
    SELECT event#, event_id, name, parameter1, parameter2, parameter3, wait_class FROM v$event_name ORDER BY wait_class, name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$EVENT_NAME.

    Weiterlernen: Verwandte Abfrage zu V$EVENT_NAME mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SYSSTAT – Instanzweite Systemstatistiken. Performance und Waits Kumuliert seit Instanzstart
    Kategorie:
    Performance und Waits
    Datencharakter:
    Kumuliert seit Instanzstart

    V$SYSSTAT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Parses, Commits, Reads, Writes und Redo auswerten.

    1. Wichtige Spalten

    SpalteBedeutung
    NAMEName der Systemstatistik; zur Auswahl besser geeignet als eine fest angenommene Statistiknummer.
    VALUEKumulativer Wert. Die Einheit hängt von NAME ab: redo size zählt Bytes, physical reads Blöcke, user commits Vorgänge.
    CON_IDContainerbezug, in der kompakten Abfrage nicht ausgegeben. Instanzweite Werte nicht als einzelne PDB-Messung interpretieren.

    2. Alle Spalten der View

    V$SYSSTAT vollständig anzeigen
    SELECT *
    FROM v$sysstat;

    3. Praxisabfrage

    V$SYSSTAT - typisches Beispiel
    SELECT name, value FROM v$sysstat WHERE name IN ('user commits','user rollbacks','execute count','parse count (total)','parse count (hard)','session logical reads','physical reads','physical writes','redo size') ORDER BY name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SYSSTAT.

    Weiterlernen: Verwandte Abfrage zu V$SYSSTAT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SESSTAT – Statistiken je Session. Performance und Waits Seit Sessionstart
    Kategorie:
    Performance und Waits
    Datencharakter:
    Seit Sessionstart

    V$SESSTAT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Ressourcenverbrauch einzelner Sessions mit V$STATNAME auflösen.

    1. Wichtige Spalten

    SpalteBedeutung
    SIDSessionkennung; kann nach Ende einer Session wiederverwendet werden.

    2. Alle Spalten der View

    V$SESSTAT vollständig anzeigen
    SELECT *
    FROM v$sesstat;

    3. Praxisabfrage

    V$SESSTAT - typisches Beispiel
    SELECT s.sid, n.name, s.value FROM v$sesstat s JOIN v$statname n ON n.statistic#=s.statistic# WHERE s.sid=&SID ORDER BY n.name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SESSTAT.

    V$STATNAME – Namen der Statistiknummern. Performance und Waits Statisch zur Version
    Kategorie:
    Performance und Waits
    Datencharakter:
    Statisch zur Version

    V$STATNAME zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    V$SESSTAT-Werte in lesbare Namen übersetzen.

    1. Wichtige Spalten

    SpalteBedeutung
    STATISTIC#Statistiknummer für die Zuordnung innerhalb der Version; nicht als releaseübergreifend fest annehmen.
    NAMEStatistikname für die fachliche Auswahl.
    CLASSBitmaske der Statistikklassen; mehrere Klassen können gleichzeitig gesetzt sein.
    STAT_IDKennung der Statistik; nicht mit ihrem aktuellen Messwert verwechseln.

    2. Alle Spalten der View

    V$STATNAME vollständig anzeigen
    SELECT *
    FROM v$statname;

    3. Praxisabfrage

    V$STATNAME - typisches Beispiel
    SELECT statistic#, name, class, stat_id FROM v$statname ORDER BY name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$STATNAME.

    V$SYSMETRIC – Kurzfristige Systemmetriken. Performance und Waits 15-/60-Sekunden-Metriken
    Kategorie:
    Performance und Waits
    Datencharakter:
    15-/60-Sekunden-Metriken

    V$SYSMETRIC zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Aktuelle Host-CPU, DB CPU und Durchsatzraten anzeigen.

    1. Wichtige Spalten

    SpalteBedeutung
    BEGIN_TIMEBeginn des beschriebenen Messintervalls.
    END_TIMEEnde des beschriebenen Messintervalls.
    METRIC_NAMEName der Messgröße.
    METRIC_UNITEinheit der Messgröße; unbedingt zusammen mit VALUE lesen.

    2. Alle Spalten der View

    V$SYSMETRIC vollständig anzeigen
    SELECT *
    FROM v$sysmetric;
    Was sehe ich hier?

    V$SYSMETRIC zeigt zeitfensterbezogene Systemmetriken. GROUP_ID, Einheit und Messintervall bestimmen, wie ein Wert korrekt gelesen werden muss.

    3. Praxisabfrage

    V$SYSMETRIC - typisches Beispiel
    SELECT begin_time, end_time, metric_name, ROUND(value,2) value, metric_unit FROM v$sysmetric WHERE group_id=2 ORDER BY metric_name;
    Was sehe ich hier?
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SYSMETRIC.

    V$SYSTEM_WAIT_CLASS – Wait-Zeit nach Klassen. Performance und Waits Kumuliert seit Instanzstart
    Kategorie:
    Performance und Waits
    Datencharakter:
    Kumuliert seit Instanzstart

    V$SYSTEM_WAIT_CLASS zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    User I/O, Commit, Concurrency und weitere Klassen priorisieren.

    1. Wichtige Spalten

    SpalteBedeutung
    WAIT_CLASSGruppe des Wait Events; Idle ist nicht automatisch ein Performanceproblem.
    TOTAL_WAITSAnzahl der Waits im jeweiligen System- oder Session-Messumfang.
    TIME_WAITEDWartezeit in Hundertstelsekunden; für Sekunden durch 100 teilen.

    2. Alle Spalten der View

    V$SYSTEM_WAIT_CLASS vollständig anzeigen
    SELECT *
    FROM v$system_wait_class;

    3. Praxisabfrage

    V$SYSTEM_WAIT_CLASS - typisches Beispiel
    SELECT wait_class, total_waits, ROUND(time_waited/100,2) waited_seconds FROM v$system_wait_class WHERE wait_class<>'Idle' ORDER BY time_waited DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SYSTEM_WAIT_CLASS.

    V$SGA – Grober Überblick über die SGA. Memory Momentaufnahme
    Kategorie:
    Memory
    Datencharakter:
    Momentaufnahme

    V$SGA zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Zentrale SGA-Bereiche und Gesamtgrößen anzeigen.

    1. Wichtige Spalten

    SpalteBedeutung
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB-Daten, 1 für Root, weitere IDs für passende Container.

    2. Alle Spalten der View

    V$SGA vollständig anzeigen
    SELECT *
    FROM v$sga;

    3. Praxisabfrage

    V$SGA - typisches Beispiel
    SELECT name, ROUND(value/1024/1024,2) mb FROM v$sga ORDER BY value DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SGA.

    V$SGAINFO – Detaillierte SGA-Komponenten. Memory Momentaufnahme
    Kategorie:
    Memory
    Datencharakter:
    Momentaufnahme

    V$SGAINFO zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Shared Pool, Buffer Cache und Resize-Fähigkeit prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    BYTESGroesse in Bytes; durch 1024 / 1024 ergibt sich die hier verwendete MB-Anzeige.
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB-Daten, 1 für Root, weitere IDs für passende Container.

    2. Alle Spalten der View

    V$SGAINFO vollständig anzeigen
    SELECT *
    FROM v$sgainfo;

    3. Praxisabfrage

    V$SGAINFO - typisches Beispiel
    SELECT name, ROUND(bytes/1024/1024,2) mb, resizeable FROM v$sgainfo WHERE bytes>0 ORDER BY bytes DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SGAINFO.

    Weiterlernen: Verwandte Abfrage zu V$SGAINFO mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SGASTAT – Feinaufteilung der SGA. Memory Momentaufnahme
    Kategorie:
    Memory
    Datencharakter:
    Momentaufnahme

    V$SGASTAT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Shared-Pool-Komponenten und Speicherverbrauch analysieren.

    1. Wichtige Spalten

    SpalteBedeutung
    BYTESGroesse in Bytes; durch 1024 / 1024 ergibt sich die hier verwendete MB-Anzeige.
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB-Daten, 1 für Root, weitere IDs für passende Container.

    2. Alle Spalten der View

    V$SGASTAT vollständig anzeigen
    SELECT *
    FROM v$sgastat;
    Was sehe ich hier?

    V$SGASTAT zeigt SGA-Speicherbelegung nach Pool und Komponente. Große Werte allein sind kein Beweis für Speicherknappheit oder Fragmentierung.

    3. Praxisabfrage

    V$SGASTAT - typisches Beispiel
    SELECT pool, name, ROUND(bytes/1024/1024,2) mb FROM v$sgastat ORDER BY bytes DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SGASTAT.

    Weiterlernen: Verwandte Abfrage zu V$SGASTAT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$PGASTAT – Instanzweite PGA-Kennzahlen. Memory Kumuliert/Momentaufnahme
    Kategorie:
    Memory
    Datencharakter:
    Kumuliert/Momentaufnahme

    V$PGASTAT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Allocation, Target, Over Allocation und Cache-Hit bewerten.

    1. Wichtige Spalten

    SpalteBedeutung
    CON_IDContainerbezug: 0 für Gesamt-CDB/non-CDB-Daten, 1 für Root, weitere IDs für passende Container.

    2. Alle Spalten der View

    V$PGASTAT vollständig anzeigen
    SELECT *
    FROM v$pgastat;

    3. Praxisabfrage

    V$PGASTAT - typisches Beispiel
    SELECT name,
           CASE WHEN unit = 'bytes' THEN ROUND(value/1024/1024,2)
                ELSE value END AS display_value,
           CASE WHEN unit = 'bytes' THEN 'MiB' ELSE unit END AS display_unit
    FROM v$pgastat
    ORDER BY name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Was bedeutet das Ergebnis? Die Abfrage rechnet ausschließlich Byte-Werte in MiB um und passt die Einheit an. Zähler, Prozentwerte und aktuelle Speichergrößen dürfen nicht miteinander addiert werden.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    NAMEDISPLAY_VALUEDISPLAY_UNIT
    over allocation count0count
    total PGA allocated512MiB

    Was sehe ich hier? 512 MiB ist eine Speichergröße; 0 ist ein Zähler. Die Einheiten gehören zu jeder Zahl.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$PGASTAT.

    Weiterlernen: Verwandte Abfrage zu V$PGASTAT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$PROCESS_MEMORY – Prozessspeicher nach Kategorie. Memory Momentaufnahme
    Kategorie:
    Memory
    Datencharakter:
    Momentaufnahme

    V$PROCESS_MEMORY zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    PGA-Verbrauch auffälliger Prozesse untersuchen.

    1. Wichtige Spalten

    SpalteBedeutung
    PIDOracle-interne Prozessnummer, nicht die OS-Prozesskennung.
    SERIAL#Prozessseriennummer; zusammen mit PID dem Prozesslebenszyklus zuordnen. Keine V$SESSION.SERIAL#.
    CATEGORYSpeicherkategorie des Prozesses, beispielsweise SQL oder PL/SQL.
    USEDGenutzter Speicher in Bytes, sofern für die Kategorie bestimmt; NULL ist kein Beweis für 0.

    2. Alle Spalten der View

    V$PROCESS_MEMORY vollständig anzeigen
    SELECT *
    FROM v$process_memory;

    3. Praxisabfrage

    V$PROCESS_MEMORY - typisches Beispiel
    SELECT pid, serial#, category, ROUND(allocated/1024/1024,2) allocated_mb, ROUND(used/1024/1024,2) used_mb, ROUND(max_allocated/1024/1024,2) max_mb FROM v$process_memory ORDER BY allocated DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$PROCESS_MEMORY.

    V$MEMORY_DYNAMIC_COMPONENTS – Dynamische Memory-Komponenten und Resizes. Memory Aktuell; Min./Max. seit Instanzstart
    Kategorie:
    Memory
    Datencharakter:
    Aktuell; Min./Max. seit Instanzstart

    V$MEMORY_DYNAMIC_COMPONENTS zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Automatische SGA-/Memory-Änderungen nachvollziehen.

    1. Wichtige Spalten

    SpalteBedeutung
    COMPONENTName der dynamischen Speicherkomponente.
    CURRENT_SIZE → CURRENT_MBAktuelle Größe; die Abfrage teilt Bytes durch 1024². Der Alias MB bezeichnet hier MiB.
    MIN_SIZE → MIN_MB, MAX_SIZE → MAX_MBKleinste und größte Größe seit Instanzstart, im Beispiel in MiB.
    LAST_OPER_TYPEArt der letzten Größenoperation, beispielsweise GROW oder SHRINK.
    LAST_OPER_TIMEStartzeit der letzten abgeschlossenen Größenoperation.

    2. Alle Spalten der View

    V$MEMORY_DYNAMIC_COMPONENTS vollständig anzeigen
    SELECT *
    FROM v$memory_dynamic_components;

    3. Praxisabfrage

    V$MEMORY_DYNAMIC_COMPONENTS - typisches Beispiel
    SELECT component, ROUND(current_size/1024/1024,2) current_mb, ROUND(min_size/1024/1024,2) min_mb, ROUND(max_size/1024/1024,2) max_mb, last_oper_type, last_oper_time FROM v$memory_dynamic_components WHERE current_size>0 ORDER BY current_size DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$MEMORY_DYNAMIC_COMPONENTS.

    V$SQL_WORKAREA – Workarea-Statistiken je SQL-Cursor. Memory Cursorcache: letzte Ausfuehrung und Zaehler
    Kategorie:
    Memory
    Datencharakter:
    Cursorcache: letzte Ausfuehrung und Zähler

    V$SQL_WORKAREA zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Sort- und Hash-Operationen mit PGA-/Spill-Problemen erkennen.

    1. Wichtige Spalten

    SpalteBedeutung
    SQL_IDKennung des SQL-Statements; verschiedene Child Cursor können dieselbe SQL_ID besitzen.
    ESTIMATED_OPTIMAL_SIZEGeschätzter Speicherbedarf in Bytes für vollständige Ausführung im Speicher.
    LAST_MEMORY_USEDBei V$SQL_WORKAREA der Speicherverbrauch in Bytes während der letzten Ausführung.
    LAST_EXECUTIONBei V$SQL_WORKAREA Speicherverfahren der letzten Ausführung, etwa OPTIMAL, ONE PASS oder MULTI-PASS.
    LAST_TEMPSEG_SIZEBei V$SQL_WORKAREA TEMP-Segmentgröße in Bytes der letzten Ausführung; NULL bei fehlendem Spill.

    2. Alle Spalten der View

    V$SQL_WORKAREA vollständig anzeigen
    SELECT *
    FROM v$sql_workarea;

    3. Praxisabfrage

    V$SQL_WORKAREA - typisches Beispiel
    SELECT sql_id, operation_type, ROUND(estimated_optimal_size/1024/1024,2) optimal_mb, ROUND(last_memory_used/1024/1024,2) used_mb, last_execution, last_tempseg_size FROM v$sql_workarea ORDER BY last_memory_used DESC;
    Einordnung: Diese View zeigt Workareas gespeicherter Child Cursor, Werte der letzten Ausfuehrung und kumulierte Ausfuehrungszaehler. Für gerade laufende Workareas ist V$SQL_WORKAREA_ACTIVE zustaendig.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SQL_WORKAREA.

    V$SQL_WORKAREA_HISTOGRAM – Optimal-, Onepass- und Multipass-Workareas. Memory Kumuliert seit Instanzstart
    Kategorie:
    Memory
    Datencharakter:
    Kumuliert seit Instanzstart

    V$SQL_WORKAREA_HISTOGRAM zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    PGA-Workarea-Effizienz nach Größenklassen bewerten.

    1. Wichtige Spalten

    SpalteBedeutung
    LOW_OPTIMAL_SIZE, HIGH_OPTIMAL_SIZEUntere und obere Grenze des optimalen Speicherbedarfs einer Größenklasse in Bytes.
    OPTIMAL_EXECUTIONSAusführungen dieser Klasse, die seit Instanzstart ohne Auslagerung der Workarea auskamen.
    ONEPASS_EXECUTIONSAusführungen im One-pass-Modus mit zusätzlicher Verarbeitung über temporären Speicher.
    MULTIPASSES_EXECUTIONSAusführungen im Multi-pass-Modus mit mehreren Verarbeitungspässen.
    TOTAL_EXECUTIONSSumme der drei Zähler; in der Abfrage nur als Filter verwendet. Für ein Zeitfenster zwei Messungen vergleichen.

    2. Alle Spalten der View

    V$SQL_WORKAREA_HISTOGRAM vollständig anzeigen
    SELECT *
    FROM v$sql_workarea_histogram;

    3. Praxisabfrage

    V$SQL_WORKAREA_HISTOGRAM - typisches Beispiel
    SELECT low_optimal_size, high_optimal_size, optimal_executions, onepass_executions, multipasses_executions FROM v$sql_workarea_histogram WHERE total_executions>0 ORDER BY low_optimal_size;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SQL_WORKAREA_HISTOGRAM.

    Weiterlernen: Verwandte Abfrage zu V$SQL_WORKAREA_HISTOGRAM mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$LOG – Online Redo Groups und Status. Redo und Archivierung Momentaufnahme
    Kategorie:
    Redo und Archivierung
    Datencharakter:
    Momentaufnahme

    V$LOG zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Größe, Sequenz, Status und Memberzahl prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    GROUP#Nummer der Redo-Log-Gruppe.
    THREAD#Redo-Thread-Nummer.
    SEQUENCE#Redo-Sequenznummer; zusammen mit Thread und Datenbank-Incarnation betrachten.
    BYTESGroesse in Bytes; durch 1024 / 1024 ergibt sich die hier verwendete MB-Anzeige.
    MEMBERSZahl der Member dieser Redo-Log-Gruppe.

    2. Alle Spalten der View

    V$LOG vollständig anzeigen
    SELECT *
    FROM v$log;

    3. Praxisabfrage

    V$LOG - typisches Beispiel
    SELECT group#, thread#, sequence#, ROUND(bytes/1024/1024,2) size_mb, members, archived, status, first_time FROM v$log ORDER BY thread#, group#;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$LOG.

    Weiterlernen: Verwandte Abfrage zu V$LOG mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$LOGFILE – Physische Redo Member. Redo und Archivierung Momentaufnahme
    Kategorie:
    Redo und Archivierung
    Datencharakter:
    Momentaufnahme

    V$LOGFILE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Pfade, Multiplexing und fehlerhafte Member prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    GROUP#Nummer der Redo-Log-Gruppe.
    MEMBERDateiname eines Redo-Log-Members.

    2. Alle Spalten der View

    V$LOGFILE vollständig anzeigen
    SELECT *
    FROM v$logfile;

    3. Praxisabfrage

    V$LOGFILE - typisches Beispiel
    SELECT group#, member, type, status, is_recovery_dest_file FROM v$logfile ORDER BY group#, member;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$LOGFILE.

    Weiterlernen: Verwandte Abfrage zu V$LOGFILE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$LOG_HISTORY – Historie der Log Switches. Redo und Archivierung Historisch im Controlfile
    Kategorie:
    Redo und Archivierung
    Datencharakter:
    Historisch im Controlfile

    V$LOG_HISTORY zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Switch-Häufigkeit und zeitliche Muster analysieren.

    1. Wichtige Spalten

    SpalteBedeutung
    THREAD#Redo-Thread-Nummer.
    SEQUENCE#Redo-Sequenznummer; zusammen mit Thread und Datenbank-Incarnation betrachten.
    FIRST_CHANGE#SCN-Grenze am Beginn der Redo-Sequenz.
    NEXT_CHANGE#SCN-Grenze nach dem Ende der Redo-Sequenz.

    2. Alle Spalten der View

    V$LOG_HISTORY vollständig anzeigen
    SELECT *
    FROM v$log_history;

    3. Praxisabfrage

    V$LOG_HISTORY - typisches Beispiel
    SELECT TO_CHAR(TRUNC(first_time,'HH24'),'DD.MM.YYYY HH24:00') hour_start, COUNT(*) sequenzanfaenge FROM v$log_history WHERE first_time>=SYSDATE-1 GROUP BY TRUNC(first_time,'HH24') ORDER BY TRUNC(first_time,'HH24') DESC;

    Gezählt werden historisch erfasste Sequenzanfänge nach FIRST_TIME, keine lückenlos gemessenen Switch-Abschlusszeitpunkte. Die verfügbare Historie und eine noch laufende Sequenz begrenzen die Aussage; Stunden ohne Treffer erscheinen nicht als Nullzeilen. Einordnung: Kapitel 18.

    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Was bedeutet das Ergebnis? FIRST_TIME ist der Zeitpunkt des ersten Eintrags der Sequenz. Das Stundenaggregat ist eine Näherung zur Sequenz-/Switch-Aktivität und kein minutengenauer Nachweis des Switch-Endes; die Controlfile-Historie ist begrenzt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$LOG_HISTORY.

    Weiterlernen: Verwandte Abfrage zu V$LOG_HISTORY mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$ARCHIVED_LOG – Metadaten zu Archived Logs. Redo und Archivierung Historisch im Controlfile
    Kategorie:
    Redo und Archivierung
    Datencharakter:
    Historisch im Controlfile

    V$ARCHIVED_LOG zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Sequenzen, Backup Count, Status und Löschung prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    THREAD#Redo-Thread-Nummer.
    SEQUENCE#Redo-Sequenznummer; zusammen mit Thread und Datenbank-Incarnation betrachten.
    BACKUP_COUNTZahl der erfassten Sicherungen des Archived Logs; kein alleiniger Nachweis vollständiger Wiederherstellbarkeit.

    2. Alle Spalten der View

    V$ARCHIVED_LOG vollständig anzeigen
    SELECT *
    FROM v$archived_log;

    3. Praxisabfrage

    V$ARCHIVED_LOG - typisches Beispiel
    SELECT thread#, sequence#, first_time, completion_time, backup_count, deleted, status, name FROM v$archived_log WHERE first_time>=SYSDATE-1 ORDER BY thread#, sequence# DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Was bedeutet das Ergebnis? Für dieselbe Thread-/Sequenz-/Resetlogs-Kombination können mehrere Einträge existieren, etwa für mehrere Ziele oder Kopien. COUNT(*) ist daher nicht ohne Weiteres die Zahl unterschiedlicher Redo-Sequenzen.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$ARCHIVED_LOG.

    Weiterlernen: Verwandte Abfrage zu V$ARCHIVED_LOG mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$ARCHIVE_DEST – Konfiguration der Archive-Ziele. Redo und Archivierung Momentaufnahme
    Kategorie:
    Redo und Archivierung
    Datencharakter:
    Momentaufnahme

    V$ARCHIVE_DEST zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Lokale und entfernte Ziele sowie Fehler prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    DEST_IDNummer des konfigurierten Archivierungsziels.
    STATUSZielzustand, beispielsweise VALID, ERROR oder DEFERRED; INACTIVE wird hier ausgefiltert.
    TARGETAuf einer Primary: PRIMARY lokal, STANDBY entfernt. Auf einer Standby: LOCAL lokal, REMOTE entfernt.
    ARCHIVERFür das Ziel verwendeter Archivierungsprozess beziehungsweise Transportmechanismus laut View.
    DESTINATIONPfad oder Serviceangabe des Ziels; nicht immer ein lokales Verzeichnis.
    ERRORFehlertext des letzten Fehlers beim Öffnen oder Kopieren; NULL allein beweist keinen vollständigen Transport- und Apply-Erfolg.

    2. Alle Spalten der View

    V$ARCHIVE_DEST vollständig anzeigen
    SELECT *
    FROM v$archive_dest;

    3. Praxisabfrage

    V$ARCHIVE_DEST - typisches Beispiel
    SELECT dest_id, status, target, archiver, destination, error FROM v$archive_dest WHERE status<>'INACTIVE' ORDER BY dest_id;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$ARCHIVE_DEST.

    Weiterlernen: Verwandte Abfrage zu V$ARCHIVE_DEST mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$ARCHIVE_DEST_STATUS – Laufzeitstatus der Archive-Ziele. Redo und Archivierung Momentaufnahme
    Kategorie:
    Redo und Archivierung
    Datencharakter:
    Momentaufnahme

    V$ARCHIVE_DEST_STATUS zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Archivierungsfortschritt und Zielprobleme untersuchen.

    1. Wichtige Spalten

    SpalteBedeutung
    DEST_ID, STATUSZielnummer und aktueller Zustand.
    DATABASE_MODEModus der Zieldatenbank, beispielsweise OPEN oder MOUNTED-STANDBY.
    RECOVERY_MODEAktueller Apply-Modus am Ziel; nicht mit dessen Open Mode gleichsetzen.
    ARCHIVED_THREAD#, ARCHIVED_SEQ#Thread und Sequenz des zuletzt am Ziel empfangenen Archived Redo Logs. Kein Nachweis, dass diese Sequenz bereits angewendet wurde.
    ERRORFehlertext des letzten Öffnungs-/Kopierfehlers. Die Laufzeitinformationen überdauern einen Instanzshutdown nicht.

    2. Alle Spalten der View

    V$ARCHIVE_DEST_STATUS vollständig anzeigen
    SELECT *
    FROM v$archive_dest_status;

    3. Praxisabfrage

    V$ARCHIVE_DEST_STATUS - typisches Beispiel
    SELECT dest_id, status, database_mode, recovery_mode, archived_thread#, archived_seq#, error FROM v$archive_dest_status WHERE status<>'INACTIVE' ORDER BY dest_id;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$ARCHIVE_DEST_STATUS.

    V$DATAFILE – Datafiles, Status und Checkpoint-SCN. Dateien und Recovery Momentaufnahme
    Kategorie:
    Dateien und Recovery
    Datencharakter:
    Momentaufnahme

    V$DATAFILE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Datafile-Pfade und Status prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    FILE#Absolute Dateinummer im Datenbankkontext.
    ENABLEDZugriffsart der Datei: DISABLED, READ ONLY oder READ WRITE. Kein Scheduler-Aktivierungskennzeichen.

    2. Alle Spalten der View

    V$DATAFILE vollständig anzeigen
    SELECT *
    FROM v$datafile;

    3. Praxisabfrage

    V$DATAFILE - typisches Beispiel
    SELECT file#, name, status, enabled, checkpoint_change#, checkpoint_time FROM v$datafile ORDER BY file#;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$DATAFILE.

    Weiterlernen: Verwandte Abfrage zu V$DATAFILE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$DATAFILE_HEADER – Informationen aus Datafile-Headern. Dateien und Recovery Momentaufnahme
    Kategorie:
    Dateien und Recovery
    Datencharakter:
    Momentaufnahme

    V$DATAFILE_HEADER zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Recovery-Bedarf und Header-Konsistenz prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    FILE#Absolute Dateinummer im Datenbankkontext.

    2. Alle Spalten der View

    V$DATAFILE_HEADER vollständig anzeigen
    SELECT *
    FROM v$datafile_header;

    3. Praxisabfrage

    V$DATAFILE_HEADER - typisches Beispiel
    SELECT file#, status, recover, fuzzy, checkpoint_change#, checkpoint_time, resetlogs_change#, resetlogs_time FROM v$datafile_header ORDER BY file#;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$DATAFILE_HEADER.

    Weiterlernen: Verwandte Abfrage zu V$DATAFILE_HEADER mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$TEMPFILE – Tempfiles und Status. Dateien und Recovery Momentaufnahme
    Kategorie:
    Dateien und Recovery
    Datencharakter:
    Momentaufnahme

    V$TEMPFILE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Tempfile-Pfade und Verfügbarkeit anzeigen.

    1. Wichtige Spalten

    SpalteBedeutung
    FILE#Absolute Dateinummer im Datenbankkontext.
    ENABLEDZugriffsart des Tempfiles, beispielsweise READ WRITE; kein Job-Aktivierungskennzeichen.
    BYTESGroesse in Bytes; durch 1024 / 1024 ergibt sich die hier verwendete MB-Anzeige.

    2. Alle Spalten der View

    V$TEMPFILE vollständig anzeigen
    SELECT *
    FROM v$tempfile;

    3. Praxisabfrage

    V$TEMPFILE - typisches Beispiel
    SELECT file#, name, status, enabled, ROUND(bytes/1024/1024,2) size_mb FROM v$tempfile ORDER BY file#;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$TEMPFILE.

    Weiterlernen: Verwandte Abfrage zu V$TEMPFILE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$CONTROLFILE – Controlfile-Pfade und Größe. Dateien und Recovery Momentaufnahme
    Kategorie:
    Dateien und Recovery
    Datencharakter:
    Momentaufnahme

    V$CONTROLFILE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Multiplexing und Dateipfade prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    BLOCK_SIZEGröße eines Controlfile-Blocks in Bytes, nicht der Tabellen-/Datafile-Blockgröße gleichsetzen.
    FILE_SIZE_BLKSControlfile-Größe in Controlfile-Blöcken; zusammen mit BLOCK_SIZE auswerten.

    2. Alle Spalten der View

    V$CONTROLFILE vollständig anzeigen
    SELECT *
    FROM v$controlfile;

    3. Praxisabfrage

    V$CONTROLFILE - typisches Beispiel
    SELECT name, status, is_recovery_dest_file, block_size, file_size_blks FROM v$controlfile ORDER BY name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$CONTROLFILE.

    Weiterlernen: Verwandte Abfrage zu V$CONTROLFILE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$RECOVER_FILE – Datafiles mit Recovery-Bedarf. Dateien und Recovery Momentaufnahme
    Kategorie:
    Dateien und Recovery
    Datencharakter:
    Momentaufnahme

    V$RECOVER_FILE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Dateien erkennen, die Media Recovery benötigen.

    1. Wichtige Spalten

    SpalteBedeutung
    FILE#Absolute Dateinummer im Datenbankkontext.

    2. Alle Spalten der View

    V$RECOVER_FILE vollständig anzeigen
    SELECT *
    FROM v$recover_file;

    3. Praxisabfrage

    V$RECOVER_FILE - typisches Beispiel
    SELECT file#, online, online_status, error, change#, time FROM v$recover_file ORDER BY file#;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Was bedeutet das Ergebnis? Die View liefert bekannten Recovery-Bedarf. Nach Wiederherstellung oder Neuerstellung eines Controlfiles kann sie unvollständig sein. Ein leeres Ergebnis ersetzt keine Header- und Recovery-Prüfung.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$RECOVER_FILE.

    Weiterlernen: Verwandte Abfrage zu V$RECOVER_FILE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$RMAN_BACKUP_JOB_DETAILS – RMAN-Jobs mit Status und Laufzeit. RMAN Historisch im Controlfile
    Kategorie:
    RMAN
    Datencharakter:
    Historisch im Controlfile

    V$RMAN_BACKUP_JOB_DETAILS zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Letzte Backupjobs, Typen und Erfolg prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    SESSION_KEYRMAN-Jobkennung im Repository; für weitere Verknüpfungen die passenden Repository-Schlüssel beachten.
    INPUT_TYPEZusammengefasste Art des RMAN-Jobs, beispielsweise DB FULL, DB INCR oder ARCHIVELOG. DB INCR zeigt nicht das genaue Level.
    END_TIMEEnde des beschriebenen Messintervalls.
    ELAPSED_SECONDSBisherige beziehungsweise ausgewiesene Laufzeit in Sekunden.

    2. Alle Spalten der View

    V$RMAN_BACKUP_JOB_DETAILS vollständig anzeigen
    SELECT *
    FROM v$rman_backup_job_details;

    3. Praxisabfrage

    V$RMAN_BACKUP_JOB_DETAILS - typisches Beispiel
    SELECT session_key, input_type, status, start_time, end_time, elapsed_seconds, input_bytes_display, output_bytes_display, output_device_type FROM v$rman_backup_job_details WHERE start_time>=SYSDATE-7 ORDER BY start_time DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$RMAN_BACKUP_JOB_DETAILS.

    Weiterlernen: Verwandte Abfrage zu V$RMAN_BACKUP_JOB_DETAILS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$BACKUP_SET – RMAN-Backupsets. RMAN Historisch im Controlfile
    Kategorie:
    RMAN
    Datencharakter:
    Historisch im Controlfile

    V$BACKUP_SET zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Backup Type, Incremental Level und Pieces prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    INCREMENTAL_LEVELLevel des inkrementellen Backups, sofern zutreffend: 0 oder 1.

    2. Alle Spalten der View

    V$BACKUP_SET vollständig anzeigen
    SELECT *
    FROM v$backup_set;

    3. Praxisabfrage

    V$BACKUP_SET - typisches Beispiel
    SELECT recid, set_stamp, set_count, backup_type, incremental_level, pieces, start_time, completion_time, controlfile_included FROM v$backup_set ORDER BY completion_time DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$BACKUP_SET.

    Weiterlernen: Verwandte Abfrage zu V$BACKUP_SET mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$BACKUP_PIECE – RMAN-Backuppieces. RMAN Historisch im Controlfile
    Kategorie:
    RMAN
    Datencharakter:
    Historisch im Controlfile

    V$BACKUP_PIECE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Handles, Status und Größe physischer Backuppieces prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    HANDLEName beziehungsweise Handle des Backup Pieces beim verwendeten Speichergerät.
    BYTESGroesse in Bytes; durch 1024 / 1024 ergibt sich die hier verwendete MB-Anzeige.

    2. Alle Spalten der View

    V$BACKUP_PIECE vollständig anzeigen
    SELECT *
    FROM v$backup_piece;

    3. Praxisabfrage

    V$BACKUP_PIECE - typisches Beispiel
    SELECT recid, set_stamp, set_count, piece#, status, handle, start_time, completion_time, ROUND(bytes/1024/1024,2) size_mb FROM v$backup_piece ORDER BY completion_time DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$BACKUP_PIECE.

    Weiterlernen: Verwandte Abfrage zu V$BACKUP_PIECE mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$BACKUP_DATAFILE – Gesicherte Datafiles. RMAN Historisch im Controlfile
    Kategorie:
    RMAN
    Datencharakter:
    Historisch im Controlfile

    V$BACKUP_DATAFILE zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Datafile-Backups und Incremental Level anzeigen.

    1. Wichtige Spalten

    SpalteBedeutung
    FILE#Absolute Dateinummer im Datenbankkontext.
    INCREMENTAL_LEVELLevel des inkrementellen Backups, sofern zutreffend: 0 oder 1.

    2. Alle Spalten der View

    V$BACKUP_DATAFILE vollständig anzeigen
    SELECT *
    FROM v$backup_datafile;

    3. Praxisabfrage

    V$BACKUP_DATAFILE - typisches Beispiel
    SELECT file#, incremental_level, checkpoint_change#, checkpoint_time, completion_time, blocks, datafile_blocks FROM v$backup_datafile ORDER BY completion_time DESC, file#;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$BACKUP_DATAFILE.

    V$BACKUP_REDOLOG – Gesicherte Archived Logs. RMAN Historisch im Controlfile
    Kategorie:
    RMAN
    Datencharakter:
    Historisch im Controlfile

    V$BACKUP_REDOLOG zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Archivlog-Backups und Sequenzen prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    THREAD#Redo-Thread-Nummer.
    SEQUENCE#Redo-Sequenznummer; zusammen mit Thread und Datenbank-Incarnation betrachten.
    SET_STAMP / SET_COUNTGemeinsamer Zuordnungsschluessel zu V$BACKUP_SET; beide Werte sind für den Join erforderlich.

    2. Alle Spalten der View

    V$BACKUP_REDOLOG vollständig anzeigen
    SELECT *
    FROM v$backup_redolog;

    3. Praxisabfrage

    V$BACKUP_REDOLOG - typisches Beispiel
    SELECT r.thread#, r.sequence#, r.first_time, r.next_time,
           s.completion_time AS backup_completion_time,
           r.set_stamp, r.set_count
    FROM v$backup_redolog r
    JOIN v$backup_set s
      ON s.set_stamp = r.set_stamp
     AND s.set_count = r.set_count
    ORDER BY s.completion_time DESC, r.thread#, r.sequence#;
    Einordnung: FIRST_TIME und NEXT_TIME begrenzen den Redo-Zeitraum. Der Backup-Abschluss stammt über SET_STAMP und SET_COUNT aus V$BACKUP_SET.COMPLETION_TIME, nicht aus dieser View. Ein Metadatensatz beweist keine physisch lesbare Sicherung.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$BACKUP_REDOLOG.

    V$DIAG_ALERT_EXT – Strukturierte ADR-Alertlog-Einträge. Diagnose und Parameter Historisch im ADR
    Kategorie:
    Diagnose und Parameter
    Datencharakter:
    Historisch im ADR

    V$DIAG_ALERT_EXT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    ORA-Fehler, Warnings und Diagnosemeldungen zeitbasiert auswerten.

    1. Wichtige Spalten

    SpalteBedeutung
    ORIGINATING_TIMESTAMPZeitstempel, zu dem die Diagnosemeldung erzeugt wurde.
    MESSAGE_TEXTText der Diagnosemeldung; vollständigen Fehlerstack und Zeitpunkt beachten.

    2. Alle Spalten der View

    V$DIAG_ALERT_EXT vollständig anzeigen
    SELECT *
    FROM v$diag_alert_ext;

    3. Praxisabfrage

    V$DIAG_ALERT_EXT - typisches Beispiel
    SELECT originating_timestamp, message_type, message_level, component_id, problem_key, SUBSTR(message_text,1,500) message_text FROM v$diag_alert_ext WHERE originating_timestamp>=SYSTIMESTAMP-INTERVAL '1' DAY ORDER BY originating_timestamp DESC;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$DIAG_ALERT_EXT.

    Weiterlernen: Verwandte Abfrage zu V$DIAG_ALERT_EXT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$PARAMETER – Aktuell wirksame Initialisierungsparameter. Diagnose und Parameter Momentaufnahme
    Kategorie:
    Diagnose und Parameter
    Datencharakter:
    Momentaufnahme

    V$PARAMETER zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Parameterwerte, Defaultstatus und Änderbarkeit prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    DISPLAY_VALUEFür Menschen formatierte Darstellung des Parameterwerts.
    ISDEFAULTTRUE: nicht ausdrücklich in der Parameterdatei angegeben. Nicht allein ein Vergleich mit einem empfohlenen Wert.
    ISSES_MODIFIABLEZeigt, ob der Parameter für eine Session geändert werden kann.
    ISSYS_MODIFIABLESystemänderbarkeit: IMMEDIATE, DEFERRED oder FALSE.
    VALUEFür die abfragende Session wirksamer Wert; instanzweite Werte stehen in V$SYSTEM_PARAMETER.

    2. Alle Spalten der View

    V$PARAMETER vollständig anzeigen
    SELECT *
    FROM v$parameter;

    3. Praxisabfrage

    V$PARAMETER - typisches Beispiel
    SELECT name, value, display_value, isdefault, isses_modifiable, issys_modifiable, ismodified FROM v$parameter ORDER BY name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$PARAMETER.

    Weiterlernen: Verwandte Abfrage zu V$PARAMETER mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SPPARAMETER – Im SPFILE gespeicherte Werte. Diagnose und Parameter Persistente Konfiguration
    Kategorie:
    Diagnose und Parameter
    Datencharakter:
    Persistente Konfiguration

    V$SPPARAMETER zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    SID-spezifische und persistent gesetzte Parameter prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    SIDInstanzname oder * als allgemeiner SPFILE-Eintrag; keine numerische Session-ID.
    DISPLAY_VALUEFür Menschen formatierte Darstellung des Parameterwerts.
    ISSPECIFIEDTRUE kennzeichnet einen ausdrücklich im SPFILE gesetzten Eintrag.

    2. Alle Spalten der View

    V$SPPARAMETER vollständig anzeigen
    SELECT *
    FROM v$spparameter;

    3. Praxisabfrage

    V$SPPARAMETER - typisches Beispiel
    SELECT sid, name, value, display_value, isspecified FROM v$spparameter WHERE isspecified='TRUE' ORDER BY name, sid;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    SIDNAMEVALUEDISPLAY_VALUEISSPECIFIED
    *open_cursors300300TRUE

    Was sehe ich hier? Der Stern gilt als allgemeiner Instanzeintrag. Es ist keine Session mit der Kennung * gemeint.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SPPARAMETER.

    V$RESOURCE_LIMIT – Aktuelle und maximale Ressourcennutzung. Diagnose und Parameter Aktuell/seit Instanzstart
    Kategorie:
    Diagnose und Parameter
    Datencharakter:
    Aktuell/seit Instanzstart

    V$RESOURCE_LIMIT zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Processes, Sessions und weitere Limits überwachen.

    1. Wichtige Spalten

    SpalteBedeutung
    CURRENT_UTILIZATIONAktuelle Nutzung dieser Ressource.
    MAX_UTILIZATIONHöchste Ressourcennutzung seit Instanzstart, keine aktuelle Nutzung.
    LIMIT_VALUEGrenzwert der Ressource; kann auch UNLIMITED enthalten.

    2. Alle Spalten der View

    V$RESOURCE_LIMIT vollständig anzeigen
    SELECT *
    FROM v$resource_limit;

    3. Praxisabfrage

    V$RESOURCE_LIMIT - typisches Beispiel
    SELECT resource_name, current_utilization, max_utilization, initial_allocation, limit_value FROM v$resource_limit ORDER BY resource_name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$RESOURCE_LIMIT.

    Weiterlernen: Verwandte Abfrage zu V$RESOURCE_LIMIT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SERVICES – Logische Datenbankservices. Diagnose und Parameter Momentaufnahme
    Kategorie:
    Diagnose und Parameter
    Datencharakter:
    Momentaufnahme

    V$SERVICES zeigt den Laufzeitkontext der aktuellen Instanz. INST_ID wird dieser V$-View nicht pauschal zugeschrieben.
    Typische Verwendung:
    Registrierte Services und Serviceziele prüfen.

    1. Wichtige Spalten

    SpalteBedeutung
    NETWORK_NAMENetzwerkname des Datenbankservice.

    2. Alle Spalten der View

    V$SERVICES vollständig anzeigen
    SELECT *
    FROM v$services;

    3. Praxisabfrage

    V$SERVICES - typisches Beispiel
    SELECT name, network_name, creation_date, goal, clb_goal, aq_ha_notification FROM v$services ORDER BY name;
    Einordnung: View-Nachschlagekarte. Die Fachlogik wird im zuständigen Kapitel erklärt.

    Spaltenreferenz: Die Tabelle erläutert ausgewählte Felder. Vollständige Spalten, Statuswerte und Versionshinweise: Oracle 19c: V$SERVICES.

    Weiterlernen: Verwandte Abfrage zu V$SERVICES mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$CONTAINERS – Container einschließlich Root und PDBs im sichtbaren Kontext.Momentaufnahme

    1. Wichtige Spalten

    SpalteBedeutung
    CON_IDContainerkennung.
    OPEN_MODEAktueller Öffnungszustand, etwa MOUNTED oder READ WRITE.
    RESTRICTEDYES: eingeschränkter Zugang; keine Aussage über Objektrechte.

    2. Alle Spalten der View

    Alle Spalten
    SELECT *
    FROM v$containers;

    3. Praxisabfrage

    Praxisabfrage
    SELECT con_id, name, open_mode, restricted
    FROM v$containers
    ORDER BY con_id;

    Was bedeutet das Ergebnis? Die Abfrage öffnet keine PDB. Der verbundene Container und die Rechte begrenzen die Sicht; fehlende Daten im falschen Kontext sind kein Bestandsnachweis.

    Im Fachkapitel nachlesen

    Oracle 19c: V$CONTAINERS

    Weiterlernen: Verwandte Abfrage zu V$CONTAINERS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$PDBS – Sichtbare PDBs und ihr aktueller Öffnungszustand.Momentaufnahme

    1. Wichtige Spalten

    SpalteBedeutung
    CON_IDContainerkennung.
    OPEN_MODEAktueller Öffnungszustand, etwa MOUNTED oder READ WRITE.
    RESTRICTEDYES: eingeschränkter Zugang; keine Aussage über Objektrechte.

    2. Alle Spalten der View

    Alle Spalten
    SELECT *
    FROM v$pdbs;

    3. Praxisabfrage

    Praxisabfrage
    SELECT con_id, name, open_mode, restricted
    FROM v$pdbs
    ORDER BY con_id;

    Fiktive Beispielausgabe:

    Eigenständiges Lernbeispiel; bei umfangreichen Listen ein Zeilenausschnitt. NULL kennzeichnet fehlende Werte. Zahlen- und Datumsdarstellung können im SQL-Client abweichen.

    CON_IDNAMEOPEN_MODERESTRICTED
    2PDB$SEEDREAD ONLYNO
    3APPPDBREAD WRITENO

    Was sehe ich hier? Im CDB-Root werden hier die Vorlage und die geöffnete Anwendungs-PDB sichtbar. Die Sicht aus einer PDB ist eingeschränkt.

    Was bedeutet das Ergebnis? Die Abfrage öffnet keine PDB. Der verbundene Container und die Rechte begrenzen die Sicht; fehlende Daten im falschen Kontext sind kein Bestandsnachweis.

    Im Fachkapitel nachlesen

    Oracle 19c: V$PDBS

    Weiterlernen: Verwandte Abfrage zu V$PDBS mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$SYS_TIME_MODEL – Zeitmodellwerte der Instanz.Kumuliert seit Instanzstart

    1. Wichtige Spalten

    SpalteBedeutung
    STAT_NAMEName des Zeitmodellwerts.
    VALUEZeit in Mikrosekunden; Ausgabe hier in Sekunden.

    2. Alle Spalten der View

    Alle Spalten
    SELECT *
    FROM v$sys_time_model;

    3. Praxisabfrage

    Praxisabfrage
    SELECT stat_name, ROUND(value/1000000,3) AS seconds
    FROM v$sys_time_model
    WHERE stat_name IN ('DB time', 'DB CPU', 'background elapsed time')
    ORDER BY stat_name;

    Was bedeutet das Ergebnis? DB time summiert aktive Foreground-Zeit und kann die Wanduhrzeit überschreiten. Verschachtelte Zeitmodellwerte nicht einfach addieren; für ein Messfenster Differenzen verwenden.

    Im Fachkapitel nachlesen

    Fiktive Beispielausgabe:

    Auszug mit erfundenen Lernwerten; keine Messung einer realen Datenbank.

    STAT_NAMESECONDS
    DB CPU90
    DB time120
    background elapsed time15

    Was sehe ich hier? Die Werte sind kumuliert. DB time und Background-Zeit werden getrennt gelesen; die Zahlen sind keine Aussage über die letzten 60 Sekunden.

    Oracle 19c: V$SYS_TIME_MODEL

    V$UNDOSTAT – Undo-Verbrauch und Retention je Messintervall.Intervallstatistik

    1. Wichtige Spalten

    SpalteBedeutung
    UNDOBLKSIm Intervall verbrauchte Undo-Blöcke.
    MAXQUERYLENLängste Abfragedauer im Intervall in Sekunden.
    TUNED_UNDORETENTIONVon Oracle ermittelte Undo-Aufbewahrungsdauer in Sekunden.

    2. Alle Spalten der View

    Alle Spalten
    SELECT *
    FROM v$undostat;

    3. Praxisabfrage

    Praxisabfrage
    SELECT begin_time, end_time, undoblks, maxquerylen, tuned_undoretention
    FROM v$undostat
    ORDER BY begin_time DESC
    FETCH FIRST 12 ROWS ONLY;

    Was bedeutet das Ergebnis? Dies sind Intervallwerte, keine seit Start summierten Zähler. Die ermittelte Retention garantiert nicht jede gewünschte historische Zeilenversion.

    Im Fachkapitel nachlesen

    Oracle 19c: V$UNDOSTAT

    Weiterlernen: Verwandte Abfrage zu V$UNDOSTAT mit fiktiver Ausgabe und Auswertung. Filter und Spalten können von dieser Nachschlageabfrage abweichen.

    V$TEMPSEG_USAGE – Aktuelle temporäre Segmentnutzung.Momentaufnahme

    1. Wichtige Spalten

    SpalteBedeutung
    SESSION_ADDRAdresse der nutzenden Session; mit V$SESSION.SADDR zuordnen.
    SESSION_NUMSessionseriennummer; beim Join SERIAL# berücksichtigen.
    BLOCKSBelegte Blöcke des temporären Segments; für Bytes die passende Blockgröße benötigen.

    2. Alle Spalten der View

    Alle Spalten
    SELECT *
    FROM v$tempseg_usage;

    3. Praxisabfrage

    Praxisabfrage
    SELECT username, session_addr, session_num, con_id,
           sql_id_tempseg AS temp_sql_id, sql_id, tablespace, segtype, blocks
    FROM v$tempseg_usage
    ORDER BY blocks DESC;

    Was bedeutet das Ergebnis? BLOCKS sind keine MiB. Nutzung kann sich während der Abfrage ändern. Eine leere Liste beweist weder fehlende TEMP-Dateien noch, dass vorher kein Spill auftrat.

    Im Fachkapitel nachlesen

    Oracle 19c: V$TEMPSEG_USAGE

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Dynamic Performance Views liefern Einblicke in den Betriebszustand, etwa zu Sessions, SQL, Speicher und Waits. Sie ergänzen die Metadatensicht des Data Dictionary.
    2. Jede Spalte besitzt einen eigenen Zeitbezug und eine eigene Einheit. Momentanwerte, kumulierte Zähler und Intervallwerte müssen entsprechend unterschiedlich ausgewertet werden.
    3. Für kumulierte Werte werden vergleichbare Messpunkte benötigt. Neustarts oder andere Zurücksetzungen können einen einfachen Differenzvergleich ungültig machen.
    4. Die zugrunde liegenden Informationen können sich während der Abfrage ändern. Oracle garantiert hier nicht dieselbe Read Consistency wie bei gewöhnlichen Tabellen.
    5. Session-, Prozess-, SQL- und Containeridentität müssen bei der Verknüpfung zusammenpassen. Ein fehlender Join-Partner oder einzelner auffälliger Wert wird deshalb im zeitlichen und fachlichen Kontext geprüft.

    Lernzielkontrolle

    Erkläre zuerst deinen Befund und den nächsten Prüfschritt. Öffne danach die begründete Lösung.
    Frage 1: Was unterscheidet eine Sessionzeile von einem Systemzähler?

    Lösung: Die Sessionzeile beschreibt einen gemeldeten Zustand. Ein Systemzähler summiert Ereignisse oder Arbeit und braucht für einen Zeitraum passende Differenzen.

    Frage 2: Warum gehört STARTUP_TIME zu einem Zählervergleich?

    Lösung: Ein Neustart kann die Zählerbasis ändern. Werte aus verschiedenen Instanzlebenszyklen sind keine gültige einfache Differenz.

    Frage 3: Belegt SOFAR kleiner TOTALWORK allein einen gerade fortschreitenden Vorgang?

    Lösung: Nein. Prüfe Sessionidentität, LAST_UPDATE_TIME und eine zweite Messung. Die Prozentzahl bezieht sich auf die gemeldete Operation.

    Frage 4: Welche SQL_ID benennt den Erzeuger eines temporären Segments?

    Lösung: SQL_ID_TEMPSEG in V$TEMPSEG_USAGE. Sie ist von der aktuell in der Session angezeigten SQL_ID zu unterscheiden.

    52. Weitere Oracle-Technologien im Überblick

    Begriffe einordnen, Einsatzmöglichkeiten verstehen und die passende Rückfrage stellen.

    Lernkompass
    Einfach gesagt Rund um die Datenbank gibt es Werkzeuge für Verfügbarkeit, Datenverteilung, Überwachung und Anwendungen.
    Warum ist das wichtig? Ähnliche Produktnamen lösen oft sehr unterschiedliche Aufgaben.
    Nach diesem Kapitel Du kannst Zweck und Grenzen wichtiger Technologien erklären und sie einem einfachen Einsatzfall zuordnen.

    Einführung: Rund um Oracle Database gibt es Technologien für unterschiedliche Aufgaben: Überwachung, Speicherverwaltung, Hochverfügbarkeit, Replikation und Anwendungsentwicklung. Ähnliche Produktbeschreibungen können dabei unterschiedliche technische Ziele verdecken. Zunächst ist wichtig, welches Problem ein Baustein löst und wie er sich von den anderen unterscheidet.

    Das Kapitel ordnet die Produkte anhand ihrer Aufgabe ein und erklärt anschließend jeweils Grundidee, Einsatzgebiet und Grenzen. Die bestehende Gegenüberstellung verbindet die Einzelbeschreibungen, insbesondere bei RAC, Data Guard und GoldenGate. Es geht um Architekturverständnis, nicht um eine Installationsanleitung. Datenbankedition, Plattform und die eigenständige Version eines Zusatzprodukts bleiben für einen konkreten Einsatz gesondert zu prüfen.

    Oracle 19c: fachliche Grundlage

    Einordnung für Oracle 19c Standard Edition 2

    RAC und Oracle Data Guard stehen im hier betrachteten lokalen Oracle-19c-SE2-Angebot nicht als Datenbankfunktionen zur Verfügung. Ihre Beschreibung dient dem Verständnis anderer Architekturen. Ein VCS-Failover einer einzelnen Instanz ist deshalb kein RAC. VCS verwaltet Ressourcen nach seinem eigenen Betriebskonzept; Oracle Clusterware darf nicht einfach als gleiches Werkzeug vorausgesetzt werden.

    ASM ist wiederum Speicherverwaltung, keine Aussage über die Anzahl gleichzeitig laufender Datenbankinstanzen. Für ein konkretes Vorhaben bleiben Edition, Plattform und separat angebotene Produkte entscheidend. Oracle 19c: Funktionsmatrix.

    1. Zuerst die Aufgabe, dann der Produktname

    FragestellungTechnologie zur Einordnung
    Ausgewählte Daten laufend an ein anderes System übertragenGoldenGate
    Viele Datenbanken zentral beobachten und verwaltenEnterprise Manager
    Eine Datenbank über mehrere aktive Instanzen betreibenRAC
    Eine Standby-Datenbank für einen Ausfall bereithaltenData Guard
    Clusterressourcen und Datenbankspeicher organisierenGrid Infrastructure / ASM
    Eine auf Oracle spezialisierte Datenbankplattform einsetzenExadata
    Eine datenbankgestützte Webanwendung entwickelnAPEX

    Die Zuordnung ist eine Orientierung, keine Produktempfehlung. Häufig ergänzen sich mehrere Bausteine. Überwachung, Hochverfügbarkeit, Replikation und Datensicherung bleiben dabei unterschiedliche Aufgaben.

    2. Oracle GoldenGate – Änderungen zwischen Systemen übertragen

    Was ist das? GoldenGate überträgt Datenänderungen aus einer Quelle an ein Ziel. Das Erfassen laufender Änderungen nennt man Change Data Capture, kurz CDC. Je nach unterstützter Kombination können auch unterschiedliche Datenbanksysteme beteiligt sein.

    Wofür wird es gebraucht? Typische Aufgaben sind die Versorgung eines Berichtssystems, Datenintegration und Migrationen mit verkürzter Umschaltphase.

    Allgemeines Beispiel: Neue Bestellungen werden im Verkaufssystem erfasst. GoldenGate überträgt die ausgewählten Änderungen an eine separate Auswertungsdatenbank, damit dort aktuelle Berichte entstehen.

    Wichtige Einordnung: Eine Erstbefüllung und die anschließende Änderungsübertragung müssen zusammenpassen. Übertragung kann verzögert sein; unterstützte Objekte und Datentypen sind zu prüfen. Beidseitiges Schreiben verlangt Konfliktregeln. Replikation ist kein historisches Backup und kann auch unerwünschte Änderungen weitergeben.

    Die erste Rückfrage: Welche Daten sollen wohin gelangen, wie aktuell müssen sie sein und welches System darf sie ändern?

    Offizielle Oracle-Übersicht (Oracle GoldenGate 21.3)

    3. Oracle Enterprise Manager – eine zentrale Betriebssicht

    Was ist das? Enterprise Manager Cloud Control ist eine Plattform zur Überwachung und Verwaltung vieler Ziele, etwa Datenbanken und Hosts. Ein Management Agent sammelt Informationen; Management Service und Repository verarbeiten und speichern sie für die zentrale Oberfläche.

    Wofür wird es gebraucht? Teams erhalten eine gemeinsame Sicht auf Zustände, Meldungen und Trends und können passende Verwaltungsaufgaben organisieren.

    Allgemeines Beispiel: Ein Betriebsteam betreut zwanzig Datenbanken. Statt jeden Host einzeln zu prüfen, sieht es zentral einen ausgefallenen Job und kann anschließend die betroffene Datenbank untersuchen.

    Wichtige Einordnung: Der Name Cloud Control bedeutet nicht, dass alle verwalteten Datenbanken in einer öffentlichen Cloud liegen müssen. Eine grüne Anzeige ersetzt keine fachliche Prüfung. Aktualität, Messabstände und Verfügbarkeit der Überwachung zählen ebenfalls. Bestimmte Funktionen gehören zu gesonderten Management Packs.

    Die erste Rückfrage: Welche Ziele und Kennzahlen werden tatsächlich überwacht, wie aktuell sind sie und wer reagiert auf eine Meldung?

    Offizielle Oracle-Übersicht (Oracle Enterprise Manager 13.5)

    4. Oracle RAC – mehrere Instanzen, eine Datenbank

    Was ist das? Real Application Clusters ermöglicht mehreren Instanzen auf verschiedenen Servern den Zugriff auf eine gemeinsame Oracle-Datenbank. Jede Instanz besitzt eigene Prozesse und Speicherbereiche; die Datenbankdateien werden gemeinsam verwendet.

    Wofür wird es gebraucht? RAC dient hoher Verfügbarkeit bei bestimmten Server-/Instanzausfällen und kann die Verteilung geeigneter Last unterstützen.

    Allgemeines Beispiel: Zwei Server bedienen die Bestelldatenbank eines Handelsunternehmens. Fällt eine Instanz aus, kann die verbleibende Instanz weiterhin Arbeit übernehmen.

    Wichtige Einordnung: Betroffene Verbindungen und laufende Transaktionen können trotzdem unterbrochen werden. Services, Treiber und Anwendungsverhalten gehören zur Verfügbarkeitsplanung. Mehr Knoten beschleunigen nicht automatisch jede Abfrage. RAC allein ist kein unabhängiges Backup und kein vollständiger Schutz gegen jeden Standortausfall.

    Die erste Rückfrage: Welche Ausfälle sollen überstanden werden und wie verhält sich die Anwendung beim Verlust einer Verbindung?

    Offizielle Oracle-Übersicht

    5. Oracle Data Guard – eine Standby-Datenbank bereithalten

    Was ist das? Data Guard hält eine oder mehrere Standby-Datenbanken zu einer primären Oracle-Datenbank aktuell. Bei einer physischen Standby werden Redo-Daten übertragen und angewendet.

    Wofür wird es gebraucht? Es unterstützt Ausfallschutz und geplante Rollenwechsel, etwa zwischen Standorten.

    Allgemeines Beispiel: Die Bestelldatenbank läuft am Hauptstandort. Eine Standby an einem zweiten Standort soll bei einem Ausfall die produktive Rolle übernehmen können.

    Wichtige Einordnung: Erreichbare Wiederanlaufzeit und möglicher Datenverlust hängen von Betriebsart, Übertragungsstand und Umschaltverfahren ab. Automatisches Failover benötigt eine passende Einrichtung. Active Data Guard erweitert die Möglichkeiten, beispielsweise Lesen auf einer physischen Standby während Redo Apply. Eine Standby ersetzt keine unabhängige Datensicherung.

    Die erste Rückfrage: Wie viel Ausfallzeit und Datenverlust sind akzeptabel, und wurde der Rollenwechsel einschließlich der Anwendung getestet?

    Offizielle Oracle-Übersicht

    6. Grid Infrastructure – den Unterbau organisieren

    Was ist das? Oracle Grid Infrastructure bündelt Infrastrukturkomponenten. Im Cluster gehören Oracle Clusterware und ASM dazu. Für einen einzelnen Server gibt es Grid Infrastructure mit Oracle Restart und ASM.

    Wofür wird es gebraucht? Clusterware verwaltet Clusterressourcen und ihre Abhängigkeiten. Oracle Restart übernimmt entsprechende Überwachungs- und Neustartaufgaben für konfigurierte Ressourcen eines Einzelservers.

    Allgemeines Beispiel: Nach einem Serverneustart müssen Speicherkomponenten, Datenbank und Services in passender Reihenfolge bereitstehen. Die Infrastruktur kennt dafür konfigurierte Abhängigkeiten.

    Wichtige Einordnung: Grid Infrastructure ist kein weiteres Anwendungsschema. Ein laufender Clusterprozess beweist nicht, dass jede Datenbankressource gesund ist. Auch Clusterware und RAC sind nicht derselbe Begriff: Die Infrastruktur und die Datenbankfunktion erfüllen verschiedene Aufgaben.

    Die erste Rückfrage: Welche Komponente verwaltet die betreffende Ressource – Clusterware, Oracle Restart oder ein anderes Betriebskonzept?

    Offizielle Oracle-Übersicht

    7. Oracle ASM – Datenbankdateien auf Speicher verteilen

    Was ist das? Automatic Storage Management verwaltet Oracle-Dateien in Disk Groups. Es übernimmt die Verteilung auf Speichergeräte und kann je nach Redundanzkonfiguration Spiegelung bereitstellen.

    Wofür wird es gebraucht? ASM vereinfacht die Verwaltung des Datenbankspeichers, unter anderem beim Hinzufügen oder Entfernen von Speicherkapazität.

    Allgemeines Beispiel: Eine Datenbank speichert ihre Dateien in der Disk Group DATA. Zusätzlicher Speicher wird in diese Gruppe aufgenommen; ASM verteilt die Belegung im Rahmen eines Rebalancing neu.

    Wichtige Einordnung: Ein Name wie +DATA ist kein gewöhnlicher Unix-Verzeichnispfad. ASM kann auch mit einer einzelnen Datenbankinstanz eingesetzt werden und bedeutet deshalb nicht automatisch RAC. Spiegelung schützt nicht gegen jede Fehlbedienung und ersetzt kein Backup.

    Die erste Rückfrage: Welche Disk Group enthält die Datei, welche Redundanz ist eingerichtet und wo liegen die tatsächlichen Ausfallgrenzen?

    Offizielle Oracle-Übersicht

    8. Oracle Exadata – eine spezialisierte Datenbankplattform

    Was ist das? Exadata kombiniert Datenbankserver, Netzwerk, Speicherserver und Software als auf Oracle Database abgestimmte Plattform. Die Speicherschicht kann bei geeigneten Operationen einen Teil der Verarbeitung übernehmen.

    Wofür wird es gebraucht? Einsatzfälle sind anspruchsvolle Datenbanklasten und die Konsolidierung mehrerer Datenbanken auf einer gemeinsamen Plattform.

    Allgemeines Beispiel: Ein Unternehmen betreibt viele Transaktionsdatenbanken und umfangreiche Auswertungen. Es untersucht, ob eine gemeinsame spezialisierte Plattform seine Leistungs- und Betriebsanforderungen erfüllt.

    Wichtige Einordnung: Exadata ist weder eine zusätzliche Tabellenart noch ein Schalter, der jede langsame SQL-Anweisung repariert. Datenmodell, Ausführungspläne und konkurrierende Last bleiben relevant. Die Plattform bringt eigene Betriebs- und Kapazitätsaufgaben mit.

    Die erste Rückfrage: Welche konkrete Last soll profitieren und welche Anforderungen bestehen an Betrieb, Kapazität und Verfügbarkeit?

    Offizielle Oracle-Übersicht

    9. Oracle APEX – aus Daten eine Webanwendung machen

    Was ist das? APEX ist eine Low-Code-Plattform für datenbankgestützte Webanwendungen. Seiten, Formulare und Berichte werden überwiegend deklarativ zusammengestellt; SQL und bei Bedarf weiterer Code ergänzen die Funktionen.

    Wofür wird es gebraucht? Geeignet sind beispielsweise interne Erfassungsanwendungen, Verwaltungsoberflächen und Berichte.

    Allgemeines Beispiel: Ein Team benötigt eine browserbasierte Anwendung für Artikel, Lieferanten und Bestellfreigaben. APEX stellt die Oberfläche bereit, die Daten liegen in Oracle Database.

    Wichtige Einordnung: APEX ist keine Cluster- oder Backuptechnologie. Weniger selbst geschriebener Oberflächencode beseitigt nicht die Verantwortung für Datenmodell, Berechtigungen und verständliche Geschäftsregeln. Die Grundlagen des Webzugangs erklärt das API-/REST-Kapitel.

    Die erste Rückfrage: Wer darf welche Daten sehen und verändern, und welche Arbeitsschritte soll die Anwendung unterstützen?

    Offizielle Oracle-Übersicht

    10. RAC, Data Guard und GoldenGate auseinanderhalten

    TechnologieGrundideeBeispielaufgabe
    RACMehrere Instanzen greifen auf dieselbe Datenbank zu.Bestimmte Server-/Instanzausfälle abfangen.
    Data GuardEine separate Standby wird zur primären Datenbank nachgeführt.Eine Übernahme an einem anderen Standort vorbereiten.
    GoldenGateAusgewählte Änderungen werden an Zielsysteme repliziert.Eine Auswertungsdatenbank laufend versorgen.

    Diese Technologien können zusammen eingesetzt werden. Ein RAC-System kann zusätzlich eine Data-Guard-Standby besitzen; GoldenGate kann ausgewählte Daten daraus oder aus der primären Umgebung in andere Systeme übertragen, sofern die konkrete Kombination unterstützt wird. Keine dieser Bezeichnungen sagt allein etwas über einen erfolgreich getesteten Wiederanlauf aus.

    11. Ein Beispiel – mehrere Aufgaben, unterschiedliche Bausteine

    Ein Onlinehandel möchte seine Bestelldatenbank bei einem Serverausfall weiterbetreiben, einen Standortausfall vorbereiten, Berichte getrennt ausführen und alle Systeme zentral überwachen. Als Orientierung ordnen wir zu: RAC zur ersten Anforderung, Data Guard zur zweiten, GoldenGate zur laufenden Datenversorgung der Berichte und Enterprise Manager zur gemeinsamen Betriebssicht. Das ist eine Lernzuordnung, noch keine fertige Architektur. Backup und Wiederherstellung bleiben ein eigener Bestandteil.

    12. Was vor einer tatsächlichen Einführung geklärt werden muss

    Lege zunächst Ziel, Datenumfang, zulässige Verzögerung, Ausfallzeit und Betriebsverantwortung fest. Danach prüfst du die unterstützten Kombinationen von Produktversion, Datenbankedition und Plattform. Die hier genannten Technologien sind nicht automatisch Bestandteil einer vorhandenen Oracle-Lizenz. Insbesondere RAC, Active Data Guard, GoldenGate und bestimmte Enterprise-Manager-Packs müssen passend zur konkreten Nutzung eingeordnet werden. Aus einem verfügbaren Menü oder installierten Programm folgt keine Nutzungsberechtigung.

    Das Wiki erklärt hier auch Technologien außerhalb einer einfachen Einzelinstanzumgebung. Die Übersicht ist daher keine Aussage, dass alle Funktionen in Standard Edition 2 verfügbar wären. Oracle Database 19c: Editionen und Funktionsumfang.

    Geltungsbereich: APEX, ORDS, Enterprise Manager und GoldenGate besitzen eigenständige Produktversionen. Die Datenbankversion 19c bestätigt nicht automatisch alle Funktionen dieser Produkte. Der Überblick ersetzt weder deren Produktdokumentation noch eine Prüfung der jeweiligen Verfügbarkeit und Lizenzierung.

    Zusammenfassung

    Die fünf Kernaussagen dieses Kapitels:
    1. Oracle-Produkte lösen unterschiedliche Aufgaben. Vor einer Auswahl muss klar sein, ob beispielsweise Hochverfügbarkeit, Datenübertragung, Administration oder Anwendungsentwicklung benötigt wird.
    2. RAC, Data Guard und GoldenGate sind nicht austauschbar. Sie behandeln mehrere Instanzen einer Datenbank, eine Standby-Datenbank beziehungsweise die Übertragung von Datenänderungen.
    3. Grid Infrastructure und ASM bilden Infrastruktur- und Speicherbausteine. Exadata ist eine spezialisierte Plattform, nicht bloß ein anderer Name für diese Einzelkomponenten.
    4. Enterprise Manager unterstützt die Verwaltung und Überwachung; APEX die Entwicklung von Anwendungen. Ihr Zweck unterscheidet sich damit von den Verfügbarkeits- und Replikationsverfahren.
    5. Vor einer Einführung werden technische Voraussetzungen, Produktversion, Edition, Lizenzierung und betrieblicher Aufwand geprüft. Ein im Überblick beschriebenes Produkt ist nicht automatisch in jeder 19c-Umgebung verfügbar oder nutzbar.

    Lernzielkontrolle

    Beantworte die Fragen zuerst ohne die Lösung zu öffnen.
    Frage 1: Warum sind RAC und Data Guard nicht dasselbe?

    Lösung: RAC verwendet mehrere Instanzen für eine gemeinsame Datenbank. Data Guard pflegt eine separate Standby zur primären Datenbank. Die beiden Ansätze adressieren unterschiedliche Ausfallszenarien und können sich ergänzen.

    Frage 2: Welche Technologie passt zur laufenden Übertragung ausgewählter Bestelldaten an ein Berichtssystem?

    Lösung: GoldenGate ist dafür ein möglicher Baustein. Vor einer Entscheidung müssen unterstützte Daten, Erstbefüllung und zulässige Übertragungsverzögerung geklärt werden.

    Frage 3: Muss eine durch Enterprise Manager Cloud Control überwachte Datenbank in einer öffentlichen Cloud liegen?

    Lösung: Nein. Cloud Control kann auch Datenbanken und Hosts im eigenen Rechenzentrum überwachen und verwalten. Der Produktname legt den Standort der Ziele nicht fest.

    Frage 4: Bedeutet ASM automatisch RAC?

    Lösung: Nein. ASM ist Speicherverwaltung und kann auch bei einer einzelnen Datenbankinstanz eingesetzt werden. RAC beschreibt den Zugriff mehrerer Instanzen auf eine Datenbank.

    Frage 5: Ersetzt Replikation eine unabhängige Sicherung?

    Lösung: Nein. Unerwünschte Änderungen können weitergegeben werden. Eine Wiederherstellung auf einen früheren Stand benötigt ein passend geplantes und getestetes Schutzkonzept.

    Frage 6: Wofür würden APEX und Exadata in unserem Beispiel stehen?

    Lösung: APEX wäre ein Werkzeug für die Webanwendung. Exadata wäre eine mögliche Datenbankplattform. Beide Begriffe liegen auf unterschiedlichen Ebenen und lösen nicht dieselbe Aufgabe.

    Frage 7: Ist ein VCS-Failover einer Einzelinstanz dasselbe wie RAC?

    Lösung: Nein. Beim Failover wird eine Ressource nach dem Clusterbetriebskonzept übernommen. RAC betreibt mehrere Instanzen für dieselbe Datenbank. Die Technologien dürfen nicht gleichgesetzt werden.

    Frage 8: Welche zwei Fragen klärst du vor einer Produktauswahl?

    Lösung: Zuerst die konkrete Aufgabe und das erwartete Verhalten bei Ausfällen. Danach die unterstützte Kombination aus Produkt, Version, Edition und Plattform samt Nutzungsrechten.

    53. Glossar und Abkürzungen

    Kurzreferenz mit 186 eindeutigen Oracle-, SQL-, Netzwerk-, Speicher-, Performance- und Recovery-Begriffen.

    Lernkompass
    Einfach gesagt Hier werden Abkürzungen und Fachbegriffe kurz und ohne langen Umweg erklärt.
    Warum ist das wichtig? Nutze das Glossar, wenn ein Begriff beim Lesen bremst.
    Nach diesem Kapitel Du kannst unbekannte Begriffe schnell klären und anschließend im Fachkapitel weiterlesen.

    Einführung: Das Glossar erklärt Fachbegriffe und Abkürzungen in kurzer Form. Es unterstützt dich dort, wo ein unbekanntes Wort das Verständnis eines Satzes unterbricht. Eine Definition ordnet den Begriff einer Aufgabe zu; sie enthält jedoch nicht alle Voraussetzungen, Betriebsfolgen oder Ausnahmen eines vollständigen Fachkapitels.

    Suche den Begriff, lies seine Bedeutung und kehre anschließend zur ursprünglichen Erklärung zurück. Die Wiki-Suche berücksichtigt auch ausgeschriebene Bezeichnungen. Wenn die Kurzdefinition nicht reicht, vertiefe den Zusammenhang im zugehörigen Kapitel. So nutzt du das Glossar als Orientierung beim Lesen, während Befehle und Diagnoseentscheidungen weiterhin im fachlichen Kontext bleiben.

    Oracle 19c: fachliche Grundlage

    A-Rows
    Tatsächlich erfasste Ausgabezeilen eines Planschritts. Statistikumfang und Starts müssen zum Vergleich mit E-Rows passen.
    ACID
    Atomicity, Consistency, Isolation und Durability; Grundeigenschaften verlässlicher Transaktionen.
    ACL
    Access Control List (Zugriffskontrollliste); zusätzliche, datei- oder verzeichnisspezifische Regeln, mit denen sich Zugriffe gezielt für Benutzer oder Gruppen festlegen lassen. POSIX-ACLs und NFSv4-ACLs unterscheiden sich in Aufbau und Auswertung.
    ADDM
    Automatic Database Diagnostic Monitor; automatische AWR-basierte Performanceanalyse, lizenzabhängig.
    ADR
    Automatic Diagnostic Repository; zentrale Ablage für Alert Log, Traces, Incidents und weitere Diagnoseinformationen.
    ADRCI
    ADR Command Interpreter; Kommandozeilenwerkzeug zum Lesen und Verwalten von Diagnoseinformationen im ADR.
    AFD
    ASM Filter Driver; Oracle-Komponente zur Kennzeichnung und Absicherung von ASM-Datenträgern.
    AL32UTF8
    Oracle-Zeichensatz auf Basis von UTF-8; unterstützt den vollständigen Unicode-Zeichenraum.
    AMM
    Automatic Memory Management; gemeinsame automatische Verwaltung von SGA und PGA über MEMORY_TARGET.
    API
    Application Programming Interface; definierte Schnittstelle, über die Programme Funktionen oder Daten austauschen.
    ARCHIVELOG
    Datenbankmodus, in dem abgeschlossene Online-Redo-Sequenzen archiviert werden. Das unterstützt Media Recovery; auch ein vorzeitig ausgelöster Logwechsel kann eine noch nicht volle Gruppe abschließen.
    ARCn
    Archiver-Prozesse; archivieren abgeschlossene Online-Redo-Sequenzen im ARCHIVELOG-Modus.
    ASH
    Active Session History; Historie aktiver Sessions in kurzen Intervallen, lizenzabhängig.
    ASM
    Automatic Storage Management; Oracle-eigene Verwaltung von Datenbankdateien und Diskgroups.
    ASMM
    Automatic Shared Memory Management; automatische Verteilung des Speichers innerhalb der SGA über SGA_TARGET.
    ASSM
    Automatic Segment Space Management; verwaltet freien Segmentplatz über Bitmaps.
    Autonomous Transaction
    Eigenständige Transaktion, die unabhängig von der aufrufenden Transaktion bestätigt oder zurückgenommen wird. Ihr COMMIT wird durch ein späteres ROLLBACK des Aufrufers nicht rückgängig gemacht.
    AWR
    Automatic Workload Repository; historische Performance-Snapshots, lizenzabhängig.
    BCT
    Block Change Tracking; zeichnet geänderte Blöcke für effizientere inkrementelle Backups auf. In Oracle Database 19c SE2 nicht verfügbar.
    Bigfile Tablespace
    Tablespace mit genau einer Daten- oder temporären Datei. Der Typ ermöglicht große Dateien; die Datei muss nicht bereits groß angelegt sein.
    Bind Variable
    Platzhalter in SQL, dessen Wert zur Laufzeit gebunden wird; verbessert oft Cursor-Wiederverwendung.
    Bitmap Index
    Index, der Werte als Bitmaps abbildet; typischerweise für niedrig kardinale, wenig geänderte Daten geeignet.
    BLOB
    Binary Large Object; LOB-Datentyp für große binäre Inhalte.
    Block
    Kleinste von Oracle verwaltete Speicher- und I/O-Einheit innerhalb eines Datafiles.
    Buffer Cache
    SGA-Bereich, der gelesene und geänderte Datenblöcke im Speicher hält.
    Buffer Gets
    Gezählte logische Blockzugriffe; derselbe Block kann mehrfach gezählt werden. Die Zahl ist keine Anzahl unterschiedlicher Blöcke und keine direkte physische I/O-Menge.
    Cardinality
    Zeilenanzahl im betrachteten Zusammenhang. Im geschätzten Plan bedeutet CARDINALITY beziehungsweise E-Rows eine Schätzung; A-Rows weist getrennt die tatsächlich erfassten Zeilen aus.
    CBO
    Cost Based Optimizer; wählt anhand von Statistiken und Kosten einen Ausführungsplan.
    CDB
    Container Database; Multitenant-Container für Root, Seed und PDBs.
    Checkpoint
    Markiert einen Recovery-Fortschritt anhand einer Checkpoint-SCN. CKPT aktualisiert Checkpoint-Informationen; DBWn schreibt die erforderlichen Dirty Buffers in die Datafiles.
    Child Cursor
    Spezialisierte Ausprägung eines Parent Cursors, zum Beispiel wegen unterschiedlicher Bind-, Optimizer- oder Umgebungsbedingungen.
    CJQ0
    Job Queue Coordinator; koordiniert Oracle Scheduler- und Job-Queue-Prozesse.
    CKPT
    Checkpoint-Prozess; koordiniert Checkpoints und aktualisiert Datei-Header.
    CLOB
    Character Large Object; LOB-Datentyp für große Zeichendaten.
    Clustering Factor
    Indexstatistik zum Zusammenhang zwischen Indexreihenfolge und Tabellenblockverteilung; im Verhältnis zu Tabellenblöcken und Zeilenzahl bewerten.
    COMMIT
    Bestätigt die Transaktion. Bei synchroner Bestätigung wird das notwendige Schreiben von Redo abgewartet; COMMIT WRITE NOWAIT kann vorher zurückmelden.
    Connection Pool
    Vorrat wiederverwendbarer Verbindungen. Ausgeliehen/frei im Pool und ACTIVE/INACTIVE in V$SESSION sind unterschiedliche Zustände.
    Consistent Get
    Logischer Blockzugriff unter Beachtung von Read Consistency; kann Undo zur Rekonstruktion einer älteren Blockversion verwenden.
    Controlfile
    Zentrale Verwaltungsdatei mit Struktur-, SCN-, Checkpoint- und Dateiinformationen.
    Cursor
    Kontext für das Verarbeiten einer SQL-Anweisung. Private Cursor- und Sessionzustände sind von gemeinsam nutzbaren SQL-Strukturen und deren Child Cursors zu unterscheiden.
    Datafile
    Physische Datei, die Datenblöcke eines oder mehrerer Segmente eines Tablespaces enthält.
    DB CPU
    Teil der DB Time, den Foreground-Sessions tatsächlich auf CPU verbringen.
    DB Time
    Aufsummierte aktive Zeit der Foreground-Sessions für Datenbankaufrufe. Sie umfasst CPU und relevante Nicht-Idle-Wartezeit; Background-Zeit wird gesondert erfasst.
    DBID
    Eindeutige numerische Kennung einer Oracle-Datenbank; besonders wichtig für RMAN und Recovery.
    DBMS_SCHEDULER
    Oracle-Paket und Framework zum Planen, Ausführen und Überwachen von Jobs.
    DBMS_STATS
    Oracle-Paket zum Sammeln und Verwalten von Optimizer-Statistiken.
    DBWn / DBWR
    Database Writer, auch DBWR genannt; schreibt Dirty Buffers aus dem Buffer Cache in Datafiles.
    DCL
    Didaktische Bezeichnung für die Rechteverwaltung, insbesondere GRANT und REVOKE. Oracle ordnet diese Anweisungen formal der DDL zu.
    DDL
    Data Definition Language; strukturelle Befehle wie CREATE, ALTER, DROP und TRUNCATE.
    Dedicated Server
    Verbindungsmodell mit einem für die Clientverbindung zuständigen Serverprozess. Mehrere logische Sessions einer Verbindung sind möglich; Session, Verbindung und OS-Prozess sind deshalb nicht allgemein 1:1 gleichzusetzen.
    Direct Path Read
    I/O-Pfad, bei dem Daten unter bestimmten Bedingungen direkt in PGA-Speicher gelesen werden und den Buffer Cache umgehen können.
    Dirty Buffer
    Im Buffer Cache veränderter Datenblock, dessen aktuelle Version noch nicht in das Datafile geschrieben wurde.
    Disk Read
    Physischer Datenbank-Lesezugriff im jeweiligen Statistikbezug. Er muss nicht einem einzelnen mechanischen Plattenzugriff entsprechen; Storage-Caches und Direct-Path-Zugriffe sind zu berücksichtigen.
    DML
    Data Manipulation Language; Zugriff auf beziehungsweise Verarbeitung von Daten bestehender Schemaobjekte. Oracle zählt auch SELECT dazu. INSERT, UPDATE, DELETE und MERGE sind datenändernde Beispiele.
    DQL
    Didaktische Bezeichnung für lesende Abfragen, insbesondere SELECT. Oracle führt SELECT formal als begrenzte DML-Form.
    Dynamic Sampling
    Optimizer-Verfahren, bei dem Oracle zur Parse-Zeit zusätzliche Stichproben aus Objekten liest.
    E-Rows
    Vom Optimizer geschätzte Zeilenanzahl eines Planschritts; Kosten sind keine gemessene Laufzeit.
    Enqueue
    Oracle-Lock- und Synchronisationsmechanismus mit verschiedenen Locktypen und Modi.
    Extent
    Gruppe zusammenhängender Datenblöcke innerhalb einer Datei, die einem Segment zugeordnet ist.
    FK
    Foreign Key; Constraint für eine referentielle Beziehung von Child- zu Parent-Tabelle.
    FRA
    Fast Recovery Area; von Oracle verwalteter Speicherbereich für Recovery-relevante Dateien.
    Full Table Scan
    Zugriff auf die für den Scan relevanten Tabellenblöcke. Je nach Plan und Ausführung sind Mehrblock- und Direct-Path-Zugriffe möglich; ein Full Scan ist nicht grundsätzlich langsam.
    Funktion
    Routine mit definiertem Rückgabewert. Die Signatur allein beweist keine ausschließlich lesende Implementierung.
    Global Temporary Table
    Tabellendefinition mit sessions- oder transaktionsbezogenen temporären Daten.
    Hard Parse
    Neuaufbereitung einer Anweisung ohne Wiederverwendung einer geeigneten ausführbaren Fassung. Bei optimierbaren SQL-Anweisungen gehört die Optimierung dazu; nicht jede Anweisungsart durchläuft denselben Optimizerprozess.
    Hash Join
    Join-Verfahren, bei dem Oracle eine Hash-Struktur für eine Eingabemenge aufbaut und die andere dagegen prüft.
    High Water Mark
    Markierung im Segment, bis zu der Oracle Blöcke als bereits verwendet betrachtet.
    Hint
    Optionale Anweisung im SQL-Kommentar, mit der der Optimizer bei der Planwahl beeinflusst werden kann.
    Histogram
    Optimizer-Statistik zur Verteilung von Spaltenwerten; hilft bei ungleichmäßiger Datenverteilung.
    Incarnation
    RMAN-Begriff für eine Datenbank-Lebenslinie; nach OPEN RESETLOGS entsteht typischerweise eine neue Incarnation.
    Index Range Scan
    Indexzugriff, bei dem Oracle einen zusammenhängenden Wertebereich eines B-Tree-Index liest.
    Index Unique Scan
    Indexzugriff auf höchstens eine Zeile, typischerweise über einen eindeutigen Index.
    Instance
    Laufender Oracle-Teil aus SGA und Hintergrundprozessen. Eine Instanz kann bereits in NOMOUNT laufen, obwohl noch keine Datenbank gemountet oder geöffnet ist.
    Instance Recovery
    Automatische Recovery nach einem Instanzabbruch: Oracle wendet benötigtes Redo an, um die Datafiles auf einen konsistenten Stand zu bringen, und rollt anschließend nicht abgeschlossene Transaktionen mit Undo zurück.
    ITL
    Interested Transaction List; verwaltet konkurrierende Transaktionen im Blockheader.
    JDBC
    Java Database Connectivity; Java-Schnittstelle für Datenbankverbindungen.
    JSON
    JavaScript Object Notation; Textformat mit Objekten, Arrays und einfachen Werten. Gültige Syntax garantiert keine fachlich richtigen Daten.
    JSON-null
    Ausdrücklicher Nullwert in einem JSON-Dokument. Ein vorhandenes Feld mit JSON-null ist nicht dasselbe wie ein fehlendes Feld; SQL-NULL kann beide Fälle verdecken.
    JSON-Pfad
    Ausdruck wie $.positionen[0].artikel, der ein Feld oder Arrayelement beschreibt. JSON-Arraypositionen beginnen bei 0.
    JSON_TABLE
    Projiziert JSON-Daten auf virtuelle Ergebniszeilen und Spalten. Es entsteht durch den SELECT keine dauerhaft gespeicherte Tabelle.
    JSON_VALUE
    SQL/JSON-Funktion zum Lesen eines skalaren SQL-Werts. Fehlerbehandlung und RETURNING-Typ bestimmen, ob ein Fehler sichtbar wird oder SQL-NULL entsteht.
    Latch
    Leichtgewichtiger interner Schutz für gemeinsam genutzte Oracle-Speicherstrukturen.
    LGWR
    Log Writer; schreibt Redo aus dem Redo Log Buffer in Online Redo Logs.
    Library Cache
    Teil des Shared Pool für geparste SQLs, PL/SQL und weitere gemeinsam genutzte Objekte.
    Listener
    Oracle-Net-Prozess, der neue Client-Verbindungen annimmt und an passende Datenbankservices weiterleitet.
    LOB
    Large Object; Sammelbegriff für große Datenobjekte wie BLOB und CLOB.
    Log Switch
    Wechsel von einer Online-Redo-Log-Gruppe zur nächsten.
    Logical Read
    Logischer Zugriff auf einen Oracle-Block im Speicher; umfasst unter anderem Consistent Gets und Current Gets.
    LREG
    Listener Registration Process; registriert Datenbankservices dynamisch beim Listener.
    Materialized View
    Physisch gespeichertes Ergebnis einer Abfrage, das je nach Definition vollständig oder inkrementell aktualisiert werden kann.
    Media Recovery
    Recovery von Datenbankdateien nach Medien- oder Dateiverlust unter Verwendung von Backups und Redo.
    MiB
    Mebibyte: 1.048.576 Bytes. Eine Division durch 1024² ergibt MiB; MB im Dezimalsystem sind 1.000.000 Bytes.
    MMNL
    Manageability Monitor Light; unterstützt die Erfassung und Verarbeitung von Manageability-Daten.
    MMON
    Manageability Monitor; führt verschiedene Management- und Statistikaufgaben im Hintergrund aus.
    MTTR
    Mean Time To Recover; Ziel- beziehungsweise Schätzwert für die Dauer einer Instance Recovery.
    Mutex
    Feingranularer Synchronisationsmechanismus, unter anderem für Cursor und Library-Cache-Strukturen.
    MVCC
    Multiversion Concurrency Control; konsistente Lesezugriffe auf unterschiedliche Datenversionen.
    Nested Loops
    Join-Verfahren, bei dem für Zeilen einer Eingabe wiederholt auf die zweite Eingabe zugegriffen wird.
    NLS
    National Language Support; Oracle-Einstellungen für Sprache, Gebietsschema, Formate und Zeichensatzkontext.
    NOARCHIVELOG
    Datenbankmodus ohne reguläre Archivierung abgeschlossener Online-Redo-Sequenzen; begrenzt die Recovery-Möglichkeiten.
    NOMOUNT
    Startphase, in der die Instanz gestartet ist, das Controlfile aber noch nicht geöffnet wurde.
    OCI
    Oracle Call Interface; native Programmierschnittstelle für Oracle-Verbindungen.
    Optimizer
    Oracle-Komponente, die für SQL einen geeigneten Ausführungsplan auswählt.
    Optimizer Statistics
    Statistiken über Tabellen, Spalten und Indizes, die der Cost Based Optimizer für Schätzungen verwendet.
    ORACLE_HOME
    Verzeichnisbaum einer Oracle-Softwareinstallation mit Binaries, Bibliotheken und Konfigurationsdateien.
    ORACLE_SID
    Betriebssystemvariable zur Auswahl einer lokalen Oracle-Instanz.
    ORDS
    Oracle REST Data Services; stellt HTTP-basierte Dienste für Oracle-Daten bereit. ORDS hat einen eigenen Versionszyklus und ersetzt nicht den Listener für Oracle-Net-Verbindungen.
    Package
    PL/SQL-Objekt zum Bündeln zusammengehöriger Typen und Routinen. Specification und Body bilden öffentliche Schnittstelle und Umsetzung.
    Parse
    Phase der SQL-Verarbeitung mit Syntax-/Semantikprüfung, Objektauflösung und gegebenenfalls Optimierung.
    Password File
    Oracle-Datei für administrative Remote-Authentifizierung, zum Beispiel SYSDBA.
    PDB
    Pluggable Database; in eine CDB eingebundene eigenständige Datenbankeinheit.
    PFILE
    Parameter File; textbasierte Initialisierungsparameterdatei einer Oracle-Instanz.
    PGA
    Program Global Area; privater, nicht gemeinsam genutzter Speicher eines Server- oder Hintergrundprozesses. Die Gesamtheit der PGAs einer Instance wird als Instance PGA bezeichnet.
    Physical Read
    Physischer Lesezugriff vom Storage auf Datenbankblöcke.
    PITR
    Point-in-Time Recovery; Wiederherstellung auf einen definierten früheren Zeitpunkt oder SCN.
    PK
    Primary Key; Constraint zur eindeutigen Identifikation einer Tabellenzeile.
    PL/SQL
    Oracle-Erweiterung von SQL um prozedurale Elemente wie Variablen, Schleifen, Prozeduren und Exceptions.
    Plan Hash Value
    Numerischer Hashwert zur groben Identifikation eines SQL-Ausführungsplans.
    PMEM
    Persistent Memory; nichtflüchtiger Speicher, der je nach Plattform für spezielle I/O-Szenarien genutzt werden kann.
    PMON
    Process Monitor; überwacht beendete Prozesse und koordiniert in 19c die Bereinigung durch CLMN und gegebenenfalls CLnn.
    Prozedur
    Routine ohne Funktionsrückgabewert; kann Werte über OUT-Parameter liefern. Was sie verändert, bestimmt der ausgeführte Code.
    RDBMS
    Relationales Datenbankmanagementsystem mit Tabellen, SQL, Transaktionen und Integritätsregeln.
    Read Consistency
    Oracle-Prinzip, durch das eine Abfrage ein logisch konsistentes Datenbild zu ihrem relevanten SCN erhält.
    RECO
    Recoverer Process; bearbeitet in-doubt Distributed Transactions.
    Recovery Catalog
    Separates Schema zur dauerhaften Speicherung von RMAN-Metadaten und Recovery-Historie.
    Recursive SQL
    SQL, das Oracle intern zur Erfüllung einer Benutzeroperation ausführt.
    Redo
    Informationen zur Wiederholung von Änderungen bei Instance oder Media Recovery.
    Redo Log Buffer
    SGA-Bereich, in dem Redo Records vor der Schreibung durch LGWR gesammelt werden.
    Redo Log Group
    Gruppe eines Online Redo Logs; besteht aus einem oder mehreren Membern.
    Redo Log Member
    Physische Datei innerhalb einer Online-Redo-Log-Gruppe.
    Redo Record
    Interne Beschreibung einer Änderung, die für Recovery im Redo aufgezeichnet wird.
    RESETLOGS
    OPEN-Option nach bestimmten Recovery-Szenarien; setzt die Redo-Sequenz neu auf und erzeugt eine neue Incarnation.
    REST
    Representational State Transfer; Architekturprinzipien für ressourcenorientierte Schnittstellen. Häufig werden HTTP und JSON verwendet, JSON ist aber keine zwingende REST-Voraussetzung.
    Restore
    Wiederherstellen gesicherter Datenbankdateien. Das anschließende RECOVER wendet benötigte Änderungen an; RESTORE allein garantiert noch nicht den gewünschten Zielstand.
    Restore Point
    Benannter SCN beziehungsweise Zeitpunkt als Referenz für Recovery oder Flashback.
    RMAN
    Recovery Manager; Oracle-Werkzeug zur Sicherung, Wiederherstellung, Recovery, Validierung und Verwaltung physischer Oracle-Backups.
    Role
    Benannte Sammlung von Privilegien, die Benutzern oder anderen Rollen zugewiesen werden kann.
    ROWID
    Zeilenkennung: Bei Heap-Tabellen beschreibt die physische erweiterte ROWID Datenobjekt, Datei, Block und Position. Index-organisierte Tabellen verwenden logische Rowids. Eine ROWID ersetzt keinen fachlichen Primärschlüssel. Siehe Kapitel 7.
    Schema
    Gesamtheit der Datenbankobjekte, die einem Benutzer gehören.
    SCN
    System Change Number; monoton steigende logische Datenbankuhr zur Ordnung von Änderungen und zur Bestimmung konsistenter Zustände, unter anderem für Read Consistency und Recovery.
    SCN Headroom
    Verfügbarer Abstand bis zu internen SCN-Grenzen; relevant für zeitbasierte SCN-Sicherheitsmechanismen.
    Segment
    Speicherbereich eines Objekts, bestehend aus einem oder mehreren Extents.
    SERIAL#
    Seriennummer im jeweiligen View-Kontext. In V$SESSION unterscheidet sie Sessionlebenszyklen zur SID; in Prozessviews kann sie eine Prozessseriennummer sein.
    Server Process
    Oracle-Prozess, der SQL einer Client-Session verarbeitet.
    Service Name
    Logischer Oracle-Net-Name, über den Clients einen Datenbankservice adressieren.
    SGA
    System Global Area; gemeinsam genutzter Speicher der Oracle-Instanz.
    Shared Pool
    SGA-Bereich mit unter anderem Library Cache und Data Dictionary Cache.
    Shared Server
    Verbindungsmodell, bei dem mehrere Sessions Serverprozesse gemeinsam nutzen können.
    SID
    Je nach Kontext Instanzkennung oder Session Identifier innerhalb von V$SESSION.
    Smallfile Tablespace
    Klassischer Tablespace, der aus mehreren kleineren Datafiles bestehen kann.
    SMON
    System Monitor; führt unter anderem Instance Recovery und interne Bereinigungen aus.
    Soft Parse
    Wiederverwendung eines grundsätzlich passenden vorhandenen Cursors.
    SPFILE
    Server Parameter File; binäre Oracle-Parameterdatei für den Instanzstart.
    SQL
    Structured Query Language; Sprache zum Abfragen und Bearbeiten relationaler Daten und Datenbankobjekte.
    SQL Plan Baseline
    Gespeicherte akzeptierte Ausführungspläne zur Stabilisierung der Planwahl.
    SQL Profile
    Optimizer-Hilfsinformation zur Verbesserung von Kardinalitäts- und Kostenschätzungen; lizenzabhängig.
    SQL Tuning Set
    Gespeicherte Sammlung von SQL und Ausführungsinformationen für Tuning- und Analyseaufgaben.
    SQL*Net
    Historische Bezeichnung für Oracle Net, das Netzwerkprotokoll und die Verbindungsdienste von Oracle.
    SQL*Plus
    Oracle-Kommandozeilenclient zur Ausführung von SQL, PL/SQL und SQL*Plus-Befehlen.
    SQL_ID
    Kennung des SQL-Texts im Library Cache. Sie bezeichnet weder einen einzelnen Aufruf noch automatisch nur einen Child Cursor; unterschiedliche Texte können unterschiedliche SQL_IDs erhalten.
    System Privilege
    Recht auf eine datenbankweite Operation, zum Beispiel CREATE SESSION.
    Table Access Full
    Bezeichnung eines Full Table Scan im Ausführungsplan.
    Tablespace
    Logischer Speichercontainer: permanente und UNDO-Tablespaces verwenden Datafiles, temporäre Tablespaces Tempfiles.
    TCL
    Transaction Control Language; COMMIT, ROLLBACK und SAVEPOINT.
    Temporary Tablespace
    Tablespace für temporäre Segmente, zum Beispiel bei Sort-, Hash- oder Join-Operationen.
    TNS
    Transparent Network Substrate; traditionelle Bezeichnung für Oracle-Net-Namens- und Verbindungsmechanismen.
    Trace File
    Diagnosedatei mit detaillierten Prozess-, Session- oder Fehlerinformationen.
    Transaction
    Zusammengehörige Datenbankarbeit mit einer gemeinsamen Transaktionsgrenze. Eine Transaktion kann Daten ändern oder ausdrücklich nur lesend arbeiten; COMMIT und ROLLBACK beenden sie.
    UCP
    Universal Connection Pool; Oracle-Verbindungspool für Java mit eigener Ausleih-, Rückgabe- und Timeoutverwaltung.
    UGA
    User Global Area; sitzungsbezogener Speicher, dessen Ablage vom Servermodus abhängt.
    Undo
    Informationen zum Rückgängigmachen von Änderungen, für Read Consistency und für weitere transaktionsbezogene Funktionen wie bestimmte Flashback-Operationen.
    Undo Retention
    Zielzeit, für die Oracle Undo-Informationen nach Möglichkeit vor Wiederverwendung bewahrt.
    Undo Segment
    Segment zur Speicherung von Undo Records für Rollback und Read Consistency.
    Unified Auditing
    Oracle-Auditverfahren mit gemeinsamen Auditaufzeichnungen. Mixed Mode und Pure Unified Mode unterscheiden; V$OPTION=FALSE bedeutet nicht generell, dass keine Auditdaten entstehen.
    User Call
    Aufruf einer Foreground-Session an die Datenbank, zum Beispiel Parse, Execute oder Fetch.
    V$-View
    Dynamische Performance-Sicht mit Zuständen, Zählern oder Betriebsmetadaten. Der Zeitbezug hängt von der jeweiligen View ab; nicht jede Zeile beschreibt nur den aktuellen Moment.
    V$SESSION
    Dynamic Performance View mit aktuellen Sessioninformationen wie Status, SQL_ID, Event und Modul.
    V$SQL
    Dynamic Performance View mit SQL-Cursoren und kumulierten Ausführungsstatistiken.
    V$SYSSTAT
    Dynamic Performance View mit Systemstatistiken. Bedeutung und Zeitbasis hängen von der Statistik ab: Viele Werte sind kumulierte Zähler, andere beschreiben einen aktuellen Zustand, etwa opened cursors current.
    V$SYSTEM_EVENT
    Dynamic Performance View mit seit Instanzstart kumulierten Wait-Event-Statistiken.
    Wait Class
    Gruppierung von Wait Events nach Ursache, zum Beispiel User I/O, Commit, Concurrency oder Network.
    Wait Event
    Benannter Oracle-Wartezustand, der beschreibt, worauf eine Session oder ein Prozess wartet.
    Wallet
    Sicherheitscontainer mit zweckabhängigem Inhalt: SEPS speichert Zugangsdaten, ein TLS-Wallet Zertifikate und gegebenenfalls private Schlüssel, ein TDE-Keystore Verschlüsselungsschlüssel. Die Zwecke sind nicht austauschbar.
    Workarea
    PGA-Arbeitsbereich für Operationen wie Sort, Hash Join oder Bitmap-Verarbeitung.
    X$-Table
    Interne, nicht dokumentierte Fixed Table, auf der zahlreiche V$-Views basieren.

    Maintenance Suite

    Einblicke in die von Marcus Garand entwickelte Oracle Maintenance Suite.

    PROJEKT & STATISCHE BEISPIELREPORTS

    Die Suite bündelt Monitoring, Diagnose und Schwachstellenanalyse in einer zentralen HTML-Oberfläche. Die einzelnen Reports machen Betriebsdaten lesbar, ordnen Befunde ein und führen zu gezielten nächsten Prüfungen. Hier wird die Umsetzung anhand einer Originalansicht und statischer Beispielseiten vorgestellt.

    Originalansicht der Maintenance Suite anzeigen
    Original-Screenshot der Oracle Maintenance Suite mit 15 erfolgreich gestarteten Reports und zentralen Navigationskacheln
    Bereitgestellte Originalansicht: Index-Version 3.1, Lauf vom 26.10.2026 um 08:00 Uhr. Sichtbar sind 15 konfigurierte, gestartete und erfolgreich beendete Reports sowie der Einstieg ins DBA-Wiki. Die Detailwerte der folgenden Ansichten sind eigenständige fiktive Beispiele.
    Fiktive Beispielansichten – keine Live-Daten

    Die folgenden Werte sind für das Wiki statisch zusammengestellt und an den bereitgestellten Ergebnissen und Report-Bestandteilen orientiert. Host db-lab01 sowie DEMO1 und DEMO2 sind Beispielnamen. Die Seiten fragen keine Datenbanken ab, starten keine Skripte und ändern keine Einstellungen.

    Report-Bestandteile15
    Beispiel-Datenbanken2
    Prüfbedarf im Beispiel4 Bereiche
    BetriebsprinzipLesend

    Von der Übersicht zum Befund

    Der Health Check zeigt die priorisierten Befunde. Die Detailseiten liefern den Kontext und verweisen auf die Erklärungen im Wiki. „Report erfolgreich“ bedeutet, dass die Auswertung erzeugt wurde; ein fachlicher Warnhinweis kann trotzdem enthalten sein.

    Health CheckDer zentrale Einstieg bündelt die wichtigsten Befunde.Beispielansicht öffnen →System / InstanzenDer Report führt Host- und Instanzsicht zusammen.Beispielansicht öffnen →PerformanceDie Beispielansicht trennt Datenbankarbeit, CPU-Anteil und Wartezeit.Beispielansicht öffnen →MemoryDer Memory Report verbindet aktuelle Belegung mit Advisor-Schätzungen und einer begründeten Auswahl möglicher Zielgrößen.Beispielansicht öffnen →Wait EventsDie Ansicht ordnet die Wartezeit nach ihrer Bedeutung für die Datenbankarbeit.Beispielansicht öffnen →Redo LogsDer Report zeigt Redo-Aufbau, aktuellen Gruppenstatus und Switch-Verhalten.Beispielansicht öffnen →AlertlogDie Ansicht verdichtet Meldungen zu einer lesbaren Chronologie.Beispielansicht öffnen →RMAN BackupsDie Übersicht trennt erfolgreiche Sicherungsjobs, Sicherungstypen und die tatsächliche Wiederherstellungsbereitschaft..Beispielansicht öffnen →ParameterDie Ansicht macht die wirksame Konfiguration nachvollziehbar.Beispielansicht öffnen →SicherheitDer Report bündelt nachvollziehbare Sicherheitsbefunde.Beispielansicht öffnen →TablespacesDie Ansicht unterscheidet belegten Platz, aktuelle Dateigröße und Wachstumsmöglichkeiten.Beispielansicht öffnen →Inactive SessionsDer Report macht länger inaktive Sessions sichtbar, ohne sie pauschal als Fehler zu bewerten.Beispielansicht öffnen →Blocked SessionsDie Ansicht verbindet wartende Session, Blocker und Transaktionskontext.Beispielansicht öffnen →FilesystemDer Report ergänzt die Datenbanksicht um Mountpoints und verfügbaren Platz.Beispielansicht öffnen →KapazitätDie Kapazitätsseite verwendet einen ausdrücklich angenommenen Wachstumstrend.Beispielansicht öffnen →Oracle DBA WikiDie Fachkapitel erläutern die technischen Hintergründe der Reports.Zur Wiki-Übersicht →

    Maintenance Suite · Health Check

    Der zentrale Einstieg bündelt die wichtigsten Befunde. Er unterscheidet technische Report-Erzeugung, Datenbankzustand und weiteren Prüfbedarf.

    Aufgabe des zentralen Health Checks

    Der Health Check ist die zentrale Zusammenfassung der bereits erzeugten Oracle-Maintenance-Reports. Er führt selbst keine Datenbankabfragen aus, sondern liest Kennzahlen und Statusinformationen aus den vorhandenen HTML-Detailreports. Dadurch entsteht eine gemeinsame Sicht auf Alertlog, Backup, Tablespaces, Storage, Redo, Wait Events, Parameter, Instanzen, Memory, Sessions und Kapazität. Gesamtstatus, Health Score und Hinweise helfen dabei, auffällige Bereiche zu priorisieren und über die verlinkten Detailreports gezielt weiter zu untersuchen. Die Bewertung hängt von der Aktualität, Vollständigkeit und auswertbaren Struktur dieser Dateien ab; sie ist keine neue Live-Prüfung der Datenbanken. Der Health Check erzeugt die Detailreports nicht neu und führt keine Korrekturen an Datenbanken, Sessions oder Betriebssystemkonfigurationen aus.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Health Check

    BereichFiktiver BefundBewertung
    Erzeugung15 von 15 Reports erstelltErfolgreich
    DatenbankenDEMO1 und DEMO2 geöffnetErreichbar
    HostCPU 38 %; kein Swap-I/O im MessintervallUnauffällig im Ausschnitt
    Memory / DEMO1PGA- und Cache-Kandidaten vorhandenPrüfen
    Tablespaces / DEMO1APP_DATA: 88 % der möglichen KapazitätPrüfen
    Blocking / DEMO11 wartende SessionPrüfen
    Backup ReadinessJobs erfolgreich; Restore-Test älter als internes PrüfzielPrüfen
    Bewertung

    Erfolgreich erzeugte HTML-Dateien sind kein Nachweis, dass alle Datenbanken störungsfrei sind. Die Übersicht leitet gezielt zu vier prüfbedürftigen Bereichen weiter.

    Was der DBA daraus ableitet

    Zuerst die aktuelle Blockierung und ihre Auswirkung prüfen, danach Kapazität und Memory-Befunde vertiefen. Die Backup-Nachkontrolle wird unabhängig von der grünen Jobmeldung eingeplant.

    ← Zur Suite-Übersicht

    Maintenance Suite · System / Instanzen

    Der Report führt Host- und Instanzsicht zusammen. Datenbanknamen machen deutlich, welche Instanz hinter einem Messwert steht.

    Aufgabe des System- und Instanz-Dashboards

    Der Report verbindet die Solaris-Hostsicht mit wichtigen Oracle-Kennzahlen aller aktuell über PMON erkannten Instanzen. Dadurch lassen sich Host-CPU, Host-RAM, Oracle-Memory, aktive Sessions, Ressourcenlimits und Datenbanklast in einer gemeinsamen Momentaufnahme beurteilen. Ergänzend zeigen lokal gespeicherte Messwerte die bisherige Entwicklung des CPU-Thread-Indikators und der aktiven Benutzer-Sessions; historische Durchschnitts- und Maximalwerte werden entsprechend der verfügbaren Zeitabdeckung gekennzeichnet. Die automatische Statusbewertung hilft dabei, auffällige Instanzen für die weitere Analyse zu priorisieren. Der Report liest die Datenbank- und Hostinformationen, speichert seine Auswertung und Monitoring-Historie lokal und verändert keine Datenbankparameter, Sessions oder Betriebssystemeinstellungen.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – System / Instanzen

    SIDZustandAktive BenutzersessionsDB CPU/s (5 Min.)SGA aktuell (MiB)PGA aktuell (MiB)
    DEMO1OPEN80,213216825,15
    DEMO2OPEN30,084096640
    Messkontext

    Demo-Host db-lab01; Intervall 07:55–08:00. Die kumulierte DB-CPU-Differenz von DEMO1 beträgt 63 Sekunden über 300 Sekunden: 63 / 300 = 0,21 CPU-Sekunden je Sekunde.

    Bewertung

    Der Demo-Host hat 32 GiB RAM und 38 % CPU-Auslastung im beobachteten Intervall. Aktive Sessions und CPU-Zeit sind verschiedene Größen; wartende Sessions sind nicht automatisch rechnende Sessions.

    Was der DBA daraus ableitet

    Die auffällige Datenbank wird über Service, Session und SQL weiter eingegrenzt. Ein isolierter Sessionzähler ist weder ein CPU-Verbrauchswert noch ein Beleg für eine erreichte Editionsgrenze.

    ← Zur Suite-Übersicht

    Maintenance Suite · Performance

    Die Beispielansicht trennt Datenbankarbeit, CPU-Anteil und Wartezeit. Sie zeigt, wie aus Messwerten eine gezielte Untersuchung entsteht.

    Aufgabe des Performance-Dashboards

    Das Performance-Dashboard verbindet wichtige Instanzkennzahlen mit aktiven Benutzer-Sessions, Top-SQL-Ranglisten und verfügbaren Cursor-Plänen der über PMON erkannten Oracle-Instanzen. Es zeigt unter anderem CPU-Auslastung, Parsing- und Speicherindikatoren und ordnet SQL-Anweisungen nach CPU-Zeit, Laufzeit, Buffer Gets, Physical Reads und Ausführungshäufigkeit. Gesamtwerte und Kennzahlen je Ausführung helfen dabei, häufig ausgeführte SQLs von einzelnen besonders aufwendigen Ausführungen zu unterscheiden. Zu passenden, noch verfügbaren Child Cursors stellt der Report den vorhandenen Ausführungsplan dar und ergänzt ihn um eine regelbasierte Bewertung auffälliger Planmerkmale und SQL-Kennzahlen. Dadurch unterstützt das Dashboard den Weg von einer auffälligen Instanz über betroffene Sessions und SQLs bis zur gezielten Plananalyse. Die Bewertung dient der Priorisierung und ist kein Oracle-Optimizer-Score; aktuelle Messwerte und kumulierte Statistiken müssen im jeweiligen zeitlichen Kontext betrachtet werden. Der Report arbeitet ausschließlich lesend, führt die untersuchten Anwendungs-SQLs nicht erneut aus und setzt keine Tuning-Änderungen um.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Performance

    Kennzahl / DEMO1Fiktiver WertBedeutung im Intervall
    Messintervall300 s07:55–08:00
    DB Time (Differenz)90 sAufsummierte Datenbankarbeit
    DB CPU (Differenz)63 s70 % der DB Time
    Non-Idle-Wait-Zeit im Beispiel27 s30 % der DB Time
    DB Time / Intervall0,30Mittlere aktive Datenbankarbeit
    Bericht AUFTRAG_LISTE1,8 s je AufrufFachlicher Vergleichswert, kein Hostwert
    Bewertung

    Das Beispiel zeigt mehr CPU- als Wait-Anteil an der DB Time. Ob ein Engpass besteht, entscheidet der Vergleich mit Last, Hostreserve und der benötigten Antwortzeit.

    Was der DBA daraus ableitet

    Die verantwortlichen SQL-Anweisungen und deren Aufwand pro Ausführung untersuchen. CPU-Anteil allein begründet weder mehr RAM noch zusätzliche Prozessoren.

    Für bereits vergangene Lastfenster ergänzt ein vorher eingerichtetes Statspack die Diagnose: Leitfaden in Kapitel 31. Dieser Suite-Report selbst erstellt keine Statspack-Snapshots.

    ← Zur Suite-Übersicht

    Maintenance Suite · Memory

    Der Memory Report verbindet aktuelle Belegung mit Advisor-Schätzungen und einer begründeten Auswahl möglicher Zielgrößen. Diese Beispielwerte orientieren sich an den bereitgestellten Memory-Ergebnissen.

    Aufgabe des Memory-Reports

    Der Memory-Report verbindet die Speichersicht des Solaris-Hosts mit den SGA- und PGA-Kennzahlen der aktuell über PMON erkannten Oracle-Instanzen. Er zeigt Host-RAM und Swap-Informationen, die Speicherverteilung innerhalb der Instanzen, wichtige Speicherparameter sowie Prozesse mit hoher PGA-Allokation. Ergänzend wertet er verfügbare Oracle-Advisor-Daten für Buffer Cache, Shared Pool, SGA und PGA aus und leitet daraus zusammen mit den Messwerten und den Regeln des Reports Vorschläge zur Speicherdimensionierung ab. Dadurch lässt sich nachvollziehen, welche Bereiche beibehalten oder vergrößert werden sollen, welcher zusätzliche Speicherbedarf entsteht und welche konfigurierten Grenzen zu beachten sind. Die Advisor-Werte sind Schätzungen für den beobachteten Workload; die daraus abgeleiteten Vorschläge müssen vor einer Umsetzung mit der Host-Auslastung, anderen Instanzen und dem betrieblichen Bedarf abgeglichen werden. Der Report arbeitet ausschließlich lesend und setzt keine Parameteränderungen selbst um.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Memory

    Bereich / DEMO1Aktuell / Zielwert (MiB)Kandidat (MiB)DifferenzBegründung im Beispiel
    Buffer Cache20002304+304Modelliert rund 5 % weniger Physical Reads
    Shared Pool100810080Kein relevanter modellierter Zusatznutzen
    Large Pool1121120Kein separater Sizing-Advisor ausgewertet
    Java Pool16160Kein separater Sizing-Advisor ausgewertet
    Übrige SGA80800Vereinfachter, gerundeter Restwert
    Gesamt-SGA32163520+304Summe der Beispielkomponenten
    PGA_AGGREGATE_TARGET500900+400Modelliert 0 Over Allocations
    SGA + PGA-Zielrahmen37164420+704Kein harter Gesamtverbrauchsdeckel
    Ergänzende MessgrößeFiktiver WertEinordnung
    Memory-ModusManuelle SGA; automatische PGAMEMORY_TARGET=0; SGA_TARGET=0; WORKAREA_SIZE_POLICY=AUTO
    PGA aktuell / Peak825,15 / 1.086,76 MiBAktueller Verbrauch und Höchststand sind getrennt
    PGA Cache Hit99,97 %Kein alleiniger Entwarnungsnachweis
    Over Allocation Count586.944 seit InstanzstartHistorischer Zähler; kein aktuelles Ereignistempo
    Advisor-Ziel900 MiB; erwartete Over Allocations 0Kein Versprechen, dass TEMP-I/O vollständig entfällt
    SGA_MAX_SIZE8.000 MiBGrößengrenze, kein Beweis freier Hostreserve
    Bewertung

    Die Reportregel wählt im Beispiel 2.304 MiB Cache und 900 MiB PGA als Kandidaten. Das ist eine begründete Prüfungsempfehlung, keine bereits umgesetzte Änderung. Die Schwelle für den Cache-Vorteil gehört zur Bewertung des Reports.

    Was der DBA daraus ableitet

    Lastabdeckung, Hostreserve und technische Änderbarkeit gegenprüfen. Nach einer freigegebenen Anpassung reale Reads, Workarea-I/O und Antwortzeit bei vergleichbarer Last messen. Die statische Ansicht führt keine Anpassung aus.

    ← Zur Suite-Übersicht

    Maintenance Suite · Wait Events

    Die Ansicht ordnet die Wartezeit nach ihrer Bedeutung für die Datenbankarbeit. Die Zahlen passen zum Performance-Beispiel desselben Zeitfensters.

    Aufgabe des Wait-Events-Reports

    Der Wait-Events-Report unterstützt die erste Einordnung von Performance-Auffälligkeiten in den aktuell über PMON erkannten Oracle-Instanzen. Er verbindet kumulierte Wartezeiten und Wait Classes mit DB Time, DB CPU sowie einer Momentaufnahme der aktuell wartenden Benutzer-Sessions. Anteile und durchschnittliche Wartezeiten helfen dabei, auffällige Ereignisse zu priorisieren; Session- und SQL-Zuordnungen geben Ansatzpunkte für die weitere Ursachenanalyse. Ergänzend zeigt der Report die seit Instanzstart gemittelte Zahl aktiver Sessions sowie Kennzahlen zu Parsing, Commits und Rollbacks. Die automatische Bewertung verwendet die hinterlegten Diagnose-Schwellen und liefert Hinweise zur weiteren Prüfung, stellt aber keine Ursache abschließend fest. Da viele Werte seit Instanzstart kumuliert sind, müssen historische Auffälligkeiten und aktuelle Wartezustände getrennt betrachtet werden. Der Report arbeitet ausschließlich lesend und verändert weder Sessions noch Datenbankparameter.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Wait Events

    Event / DEMO1Differenz WartezeitAnteil an DB TimeNächste Frage
    db file sequential read18,0 s20 %Welche SQL und Objekte verursachen die Einzelblockzugriffe?
    log file sync3,6 s4 %Viele Commits oder hohe Wartezeit je Commit?
    buffer busy waits1,8 s2 %Welche Blöcke sind gleichzeitig gefragt?
    Weitere Non-Idle-Waits3,6 s4 %Welche einzelnen Events stecken darin?
    Summe Non-Idle-Waits27,0 s30 %DB CPU ergänzt die übrigen 70 %
    Bewertung

    Die größte Wait-Zeit entfällt hier auf Einzelblock-Lesezugriffe. Der Eventname allein beweist weder langsamen Storage noch einen schlechten Index.

    Was der DBA daraus ableitet

    Zeitraum, SQL_ID, Datenmenge und Latenz zusammenführen. Prozentwerte beziehen sich hier ausdrücklich auf DB Time und nicht nur auf die Summe der Waits.

    Für bereits vergangene Lastfenster ergänzt ein vorher eingerichtetes Statspack die Diagnose: Leitfaden in Kapitel 31. Dieser Suite-Report selbst erstellt keine Statspack-Snapshots.

    ← Zur Suite-Übersicht

    Maintenance Suite · Redo Logs

    Der Report zeigt Redo-Aufbau, aktuellen Gruppenstatus und Switch-Verhalten. Er hilft, Struktur und Betriebsverlauf gemeinsam zu beurteilen.

    Aufgabe des Redo-Log-Reports

    Der Redo-Log-Report verbindet die aktuelle Konfiguration der Online Redo Logs mit der verfügbaren Log-Switch-Historie der über PMON erkannten Oracle-Instanzen. Er zeigt Größe, Anzahl und Status der Redo-Gruppen und ihrer Member sowie die Switch-Häufigkeit in verschiedenen Zeitfenstern. Eine Stundenübersicht und die Matrix der aktuellen Woche helfen dabei, Lastspitzen und zeitliche Muster zu erkennen; Angaben zum archivierten Redo ergänzen das Betriebsbild. Dadurch unterstützt der Report die Prüfung, ob Redo-Größen, Gruppenaufbau und beobachtete Switch-Raten zum Lastprofil passen und wo eine weiterführende Analyse erforderlich ist. Die automatische Bewertung folgt den Regeln und Schwellenwerten des Reports und berechnet keine allgemein optimale Redo-Größe. Der Report arbeitet ausschließlich lesend, erzwingt keine Log Switches und verändert weder die Redo-Konfiguration noch die Archivierung.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Redo Logs

    Gruppe / DEMO1GrößeMemberStatusArchiviert
    11.000 MiB2INACTIVEYES
    21.000 MiB2INACTIVEYES
    31.000 MiB2INACTIVEYES
    41.000 MiB2INACTIVEYES
    51.000 MiB2ACTIVEYES
    61.000 MiB2CURRENTNO
    Zeitfenster

    Fiktiv 07:00–08:00: 4 Log Switches. Zwei Member je Gruppe dokumentieren Mehrfachablage, aber noch keine nachgewiesene Trennung der Speicherausfallbereiche.

    Bewertung

    Die aktuelle Gruppe ist noch nicht archiviert; das ist für sich kein Fehler. Vier Switches in der letzten Stunde entsprechen rechnerisch 15 Minuten je Switch, zeigen aber nicht die Verteilung innerhalb der Stunde.

    Was der DBA daraus ableitet

    Bei auffälligen Spitzen zusätzlich Redo-Rate, Archivfortschritt, Checkpoint-Kontext und Commit-Waits prüfen. Eine feste Zahl von Switches pro Stunde ist kein universelles Gesundheitskriterium.

    ← Zur Suite-Übersicht

    Maintenance Suite · Alertlog

    Die Ansicht verdichtet Meldungen zu einer lesbaren Chronologie. Sie trennt Ereigniszeitpunkt und aktuelle Betriebswirkung.

    Aufgabe des Alertlog-Reports

    Der Alertlog-Report bündelt betriebsrelevante Meldungen der aktuell über PMON erkannten Oracle-Instanzen in einer gemeinsamen Übersicht. Er wertet die verfügbaren Alertlog-Daten lesend aus und konzentriert die Hauptkennzahlen auf die letzten 24 Stunden. ORA-Fehler, Errors und Warnings, Checkpoint- und Redo-Meldungen sowie Startup, Shutdown, Deadlocks und Corruption werden getrennt dargestellt. Kennzahlen, letzte Ereignisse und Meldungsdetails helfen dabei, auffällige Instanzen und den zeitlichen Verlauf schnell zu erkennen. Die automatische Bewertung priorisiert Befunde nach den Regeln des Reports und unterstützt den Einstieg in die Ursachenanalyse. Sie ersetzt keine vollständige Datenbankdiagnose und führt keine Korrekturen aus.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Alertlog

    Zeitpunkt (fiktiv)SIDMeldung / KategorieEinordnung
    25.10.2026 14:12DEMO1ORA-00060 – Deadlock erkanntVergangenes Ereignis; Trace und Transaktionsablauf prüfen
    26.10.2026 07:45DEMO1Archivierung einer Redo-Sequenz abgeschlossenBetriebsinformation
    26.10.2026 07:55–08:00DEMO2Keine neue erfasste ORA-MeldungGilt nur für den erfassten Ausschnitt
    Bewertung

    Der frühere Deadlock ist nicht automatisch die Ursache der aktuellen Blockierung. Ebenso bedeutet eine leere Fehlerliste nicht, dass jede Betriebsquelle fehlerfrei ist.

    Was der DBA daraus ableitet

    Fehlerstack, Trace-Verweis und Zeitraum sichern. Anschließend mit Anwendung, Session- und gegebenenfalls Clusterereignissen korrelieren.

    ← Zur Suite-Übersicht

    Maintenance Suite · RMAN Backups

    Die Übersicht trennt erfolgreiche Sicherungsjobs, Sicherungstypen und die tatsächliche Wiederherstellungsbereitschaft.

    Aufgabe des Backup-Dashboards

    Das Backup-Dashboard bündelt die verfügbaren RMAN-Sicherungsinformationen der aktuell über PMON erkannten Oracle-Instanzen in einer gemeinsamen Übersicht. Es zeigt die jeweils letzten FULL-, Level-0-, Level-1-, Archivelog- und Controlfile-Sicherungen mit Zeitpunkt, Dauer, Größe und ermitteltem RMAN-Status. Ergänzend werden Sicherungseinstellungen wie die Retention Policy und das Controlfile Autobackup dargestellt. Dadurch lassen sich die einzelnen Sicherungsarten getrennt beurteilen und auffällige Statusmeldungen oder Sicherungsverläufe gezielt untersuchen. Der Report arbeitet ausschließlich lesend und startet weder Sicherungen noch Bereinigungen; ein erfolgreicher Backupstatus allein ist noch kein vollständiger Nachweis der Wiederherstellbarkeit.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – RMAN Backups

    Prüfpunkt / DEMO1Fiktiver StandBewertung
    Letztes Level 025.10.2026 18:20 – COMPLETEDBasis der inkrementellen Kette
    Letztes Level 126.10.2026 02:20 – COMPLETEDInkrementelle Sicherung vorhanden
    Letztes Archivelog-Backup26.10.2026 07:45 – COMPLETED15-Minuten-Zeitplan im Beispiel
    Controlfile AutobackupON; letzter erfolgreicher Lauf 07:46Startinformationen zusätzlich berücksichtigen
    Retention PolicyRECOVERY WINDOW OF 7 DAYSAufbewahrungsziel, kein automatischer Restore-Nachweis
    VALIDATE25.10.2026 – ohne gemeldeten BefundValidierung ersetzt keinen vollständigen Restore-Test
    Letzter dokumentierter Restore-Test15.09.2026Interner Beispiel-Prüfrhythmus von 30 Tagen überschritten
    DEMO2 – alternatives KonzeptFiktiver Stand
    Tägliches Full Backup25.10.2026 18:20 – COMPLETED
    Archivelog-Backup26.10.2026 07:45 – COMPLETED
    Letztes VALIDATE25.10.2026 – ohne gemeldeten Befund
    Bewertung

    Die Jobs sind technisch erfolgreich. Der ältere Restore-Test bleibt dennoch ein separater Prüfpunkt. Das hier verwendete 30-Tage-Ziel ist eine fiktive betriebliche Vorgabe, keine Oracle-Regel.

    Was der DBA daraus ableitet

    Verfügbare Backupstücke und benötigte Archivelogs, Zugang zum Sicherungsmedium sowie das Recovery-Runbook prüfen. Für DEMO2 zeigt das alternative Konzept täglich ein Full Backup; Full und Level 0 bleiben begrifflich getrennt.

    ← Zur Suite-Übersicht

    Maintenance Suite · Parameter

    Die Ansicht macht die wirksame Konfiguration nachvollziehbar. Parameterwerte werden dem richtigen Zweck und der passenden Datenbank zugeordnet.

    Aufgabe des Parameter-Dashboards

    Das Parameter-Dashboard bündelt wichtige Konfigurations- und Ressourcendaten der aktuell über PMON erkannten Oracle-Instanzen. Es zeigt ausgewählte Einstellungen für Optimizer, UNDO, I/O, CPU, Parallelisierung und Speicher sowie NLS-Werte und Zeichensätze. Für Prozesse und Sessions stellt es die aktuelle Nutzung, konfigurierte Grenzen, freie Reserven und bisherige Höchststände gegenüber. Angaben zur laufenden Oracle-Version, zu SQL-seitig registrierten Patch-Aktionen und zur Zeitsynchronisation des Solaris-Hosts ergänzen die Übersicht. Dadurch lassen sich knappe Ressourcenreserven und prüfbedürftige Konfigurationen gezielt erkennen und im Zusammenhang bewerten. Die automatischen Hinweise folgen den Regeln des Reports und ersetzen keine Prüfung der konkreten Anwendungs- und Betriebsanforderungen; die SQL-Patch-Registry allein belegt außerdem nicht den vollständigen Patchstand des Oracle Homes. Das Dashboard arbeitet ausschließlich lesend und ändert weder Parameter noch Patches oder Betriebssystemeinstellungen.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Parameter

    Parameter / DEMO1Fiktiver WertEinordnung
    memory_target0AMM deaktiviert
    sga_target0ASMM deaktiviert
    sga_max_size8.000 MiBSGA-Obergrenze
    db_cache_size2.000 MiBKonfigurierte Cache-Größe
    shared_pool_size1.008 MiBKonfigurierter Shared Pool
    pga_aggregate_target500 MiBPGA-Zielwert
    pga_aggregate_limit4.096 MiBSeparater Grenzwert
    workarea_size_policyAUTOAutomatische Workarea-Steuerung
    statistics_levelTYPICALStatistikgrundlage
    db_cache_adviceONCache-Advice aktiv
    UmgebungsinformationFiktiver BefundHerkunft
    DatenbankzeichensatzWE8MSWIN1252Datenbank
    NLS_DATE_FORMAT der Report-SessionYYYY-MM-DD HH24:MI:SSSession
    ZeitdienstSynchronisiert; ntp-demo.internBetriebssystem; kein Oracle-Initialisierungsparameter
    Bewertung

    Die Konfiguration erklärt, warum im Memory-Beispiel einzelne SGA-Komponenten und die PGA separat bewertet werden. Ein Parameter ist noch keine Messung der tatsächlichen Nutzung.

    Was der DBA daraus ableitet

    Aktuelle Belegung und Advisor-Daten ergänzen. Bei Konfigurationsabweichungen zuerst den beabsichtigten Betriebsmodus klären.

    ← Zur Suite-Übersicht

    Maintenance Suite · Sicherheit

    Der Report bündelt nachvollziehbare Sicherheitsbefunde. Die Beispielansicht zeigt technische Kontrollen und deren Grenzen.

    Aufgabe des Security-Dashboards

    Das Security-Dashboard bündelt ausgewählte sicherheitsrelevante Informationen der aktuell über PMON erkannten Oracle-Instanzen. Es zeigt Benutzerstatus und Passwortprofile, administrative Berechtigungen, ausgewählte Systemprivilegien und PUBLIC-Grants sowie Database Links und Directory Objects. Verfügbare Auditdaten zu fehlgeschlagenen Anmeldungen, Authentifizierungsparameter und Informationen zu Wallets und verschlüsselten Spalten ergänzen die Übersicht. Dadurch lassen sich auffällige Konten, weitreichende Rechte und prüfbedürftige Konfigurationen gezielt für eine manuelle Sicherheitsprüfung priorisieren. Die automatische Bewertung folgt den Regeln des Reports und ist eine technische Momentaufnahme der auslesbaren Daten; ein grüner Status ist kein Nachweis vollständiger Sicherheit oder der Erfüllung einer Sicherheitsnorm. Der Report arbeitet ausschließlich lesend und verändert weder Benutzer und Berechtigungen noch Audit-, Authentifizierungs- oder Verschlüsselungseinstellungen.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Sicherheit

    Prüffeld / DEMO1Fiktiver BefundBewertung
    Anwendungskonto APP_LOGINOPEN; CREATE SESSION; fachliche RolleZweckgebundene Anmeldung
    Schema-Owner APP_OWNERLOCKED; keine interaktive Anmeldung vorgesehenEntspricht dem Beispiel-Sollzustand
    Administrative AnmeldungGetrenntes AdministrationskontoRechte und Verwendung weiter nachweisen
    Unified-Auditing-Binary-ModusFALSEKein Nachweis, dass Auditing insgesamt deaktiviert ist
    Audit-AufbewahrungArchivierung und Bereinigungsjob dokumentiertTatsächliche Abdeckung zusätzlich prüfen
    Wallet-VerzeichnisZugriff auf vorgesehenes OS-Konto begrenztElternverzeichnisse und ACLs mitprüfen
    Bewertung

    Die Darstellung beschreibt einzelne Kontrollen, kein Zertifikat und keinen pauschalen Nachweis vollständiger Sicherheit. Konfiguration, tatsächliche Ereignisse und Auswertung sind getrennte Ebenen.

    Was der DBA daraus ableitet

    Berechtigungspfade, PUBLIC-Grants, aktive Audit-Regeln und den vorgesehenen Sollzustand zusammen bewerten. Kennwörter und Wallet-Inhalte gehören nicht in einen Bericht.

    ← Zur Suite-Übersicht

    Maintenance Suite · Tablespaces

    Die Ansicht unterscheidet belegten Platz, aktuelle Dateigröße und Wachstumsmöglichkeiten. Dadurch bleibt sichtbar, wie viel Reserve wirklich noch vorhanden ist.

    Aufgabe des Tablespace-Reports

    Der Tablespace-Report verbindet die logische Speicherbelegung der über PMON erkannten Oracle-Instanzen mit den zugehörigen Datafiles beziehungsweise Tempfiles und den verfügbaren Storage-Informationen. Er zeigt aktuelle Größe, belegten und freien Speicher sowie Autoextend-Einstellungen und die konfigurierte maximale Kapazität. Ergänzend nutzt er lokal gespeicherte Vergleichswerte, um das Wachstum über 24 Stunden, sieben und 30 Tage sowie eine geschätzte Restlaufzeit darzustellen, soweit ausreichende Daten vorhanden sind. Dadurch lassen sich hohe Belegung, begrenzte Wachstumsreserven und mögliche Engpässe auf dem zugrunde liegenden Filesystem gemeinsam beurteilen. Die aufklappbaren Dateidetails und Hinweise zur Freiraumverteilung unterstützen die weitere Analyse; für geeignete Tablespaces erzeugt der Report zusätzlich ADD-DATAFILE-Vorschläge als Text. Die Datenbank wird ausschließlich lesend abgefragt. Der Report speichert seine Auswertung, Wachstumshistorie und SQL-Vorschläge lokal, führt jedoch keine Erweiterung oder sonstige Datenbankänderung selbst aus.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Tablespaces

    SID / TablespaceTypBelegt (GiB)Allokiert (GiB)Maximal (GiB)Belegt / Max.
    DEMO1 / APP_DATAPERMANENT889010088 %
    DEMO1 / APP_INDEXPERMANENT30405060 %
    DEMO1 / UNDOTBS1UNDO12, davon 3 ACTIVE1624Separat bewerten
    DEMO1 / TEMPTEMPORARY6 aktuell genutzt1632Momentaufnahme
    Bewertung

    APP_DATA hat nur 2 GiB innerhalb der vorhandenen Dateien frei und weitere 10 GiB konfigurierte Wachstumsmöglichkeit. Die beispielhafte Prüfschwelle von 85 % der maximalen Kapazität wird überschritten.

    Was der DBA daraus ableitet

    Die größten und wachsenden Segmente prüfen und die Dateigrößen mit dem freien Filesystem abgleichen. UNDO-Zustände und TEMP-Nutzung benötigen eine andere Interpretation als permanente Segmente.

    ← Zur Suite-Übersicht

    Maintenance Suite · Inactive Sessions

    Der Report macht länger inaktive Sessions sichtbar, ohne sie pauschal als Fehler zu bewerten. Transaktionskontext und Anwendungsherkunft sind entscheidend.

    Aufgabe des Inactive-Sessions-Reports

    Der Inactive-Sessions-Report unterstützt die gezielte Prüfung lange inaktiver Benutzerverbindungen in den aktuell über PMON erkannten Oracle-Instanzen. Er zeigt Sessions, deren Inaktivitätsdauer den konfigurierten Grenzwert überschreitet, und berücksichtigt dabei die festgelegten Ausschlüsse für bestimmte Programme und Connection Pools. Benutzer, Programm, Client, Idle-Zeit und verfügbare SQL-Informationen helfen dabei, die angezeigten Verbindungen fachlich einzuordnen. Ergänzende CPU- und Laufzeitwerte gehören zum zugeordneten SQL-Cursor und beschreiben nicht den Ressourcenverbrauch der inaktiven Session allein. Die automatische Klassifizierung unterstützt die Priorisierung der manuellen Prüfung; eine lange Inaktivität oder die Kennzeichnung als Kill-Kandidat ist keine Freigabe zum Beenden einer Verbindung. Der Report zeigt eine Momentaufnahme, arbeitet ausschließlich lesend und führt angezeigte Kill-Befehle niemals selbst aus.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Inactive Sessions

    SID / SessionAnwendungStatusInaktiv seitOffene Transaktion
    DEMO1 / 214,731APP_POOLINACTIVE00:18:20Nein
    DEMO1 / 305,802APP_BATCHINACTIVE00:05:10Ja
    DEMO2 / 122,244REPORT_POOLINACTIVE00:12:00Nein
    Bewertung

    Pool-Verbindungen können regulär inaktiv bleiben. Session 305 verdient wegen ihrer offenen Transaktion besondere Aufmerksamkeit und erscheint im Blockierungsbeispiel erneut.

    Was der DBA daraus ableitet

    Zuständigkeit, Transaktion und Verwendung der Verbindung klären. Der Report beendet keine Session; Dauer allein ist keine Begründung dafür.

    ← Zur Suite-Übersicht

    Maintenance Suite · Blocked Sessions

    Die Ansicht verbindet wartende Session, Blocker und Transaktionskontext. So wird die fachlich relevante Sperrkette sichtbar.

    Aufgabe des Blocked-Sessions-Reports

    Der Blocked-Sessions-Report unterstützt die Untersuchung aktueller Sperrkonflikte in den über PMON erkannten Oracle-Instanzen. Er stellt die ermittelten wartenden Sessions (Waiter) und blockierenden Sessions (Blocker) gegenüber und ergänzt die Zuordnung um Wartezeiten, Locktypen, Benutzer, Programme und SQL-Texte. Soweit verfügbar, zeigt er außerdem betroffene Objekte sowie Startzeit und UNDO-Verbrauch der blockierenden Transaktion. Dadurch lassen sich auffällige Blockierungen priorisieren und mögliche Ursachen gezielt untersuchen. Die automatische Bewertung dient als Orientierung für die weitere Prüfung und ist keine Freigabe zum Beenden einer Session. Der Report liefert eine Momentaufnahme, arbeitet ausschließlich lesend und führt angezeigte Kill-Befehle niemals selbst aus.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Blocked Sessions

    SIDWaiter (SID,SERIAL#)Blocker (SID,SERIAL#)Wait EventAktueller WaitBefund
    DEMO1412,1109305,802enq: TX - row lock contention95 sBlocker INACTIVE, Transaktion offen
    Bewertung

    Eine inaktive Session hält hier eine Transaktion offen und blockiert eine andere Session. Das zuletzt angezeigte SQL des Blockers muss nicht die sperrende Anweisung sein.

    Was der DBA daraus ableitet

    Anwendung und Transaktionsverantwortliche zuordnen, betroffene Ressource und Verlauf sichern. Eine Auflösung wird fachlich abgestimmt; die Beispielseite enthält keine Kill-Aktion.

    ← Zur Suite-Übersicht

    Maintenance Suite · Filesystem

    Der Report ergänzt die Datenbanksicht um Mountpoints und verfügbaren Platz. Der fiktive Host verwendet hier binäre Größen in GiB.

    Aufgabe des Filesystem-Reports

    Der Filesystem-Report gibt einen Überblick über die aktuelle Kapazität und Belegung der vom Skript berücksichtigten Filesysteme und Mountpoints des Hosts. Er liest die Betriebssystemwerte mit df -kP und stellt Gesamtkapazität, belegten und verfügbaren Speicher sowie den prozentualen Belegungsgrad gegenüber. Konfigurierte Warn- und Kritisch-Schwellen, eine gesonderte Übersicht besonders stark belegter Mountpoints und die Anzeige der höchsten Auslastung helfen dabei, knappe Speicherreserven für die weitere Prüfung zu priorisieren. Dabei sollten prozentuale Belegung und absolut freier Speicher gemeinsam betrachtet werden. Der Report liefert eine Momentaufnahme; historische Wachstumsraten, Storage-Latenzen und freie Kapazitäten innerhalb von Oracle-Tablespaces werden damit nicht ermittelt. Er arbeitet auf Betriebssystemebene, baut keine Oracle-Datenbankverbindung auf und verändert weder Mountpoints noch Storage-Konfiguration oder Nutzdaten.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Filesystem

    Mountpoint / db-lab01Gesamt (GiB)Belegt (GiB)Frei (GiB)Belegung
    /u01100554555 %
    /oradata3002208073,3 %
    /archive100356535 %
    /backup100062038062 %
    Bewertung

    Der Mountpoint /oradata besitzt noch 80 GiB freie Kapazität. Das allein erweitert aber weder das maximale Datafile-Limit noch die Benutzerquota.

    Was der DBA daraus ableitet

    Tablespace-, Dateigrößen- und Filesystemgrenzen gemeinsam betrachten. Bei NFS zusätzlich Erreichbarkeit und Zugriffsrechte prüfen; freier Platz ist nur eine der Voraussetzungen.

    ← Zur Suite-Übersicht

    Maintenance Suite · Kapazität

    Die Kapazitätsseite verwendet einen ausdrücklich angenommenen Wachstumstrend. Sie trennt Prognose und tatsächlich gemessene Belegung.

    Aufgabe des Kapazitätsreports

    Der Kapazitätsreport verbindet die aktuelle Belegung der erfassten lokalen Dateisysteme und ZFS-Pools auf dem Solaris-Host mit einer Kapazitätsplanung für die nächsten zwölf Monate. Er zeigt Gesamtkapazität, belegten und freien Speicher sowie auffällige Belegungswerte anhand der konfigurierten Warn- und Kritisch-Schwellen. Aus einem manuell vorgegebenen monatlichen Wachstum und einer zusätzlichen Reserve berechnet er eine empfohlene Gesamtkapazität und einen möglichen Erweiterungsbedarf. Dadurch unterstützt der Report die frühzeitige Erkennung von Speicherengpässen und die Planung zusätzlicher Kapazitäten. Die Prognose ist ein Planungsszenario und kein automatisch aus historischen Messwerten ermittelter Trend; sie bezieht sich auf die erfassten Storage-Bereiche und ersetzt keine Prüfung einzelner Tablespaces. Der Report liest ausschließlich Betriebssysteminformationen, baut keine Oracle-Datenbankverbindung auf und verändert keine Dateisysteme oder Pools.

    Fiktives Beispiel · statisch

    Demo-Host db-lab01 · Beispielstand 26.10.2026, 08:00 Uhr · Datenbanken DEMO1 / DEMO2 · kein Live-Zugriff

    Beispielauswertung – Kapazität

    Planungsgröße / /oradataFiktiver WertHerleitung
    Freier Filesystemplatz80 GiBAus dem Filesystem-Beispiel
    Betriebliche Reserve20 GiBAnnahme für diese Darstellung
    Für Wachstum verfügbar60 GiB80 − 20
    Angenommenes Wachstum10 GiB / MonatVereinfachter Planungstrend
    Rechnerische Reichweite6 Monate60 / 10
    APP_DATA bis Dateigrenze12 GiB100 maximal − 88 belegt
    Bewertung

    Die sechs Monate beschreiben nur den vereinfachten Filesystemtrend. APP_DATA kann seine konfigurierte Grenze früher erreichen; der Hostwert überstimmt diese Grenze nicht.

    Was der DBA daraus ableitet

    Trend über mehrere Messpunkte bestätigen, bekannte Last- und Datenzuwächse ergänzen und rechtzeitig planen. Eine Kapazitätsprognose ist kein festes Ausfalldatum.

    ← Zur Suite-Übersicht

    Über den Autor

    Marcus Garand · Senior Oracle DBA

    Seit zehn Jahren als Oracle DBA tätig, mit Erfahrung in unterschiedlichen Aufgaben und Positionen. Zu seinem fachlichen Hintergrund gehören Weiterbildungen rund um Oracle-Datenbanken, Backup und Recovery, Monitoring sowie SQL Server.

    Fortbildungen und Zertifizierung
    • Praxisworkshop Oracle Backup und Recovery
    • Seminar Oracle Data Guard
    • Seminar System-Monitoring mit Checkmk
    • SQL Server Troubleshooting
    • Oracle-Architektur und Interna
    • Oracle-Datenbankadministrationsschulung
    • New Features Oracle 12c
    • Administration von SQL Server
    • LPIC-1-Zertifizierung