CSE 444: Database Internals
Section 8:
Transactions – Recovery with ARIES
1
Review in this section
Recovery for ARIES
Follows homework closely
2
ARIES
3
ARIES Data Structures
4
pageID | recLSN |
| |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
| | |
| | |
Transaction table
Log Record “Types”
(note that still no-force, the actual modified pages may not be written, and much smaller cost)
Undoing updates (during abort or recovery from crash),
for every update record undone, write a CLR (Compensation Log Record)
5
Example.
Example is adopted from Ramakrishnan-Gehrke book
6
Same as in Section 6
ARIES Data Structures
7
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
pageID | recLSN |
| |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
| | |
| | |
Transaction table
Buffer Pool
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
First operation:�1. T1000 changes the value of A from “abc” to “def” on page P500?
8
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
pageID | recLSN |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
| | |
Transaction table
Buffer Pool
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Changes�1. T1000 changes the value of A from “abc” to “def” on page P500
9
P500�PageLSN= 101 | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
pageID | recLSN |
P500 | 101 |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
| | | | | | |
| | | | | | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | Running |
| | |
Transaction table
Buffer Pool
A = def D = mnp
C = tuv
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
In hw4/lecture notes,��1. “Transaction T3 writes A”��If it is stored in LSN8 (say), and A is not written earlier, �then log entry = “Write A, A -> A8”��2. Also, “page id” was not mentioned in log entries in some places (implied from the log entry)�� It is ok if you do not write page Id in hw4��3. Note the “status” column in transaction table� was omitted in some lecture 6 slides
10
Comments
Next:�2. T2000 changes the value of B from “hij” to “klm” on page P600 ?
11
P500�PageLSN= 101 | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
pageID | recLSN |
P500 | 101 |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
| | | | | | |
| | | | | | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | Running |
| | |
Transaction table
Buffer Pool
A = def D = mnp
C = tuv
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Changes:�2. T2000 changes the value of B from “hij” to “klm” on page P600 ?
12
P500�PageLSN= 101 | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | | |
| | | | | | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | Running |
T2000 | 102 | Running |
Transaction table
Buffer Pool
A = def D = mnp
C = tuv
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Next:�3. T2000 changes the value of D from “mnp” to “qrs” on page P500?
13
P500�PageLSN= 101 | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | | |
| | | | | | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | Running |
T2000 | 102 | Running |
Transaction table
Buffer Pool
A = def D = mnp
C = tuv
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Changes:�3. T2000 changes the value of D from “mnp” to “qrs” on page P500
14
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | Running |
T2000 | 103 | Running |
Transaction table
Buffer Pool
A = def D = qrs
C = tuv
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Next:�4. T1000 changes the value of C from “tuv” to “wxy” on page P505?
15
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | Running |
T2000 | 103 | Running |
Transaction table
Buffer Pool
A = def D = qrs
C = tuv
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Changes:�4. T1000 changes the value of C from “tuv” to “wxy” on page P505?
16
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | Running |
T2000 | 103 | Running |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Next:�5. T2000 commits and the end log record is written
17
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | Running |
T2000 | 103 | Running |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Changes:�5. T2000 commits and the end log record is written --- step 1
18
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | Running |
T2000 | 103 | Committed |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Changes:�5. T2000 commits and the end log record is written --- step 2
19
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | Running |
T2000 | 103 | Committed |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
T2000 removed from transaction table
Changes:�5. T2000 commits and the end log record is written --- step 2
20
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | Running |
T2000 | 103 | Committed |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Log written to disk
Note: no force = not the dirty pages changed by T2000!
�Whenever a transaction commits, �log is flushed to the disk == the log-tail is written to disk��NOTE:�1. The “Commit” record is required to be flushed (i.e. all logs up to and including that commit record)�2. The “End” record is not required to be flushed, in this case we are only assuming that it has been flushed as well (so that we have a good example while doing recovery ☺)�� �
21
Next:�6. T1000 changes the value of E from “pq” to “rs” on page P700
22
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= - |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | Running |
| | |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = pq
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Changes:�6. T1000 changes the value of E from “pq” to “rs” on page P700
23
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= 107 |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
P700 | 107 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | 104 | T1000 | P700 | Write E “pq” -> “rs” | Update | - |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 107 | Running |
| | |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = rs
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Next:�7. Page P600 is flushed to disk
24
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= 107 |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
P700 | 107 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | 104 | T1000 | P700 | Write E “pq” -> “rs” | Update | - |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 107 | Running |
| | |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = rs
P500�PageLSN= - | P600�PageLSN= - |
P505�PageLSN= - | P700�PageLSN= - |
B = hij
Disk
A = abc D = mnp
C = tuv
E = pq
Next:�7. Page P600 is flushed to disk – Step 1
25
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= 107 |
B = klm
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
P700 | 107 |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | 104 | T1000 | P700 | Write E “pq” -> “rs” | Update | - |
Dirty page table
transID | lastLSN | status |
T1000 | 107 | Running |
| | |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = rs
P500�PageLSN= - | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Next:�7. Page P600 is flushed to disk – Step 2
26
P500�PageLSN= 103 | P600�PageLSN= 102 |
P505�PageLSN= 104 | P700�PageLSN= 107 |
pageID | recLSN |
P500 | 101 |
P505 | 104 |
P700 | 107 |
Dirty page table
transID | lastLSN | status |
T1000 | 107 | Running |
| | |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = rs
P500�PageLSN= - | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | 104 | T1000 | P700 | Write E “pq” -> “rs” | Update | - |
B = klm
���NOTE: Write Ahead Log – Keep track of all changes to a page��1. All LSNs changing that page must be written to disk�2. In this case it is okay, since the last log record involves P700 while P600 is being flushed�3. When a page is written, we need to ensure that all log records up to the lastLSN of the last transaction that ever wrote to that page are on disk�(Log is always written to disk in order, i.e. we can never skip some log entries in between!)�
27
28
8. CRASH!!
8. Crash!! ---- These are gone from memory
29
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | 104 | T1000 | P700 | Write E “pq” -> “rs” | Update | - |
P500�PageLSN= 103 | |
P505�PageLSN= 104 | P700�PageLSN= 107 |
pageID | recLSN |
P500 | 101 |
P505 | 104 |
P700 | 106 |
Dirty page table
transID | lastLSN | status |
T1000 | 104 | Running |
| | |
Transaction table
Buffer Pool
A = def D = qrs
C = wxy
E = rs
P500�PageLSN= - | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Three Recovery Phases of ARIES
30
About Checkpointing
31
Analysis Phase
32
Analysis Phase
33
| |
| |
pageID | recLSN |
| |
| |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
| | |
| | |
Transaction table
Buffer Pool
P500�PageLSN= - | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Will not show the buffer pool from the next slide
Analysis Phase
34
pageID | recLSN |
P500 | 101 |
| |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | U= Unknown |
| | |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
In hw5, you can also write “Running/In progress” instead of “Unknown”
Analysis Phase
35
pageID | recLSN |
P500 | 101 |
P600 | 102 |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | U |
T2000 | 102 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Analysis Phase
36
pageID | recLSN |
P500 | 101 |
P600 | 102 |
| |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 101 | U |
T2000 | 103 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Analysis Phase
37
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
T2000 | 103 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Analysis Phase
38
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
T2000 | 105 | C |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Write A or Abort if you see an Abort log instead
Analysis Phase
39
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Already written to disk, but reappears
Compare with Dirty Table and Transaction Table right before Crash!!
40
P500�PageLSN= 103 | |
P505�PageLSN= 104 | P700�PageLSN= 107 |
pageID | recLSN |
P500 | 101 |
P505 | 104 |
P700 | 107 |
Dirty page table
transID | lastLSN | status |
T1000 | 107 | Running |
| | |
Transaction table
Buffer Pool
A = def D = qrs
C = tuv
E = rs
P500�PageLSN= - | P600�PageLSN= 102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | 104 | T1000 | P700 | Write E “pq” -> “rs” | Update | - |
Lost update during crash, but write ahead log, so safe!
Analysis Phase
41
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
T2000 | 105 | C |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
Remove entry from Transaction Table if you see an End record (both for Aborted and Committed transactions)
REDO Phase
42
Analysis Phase
43
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
REDO Phase: find firstLSN
44
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
REDO Phase
45
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= “-” to 101 | |
| |
A = def D = mnp
Buffer Pool
REDO Phase
46
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= 101 | P600 PageLSN= 102 |
| |
A = def D = mnp
Buffer Pool
B = klm
REDO Phase
47
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= 101 to 103 | P600 PageLSN=102 |
| |
A = def D = qrs
Buffer Pool
B = klm
REDO Phase
48
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= 103 | P600 PageLSN=102 |
P505�PageLSN=“” to 104 | |
A = def D = qrs
Buffer Pool
B = klm
C =wxy
UNDO Phase
49
UNDO Phase
50
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
| | | | | | |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= 103 | P600 PageLSN=102 |
P505�PageLSN= 104 | |
A = def D = qrs
Buffer Pool
B = klm
C =wxy
ToUNDO = {104}
CLR
51
UNDO Phase
52
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | | T1000 | | UndoT1000 LSN104 | CLR | 101 |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= 103 | P600 PageLSN=102 |
P505�PageLSN= 107 | |
A = def D = qrs
Buffer Pool
B = klm
C =tuv
ToUNDO = {101}
UNDO Phase
53
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | | T1000 | | UndoT1000 LSN104 | CLR | 101 |
108 | | T1000 | | UndoT1000 LSN101 | CLR | - |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= 108 | P600 PageLSN=102 |
P505�PageLSN= 107 | |
A = abc D = qrs
Buffer Pool
B = klm
C =tuv
ToUNDO = {}
UNDO Phase
54
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | | T1000 | | UndoT1000 LSN104 | CLR | 101 |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= 103 | P600 PageLSN=102 |
P505�PageLSN= 107 | |
A = def D = qrs
Buffer Pool
B = klm
C =tuv
ToUNDO = {101}
UNDO Phase
pageID | recLSN |
P500 | 101 |
P600 | 102 |
P505 | 104 |
| |
LSN | prevLSN | tID | pID | Log entry | Type | undoNextLSN |
101 | - | T1000 | P500 | Write A “abc” -> “def” | Update | - |
102 | - | T2000 | P600 | Write B “hij” -> “klm” | Update | - |
103 | 102 | T2000 | P500 | Write D “mnp” -> “qrs” | Update | - |
104 | 101 | T1000 | P505 | Write C “tuv” -> “wxy” | Update | - |
105 | 103 | T2000 | | | Commit | |
106 | 105 | T2000 | | | End | |
107 | | T1000 | | UndoT1000 LSN104 | CLR | 101 |
108 | | T1000 | | UndoT1000 LSN101 | CLR | - |
109 | | T1000 | | | End | - |
Dirty page table
Log
transID | lastLSN | status |
T1000 | 104 | U |
Transaction table
P500�PageLSN= - | P600 PageLSN=102 |
P505�PageLSN= - | P700�PageLSN= - |
B = klm
Disk
A = abc D = mnp
C = tuv
E = pq
P500�PageLSN= 108 | P600 PageLSN=102 |
P505�PageLSN= 107 | |
A = abc D = qrs
Buffer Pool
B = klm
C =tuv
Write an END record
(explicitly mentioned in hw 4 for the aborted transaction)
What happens if T aborts?
56
2 Follow “prevLSN” to undo all updates by T
3. Write an “End” log record for T
Handling Crashes during Undo
57
[Figure 4 from Franklin97]
In general, for every single crash (even for crash during Analysis/Redo/Undo phases), start again with Analysis
If some CLR records are written to disk during an UNDO phase, then a crash happens (e.g. here LSN 40, 50 are written to disk before the second crash), then the next UNDO phase will skip undoing those CLRs.