Hiểu về Transaction Log trong SQL Server

Hiểu về Transaction Log trong SQL Server

Trong SQL Server, Transaction Log là thành phần quan trọng nhưng thường ít được để ý đến. Điều này khá dễ hiểu bởi Transaction Log âm thầm hoạt động bên dưới, nên người DBA thường không quan tâm đến (thậm chí không hề biết đến….sự tồn tại của Transaction Log).

Mọi việc không có gì đáng nói cho đến lúc một sự cố nào đó xảy ra, chẳng hạn người DBA thực hiện thao tác DELETE/UPDATE nhầm, File System của Windows bị lỗi hay HDD bị hư. Lúc đó, bạn không những cần bản sao lưu Full (và Differential) mà còn cần các bản sao lưu Transaction Log để phục hồi dữ liệu trở về thời điểm mong muốn. Bởi chỉ có bản sao lưu Transaction Log mới giúp bạn thực hiện Point-in-Time Recovery, ví dụ: phục hồi database về thời điểm ngay trước khi thao tác DELETE xảy ra.

Thậm chí, nếu sự cố xảy ra gây mất/hỏng Data File nhưng Log File vẫn còn, bạn vẫn có thể sao lưu các Transaction Log đang có (gọi là Tail-Log Backup). Kết hợp bản Tail-Log Backup này cùng các bản sao lưu trước đó, bạn khôi phục dữ liệu về thời điểm ngay trước khi sự cố xảy ra. Nhờ đó, hầu như không mất mát bất cứ dữ liệu nào cả.

Vậy Transaction Log là gì? Vì sao Transaction Log có thể giúp khôi phục database như những ví dụ trên? Bài viết sau sẽ giúp bạn làm rõ vai trò quan trọng này của Transaction Log.

Transaction Log là gì?

Mỗi database trong SQL Server chứa một/nhiều Data File và một/nhiều Log File. Trong khi các Data File chứa tất cả dữ liệu hình thành nên một database (VD: cấu trúc database, dữ liệu database,…) thì Log File chỉ chứa một loại dữ liệu duy nhất: các record ghi nhận thao tác cập nhật dữ liệu vào database như Insert, Update, Delete. Nghĩa là mọi thao tác làm thay đổi dữ liệu của database đều được lưu vào Log File.

Vì sao SQL Server phải thực hiện thao tác này trong khi có thể cập nhật thẳng dữ liệu vào Data File?

Nguyên nhân là hiệu suất xử lý. Vì Data File là một cấu trúc phức tạp, lưu trữ dữ liệu theo cơ chế ngẫu nhiên nên một thao tác cập nhật vào Data File đòi hỏi thực hiện nhiều xử lý, ví dụ: phân chia các page, tạo thêm các extent mới,…. Vì vậy, nếu mỗi thao tác cập nhật đều lưu thẳng dữ liệu vào Data File sẽ khiến xử lý của database trở nên rất chậm, kém hiệu quả. Để giải quyết vấn đề này, SQL Server sử dụng Transaction Log (Log File) để tuần tự ghi nhận các thao tác cập nhật dữ liệu. Mỗi thao tác làm thay đổi dữ liệu sẽ ngay lập tức được ghi nhận vào các record của Transaction Log. Bản thân giá trị dữ liệu sẽ được lưu trong buffer của bộ nhớ RAM để xử lý thay vì lưu thẳng vào Data File trên đĩa cứng. Vì Transaction Log lưu trữ dữ liệu theo cơ chế tuần tự và theo một cấu trúc đơn giản nên xử lý sẽ rất nhanh.

Tóm lại, Transaction Log là một dãy các record lưu trữ thông tin các thao tác cập nhật dữ liệu được thực hiện lên database.

Vậy khi nào các dữ liệu đang có trong buffer sẽ được lưu xuống Data File? Đó là khi một Checkpoint xảy ra. Checkpoint có thể do người dùng thực thi hoặc do SQL Server tự động thực hiện dựa trên thiết lập của database. Lúc đó, dữ liệu trong buffer sẽ được lưu vào Data File trên đĩa cứng. Đồng thời, thông tin về Checkpoint sẽ được ghi nhận vào Transaction Log.

Điều gì xảy ra nếu SQL Server bị tắt đột ngột trong khi dữ liệu trong buffer chưa được ghi xuống Data File? Đây là lúc các record trong Transaction Log thể hiện vai trò. Trong tình huống này, khi khởi động, SQL Server sẽ đọc thông tin từ Transaction Log (các record phát sinh sau Checkpoint gần nhất) để khôi phục những dữ liệu chưa được lưu vào Data File. Khi tiến hành quá trình này, SQL Server sẽ sử dụng các thao tác redo (roll-forward) và undo (roll-back) để đảm bảo tính chất nhất quán của transaction.

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.

Cấu trúc Transaction Log

Một cách đơn giản, có thể hiểu dữ liệu Transaction Log là các record được lưu trữ như hình bên dưới.

Mỗi thao tác thay đổi lên dữ liệu được ghi nhận thành một dãy các record trong Transaction Log. Mỗi record được đánh số thứ tự Log Sequence Number (LSN) và được lưu trữ trong các Virtual Log File. Số lượng và kích thước của Virtual Log File được quyết định bởi Database Engine của SQL Server.

