Trong phần thứ hai của loạt bài này, tôi đã mô tả cấu trúc phân cấp của nhật ký giao dịch. Vì bài đăng này chủ yếu liên quan đến Tệp nhật ký ảo (VLF) mà tôi đã mô tả, tôi khuyên bạn nên đọc phần thứ hai trước khi tiếp tục.
Khi tất cả đều ổn, nhật ký giao dịch sẽ lặp lại liên tục, sử dụng lại các VLF hiện có. Hành vi này tôi gọi là tính chất hình tròn của nhật ký . Tuy nhiên, đôi khi sẽ có điều gì đó xảy ra để ngăn chặn điều này và nhật ký giao dịch ngày càng phát triển, thêm ngày càng nhiều VLF. Trong bài đăng này, tôi sẽ giải thích cách tất cả điều này hoạt động hoặc đôi khi không.
VLF và cắt ngắn nhật ký
Tất cả các VLF đều có cấu trúc tiêu đề chứa siêu dữ liệu về VLF. Một trong những trường quan trọng nhất trong cấu trúc là trạng thái của VLF và các giá trị mà chúng tôi quan tâm bằng 0, có nghĩa là VLF không hoạt động và hai, nghĩa là VLF đang hoạt động . Điều quan trọng là vì một VLF không hoạt động có thể được sử dụng lại, nhưng một VLF đang hoạt động thì không. Lưu ý rằng một VLF hoàn toàn hoạt động hoặc hoàn toàn không hoạt động.
Một VLF sẽ vẫn hoạt động khi có các bản ghi nhật ký bắt buộc trong đó, vì vậy nó không thể được sử dụng lại và ghi đè (tôi sẽ đề cập đến các bản ghi nhật ký vào lần sau). Ví dụ về các lý do tại sao có thể yêu cầu bản ghi nhật ký bao gồm:
- Có một giao dịch lâu dài mà bản ghi nhật ký là một phần của nó, vì vậy chúng không thể được giải phóng cho đến khi giao dịch đã được cam kết hoặc hoàn tất quay trở lại
- Bản sao lưu nhật ký chưa sao lưu các bản ghi nhật ký đó
- Phần đó của nhật ký chưa được Đại lý đọc nhật ký xử lý để sao chép giao dịch hoặc Thay đổi thu thập dữ liệu
- Phần đó của nhật ký chưa được gửi đến bản sao cơ sở dữ liệu không đồng bộ hoặc bản sao nhóm khả dụng
Điều quan trọng cần lưu ý là nếu không có lý do nào để VLF vẫn hoạt động, nó sẽ không chuyển sang trạng thái không hoạt động trở lại cho đến khi một quy trình được gọi là cắt ngắn nhật ký xảy ra - thêm về điều này bên dưới.
Sử dụng một nhật ký giao dịch giả định đơn giản với chỉ năm VLF và số thứ tự VLF bắt đầu từ 1 (hãy nhớ lần trước là trong thực tế, chúng không bao giờ làm), khi nhật ký giao dịch được tạo, VFL 1 ngay lập tức được đánh dấu là đang hoạt động, như luôn có là ít nhất một VLF đang hoạt động trong nhật ký giao dịch — VLF nơi các khối nhật ký hiện đang được ghi vào. Kịch bản ví dụ của chúng tôi được hiển thị trong Hình 1 bên dưới.
Hình 1:Nhật ký giao dịch giả thuyết, hoàn toàn mới với 5 VLF, số thứ tự 1 đến hết 5.
Khi nhiều bản ghi nhật ký được tạo và nhiều khối nhật ký được ghi vào nhật ký giao dịch, VLF 1 sẽ lấp đầy, do đó, VLF 2 phải hoạt động để có nhiều khối nhật ký được ghi vào, như thể hiện trong Hình 2 bên dưới.
Hình 2:Hoạt động di chuyển qua nhật ký giao dịch.
SQL Server theo dõi thời điểm bắt đầu của giao dịch không được cam kết (đang hoạt động) cũ nhất và LSN này vẫn tồn tại trên đĩa mỗi khi hoạt động của trạm kiểm soát xảy ra. LSN của bản ghi nhật ký gần đây nhất được ghi vào nhật ký giao dịch cũng được theo dõi, nhưng nó chỉ được theo dõi trong bộ nhớ vì không có cách nào để duy trì đĩa mà không gặp phải các điều kiện đua khác nhau. Điều đó không quan trọng vì nó chỉ được sử dụng trong quá trình khôi phục sự cố và SQL Server có thể tính ra LSN của “phần cuối” của nhật ký giao dịch trong quá trình khôi phục sự cố. Các điểm kiểm tra và khôi phục sự cố là chủ đề cho các bài đăng sau này trong loạt bài này.
Cuối cùng, VLF 2 sẽ đầy và VLF 3 sẽ hoạt động, v.v. Điểm mấu chốt của bản chất vòng tròn của nhật ký giao dịch là các VLF trước đó trong nhật ký giao dịch trở nên không hoạt động để chúng có thể được sử dụng lại. Điều này được thực hiện bởi một quy trình có tên là cắt ngắn nhật ký , còn thường được gọi là xóa nhật ký . Thật không may, cả hai thuật ngữ này đều là những từ viết sai kinh khủng vì không có gì thực sự bị cắt bớt hoặc xóa.
Cắt ngắn nhật ký chỉ đơn giản là quá trình kiểm tra tất cả các VLF trong nhật ký giao dịch và xác định các VLF đang hoạt động nào hiện có thể được đánh dấu là không hoạt động trở lại, vì SQL Server vẫn không yêu cầu nội dung của chúng. Khi thực hiện cắt bớt nhật ký, không có gì đảm bảo rằng bất kỳ VLF đang hoạt động nào cũng có thể không hoạt động — điều đó hoàn toàn phụ thuộc vào những gì đang xảy ra với cơ sở dữ liệu.
Có hai quan niệm sai lầm phổ biến về việc cắt bớt nhật ký:
- Nhật ký giao dịch nhỏ hơn (quan niệm sai "cắt bớt"). Không, không - không có thay đổi kích thước nào so với việc cắt bớt nhật ký. Thứ duy nhất có thể làm cho nhật ký giao dịch nhỏ hơn là một DBCC SHRINKFILE rõ ràng.
- Các VLF không hoạt động bị loại bỏ theo một cách nào đó (khái niệm sai lầm về "xóa"). Không - không có gì được ghi vào VLF khi nó không hoạt động ngoại trừ một vài trường trong tiêu đề VLF.
Hình 3 dưới đây cho thấy nhật ký giao dịch của chúng tôi trong đó các VLF 3 và 4 đang hoạt động và việc cắt bớt nhật ký có thể đánh dấu các VLF 1 và 2 là không hoạt động.
Hình 3:Việc cắt bớt nhật ký đánh dấu các VLF trước đó là không hoạt động.
Khi việc cắt ngắn nhật ký xảy ra phụ thuộc vào mô hình khôi phục đang được sử dụng cho cơ sở dữ liệu:
- Mô hình đơn giản:việc cắt bớt nhật ký xảy ra khi hoạt động của trạm kiểm soát hoàn tất
- Mô hình đầy đủ hoặc mô hình được ghi nhật ký hàng loạt:việc cắt bớt nhật ký xảy ra khi quá trình sao lưu nhật ký hoàn tất (miễn là không có một bản sao lưu toàn bộ hoặc khác biệt đồng thời đang chạy, trong trường hợp đó, việc cắt bớt nhật ký được hoãn lại cho đến khi quá trình sao lưu dữ liệu hoàn tất)
Không có ngoại lệ cho điều này.
Bản chất tròn của nhật ký
Để tránh việc nhật ký giao dịch phải phát triển, việc cắt bớt nhật ký phải có khả năng đánh dấu các VLF không hoạt động. VLF vật lý đầu tiên trong nhật ký phải không hoạt động để nhật ký giao dịch có bản chất vòng tròn.
Hãy xem xét Hình 4 bên dưới, cho thấy các VLF 4 và 5 đang được sử dụng và việc cắt bớt nhật ký đã đánh dấu các VLF từ 1 đến 3 là không hoạt động. Nhiều bản ghi nhật ký hơn được tạo, nhiều khối nhật ký hơn được ghi vào VLF 5 và cuối cùng, nó sẽ đầy.
Hình 4:Hoạt động lấp đầy VLF vật lý cao nhất trong nhật ký giao dịch.
Tại thời điểm này, trình quản lý nhật ký cho cơ sở dữ liệu xem xét trạng thái của VLF vật lý đầu tiên trong nhật ký giao dịch, trong ví dụ của chúng tôi là VLF 1, với số thứ tự 1. VLF 1 không hoạt động, vì vậy nhật ký giao dịch có thể bao quanh và bắt đầu điền lại từ đầu. Trình quản lý nhật ký thay đổi VLF đầu tiên thành hoạt động và tăng số thứ tự của nó lên cao hơn một so với số thứ tự VLF cao nhất hiện tại. Vì vậy, nó trở thành VLF 6 và việc ghi nhật ký tiếp tục với khối nhật ký được ghi vào VLF đó. Đây là bản chất tròn của nhật ký, như thể hiện dưới đây trong Hình 5.
Hình 5:Bản chất vòng tròn của nhật ký giao dịch và tái sử dụng VLF.
Khi điều gì sai
Khi VLF vật lý đầu tiên trong nhật ký giao dịch không không hoạt động, nhật ký giao dịch không thể quấn quanh, do đó, nó sẽ phát triển (miễn là nó được định cấu hình để làm như vậy và có đủ dung lượng đĩa). Điều này thường xảy ra vì có điều gì đó ngăn cản việc cắt ngắn nhật ký hủy kích hoạt VLF. Nếu bạn thấy nhật ký giao dịch cho cơ sở dữ liệu đang tăng lên, bạn có thể truy vấn SQL Server để tìm hiểu xem có sự cố cắt ngắn nhật ký hay không bằng cách sử dụng mã đơn giản dưới đây:
SELECT [log_reuse_wait_desc] FROM [master].[sys].[databases] WHERE [name] = N'MyDatabase';
Nếu việc cắt ngắn nhật ký có thể hủy kích hoạt một hoặc nhiều VLF, thì kết quả sẽ là KHÔNG GÌ. Nếu không thì , bạn sẽ được cung cấp lý do tại sao việc cắt bớt nhật ký không thể hủy kích hoạt bất kỳ VLF nào. Có một danh sách dài các lý do có thể xảy ra được mô tả ở đây trong phần Các yếu tố có thể trì hoãn việc cắt bớt nhật ký.
Điều quan trọng là phải hiểu ngữ nghĩa của kết quả là gì:đó là lý do khiến việc cắt ngắn nhật ký không thể thực hiện được bất kỳ điều gì lần cuối cùng nó cố gắng chạy . Ví dụ:kết quả có thể là ACTIVE_BACKUP_OR_RESTORE, nhưng bạn biết rằng bản sao lưu đầy đủ dài hạn đó đã kết thúc. Điều này chỉ có nghĩa là lần cuối cùng cố gắng cắt bớt nhật ký, bản sao lưu vẫn đang chạy.
Theo kinh nghiệm của tôi, lý do phổ biến nhất để ngăn chặn việc cắt bớt nhật ký là LOG_BACKUP ; tức là, hãy thực hiện sao lưu nhật ký! Nhưng cũng có một hành vi kỳ lạ, thú vị với LOG_BACKUP . Nếu bạn liên tục thấy kết quả LOG_BACKUP nhưng bạn biết sao lưu nhật ký đang diễn ra thành công, đó là vì có rất ít hoạt động trong cơ sở dữ liệu và VLF hiện tại giống với lần cuối cùng sao lưu nhật ký được thực hiện. Vì vậy, LOG_BACKUP có nghĩa là “thực hiện sao lưu nhật ký” hoặc “tất cả các bản ghi nhật ký được sao lưu đều từ VLF hiện tại, vì vậy không thể hủy kích hoạt nó.” Khi điều thứ hai xảy ra, nó có thể gây nhầm lẫn.
Quay lại…
Duy trì tính chất vòng tròn của nhật ký giao dịch là rất quan trọng để tránh tăng trưởng nhật ký tốn kém và cần phải thực hiện hành động khắc phục. Thông thường, điều này có nghĩa là đảm bảo sao lưu nhật ký được diễn ra thường xuyên để tạo điều kiện cho việc cắt ngắn nhật ký và định cỡ nhật ký giao dịch để có thể lưu giữ bất kỳ hoạt động lớn và chạy dài hạn nào như xây dựng lại chỉ mục hoặc hoạt động ETL mà không xảy ra tăng trưởng nhật ký.
Trong phần tiếp theo của loạt bài này, tôi sẽ trình bày về các bản ghi nhật ký, cách chúng hoạt động và một số ví dụ thú vị.