Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1 MB, 67 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small> Checkpoint đơn giản
<small>l</small> Checkpoint linh động (nonquiescent checkpoint)
<small>l</small>
<small>l</small> Undo-Logging (immediate modification)
<small>l</small> Redo-Logging (deferred modification)Undo/Redo Logging
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small> Lỗi lập trình của các giao tác (transaction bug)
<small>l</small> Lỗi lập trình của DBMS (DBMS bug)
<small>l</small> Hư hỏng phần cứng (hardware failure)
<small>l</small> Chia sẻ dữ liệu (data sharing)
<small>l</small>
<small>l</small> Chia sẻ dữ liệu
<small>l</small> Sự cố
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small> Nhập thiếu 1 số trong dãy số điện thoại
<small>l</small>
<small>l</small> Nhập sai 1 số trong dãy số điện thoại
<small>l</small>
<small>l</small> Ràng buộc khóa chính, khóa ngoại
<small>l</small> Ràng buộc miền giá trị
<small>l</small> Trigger
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small> Đầu đọc của đĩa cứng hư
<small>l</small> Sector trên đĩa cứng hư
<small>l</small>
<small>l</small> Kỹ thuật RAID
<small>l</small> Duy trì CSDL trên băng từ hoặc đĩa quang (archive)
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small> Cúp điện
<small>l</small> Lỗi phần mềm DBMS hoặc OS
<small>l</small> Hư RAM
<small>l</small>
<small>l</small> Nhật ký giao tác (transaction log)
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small> Một mẫu tin cho biết một giao tác nào đó đã làm những gì
<small>l</small>
<small>DataA = 8 </small><b><small>16</small></b>
<small>B = 8 </small><b><small>16</small></b>
<small>Disk</small>
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13"><small>lGhi nhận giao tác T cập nhật lên đơn vị dữ liệu X</small>
<small>lX có giá trị trước khi cập nhật là v và sau khi cập nhật là w</small>
<small>l</small>
<small>l</small> DBMS sẽ tra cứu nhật ký giao tác để khơi phục những gì mà các giao tác đã làm
<small>l</small> Một vài giao tác sẽ phải thực hiện lại (redo)
<small>lNhững giá trị đã cập nhật xuống CSDL sẽ phải cập nhật lần nữal</small> Một vài giao tác không cần phải thực hiện lại (undo)
<small>lCSDL sẽ được khôi phục về lại trạng thái trước khi thực hiện</small>
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small> Checkpoint đơn giản
<small>l</small> Checkpoint linh động (nonquiescent checkpoint)
<small>l</small>
<small>l</small>
<small>l</small> Do phải quét hết tập tin nhật ký.
<small>l</small>
<small>l</small> Nhật ký giao tác có thêm mẫu tin <checkpoint> hay <ckpt>
<small>l</small> Mẫu tin <checkpoint> sẽ được ghi xuống nhật ký định kỳ
<small>lVào thời điểm mà DBMS ghi tất cả những gì thay đổi của CSDL từ vùng đệm xuống đĩa</small>
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17"><small>l</small>
<small>l</small> (1) Tạm dừng tiếp nhận các giao tác mới
<small>l</small> (2) Đợi các giao tác đang thực hiện
<small>lHoặc là hoàn tất (commit)</small>
<small>lHoặc là hủy bỏ (abort)</small>
và ghi mẫu tin <commit T> hay <abort T> vào nhật ký
<small>l</small> (3) Tiến hành ghi nhật ký từ vùng đệm xuống đĩa
<small>l</small> (4) Tạo 1 mẫu tin <checkpoint> và ghi xuống đĩa
<small>l</small> (5) Tiếp tục nhận các giao tác mới
<small>l</small>
<small>l</small>
<small>l</small>
<small>l</small> Duyệt từ cuối nhật ký đến điểm lưu trữ
<small>Checkpoint </small>
<small>scan </small>
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19"><small>l</small>
<small>l</small> Chờ các giao tác hoàn tất hoặc hủy bỏ
<small>l</small> Cho phép tiếp nhận các giao tác mới trong quá trình checkpoint
<small>l</small> Mẫu tin <start ckpt (T<sub>1</sub>, T<sub>2</sub>, …, T<sub>k</sub>)>
<small>l</small> Mẫu tin <end ckpt>
<small>Checkpoint </small>
<small>V</small>
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20"><small>l</small>
<small>l</small> (1) Tạo mẫu tin <start ckpt (T<sub>1</sub>, T<sub>2</sub>,…, T<sub>k</sub>)> và ghi xuống đĩa
<small>lT</small><sub>1</sub><small>, T</small><sub>2</sub><small>, …, T</small><sub>k</sub><small> là những giao tác đang thực thi</small>
<small>l</small> (2) Chờ cho đến khi T<sub>1</sub>, T<sub>2</sub>, …, T<sub>k</sub> hồn tất hay hủy bỏ,nhưng khơng ngăn các giao tác mới bắt đầu
<small>l</small> (3) Khi T<sub>1</sub>, T<sub>2</sub>, …, T<sub>k</sub> thực hiện xong, tạo mẫu tin <end ckpt> và ghi xuống đĩa
<small>l</small>
<small>l</small>
<small>l</small> Undo-Logging (immediate modification)
<small>l</small> Redo-Logging (deferred modification)
<small>l</small> Undo/Redo Logging
<small>l</small>
<small>l</small> <b>(1) Một thao tác phát sinh ra 1 mẫu tin nhật ký</b>
<small>lMẫu tin của thao tác cập nhật chỉ ghi nhận lại </small><b><small>giá trị cũ</small></b>
<small>l</small> <b><small><T, X, v></small></b>
<small>l</small> <b>(2) Trước khi X được cập nhật xuống đĩa, mẫu tin <T, </b>
X, v> đã phải có trên đĩa
<small>l</small> <b>(3) Trước khi mẫu tin <commit, T> được ghi</b> xuống đĩa, tất cả các cập nhật của T đã được phản ánh lên đĩa
<small>lFlush-log: chỉ chép những block mẫu tin nhật ký mới chưa được chép trước đó</small>
<small>Hành động</small>
<small>Mem AMem BDisk ADisk B</small>
<small>Mem Log<start T></small>
<small>6789101112</small>
</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24"><small>l</small>
<small>l</small> <b>(1) Gọi S là tập các giao tác chưa kết thúc</b>
<small>l</small> <b><small>Có <start T</small><sub>i</sub><small>> trong nhật ký nhưng </small></b>
<small>l</small> <b><small>Khơng có <commit T</small><sub>i</sub><small>> hay <abort T</small><sub>i</sub><small>> trong nhật ký</small></b>
<small>l</small> <b>(2) Với mỗi mẫu tin <T<sub>i</sub>, X, v> trong nhật ký (theo thứ tự cuối tập tin đến đầu tập tin)</b>
<small>l</small> <b><small>Nếu T</small><sub>i</sub><small> Sthì- Write(X, v) - Output(X)</small></b>
<small>l</small> <b>(3) Với mỗi T<sub>i</sub> S</b>
<b><small>Ghi mẫu tin <abort T> lên nhật ký</small></b>
<small>Sự cốT</small><sub>2</sub>
<small>Bỏ qua</small>
<small>Khôi phục dữ liệu </small>
</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26"><small>Hành động</small>
<small>Mem A Mem BDisk ADisk B</small>
<small>Mem Log<start T></small>
<small>67891011</small>
</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27"><small>l</small>
<small>l</small>
<small>l</small>
<b><small><T</small><sub>1</sub><small>, A, 5> <start T</small><sub>2</sub><small>> <T</small><sub>2</sub><small>, B, 10></small></b>
<small>Checkpoint</small>
</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28"><small>l</small>
<small>l</small> <T<sub>3</sub>, F, 30>
<small>lT</small><sub>3</sub><small> chưa kết thúc</small>
<small>lKhơi phục F=30l</small> < T<sub>3</sub>, E, 25 >
<small>lKhôi phục E=25l</small> <checkpoint>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 5> <start T</small><sub>2</sub><small>> <T</small><sub>2</sub><small>, B, 10> <T</small><sub>2</sub><small>, C, 15> <T</small><sub>2</sub><small>, D, 20> <commit T</small><sub>1</sub><small>> <commit T</small><sub>2</sub><small>> </small></b>
<b><small><checkpoint> </small></b>
<b><small><start T</small><sub>3</sub><small>> <T</small><sub>3</sub><small>, E, 25> <T</small><sub>3</sub><small>, F, 30></small></b>
<small>scan</small>
</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29"><small>l</small>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 5> <start T</small><sub>2</sub><small>> <T</small><sub>2</sub><small>, B, 10></small></b>
<small>Nonquiescent Checkpoint</small>
</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30"><small>l</small>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 5> <start T</small><sub>2</sub><small>> <T</small><sub>2</sub><small>, B, 10> </small></b>
<b><small><start ckpt (T</small><sub>1</sub><small>,T</small><sub>2</sub><small>)> </small></b>
<b><small><T</small><sub>2</sub><small>, C, 15> <start T</small><sub>3</sub><small>> <T</small><sub>1</sub><small>, D, 20> <commit T</small><sub>1</sub><small>> <T</small><sub>3</sub><small>, E, 25> </small></b>
<b><small><commit T</small><sub>2</sub><small>> <T, F, 30></small></b>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 5> <start T</small><sub>2</sub><small>> <T</small><sub>2</sub><small>, B, 10> </small></b>
<b><small><start ckpt (T</small><sub>1</sub><small>,T</small><sub>2</sub><small>)> </small></b>
<b><small><T</small><sub>2</sub><small>, C, 15> <start T</small><sub>3</sub><small>> <T</small><sub>1</sub><small>, D, 20> <commit T</small><sub>1</sub><small>> <T</small><sub>3</sub><small>, E, 25> <commit T</small><sub>2</sub><small>> </small></b>
<b><small><end ckpt> </small></b>
</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31"><small>l</small>
<small>l</small> <T<sub>3</sub>, F, 30>
<small>lT</small><sub>3</sub><small> chưa kết thúc</small>
<small>lKhôi phục F=30l</small> <end ckpt>
<small>lNhững giao tác bắt đầu trước <start ckpt> đã hoàn tất</small>
<small>lT</small><sub>1</sub><small> và T</small><sub>2</sub><small> đã hoàn tấtl</small> < T<sub>3</sub>, E, 25 >
<b><small><start ckpt (T</small><sub>1</sub><small>,T</small><sub>2</sub><small>)> </small></b>
<b><small><T</small><sub>2</sub><small>, C, 15> </small></b>
<b><small><start T</small><sub>3</sub><small>> <T</small><sub>1</sub><small>, </small></b>
<b><small>D, 20> <commit T</small><sub>1</sub><small>> <T</small><sub>3</sub><small>, E, 25> </small></b>
<b><small><commit T</small><sub>2</sub><small>> </small></b>
<b><small><end ckpt> <T</small><sub>3</sub><small>, F, 30></small></b>
<small>scan</small>
</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32"><b><small><start, T</small><sub>2</sub><small>> <T</small><sub>2</sub><small>, B, 10> <start ckpt (T</small><sub>1</sub><small>,T</small><sub>2</sub><small>)> </small></b>
<b><small><T</small><sub>2</sub><small>, C, 15> <start, T</small><sub>3</sub><small>> <T</small><sub>1</sub><small>, D, 20> <commit T</small><sub>1</sub><small>> <T</small><sub>3</sub><small>, E, 25></small></b>
<small>scan</small>
</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33"><small>l</small>
<small>l</small> <b>(1)</b> Một thao tác phát sinh ra 1 mẫu tin nhật ký
<small>lMẫu tin của thao tác cập nhật chỉ ghi nhận lại </small><b><small>giá trị mới</small></b>
</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34"><small>Hành động</small>
<small>Mem AMem BDisk ADisk B</small>
<small>Mem Log<start T></small>
<b><small>Flush log</small></b>
<small><T, A, 16></small>
<small><T, B, 16><commit T></small>
</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35"><small>l</small>
<small>l</small> <b>(1) Gọi S là tập các giao tác hoàn tất</b>
<small>l</small> <b><small>Có mẫu tin <commit T</small><sub>i</sub><small>> trong nhật ký</small></b>
<small>l</small> <b>(2) Với mỗi mẫu tin <T<sub>i</sub>, X, w> trong nhật ký (theo thứ tự cuối tập tin đến đầu tập tin)</b>
<small>l</small> <b><small>Nếu T</small><sub>i</sub><small> Sthì- Write(X, w) - Output(X)</small></b>
<small>l</small> <b>(3) Với mỗi T<sub>j</sub> S</b>
<small>l</small> <b><small>Ghi mẫu tin <abort T</small><sub>j</sub><small>> lên nhật ký</small></b>
<small>Sự cốT</small><sub>2</sub>
<small>Bỏ quaThực hiện lại </small>
</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37"><small>Hành động</small>
<small>Mem A Mem BDisk ADisk B</small>
<small>Mem Log<start T></small>
<b><small>Flush log</small></b>
<small><T, A, 16></small>
<small><T, B, 16><commit T></small>
<b><small>Thực hiện lại T, ghi A=16 và B=16</small></b>
<b><small>Thực hiện lại T, ghi A=16 và B=16</small></b>
<b><small>Xem như T chưa hoàn tất, A và B khơng có thay đổi</small></b>
</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39"><small>l</small>
<small>l</small> <b>(1) </b>Tạo mẫu tin <start ckpt (T<sub>1</sub>, T<sub>2</sub>,…, T<sub>k</sub>)> và ghi xuống đĩa
<small>lT</small><sub>1</sub><small>, T</small><sub>2</sub><small>, …, T</small><sub>k</sub><small> là những giao tác đang thực thi</small>
<small>l</small> <b>(2)</b> Ghi xuống đĩa những dữ liệu của các giao tác đã hoàn tất trên vùng đệm
<small>l</small> <b>(3) </b>Tạo mẫu tin <end ckpt> và ghi xuống đĩa
<small>l</small>
<small>l</small> T<sub>1</sub> đã hồn tất trước <start ckpt>
<small>lCó thể đã được ghi xuống đĩa</small>
<small>lNếu chưa thì trước khi <end ckpt> cũng được ghi xuống đĩa</small>
<b><small>ckpt (T</small><sub>2</sub><small>)> <T</small><sub>2</sub><small>, </small></b>
<b><small>C, 15> <start T</small><sub>3</sub><small>> <T</small><sub>3</sub><small>, D, 20> </small></b>
<b><small><end ckpt> </small></b>
<b><small><commit T</small><sub>2</sub><small>> <commit T</small><sub>3</sub><small>></small></b>
</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="41"><small>lThực hiện lại T</small><sub>3</sub>
<small>lGhi D=20</small>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 5> <start T</small><sub>2</sub><small>> <commit T</small><sub>1</sub><small>> <T</small><sub>2</sub><small>, B, 10> <start </small></b>
<b><small>ckpt (T</small><sub>2</sub><small>)> <T</small><sub>2</sub><small>, </small></b>
<b><small>C, 15> <start T</small><sub>3</sub><small>> <T</small><sub>3</sub><small>, D, 20> </small></b>
<b><small><end ckpt> </small></b>
<b><small><commit T</small><sub>2</sub><small>> <commit T</small><sub>3</sub><small>></small></b>
<small>scan</small>
</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="42"><b><small>ckpt (T</small><sub>2</sub><small>)> <T</small><sub>2</sub><small>, </small></b>
<b><small>C, 15> <start T</small><sub>3</sub><small>> <T</small><sub>3</sub><small>, D, 20></small></b>
<small>scan</small>
</div><span class="text_page_counter">Trang 43</span><div class="page_container" data-page="43"><small>l</small>
<small>l</small> <b>Khi giao tác kết thúc, dữ liệu được ghi xuống đĩa ngay lập tức</b>
<small>l</small> <b>Truy xuất đĩa nhiều</b>
<small>l</small> <b>Giữ lại các cập nhật trên vùng đệm cho đến khi giao tác hoàn tất và mẫu tin nhật ký được ghi xuống đĩa</b>
<small>l</small> <b>Tốn nhiều bộ nhớ</b>
<small>l</small>
<small>l</small> <b>(1) Một thao tác phát sinh ra 1 mẫu tin nhật ký</b>
<small>l</small> <b><small>Mẫu tin của thao tác cập nhật ghi nhận giá trị cũ và mới của một đơn vị dữ liệu</small></b>
</div><span class="text_page_counter">Trang 45</span><div class="page_container" data-page="45"><small>Hành động</small>
<small>Mem AMem BDisk ADisk B</small>
<small>Mem Log<start T></small>
<b><small>Flush log</small></b>
<small><T, A, 8, 16></small>
<small><T, B, 8, 16></small>
<small><commit T></small>
</div><span class="text_page_counter">Trang 46</span><div class="page_container" data-page="46"><small>l</small>
<small>l</small> <b>(1) Khôi phục lại (undo) những giao tác chưa kết thúc </b>
<small>l</small> <b><small>Theo thứ tự từ cuối nhật ký đến đầu nhật ký</small></b>
<small>l</small> <b>(2) Thực hiện lại (redo) những giao tác đã hoàn tất</b>
<small>l</small> <b><small>Theo thứ tự từ đầu nhật ký đến cuối nhật ký</small></b>
<small>Sự cốT</small><sub>2</sub>
<small>Khôi phụcThực hiện lại </small>
</div><span class="text_page_counter">Trang 48</span><div class="page_container" data-page="48"><small>Hành động</small>
<small>Mem AMem BDisk ADisk B</small>
<small>Mem Log<start T></small>
<small>67891011</small>
</div><span class="text_page_counter">Trang 49</span><div class="page_container" data-page="49"><small>l</small>
<small>l</small> (1) Tạo mẫu tin <start ckpt (T<sub>1</sub>, T<sub>2</sub>,…, T<sub>k</sub>)> và ghi xuống đĩa
<small>lT</small><sub>1</sub><small>, T</small><sub>2</sub><small>, …, T</small><sub>k</sub><small> là những giao tác đang thực thi</small>
<small>l</small> (2) Ghi xuống đĩa những dữ liệu đang nằm trên vùng đệm
<small>lNhững đơn vị dữ liệu được cập nhật bởi các giao tác</small>
<small>l</small> (3) Tạo mẫu tin <end ckpt> trong nhật ký và ghi xuống đĩa
<small>l</small>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 4, 5> <start T</small><sub>2</sub><small>> <commit T</small><sub>1</sub><small>> <T</small><sub>2</sub><small>, B, 9, 10> </small></b>
<b><small><start ckpt (T</small><sub>2</sub><small>)> </small></b>
<b><small><T</small><sub>2</sub><small>, C, 14, 15> <start T</small><sub>3</sub><small>> <T</small><sub>3</sub><small>, D, 19, 20> <end ckpt> <commit T</small><sub>2</sub><small>> <commit T</small><sub>3</sub><small>></small></b>
<small>l</small> T<sub>1</sub> đã hồn tất trước <start ckpt>
<small>lCó thể đã được ghi xuống đĩa</small>
<small>lNếu chưa thì trước khi <end ckpt> cũng được ghi xuống đĩa</small>
<small>l</small> Giá trị B=10 đã được ghi xuống đĩa
</div><span class="text_page_counter">Trang 51</span><div class="page_container" data-page="51"><small>l</small>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 4, 5> <start T</small><sub>2</sub><small>> <commit T</small><sub>1</sub><small>> <T</small><sub>2</sub><small>, B, 9, 10> </small></b>
<b><small><start ckpt (T</small><sub>2</sub><small>)> <T</small><sub>2</sub><small>, C, 14, 15> <start T</small><sub>3</sub><small>> <T</small><sub>3</sub><small>, D, 19, 20> <end ckpt> <commit T</small><sub>2</sub><small>> <commit T</small><sub>3</sub><small>></small></b>
<small>lThực hiện lại T</small><sub>3</sub><small> và ghi D=20</small>
<small>scan</small>
</div><span class="text_page_counter">Trang 52</span><div class="page_container" data-page="52"><small>l</small>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 4, 5> <start T</small><sub>2</sub><small>> <commit T</small><sub>1</sub><small>> <T</small><sub>2</sub><small>, B, 9, 10> </small></b>
<b><small><start ckpt (T</small><sub>2</sub><small>)> <T</small><sub>2</sub><small>, C, 14, 15> <start T</small><sub>3</sub><small>> <T</small><sub>3</sub><small>, D, 19, 20> <end ckpt> <commit T</small><sub>2</sub><small>></small></b>
<small>lKhơi phục D=19</small>
<small>scan</small>
</div><span class="text_page_counter">Trang 53</span><div class="page_container" data-page="53"><small>l</small>
<b><small><start T</small><sub>1</sub><small>> <T</small><sub>1</sub><small>, A, 4, 5> <start T</small><sub>2</sub><small>> <commit T</small><sub>1</sub><small>> </small></b>
<b><small><start T</small><sub>3</sub><small>> <T</small><sub>2</sub><small>, B, 9, 10> <T</small><sub>3</sub><small>, E, 6, 7> </small></b>
<b><small><start ckpt (T</small><sub>2, </sub><small>T</small><sub>3</sub><small>)> <T</small><sub>2</sub><small>, C, 14, 15> <T</small><sub>3</sub><small>, D, 19, 20> <end </small></b>
<small>lKhơi phục D=19 và E=6</small>
<small>scan</small>
</div><span class="text_page_counter">Trang 54</span><div class="page_container" data-page="54">