Trong Transaction Log, những record cần dùng cho quá trình Full Recovery của Database được gọi là Active Log. Khi thông tin chứa trong các record của Transaction Log được ghi xuống Data File (với Recovery model là SIMPLE), hoặc khi Transaction Log được sao lưu (với Recovery model là FULL/BULK-LOGGED) thì các Active Log sẽ trở thành Inactive Log. Lúc đó, vùng lưu trữ chứa các Inactive Log có thể được sử dụng để lưu trữ các Active Log mới. Quá trình này được gọi là Log Truncation.

Lưu ý: Thực chất, quá trình Log Truncation không xóa đi dữ liệu nên không làm cho kích thước Log File giảm xuống. Ở đây, SQL Server chỉ đánh dấu các record không còn được sử dụng và do đó có thể ghi đè bằng các record mới. Vì thế, Transaction Log không cần tăng thêm kích thước cho record mới.

Quản lý Transaction Log

Các record được ghi vào Transaction Log theo cơ chế xoay vòng (circular). Nghĩa là các Active Log được ghi tuần tự từ cho đến cuối file. Nếu lưu đến cuối file mà vùng lưu trữ đầu file có thể sử dụng (do quá trình Log Truncation xảy ra) thì các record mới sẽ được hi đè vào vùng này.

Vậy nếu ghi đến cuối file mà các record ở đầu file vẫn là Active Log thì chuyện gì xảy ra? Lúc đó, SQL Server sẽ tăng kích thước Log File để có thể ghi thêm Active Log mới (kích thước mỗi lần tăng thêm được thiết lập trong thuộc tính File Growth của Log File). Nếu bạn không giới hạn kích thước, Log File sẽ tiếp tục tăng cho đến khi vùng lưu trữ đầu file được giải phóng, hoặc khi ổ đĩa bị đầy. Hẳn nhiên, khi ổ đĩa đầy, Transaction Log sẽ không thể ghi thêm dữ liệu nên Database sẽ ngừng hoạt động.

Quá trình Log Truncation sẽ được tiến hành khi xảy ra 1 trong 2 tình huống sau:

  • Nếu Recovery model là SIMPLE: Khi một Checkpoint xảy ra, dữ liệu đang có trong buffer sẽ được lưu xuống Data File. Do đó, các record tương ứng sẽ trở thành Inactive Log. Các record mới có thể được ghi đè vào vùng này.
  • Nếu Recovery model là FULL hoặc BULK-LOGGED: Với 2 Recovery model này, cho dù Checkpoint có xảy ra thì SQL Server vẫn không tiến hành quá trình Log Truncation. Do đó, các Active Log không trở thành Inactive Log để vùng lưu trữ được thu hồi. Thay vào đó, bạn phải tiến hành sao lưu Transaction Log bằng lệnh BACKUP LOG. Chỉ khi được sao lưu thì các Active Log mới trở thành Inactive Log. Nhờ đó, vùng lưu trữ mới được thu hồi.

Tùy theo Recovery model thiết lập cho Database mà bạn cần có phương án quản lý Transaction Log hợp lý để tránh trường hợp dung lượng Transaction Log cứ tăng lên, làm đầy ổ đĩa khiến Database không thể hoạt động. Nếu Recovery model của Database là SIMPLE, bạn không cần quan tâm nhiều đến quản lý Transaction Log. Bởi khi đó SQL Server sẽ tự thực hiện Checkpoint để ghi dữ liệu xuống Data File và tiến hành quá trình Log Truncation. Trong trường hợp Recovery model là FULL hoặc BULK-LOGGED, bạn cần sao lưu Transaction Log định kỳ để quá trình Log Truncation diễn ra.

Sao lưu Transaction Log

Sao lưu Transaction Log là thao tác cần thiết giúp bạn ở 2 khía cạnh:

  1. Khiến quá trình Log Truncation xảy ra. Nhờ đó, kích thước Log File không phải tăng lên để chứa các record mới.
  2. Tạo bản sao lưu Transacton Log để có thể phục hồi khi Database bị hư hỏng, mất mát.

Để sao lưu Transaction Log, bạn sử dụng lệnh BACKUP LOG theo ví dụ sau:

BACKUP LOG ERP
TO DISK = ‘E:\SQLBackupData\ERP_LOG.bak’

Đọc bài viết Sao lưu Transaction Log để tham khảo các bước sao lưu sao lưu dữ liệu này.

Lưu ý: Bản thân các bản sao lưu Transaction Log không thể giúp bạn khôi phục Database. Trước tiên, bạn cần khôi phục Database bằng bản sao lưu Full (và Differential) với tùy chọn NORECOVERY. Sau đó, bạn mới có thể khôi phục từ các bản sao lưu Transaction Log. Ngoài ra, các bản sao lưu Transaction Log được khôi phục phải liên tiếp nhau.

# Giải pháp sao lưu dữ liệu toàn diện cho SQL Server

Giúp giảm RPO từ 24 giờ xuống 30 phút

Với khả năng sao lưu offsite tự động cùng công nghệ In-File Delta, zBackup giúp bạn dễ dàng sao lưu Transaction Log với tần suất 30 phút/lần. Nhờ đó, bất kỳ lúc nào sự cố xảy ra với SQL Server, bạn đều có thể phục hồi dữ liệu trở về thời điểm cách xa nhất 30 phút trước.

Xem cách zBackup sao lưu SQL Server ››

  • Nhựt Lê Bá

    Greet. Thanks, This artist is very useful, It help me have overview about transaction log.