Log Sequence Number và ý nghĩa trong phục hồi database SQL Server

Log Sequence Number và ý nghĩa trong phục hồi database SQL Server

Mỗi Log record trong Transaction Log của SQL Server được gán một giá trị số gọi là Log Sequence Number (LSN). LSN có giá trị tăng dần tương ứng với thời điểm của thao tác chứa trong Log record – nghĩa là nếu LSN2 lớn hơn LSN1 thì các thao tác chứa trong Log record LNS2 sẽ diễn ra sau các thao tác chứa trong Log record LSN1.

Khi bạn sao lưu thì giá trị LSN này cũng được lưu trữ vào bản sao lưu. Thông thường, bạn ít khi phải quan tâm đến LSN khi quản trị SQL Server. Tuy nhiên, lúc tiến hành phục hồi thì có thể bạn cần biết giá trị này để xác định thứ tự trước sau của các bản sao lưu.

Nhắc lại về quá trình phục hồi database SQL Server

Bạn biết rằng mỗi quá trình phục hồi database SQL Server đều phải bắt đầu từ bản sao lưu Full; rồi sau đó mới đến các bản sao lưu Differential hoặc/và Transaction Log. Sẽ không có gì đáng nói nếu bạn chỉ cần khôi phục database từ bản sao lưu Full. Nhưng nếu bạn cần khôi phục thêm từ các bản sao lưu Differential hoặc/và Transaction Log sau đó, điểm quan trọng cần lưu ý là các bản sao lưu này cần được phục hồi theo thứ tự liên tiếp nhau. Nếu các bản sao lưu không liên tiếp nhau, bạn sẽ gặp lỗi như bên dưới:

Msg 4305, Level 16, State 1, Line 1
The log in this backup set begins at LSN 48000000016200001, which is too recent to apply to the database. An earlier log backup that includes LSN 48000000011900001 can be restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE LOG is terminating abnormally.

Vậy làm cách nào để biết được thứ tự các bản sao lưu nếu tên file hoặc giá trị Date created, Date modified của file không thể giúp bạn phân biệt? Hoặc bạn muốn biết có bị sót bản sao lưu nào khiến quá trình phục hồi không liên tiếp? Câu trả lời là Log Sequence Number – giá trị LSN trong các bản sao lưu có thể giúp bạn xác định được thứ tự này.

Xem giá trị Log Sequence Number trong bản sao lưu

Lệnh RESTORE HEADERONLY cho bạn biết các thông tin Backup header của bản sao lưu, trong đó có các giá trị LSN.

RESTORE HEADERONLY
FROM DISK = ‘C:\SQLBackup\Full1.bak’

4 giá trị LSN bạn cần quan tâm là:

  • FirstLSN: LSN của transaction đầu tiên chứa trong bản sao lưu
  • LastLSN: LSN của Log record trong bản sao lưu kế tiếp
  • CheckpointLSN: LSN của Checkpoint gần nhất
  • DatabaseBackupLSN: LSN của bản sao lưu Full gần nhấtGiá trị Log Sequence Number khi chạy lệnh RESTORE HEADERONLY

Free eBook: Download ebook 8 lưu ý quan trọng khi sao lưu & phục hồi SQL Server. Những kinh nghiệm hữu ích giúp bạn sao lưu an toàn và đảm bảo khả năng phục hồi khi sự cố mất dữ liệu xảy ra với database SQL Server.

Mối liên hệ của giá trị Log Sequence Number giữa các bản sao lưu

1. Bản sao lưu Full và Transaction Log

Nếu bản sao lưu Transaction Log được tạo kế ngay sau bản sao lưu Full thì giá trị LastLSN (hoặc LastLSN+1) của bản Full sẽ nằm giữa giá trị FirstLSN và LastLSN của bản Transaction Log. Nếu LastLSN của bản Full nằm ngoài FirstLSN và LastLSN của bản Transaction Log thì chắc chắn bản Transaction Log này không phải là bản sao lưu được tạo ra ngay sau bản Full. Do đó, nếu phục hồi từ bản Transaction Log này ngay sau khi phục hồi bản Full sẽ bị lỗi.

