2008-10-10 3 views
8

Ich bin kein DBA und es fällt mir etwas schwer, den Transaktionsmanagementprozess von Oracle zu verstehen.Oracle - Wie funktionieren das Transaktions-, Rollback-Segment und die Undo_retention-Parameter?

Von dem, was ich verstanden, indem sie einige zuverlässige aussehende Seiten im Internet zu lesen (vor allem dieser AskTom note - aber nicht mit den Kommentaren stören), wenn eine Transaktion begangen wird, ist die neue Daten nicht berichtet der eigentliche Datenblock noch, bleibt aber im Rollback-Segment angemeldet. Wenn jemand eine SELECT-Anweisung für die Daten ausgibt oder wenn UNDO_RETENTION-Sekunden verstrichen sind - je nachdem, welches dieser beiden Ereignisse zuerst eintritt - werden die neuen Daten dann (und nur dann) in die Datenblöcke geschrieben.

Aber jemand in unserer Gesellschaft, die angeblich in der wissen, sagte mir vor kurzem das Gegenteil: nach ihm, wenn eine Transaktion die neuen Daten verpflichtet ist, sind sofort auf den Datenblöcken geschrieben, und das Rollback-Segment/rückgängig machen Tablespace behält die alten Daten für eine Dauer von UNDO_RETENTION Sekunden bei. Diese alten Daten bleiben während dieser Zeit für den Zugriff durch Abfragen verfügbar, die vor der Transaktion in SCNs gestartet wurden.

Was passiert wirklich in Oracle, und können Sie Referenzen angeben, um Ihre Antwort zu sichern?

Wir verwenden Oracle 9.2.0.8.

Vielen Dank im Voraus.

Antwort

13

Viel zu decken hier! Die Person in Ihrer Firma hat im Wesentlichen Recht, außer dass die Änderungen in den Datenblock im Speicher geschrieben werden, wie sie gemacht werden, sogar vor dem Commit; und sie werden völlig unabhängig von der Zeit, zu der Sie das Commit durchführen, auf die Festplatte geschrieben (möglicherweise vor, möglicherweise nach, niemals als Teil der Commit-Operation).

1) UNDO_RETENTION hat nichts damit zu tun, wenn Ihre Änderungen in den Datenblock geschrieben werden, entweder im Speicher oder auf der Festplatte. UNDO_RETENTION steuert, wie lange die zum Rückgängigmachen der Änderung erforderlichen Daten NACH dem Commit der Änderung bestehen bleiben. Der Zweck ist, dass andere Abfragen oder serialisierbare Transaktionen, die vor dem Festschreiben gestartet wurden, diese Daten möglicherweise noch benötigen. Referenz: http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/undo.htm#sthref1477

2) Wenn Sie ein Update durchführen, werden die Datenblöcke im Speicher geändert.Sie können oder dürfen nicht auf die Festplatte geschrieben werden (sogar bevor Sie sich verpflichten, glaube ich); Dies geschieht durch einen Hintergrundprozess. Außerdem werden Redo-Informationen in den Redo-Log-Puffer geschrieben. Rückgängig wird generiert und in einem Rückgängig-Segment gespeichert.

3) Beim Festschreiben stellt Oracle sicher, dass Ihre Wiederherstellungsinformationen auf die Festplatte geschrieben werden, und kennzeichnet die Rückgängig-Daten als festgeschrieben. Aber es schreibt die geänderten Datenblöcke nicht auf den Speicher, noch geht es zurück und markiert jeden Block als festgeschrieben. Dies ist, um das Commit so schnell wie möglich zu machen. Referenz: http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/transact.htm#sthref628

4) Die Datenblöcke im Speicher werden entweder als festgeschrieben markiert, wenn sie durch den Hintergrundprozess auf die Festplatte geschrieben werden, oder bei der nächsten Verwendung (durch SELECT oder eine andere Operation). Genau darum geht es in der AskTom-Notiz. Es geht nicht darum, ob Ihre Änderungen an Daten in den Block geschrieben werden; es geht darum, ob sie im Block selbst als festgeschrieben markiert sind.

+0

Danke für diese erschöpfende Antwort. – Manur

+2

Ja, Sie haben recht, dass unsaubere Blöcke vor dem Commit auf die Festplatte geschrieben werden können. Aus diesem Grund kann eine SELECT-Anweisung ein Redo generieren - es muss möglicherweise eine "verzögerte Blockbereinigung" durchgeführt werden. Der wichtige Teil ist, dass ein Commit nur garantiert, dass Redo auf die Festplatte geschrieben wird - nicht die Daten selbst. –

0

Mein Verständnis ist (im Grunde) der spätere, This link hat die Details.

Die Datenblöcke müssen nicht geschrieben werden, nur im Puffer aktualisiert werden, sie können oder können nicht auf die Festplatte geschrieben werden. Das Redo muss jedoch auf die Festplatte geschrieben werden, bevor das Commit fortgesetzt werden kann.

0

Ich stimme auch für die zweite Version basierend auf
diese link (das ist Oracle 10.2, aber ich denke, es gilt immer noch für 9.2 als auch).

Es heißt: "Nachdem eine Transaktion festgeschrieben wurde, werden für Rollback- oder Transaktionswiederherstellungszwecke keine Daten rückgängig gemacht. Für konsistente Lesevorgänge benötigen lang andauernde Abfragen jedoch diese alten Rückgängig-Informationen zum Erstellen älterer Bilder Datenblöcke. "

und

„Wenn die automatische Undo-Management aktiviert ist, gibt es immer eine aktuelle Aufbewahrungsfrist rückgängig, die die minimale Menge an Zeit, die Oracle Database alten zu behalten versucht Informationen rückgängig machen, bevor sie überschrieben werden.“