Transaktionen

Moin

Datenbanken unterstützen doch fast alle atomare Transaktionen.

Was passiert eigentlich wenn eine DB während oder kurz nach einem Commit hart crashed (im Sinne Stromausfall) ?

Sind die Daten auf Platte dann in jedem Fall noch Konsistent ?

Welche Protokolle werden auf den Platten angewand um dies zu garantieren ?

Geht das nicht unheimlich zu Lasten der Performance ?

Bei verteilten DB’s stell ich mir das ganze noch wesentlich härter vor, gilt da auch in jedem Fall Konsistenz (vorrausgesetzt alle Daten aller beteiligter Server sind nach dem Hochfahren wieder da) ?

Danke
Gilson Laurent

Was passiert eigentlich wenn eine DB während oder kurz nach
einem Commit hart crashed (im Sinne Stromausfall) ?

Sind die Daten auf Platte dann in jedem Fall noch Konsistent ?

bei oracle ist es so, dass alle schreibzugriffe direkt in datafile vorgenommen werden, der alte inhalt wird dabei ins sogenannte rollback-segment kopiert. zusätzlich werden alle ausgeführten befehle in einem sogenannten redo-logfile gesichert (stand oracle 8 - bei neueren versionen heisst das ev. anders, dürfte intern aber ähnlich funktionieren).

wenn also genau während eines commits ein stromausfall passiert, steht der neue wert bereits im datafile. oracle erkennt aber, dass das letzte statement noch nicht korrekt commited wurde. es muss also „recovern“ - dabei wird der letzte als konsistent angenommen bestand hergenommen und alle änderungen, die seitdem passiert sind und auch commited wurden (aus dem redo-logfile) angewendet. das ganze dauert zwar manchmal eine weile, führt aber zu einem aus datenbanksicht konsistenten zustand.

Welche Protokolle werden auf den Platten angewand um dies zu
garantieren ?

hat mit der platte nix zu tun

Geht das nicht unheimlich zu Lasten der Performance ?

natürlich. aber das ist der preis für sicheres arbeiten. in unternehmenskritischen anwendungen kostet eine inkonsistenz aufgrund eines stromausfalls weitaus mehr als der verwaltungs-overhead für die datenkonsistenz. für spielzeug-anwendungen gibt es spielzeug-datenbanken, die schön performant sind.

Bei verteilten DB’s stell ich mir das ganze noch wesentlich
härter vor, gilt da auch in jedem Fall Konsistenz
(vorrausgesetzt alle Daten aller beteiligter Server sind nach
dem Hochfahren wieder da) ?

ist es auch - verteilte commits werden nach den sogenannten two-phase-commit-verfahren durchgeführt. dabei stellt die datenbank zu fast 100% sicher, dass die daten konsistent bleiben. in einigen fällen kann es aber dazu kommen, dass der status von transaktionen zweifelhaft ist (transaction in doubt). dann muss der administrator eingreifen und die transaktion manuell abbrechen. sobald alle beteiligten datenbanken wieder verfügbar sind, wird automatisch auf einen konsistenten zustand recovered. ist natürlich ebenfalls eine höllischer aufwand. nur gleiche argumentation wie oben: in unternehmenskritischen anwendungen muss konsistenz vor performance kommen (ausser die performance ist das unternehmenskritische daran).

aber performance kann mit intensiven hardware-einsatz erschlagen. schlechtes db-design führt zu inkonsistenzen, die keiner mehr reparieren kann. der aufwand ist damit gerechtfertigt.

erwin

hi!

Geht das nicht unheimlich zu Lasten der Performance ?

natürlich. aber das ist der preis für sicheres arbeiten. in
unternehmenskritischen anwendungen kostet eine inkonsistenz
aufgrund eines stromausfalls weitaus mehr als der
verwaltungs-overhead für die datenkonsistenz.

performance-probleme sind nur ein zeitproblem: ein bißchen warten, und die neu angeschaffte hardware hat keines mehr :wink:

