\paragraph{Wann wird in Protokolldatei geschrieben?}
\begin{itemize}
\item{UNDO-Information:\\
\begin{itemize}
\item bevor die zugehörigen Änderungen in Datenbestand eingebracht werden
\item sonst rücksetzen unmöglich
\end{itemize}
}
\item{REDO-Information:\\
\begin{itemize}
\item muss geschrieben sein (in tmp Log Datei und Archivdatei), bevor der Abschluss der TA
an Programm bzw Benutzer gemeldet wird
\item sonst Wiederherstellung nicht möglich
\end{itemize}
}
\end{itemize}
\subsubsection{Backward-/Forward Recovery}
\begin{enumerate}
\item{ Forward:\\
Änderungen sind noch nicht in DB, aber schon in Log. Bevor
diese auf DB geschrieben werden, wird ein Commit-Record in
Log File geschrieben. Falls was schief geht und der Commit Record noch da ist, werden alle diese Änderungen wiedehrolt und ansonsten nichts getan, da alte Version noch in DB steht.}
\item{ Backward:\\
Ins Log kommt immer \textbf{alte} Version eines Wertes. Bei
einem Commit wird gewartet bis alle neuen werte in DB stehen.
Danach erst wird CommitRecord erstellt und eine Bestätigung
signalisiert.
Bei Verlust werden entweder alte Daten hergestellt oder nichts getan.}
\end{enumerate}
\paragraph{Vergleich}
\begin{itemize}
\item{ Forward Recovery: Hoher Speicherplatzbedarf! Daten werden erst nach Beendigung der TA in DB geschrieben und deswegen solange in Puffer behalten}
\item{ Backward-Recovery: Hoher I/O Aufwand! Alle Änderungen müssen vor TA-Ende in Datenfiles stehen.}
Zustände vor bzw nach einer Änderungen werden protokolliert:
\begin{itemize}
\item alter Zustand: Before Image (BI) für UNDO
\item neuer Zustand: After Image (AI) für REDO
\item für jede veränderte Seite (3) wird jeweils eine
vollständige Kopie vor (2) und nach (4) der Änderung in den Log
geschrieben.\\
$+$ schnelle Recovery\\
$-$ hoher E/A Aufwand
\end{itemize}
\paragraph{Optimierungen}
Um Log-Aufwand zu reduzieren nur geänderte \textbf{Teile einer Seite}
protokollieren.\\
Sammlung und Pufferung im HS:
\begin{itemize}
\item$+$ reduzierter E/A Aufwand
\item$-$ komplexeres und zeitaufwändigeres Recovery\\
Zurückspeichern gleicht eher dem Neu einfügen (freien Platz suchen, TID vergeben), da Stelle von wo Einträge stammen andersweitig genutzt werden können
\end{itemize}
\subsubsection{Sicherungspunkte}
Ma"snahmen zur Begrenzung des REDO Aufwands nach Systemfehlern (alle
erfolgreichen Änderungen die im Puffer verloren gegangen sind müssen wiederholt werden $\rightarrow$ nicht praktikabel!
\paragraph*{Methoden}
\begin{itemize}
\item{\textbf{Transaction-Oriented Checkpoint}\\
Geänderte Seiten einer TA nach TA-ende sofort in DB bringen (siehe FORCE) $\rightarrow$ zu hohe Belastung}
\item{\textbf{ Transaction-COnsisten Checkpoint}
\begin{itemize}
\item Einbringung aller Änderung erfolgreicher TA's
\item Lesesperee auf ganzer DB zum Zeitpunkt des Sicherungspunktes
\item Verzögerung von TA's
\item Sicherungspunkt begrenzt Undo und Redo Recovery
\end{itemize}
}
\item{\textbf{Action-Consisten Checkpoint}
\begin{itemize}
\item Zum Zeitpunkt des Sicherungspunktes dürfen keine Änderunen aktiv sein
\item Begünstigt nur Recovery, dafür kürzere Totzeit von System
\end{itemize}
}
\end{itemize}
\subsubsection{Allgemeine Restart Prozedur}
\textbf{3-phasiger Ansatz}
\begin{enumerate}
\item Analyse Lauf
Vom letzten Checkpoint bis zum Log Ende. Bestimmung von Gewinner und Verlierer TA's, sowie Seiten, die von ihnen geändert wurden
\item Undo Lauf \\
Rücksetzen der Verlierer TA's durch Rückwärtslesen des Logs bis zum BOT Satz der ältesten Verlierer TA
\item Redo Lauf \\
Vorwärtslesen des Logs (Startpunkt abhängig von Checkpoint Typ) und Änderungen der Gewinner TA's wiederholen