Thứ Ba, 22 tháng 5, 2012

Các Chế Độ Phục Hồi Của Database



Vũ Huy Tâm

Chế độ phục hồi (recovery model) là thuộc tính của database, liên quan đến cơ chế sử dụng log file và do đó, liên quan đến khả năng khôi phục dữ liệu của database. Các model đó là FULL, SIMPLE, và BULK-LOGGED.
Bạn có thể xem và thay đổi chế độ phục hồi của database bằng code như sau:
-- lấy chế độ phục hồi hiện tại của database
SELECT recovery_model_desc FROM SYS.databases WHERE name='AUXDB'
 
-- thiết lập chế độ phục hồi cho database
ALTER DATABASE AUXDB SET RECOVERY FULL
ALTER DATABASE AUXDB SET RECOVERY SIMPLE
ALTER DATABASE AUXDB SET RECOVERY BULK_LOGGED
Bạn cũng có thể dùng giao diện trong Management Studio bằng cách right-click vào database, chọn Properties, rồi chuyển tới tab Options:
FULL: Lưu tất cả các transaction tuần tự trong log file và giữ chúng ở đó đến khi log file được backup. Khi log backup được thực hiện, các transaction xảy ra kể từ lần log backup trước được ghi ra backup file và loại bỏ khỏi log file. Chính xác ra là chúng được đánh dấu là đã được backup và có thể được ghi đè bởi các transaction đến sau. Nếu là lần log backup đầu tiên kể từ khi database được tạo thì nó gồm tất cả transaction từ lần full backup. Vì thế bạn chỉ có thể backup log nếu (1) recovery model là FULL và (2) database đã từng được full backup.
Ở chế độ FULL, các transaction được lưu nguyên vẹn và thành chuỗi liên tục. Khi được sao lưu log backup định kỳ, database có thể được khôi phục tới một thời điểm bất kỳ, và do đó hạn chế tối đa mất mát dữ liệu khi có sự cố xảy ra. Đây là chế độ cần thiết cho các OLTP database, và cũng là chế độ mặc định mỗi khi database mới được tạo.
Cũng vì các transaction được lưu nguyên vẹn đến khi được log backup, nếu bạn không thực hiện log backup định kỳ kích thước của log file sẽ không ngừng tăng lên. Khi log file đầy, SQL Server sẽ xin cấp phát thêm không gian đĩa để log file có thể chứa thêm transaction. Nếu bạn đặt kích thước tối đa cho log file và đã tăng tới kích thước này, hoặc đĩa hết chỗ trống, SQL Server sẽ báo lỗi và hủy bỏ transaction.
Có thể so sánh chế độ FULL với quyển sổ ghi nhật ký hàng ngày của bạn. Giả sử bạn muốn giữ quyển sổ nhật ký luôn có độ dày 100 trang. Cứ mỗi tuần bạn lại sao lưu các trang đã viết bằng cách xé chúng khỏi sổ và cất vào tủ, đồng thời thêm ngần đấy trang trắng vào thay thế. Các trang trắng này lại được dùng để viết nhật ký cho các ngày tiếp. Nếu không sao lưu, bạn không thể thêm trang trắng vào sổ và chằng bao lâu cuốn sổ sẽ đầy không còn chỗ để viết tiếp. Muốn viết tiếp bạn phải tăng số trang của quyển sổ lên hơn 100 và thêm các trang trắng vào cuối.
SIMPLE: Chế độ SIMPLE không quan tâm đến chuyện log đã được backup hay chưa. Mỗi khi transaction kết thúc, nó sẽ được đánh dấu là cho phép ghi đè lên và các transaction tiếp theo sẽ dùng lại không gian đó. Vì thế log backup không thể thực hiện ở chế độ này và kích thước log file cũng không bị tăng liên tục. Tuy nhiên trong nội bộ 1 transaction, các cập nhật vẫn được lưu vào log file đầy đủ, và log file vẫn cần đủ lớn để chứa các cập nhật này. Vì thế kích thước log file tương đương với kích thước của transaction lớn nhất đã từng được thực hiện trong database. Trở lại việc so sánh tương đồng với sổ nhật ký, chế độ SIMPLE giống như khi viết đến trang cuối thì bạn quay lại trang đầu, tẩy hết những gì đã viết và viết đè lên đó.
Vì không thể thực hiện được log backup, chế độ SIMPLE không cho phép khả năng khôi phục dữ liệu đến một thời điểm nhất định. Bạn chỉ có thể khôi phục lại dữ liệu từ bản full backup (hoặc differential backup) gần đây nhất. Do đó chế độ này không thích hợp với các hệ thống OLTP. Tuy nhiên do ưu điểm giảm nhẹ gánh nặng về quản lý log file bạn có thể đặt chế độ này cho các database ở môi trường development. Bạn cũng có thể chọn đặt chế độ này cho các database phục vụ báo cáo, database cho các ứng dụng DW/BI.
BULK-LOGGED: Chế độ này hoạt động giống như chế độ FULL, tuy nhiên nó chỉ log tối thiểu các thao tác bulk (liên quan đến nhiều bản ghi) như bcp, BULK INSERT, hay SELECT INTO. Điều này giúp cho các thao tác trên thực hiện nhanh hơn, vì không phải log chi tiết từng thay đổi như với chế độ FULL. Giống như FULL, chế độ này vẫn đòi hỏi phải backup log định kỳ nếu không kích thước log file sẽ tăng. Nhưng nó lại mất khả năng khôi phục tới một thời điểm nhất định như với chế độ FULL. Bản thân tôi không nhìn thấy nhiều giá trị của chế độ BULK-LOGGED.
Nguồn www.sqlviet.com