Tham khảo ví dụ sau:

3 bản sao lưu F1 (Full), L1 (Transaction Log) và L2 (Transaction Log) được tạo liên tiếp nhau. Khi chạy lệnh RESTORE HEADERONLY thì giá trị FirstLSN và LastLSN của 3 bản sao lưu này như sau:
FirstLSN và LastLSN

  • Giá trị LastLSN của bản sao lưu F1 là 48000000011900001. Bản sao lưu L1 có FirstLSN là 48000000006700001 và LastLSN là 48000000016200001. Giá trị LastLSN của F1 nằm giữa FirstLSN và LastLSN của L1. Do đó, nếu bạn phục hồi L1 ngay sau F1 thì thao tác sẽ thành công.
    FirstLSN F1 vs FirstLSN và LastLSN của L1

    Processed 0 pages for database ‘zBackupLabDB’, file ‘zBackupLabDB_Data’ on file 1.
    Processed 6 pages for database ‘zBackupLabDB’, file ‘zBackupLabDB_Log’ on file 1.
    RESTORE LOG successfully processed 6 pages in 0.035 seconds (1.325 MB/sec).
  • Trong khi đó, L2 có FirstLSN là 48000000016200001 và LastLSN là 48000000028800001. Giá trị LastLSN của F1 (48000000011900001) không nằm giữa 2 giá trị này của L2. Do đó, nếu bạn phục hồi L2 ngay sau F1 thì thao tác sẽ lỗi.
    FirstLSN F1 vs FirstLSN và LastLSN của L2

    Msg 4305, Level 16, State 1, Line 1
    The log in this backup set begins at LSN 48000000016200001, which is too recent to apply to the database. An earlier log backup that includes LSN 48000000011900001 can be restored.
    Msg 3013, Level 16, State 1, Line 1
    RESTORE LOG is terminating abnormally.

2. Bản sao lưu Full và Differential

Bạn chỉ có thể phục hồi bản sao lưu Differential D theo sau bản sao lưu Full F nếu giá trị DatabaseBackupLSN của D bằng giá trị CheckpointLSN của F.
LSN của Full và Differential

  • 2 bản sao lưu Differential D1 và D2 được tạo sau bản sao lưu Full F1. Giá trị DatabaseBackupLSN của D1 và D2 đều là 48000000010300037 (bằng với giá trị CheckpointLSN của F1). Do đó, D1 và D2 có thể phục hồi kế sau F1.
  • Tương tự, D3 có DatabaseBackupLSN bằng với CheckpointLSN của F2 nên có thể phục hồi kế sau F2.
  • Nếu phục hồi D3 kế sau F1, bạn sẽ gặp lỗi như bên dưới:
    Msg 3136, Level 16, State 1, Line 1
    This differential backup cannot be restored because the database has not been restored to the correct earlier state.
    Msg 3013, Level 16, State 1, Line 1
    RESTORE DATABASE is terminating abnormally.

3. Bản sao lưu Differential và Transaction Log

Tương tự mối liên hệ giữa Full và Transaction Log, nếu bản sao lưu Transaction Log được tạo kế ngay sau bản sao lưu Differential thì giá trị LastLSN (hoặc LastLSN+1) của bản sao lưu Differential sẽ nằm giữa giá trị FirstLSN và LastLSN của bản sao lưu Transaction Log đó. Nếu giá trị LastLSN của bản Differential nằm ngoài 2 giá trị FirstLSN và LastLSN của bản Transaction Log thì chắc chắn bản Transaction Log này không phải là bản sao lưu được tạo ra ngay sau bản Differential. Nên phục hồi từ bản Transaction Log này sẽ bị lỗi.

4. Giữa các bản sao lưu Transaction Log liên tiếp nhau

Khi các bản sao lưu Transaction Log L1, L2, L3 kế tiếp nhau thì LastLSN của bản L1 bằng FirstLSN của L2, LastLSN của L2 bằng FirstLSN của L3, cứ tiếp tục như vậy.
LSN của các bản sao lưu Transaction Log