ernsthaft: für den anwender ist dieses performance-problem gar nicht bis minimal spürbar, jedoch spürt er sofort, wenn daten verloren gehen sollten (und es gibt nix schlimmeres als einen in rage geratenen anwender :wink:; hier sind die db-administratoren und entwickler gefragt, zu optimieren, was das zeug hält …

grüße,
tomh

ps: es war sogar kein problem, eine 7.2-er datenbank zu recovern, die nur mehr durch das killen der prozesse niederzufahren war …

Moin

Sind die Daten auf Platte dann in jedem Fall noch Konsistent ?

bei oracle ist es so, dass alle schreibzugriffe direkt in
datafile vorgenommen werden, der alte inhalt wird dabei ins
sogenannte rollback-segment kopiert. zusätzlich werden alle
ausgeführten befehle in einem sogenannten redo-logfile gesichert

Das hilft mir schonmal weiter… Die verwenden also WAL mit einer Rollback-Datei ?

Welche Protokolle werden auf den Platten angewand um dies zu
garantieren ?

hat mit der platte nix zu tun

Damit meinte ich die Auf/Verteilung der Daten die zum commit gehören. (Also das rollback und redolog und den zeitlichen Ablauf der schreib/lese-operationen)

Geht das nicht unheimlich zu Lasten der Performance ?

natürlich. aber das ist der preis für sicheres arbeiten.

Gibts da allgemein gültige Ansätze wie man den Overhead klein halten kann ? (Ausser WAL ?)

cu

Das hilft mir schonmal weiter… Die verwenden also WAL mit
einer Rollback-Datei ?

was ist WAL???
(kenne nur ich den begriff nicht?)

Damit meinte ich die Auf/Verteilung der Daten die zum commit
gehören. (Also das rollback und redolog und den zeitlichen
Ablauf der schreib/lese-operationen)

wie bereits erwähnt werden daten sofort in die datei geschrieben (erst nachdem der alte inhalt ins rollback-segment umkopiert wurden). beim commit wird sichergestellt, dass das redo-log auf die platte geschrieben wird. inkonsistenzen sollten damit zu keinem zeitpunkt auftreten können.

ach ja: mein ursprünliches posting klang ev. so, also ob die performance durch diese ganzen aktionen in den keller sinkt. das ist nicht so richtig. natürlich kosten diese aktionen alle zeit. aber das ganze ist so optimiert, dass die db trotzdem noch performant läuft. oracle versucht ständig, alle diese aktionen auf möglichst viele subprozesse zu verteilen. schlauerweise hat an rollback-segmente, redo-logfiles und datafiles noch auf verschiedenen platten, um die io-last zu verteilen (oracle 10g macht das vollautomatisch). wenn du also einen server mit ordendlicher io-leistung und massig hauptspeicher hast, sollte performance eigentlich kein thema sein.

erwin

Moin

Das hilft mir schonmal weiter… Die verwenden also WAL mit
einer Rollback-Datei ?

was ist WAL???

Write-ahead-logging. Ich habs aus der doc zu postgresql, das hört sich im Prinzip genauso an wie das von dir beschriebene oracle-system, nur mit einer zusätzlichen bei oracle Datei.

Damit meinte ich die Auf/Verteilung der Daten die zum commit
gehören. (Also das rollback und redolog und den zeitlichen
Ablauf der schreib/lese-operationen)

wie bereits erwähnt werden daten sofort in die datei geschrieben
beim commit wird sichergestellt, dass das redo-log auf
die platte geschrieben wird. inkonsistenzen sollten damit zu
keinem zeitpunkt auftreten können.

hmmm … also doch nicht ganz WAL. Dabei werden (laut der doc von postgres, mysql-nndb scheint was ähnliches zu machen) die Commandos ins WAL (=redolog) auf Platte geschrieben. Bei einem commit-commando wird geflushed, also Plattencache & Co für’s WAL geleert. Das ändern der datafile kommt später, wenn Zeit dafür ist (oder die Daten unvorhergesehenerweise aus dem RAM verdrängt wurden und wieder gebraucht werden). rollback wird auch angelegt, allerdings direkt in der datafile beim ändern (Keine Kopie, die neuen Daten werden woanders hingeschrieben, defragmentiert wird später)

aber das ganze ist so optimiert, dass die db trotzdem noch
performant läuft.

Das ist mein Problem:
Ich soll eine „DB“ schreiben. Kein SQL, keine grossartigen Strukturen/Befehle wie joins…, aber eben doch crash-sicher und einigermassen schnell. Und da ich von der Materie nicht soviel Ahnung hatte dachte ich doch gleich an dieses Forum.

wenn du also einen server mit
ordendlicher io-leistung und massig hauptspeicher hast, sollte
performance eigentlich kein thema sein.

Das ist der zweite Teil meines Problems: der Server ist sowas von arschlahm…

Danke, deine Info’s haben mir geholfen.

cu