Crash: Là các sự cố xảy ra không lường trước được, ví dụ như cúp điện, hư ổ cứng, RAM hoặc các thiết bị khác … Nói chung các sự cố này xảy ra làm cho việc thực hiện các transaction bị gián đoạn hoặc mất đi tình toàn vẹn dữ liệu. Như vậy có thể thấy có 2 trường hợp có thể xảy ra với 1 Transaction khi có sự cố: Transaction chưa thực hiện commit (begin trans mà không có commit). Ở trường hợp này thì database Transaction đã thực hiện commit nhưng vẫn chưa lưu dữ liệu...
Trang 1HỆ QUẢN TRỊ CƠ
SỞ DỮ LIỆU
Bài viết về: PHỤC HỒI SỰ CỐ
Trang 2Nội dung:
1 Một vài giả định và quy ước: 3
1.1 Transaction: 3
1.2 Checkpoint: 3
1.3 Logging: 3
2 Một vài khái niệm cơ bản: 4
2.1 Crash: 4
2.2 Logging: 4
2.3 Recovery: 4
2.4 Checkpoint và cơ chế Logging: 4
3 DBMS áp dụng cơ chế phục hồi như thế nào: 7
3.1 Các kỹ thuật Recovery (3 kỹ thuật): 7
3.1.1 Undo Logging (Sử dụng cho cơ chế phục hồi Immediate Update): 7
3.1.2 Undo Logging và Checkpoint: 8
3.1.3 Redo Logging (Sử dụng cho cơ chế phục hồi Defer Update): 10
3.1.4 Undo/ Redo Logging 10
4 Bài tập: 11
Trang 31 Một vài giả định và quy ước:
1.1 Transaction:
Bắt đầu transaction: < start T1 >
Hoàn tất transaction: < commit T1 >
Hủy bỏ 1 giao tác < abort T1 > 1.2 Checkpoint:
Tạo 1 checkpoint: <checkpoint> 1.3 Logging:
Trang 42 Một vài khái niệm cơ bản:
2.1 Crash:
Là các sự cố xảy ra không lường trước được, ví dụ như cúp điện, hư ổ cứng, RAM hoặc các thiết bị khác … Nói chung các sự cố này xảy ra làm cho việc thực hiện các transaction bị gián đoạn hoặc mất đi tình toàn vẹn dữ liệu Như vậy có thể thấy có 2 trường hợp có thể xảy ra với 1 Transaction khi có sự cố:
Transaction chưa thực hiện commit (begin trans mà không có commit) Ở trường hợp này thì database
Transaction đã thực hiện commit nhưng vẫn chưa lưu dữ liệu từ bộ nhớ đệm xuống datafile (begin trans và commit)
2.2 Logging:
Là cơ chế lưu vết lại tất cả các yêu cầu thay đổi từ phía User Cần phải chú ý rằng đôi lúc việc kết quả truy vấn hay update cơ sở tưởng chừng như đã hoàn tất ở phía người dùng, tuy nhiên, trong 1 số trường hợp DBMS vẫn thực hiện vẫn chưa hoàn thành việc update (nói chính xác hơn là lưu trữ xuống datafile) Việc hiển thị kết quả chỉ
là do DBMS thực hiện trên bộ nhớ đệm
2.3 Recovery:
Là phục hồi dữ liệu trên ổ cứng (datafile) về trạng thái đảm bảo tính toàn vẹn dữ liệu gần nhất Có 2 cơ chế phục hồi:
Defer Update: kết quả thay đổi của dữ liệu chỉ được lưu từ bộ nhớ đệm
xuống datafile khi transaction thực hiện commit Như vậy rõ ràng, trước khi giao tác này thực hiện commit, có sự có xảy ra thì cũng không ảnh hưởng đến datafile bên dưới
Immediate Update: kết quả thay đổi được lưu xuống datafile ngay sau khi
thực hiện 1 thao tác dữ liệu trong một giao tác mà không cần chờ đến lệnh commit
2.4 Checkpoint và cơ chế Logging:
Theo cơ chế logging và kỹ thuật Recovery Immedia Update ở trên thì sau mỗi lần commit hoặc abort của 1 giao tác thì DBMS lại yêu cầu DataFile Management ghi toàn bộ dữ liệu xuống datafile đồng thời ghi 1 entry vào trong logfile Chú ý rằng việc lưu trữ này tiêu hao nhiều thời gian đặc biệt đối với hệ thống nhiều User cùng thực hiện cùng lúc
Người ta đề ra checkpoint để giảm thiểu vấn đề trên Như vậy sau 1 thời gian hạn định thì DBMS thực hiện lưu 1 checkpoint mà tại đó các giao tác vừa commit xong thì sẽ được lưu dữ liệu từ bộ nhớ đệm xuống datafile Nếu trong khoảng thời gian đó giao tác hiện thời chưa hoàn tất(commit) thì DBMS sẽ đợi 1
Trang 5khoảng thời gian cho đến khi giao tác này hoàn tất Trong khoảng thời gian này DBMS không nhận thêm bất kì 1 giao tác nào khác nữa Sau khi lưu mọi thông tin xuông datafile , Log Manager ghi 1 entry vào trong logfile
Như vậy, có thể thấy ràng mọi công việc đã hoàn tất trước checkpoint Nếu có
1 sự cố xảy ra sau này chỉ cần quay lại vị trí checkpoint là đảm bảo các tính chất của
dữ liêu
Tuy nhiên, cũng phải nhận định rằng, việc chờ đợi 1 giao tác hoàn tất mà không tiếp nhận bất kì 1 giao tác nào khác trong thời gian đó sẽ làm trì hoãn hoạt động của DBMS, đặc biệt là với DBMS nhiều người dùng Vì thế người ta đưa ra 1 kỹ thuật mới là Nonquiescent Checkpoint
Nonquiescent Checkpoint: Cơ chế hoạt động của loại checkpoint này là:
Ví dụ, chúng ta có 4 giao tác T1, T2, T3, T4 Ở thời điểm t1, Log Manager bắt đầu thực hiện lưu checkpoint Tại thời điểm này có 2 giao tác đang hoạt động là T1 và T2 còn T3 và T4 chưa bất đầu giao tác của mình Log Manager lưu vào logfile: <start ckpt T1,T2>
Log Manager tiếp tục đợi cho đến khi T1, T2 hoàn tất giao tác của mình cho đến t2 Trong khoảng thời gian từ t1 đến t2 này nó không ngăn cản bất cứ 1 giao tác nào vào hệ thống Sau khi cả 2 giao tác hoàn tất Log Manager thực hiện lưu <end ckpt> Như vậy nếu 1 sự cố xảy ra ở thời điểm t3 > t2 > t1 thì 2 giao tác T1 và T2 xem như đã hoàn thành và không cần phục hồi nữa Chỉ cần xét 2 giao tác T3 và T4 mà thôi Tiếp tục xét như vậy thì cũng có thể thấy được là T3 đã hoàn thành trước thời điểm t3 vì trong logfile sẽ tồn tại 1 entry lưu commit cho giao tác T3 này Như vậy công việc phục hồi chỉ cần thực hiện với T4 mà thôi
Trang 73 DBMS áp dụng cơ chế phục hồi như thế nào:
3.1 Các kỹ thuật Recovery (3 kỹ thuật):
3.1.1 Undo Logging (Sử dụng cho cơ chế phục hồi Immediate Update):
Như đã trình bày ở trên, mỗi thao tác update trên CSDL đều được Log Manager lưu lại 1 entry vào trong logfile Việc phục hồi (Recovery) thực sự chỉ là việc rà soát và
thực hiện sửa các lỗi dựa theo việc Logging Như vậy, cơ chế Recovery phải phụ thuộc và được hỗ trợ bởi cơ chế lưu entry của Logging Ở đây cơ chế Undo Logging hỗ trợ cho
thao tác phục hồi CSDL theo dạng Undo, có nghĩa là phục hồi lại CSDL ở trạng thái trước khi 1 hoặc nhiều giao tác diễn ra nhưng chưa hoàn tất thì xảy ra sự cố
Quy tắc Logging:
Một entry có dạng: < Tn, X, v > Trong đó, Tn là giao tác yêu cầu update
cơ sở dữ liệu, X là ĐVDL trên CSDL và v là giá trị trước khi thay đổi
Ví dụ: UPDATE FROM Student AS s SET s.name= “Nam” WHERE s.id=”1”
Vậy:
- X ở đây là entry student.name có id=1
- Giá trị cũ là 1 giá trị “XYZ”
Entry trong logfile sẽ là < Tn, X, “XYZ” > mà không phải là
< Tn, X, “Nam” >
Entry trong logfile phải được ghi trước khi ghi cập nhật dữ liệu cho DVDL
X xuống datafile Quy tắc này nhằm đảm bảo việc phục hồi nếu có sự cố trong việc lưu dữ liệu từ bộ nhớ đệm xuống datafile Nhw trong ví dụ
bên dưới thì việc lưu entry báo hiệu sự thay đổi vào logfile (2) phải được thực hiện trước khi lưu A với giá trị mới là 103 vào trong datafile (3) Công việc này gọi là Output(X) và được thực hiện ngầm định bên dưới hoặc được triệu gọi bởi hàm flush() Hàm này thực hiện đẩy toàn bộ dữ
liệu trong bộ nhớ đệm xuống vùng nhớ trên Datafile
Entry <commit> phải được lưu cuối cùng, sau khi tất cả các công việc lưu
từ bộ đệm xuống datafile hoàn tất Quy tắc này nhằm thông báo rằng giao tác đã hoàn tất 1 cách thành công Nếu có 1 sự cố nào xảy ra trong
quá trình lưu trữ thì sẽ không tồn tại entry <commit> trong logfile Điều
này thông báo việc cần phải phục hồi dữ liệu lại trạng thái gần nhất
Trang 8Time Transaction T T A
(on Buffer)
A (on Disk)
LogFile
1 Start T 3 <start T>
2 T = Read(A) 3 3 3
3 T = T + 100 103 3 3
4 Write(A,T) 103 103 3 <T,A,3>
6 Commit <commit>
Như ví dụ trên, giả dụ có 1 sự cố xảy ra thì sẽ có 3 trường hợp như sau:
Sự cố điễn ra trước <start T>: Chẳng cần xét đến vì giao tác T còn chưa bắt
đầu
Sự cố diễn ra sau <commit> (hoặc abort): Cũng không cần xét đến việc phục
hồi vì giao tác T đã hoàn thành trước đó
Sự cố diễn ra trong khoảng <start T> và <commit> (hoặc abort): ví dụ ở đây
sự cố là cúp điện, vào thời điểm từ 1 5, như vậy sẽ chỉ tồn tại <start T>
trong logfile mà không tồn tại <commit> và <abort> Khi hệ thống khởi động
lại sau đó Nó sẽ đọc trong logfile và phát hiện dấu hiệu của sự cố này Biện pháp xử lý như sau:
Cơ chế Phục hồi: Phục hồi các giao tác chưa hoàn tất về trạng thái ban đầu
Có thể thấy rằng việc Undo làm cho CSDL quay về trạng thái toàn vẹn gần nhất
3.1.2 Undo Logging và Checkpoint:
Cũng tương tự như Undo Logging nhưng chú ý 1 vài điểm sau:
Đối với Checkpoint thông thường:
2
3
B1: Đọc lại logfile từ dưới trở lên trên
<start T>
<T,X,v>
B2: Với mỗi Entry có dạng <T,X,v> thì thực hiện lưu (phục hồi) vào DVDL X giá trị
cũ của X là v Có nghĩa là thực hiện Write(X,v) và Output(X)
B3: Thực hiện B2 cho đến khi gặp <start T> thì dừng lại Và thực hiện lưu entry
<abort> vào logfile để thông báo kết thúc giao tác phục hồi
1
Trang 9 Trong qua trình được ngược các entry trong logfile từ dưới lên trên:
o Khi gặp entry có dạng: <checkpoint> thì các Giao tác bắt đầu trước đó đã
hoàn tất và không cần phục hồi vì đối với Checkpoint thông thường thì DBMS không tiếp nhận bất cứ 1 giao tác nào trong thời gian chờ đợi các giao tác hiện đang hoạt động hoàn tất Dừng việc phục hồi tại đây
Ví dụ: xem ví dụ trong slide Phục hồi sự cố
Đối với Nonquisecent Checkpoint:
Trong quá trình đọc ngườc các entry trong logfile từ dưới lên cần chú ý:
o Nếu gạp entry có dạng <end ckpt> thì các Giao tác bắt đầu trước <start ckpt T> đã hoàn tất Loại bỏ các entry của giao tác này ra khỏi việc phục
hồi
o Khi gặp entry có dạng: <start ckpt T> thì dừng công tác phục hồi
Ví dụ: xem ví dụ trong slide Phục hồi sự cố
Nhận xét: Cơ chế Undo Logging truy xuất ổ cứng nhiều
Trang 103.1.3 Redo Logging (Sử dụng cho cơ chế phục hồi Defer Update):
Vì cơ chế Defer Update lưu tất cả các update trên bộ nhớ đệm cho đến khi Giao tác thực hiện commit thì mới thực hiện đẩy dữ liệu xuống datafile
Quy tắc Logging:
- Lưu các entry update có dạng <T,X,u> trong đó u là giá trị mới được dùng để thay đổi cho giá trị cũ của DVDL X
Cơ chế Phục hồi: - Phục hồi lại các giao tác đã hoàn tất cả các giao tác đã hoàn
tất và bỏ qua các giao tất chưa hoàn tất
Nhận xét: cơ chế này làm tốn bộ nhớ đệm 3.1.4 Undo/ Redo Logging
Kết hợp 2 cơ chế Undo và Redo để đưa ra cơ chế chung giảm thiểu được các nhược điểm của 2 cơ chế này, như vậy quy tắc và cơ chế ở đây được kết hợp lại là:
Quy tắc Logging:
- Lưu các entry có dạng <T,X,v,u> Trong đó:
o T là giao tác
o X là ĐVDL
o V là giá trị cũ
o U là giá trị mới
B1: Đọc lại logfile từ dưới trở lên trên
<start T>
<T,X,u>
B2:
Đối với giao tác T mà tồn tại 2 entry <start T> và <commit T> trong logfile thì thực hiện lại tất cả thao tác với tất cả entry của giao tác này từ entry
<start T> cho đến <commit T> Mỗi Entry có dạng <T,X,v> thì thực hiện lưu
(phục hồi) vào DVDL X giá trị cũ của X là v Có nghĩa là thực hiện Write(X,v) và
Output(X)
Đối với giao tác T mà chỉ tồn tại entry <start T> mà không tồ tại <commit T> thì bỏ qua giao tác này trong công tác phục hồi vì nó chưa hoàn tất Và thực
hiện lưu entry <abort> vào logfile cho các giao tác chưa hoàn tất này
Trang 11Cơ chế Phục hồi:
- Phục hồi lại các giao tác chưa hoàn thành theo cơ chế Undo
- Phục hồi lại các giao tác đã hoàn thành theo cơ chế Redo
Ví dụ: xem trong slide Phục hồi sự cố
4 Bài tập:
Các bài tập ở phần này có các dạng sau:
- Dạng 1: Cho nội dung (các entry) của 1 logfile
o Yêu cầu: Phát hiện cơ chế Logging đang được sử dụng và thực hiện phục
hồi lại dữ liệu
o Hướng dẫn: Dựa vào cấu trúc của entry update để xét cơ chế Logging
<T,X,u>
<T,X,v>
<T,X,u,>
Sau đó dựa vào loại cơ chế mà thực hiện các thao tác phục hồi cho phù hợp
- Dạng 2: Cho chuỗi thao tác của các thao tác T1,T2, T3 …
o Yêu cầu: Thực hiện logging theo các cơ chế (Undo, Redo, Undo/Redo …)
và sau đó thực hiện phục hồi dữ liệu khi có sự cố xảy ra giữa 2 thao tác nào
đó
o Hướng dẫn: Dựa vào loại cơ chế là Undo, Redo hay Undo, Redo mà thực
hiện lưu giá trị mới, cũ hay cả hai
- Khi có sự cố xảy ra thì bài toán quay về dạng 1