Tại sao Nhật ký giao dịch tiếp tục phát triển hoặc hết dung lượng?


264

Đây có vẻ là một câu hỏi phổ biến trong hầu hết các diễn đàn và trên tất cả các trang web, nó được hỏi ở đây trong nhiều định dạng thường nghe như thế này:

Trong máy chủ SQL -

  • Một số lý do khiến nhật ký giao dịch phát triển quá lớn là gì?
  • Tại sao tệp nhật ký của tôi rất lớn?
  • Một số cách để ngăn chặn vấn đề này xảy ra là gì?
  • Tôi phải làm gì khi tự mình đi đúng hướng với nguyên nhân cơ bản và muốn đưa tệp nhật ký giao dịch của mình lên một kích thước lành mạnh?

4
Câu trả lời thực sự ngắn gọn là: đặt cơ sở dữ liệu ở chế độ Đơn giản (không phải Chế độ đầy đủ ). Nếu bạn không thực hiện nhiều bản sao lưu nhật ký giao dịch trong ngày ở giữa bản sao lưu hàng đêm đầy đủ của mình: bạn không cần Chế độ đầy đủ .
Ian Boyd

@IanBoyd - Chắc chắn đó là câu trả lời đơn giản nhất. Chìa khóa, mặc dù, là nhận được những gì có nghĩa là. Tôi nhấn vào đó trong câu trả lời. Đáng buồn thay, quá nhiều người hoặc không bao giờ giải quyết điều này hoặc chỉ chuyển sang đơn giản mà không hiểu lý do tại sao. Tuy nhiên, tôi sẽ chỉnh sửa câu trả lời của mình để nhấn vào chế độ đơn giản sớm hơn một chút trong đó ..
Mike Walsh

Nếu Cơ sở dữ liệu được đặt ở chế độ Đầy đủ, sau đó sao lưu toàn bộ và sau đó sao lưu nhật ký giao dịch. Điều này sẽ làm giảm kích thước tệp LDF. Nếu không thực hiện thu nhỏ operaiton. (Không nên thu nhỏ). Vẫn kích thước tệp lớn, kiểm tra kích thước ban đầu được đặt cho tệp LDF. Trong trường hợp của tôi, kích thước tệp LDF ban đầu là lớn.
dùng9516827

@ user9516827 Lấy một bản sao lưu đầy đủ và sau đó một bản sao lưu nhật ký sẽ hoàn toàn không làm giảm kích thước của tệp nhật ký - bản sao lưu nhật ký chỉ tạo không gian sử dụng trong tệp có sẵn để sử dụng lại. Và nếu bạn không thay đổi điều gì đó, điều đó sẽ chỉ xảy ra một lần nữa, do đó việc thu nhỏ lại không có ý nghĩa gì đối với việc phát triển lại sau này.
Aaron Bertrand

Câu trả lời:


321

Câu trả lời ngắn hơn:

Bạn có thể có một giao dịch chạy dài đang chạy (Bảo trì chỉ mục? Xóa hoặc cập nhật hàng loạt lớn?) Hoặc bạn đang ở chế độ khôi phục "mặc định" (bên dưới có nghĩa là mặc định) Fullvà chưa thực hiện sao lưu nhật ký (hoặc không dùng chúng thường xuyên đủ).

Nếu đó là sự cố mô hình khôi phục, câu trả lời đơn giản có thể là Chuyển sang Simplechế độ khôi phục nếu bạn không cần khôi phục thời gian và sao lưu nhật ký thông thường. Nhiều người, mặc dù, làm cho câu trả lời của họ mà không hiểu mô hình phục hồi. Đọc để hiểu tại sao nó quan trọng và sau đó quyết định những gì bạn làm. Bạn cũng có thể chỉ cần bắt đầu thực hiện sao lưu nhật ký và ở lại Fullphục hồi.

Có thể có những lý do khác nhưng đây là những lý do phổ biến nhất. Câu trả lời này bắt đầu đi sâu vào hai lý do phổ biến nhất và cung cấp cho bạn một số thông tin cơ bản về lý do và cách thức đằng sau lý do cũng như khám phá một số lý do khác.


Câu trả lời dài hơn: Kịch bản nào có thể khiến nhật ký tiếp tục phát triển? Có nhiều lý do, nhưng thông thường những lý do này có hai mẫu sau: Có sự hiểu lầm về các mô hình khôi phục hoặc có các giao dịch chạy dài. Đọc để biết chi tiết.

Lý do hàng đầu 1/2: Không hiểu mô hình phục hồi

( Đang ở Chế độ khôi phục hoàn toàn và không thực hiện sao lưu nhật ký - Đây là lý do phổ biến nhất - đại đa số những người gặp phải vấn đề này là. )

Mặc dù câu trả lời này không phải là một bước đi sâu trong các mô hình phục hồi SQL Server, chủ đề của các mô hình khôi phục là rất quan trọng đối với vấn đề này.

Trong SQL Server, có ba mô hình phục hồi :

  • Full,
  • Bulk-Logged
  • Simple.

Bulk-LoggedBây giờ chúng ta sẽ bỏ qua chúng ta sẽ nói rằng đó là một mô hình lai và hầu hết những người trong mô hình này đều có lý do và hiểu các mô hình phục hồi.

Hai chúng tôi quan tâm và sự nhầm lẫn của họ là nguyên nhân của phần lớn các trường hợp những người có vấn đề này là SimpleFull.

Tạm dừng: Phục hồi nói chung

Trước khi chúng ta nói về Mô hình khôi phục: hãy nói về phục hồi nói chung. Nếu bạn muốn đi sâu hơn nữa với chủ đề này, chỉ cần đọc blog của Paul Randal và nhiều bài viết về nó như bạn muốn. Đối với câu hỏi này, mặc dù:

  1. Sự cố / Khởi động lại phục hồi
    Một mục đích của tệp nhật ký giao dịch là phục hồi sự cố / khởi động lại . Đối với việc cuộn tiến và lùi công việc đã hoàn thành (lăn tiến / làm lại) trước khi gặp sự cố hoặc khởi động lại và công việc đã được bắt đầu nhưng chưa kết thúc sau sự cố hoặc khởi động lại (quay ngược / hoàn tác). Đó là công việc của nhật ký giao dịch để thấy rằng một giao dịch bắt đầu nhưng không bao giờ kết thúc (quay lại hoặc sự cố / khởi động lại xảy ra trước khi giao dịch được cam kết). Trong tình huống đó, công việc của nhật ký là nói "Này .. điều này không bao giờ thực sự kết thúc, hãy quay lại" trong quá trình phục hồi. Đây cũng là công việc của nhật ký để thấy rằng bạn đã hoàn thành một cái gì đó và ứng dụng khách của bạn được thông báo rằng nó đã kết thúc (ngay cả khi nó chưa cứng vào tệp dữ liệu của bạn) và nói"Này .. điều này thực sự đã xảy ra, hãy tiếp tục, hãy làm cho nó giống như các ứng dụng nghĩ rằng" sau khi khởi động lại. Bây giờ có nhiều hơn nhưng đó là mục đích chính.

  2. Phục hồi thời điểm
    Mục đích khác cho tệp nhật ký giao dịch là có thể cung cấp cho chúng tôi khả năng khôi phục kịp thời do "oops" trong cơ sở dữ liệu hoặc để đảm bảo điểm khôi phục trong trường hợp xảy ra lỗi phần cứng liên quan đến dữ liệu và / hoặc tệp nhật ký của cơ sở dữ liệu. Nếu nhật ký giao dịch này chứa các bản ghi các giao dịch đã được bắt đầu và kết thúc để khôi phục, SQL Server có thể và sau đó sử dụng thông tin này để đưa cơ sở dữ liệu đến nơi xảy ra trước khi xảy ra sự cố. Nhưng đó không phải lúc nào cũng là một lựa chọn có sẵn cho chúng ta. Để làm việc đó, chúng tôi phải có cơ sở dữ liệu của mình trong mô hình khôi phục phù hợp và chúng tôi phải thực hiện sao lưu nhật ký .

Mô hình phục hồi

Lên các mô hình phục hồi:

  • Mô hình phục hồi đơn giản
    Vì vậy, với phần giới thiệu ở trên, dễ nhất là nói về Simple Recoverymô hình trước. Trong mô hình này, bạn đang nói với SQL Server: "Tôi ổn với bạn khi sử dụng tệp nhật ký giao dịch của bạn để khắc phục sự cố và khởi động lại phục hồi ..." (Bạn thực sự không có lựa chọn nào ở đó. Tra cứu các thuộc tính ACID và điều đó sẽ nhanh chóng có ý nghĩa.) "... nhưng một khi bạn không còn cần nó cho mục đích khôi phục sự cố / khởi động lại đó, hãy tiếp tục và sử dụng lại tệp nhật ký."

    SQL Server lắng nghe yêu cầu này trong Phục hồi đơn giản và nó chỉ giữ thông tin cần thiết để thực hiện khôi phục sự cố / khởi động lại. Khi SQL Server chắc chắn có thể khôi phục được vì dữ liệu được làm cứng vào tệp dữ liệu (ít nhiều), dữ liệu đã được làm cứng không còn cần thiết trong nhật ký và được đánh dấu để cắt bớt - có nghĩa là nó được sử dụng lại.

  • Mô hình khôi phục hoàn toàn
    Với Full Recovery, bạn đang nói với SQL Server rằng bạn muốn có thể khôi phục đến một thời điểm cụ thể, miễn là tệp nhật ký của bạn có sẵn hoặc đến một thời điểm cụ thể được bao phủ bởi bản sao lưu nhật ký. Trong trường hợp này khi SQL Server đạt đến điểm an toàn để cắt tệp nhật ký trong Mô hình khôi phục đơn giản, nó sẽ không làm điều đó. Thay vào đó, nó cho phép tệp nhật ký tiếp tục phát triển và sẽ cho phép nó tiếp tục phát triển, cho đến khi bạn thực hiện sao lưu nhật ký (hoặc hết dung lượng trên ổ đĩa tệp nhật ký của bạn) trong các trường hợp bình thường.

Chuyển từ đơn giản sang đầy đủ có Gotcha.

Có các quy tắc và ngoại lệ ở đây. Chúng ta sẽ nói về các giao dịch chạy dài theo chiều sâu bên dưới.

Nhưng một lưu ý cần lưu ý đối với Chế độ khôi phục hoàn toàn là: Nếu bạn chỉ chuyển sang Full Recoverychế độ, nhưng không bao giờ thực hiện Sao lưu toàn bộ ban đầu, SQL Server sẽ không thực hiện yêu cầu của bạn trong Full Recoverymô hình. Nhật ký giao dịch của bạn sẽ tiếp tục hoạt động như hiện tại Simplecho đến khi bạn chuyển sang Mô hình khôi phục hoàn toàn VÀ thực hiện lần đầu tiên Full Backup.

Mô hình phục hồi đầy đủ mà không sao lưu nhật ký là xấu.

Vì vậy, đó là lý do phổ biến nhất cho tăng trưởng log không kiểm soát? Trả lời: Đang ở chế độ Khôi phục hoàn toàn mà không có bất kỳ bản sao lưu nhật ký nào.

Điều này xảy ra tất cả thời gian cho mọi người.

Tại sao điều này là một lỗi phổ biến như vậy?

Tại sao nó xảy ra tất cả các thời gian? Bởi vì mỗi cơ sở dữ liệu mới có cài đặt mô hình khôi phục ban đầu bằng cách xem cơ sở dữ liệu mô hình.

Cài đặt mô hình khôi phục ban đầu của mô hình luôn luôn Full Recovery Model- cho đến khi và trừ khi có ai đó thay đổi điều đó. Vì vậy, bạn có thể nói "Mô hình khôi phục mặc định" là Full. Nhiều người không nhận thức được điều này và có cơ sở dữ liệu của họ chạy Full Recovery Modelmà không có bản sao lưu nhật ký, và do đó một tệp nhật ký giao dịch lớn hơn nhiều so với mức cần thiết. Đây là lý do tại sao điều quan trọng là phải thay đổi mặc định khi chúng không hoạt động cho tổ chức của bạn và nhu cầu của tổ chức)

Full Recovery Model với quá ít bản sao lưu log là xấu.

Bạn cũng có thể gặp rắc rối ở đây bằng cách không sao lưu nhật ký đủ thường xuyên.
Việc sao lưu nhật ký một ngày nghe có vẻ tốt, nó làm cho việc khôi phục yêu cầu ít lệnh khôi phục hơn, nhưng hãy nhớ rằng cuộc thảo luận ở trên, tệp nhật ký đó sẽ tiếp tục phát triển và phát triển cho đến khi bạn thực hiện sao lưu nhật ký.

Làm cách nào để tìm ra tần suất sao lưu nhật ký tôi cần?

Bạn cần xem xét tần suất sao lưu nhật ký của mình với hai điều cần lưu ý:

  1. Nhu cầu phục hồi - Điều này hy vọng sẽ là đầu tiên. Trong trường hợp ổ đĩa lưu trữ nhật ký giao dịch của bạn bị hỏng hoặc bạn bị hỏng nghiêm trọng ảnh hưởng đến sao lưu nhật ký của bạn, có thể mất bao nhiêu dữ liệu? Nếu con số đó không quá 10-15 phút, thì bạn cần phải thực hiện sao lưu nhật ký cứ sau 10 - 15 phút, kết thúc cuộc thảo luận.
  2. Tăng trưởng nhật ký - Nếu tổ chức của bạn ổn để mất thêm dữ liệu vì khả năng dễ dàng tạo lại ngày hôm đó, bạn có thể ổn để sao lưu nhật ký ít thường xuyên hơn 15 phút. Có thể tổ chức của bạn vẫn ổn với mỗi 4 giờ. Nhưng bạn phải xem có bao nhiêu giao dịch bạn tạo ra trong 4 giờ. Sẽ cho phép nhật ký tiếp tục phát triển trong bốn giờ đó làm cho tệp nhật ký quá lớn? Điều đó có nghĩa là sao lưu nhật ký của bạn mất quá nhiều thời gian?

Lý do hàng đầu 2/2: Giao dịch chạy dài

( "Mô hình phục hồi của tôi vẫn ổn! Nhật ký vẫn đang phát triển! )

Đây cũng có thể là một nguyên nhân của tăng trưởng log không kiểm soát và không bị hạn chế. Không quan trọng mô hình khôi phục, nhưng nó thường xuất hiện dưới dạng "Nhưng tôi đang ở trong Mô hình khôi phục đơn giản - tại sao nhật ký của tôi vẫn tăng?!"

Lý do ở đây rất đơn giản: nếu SQL đang sử dụng nhật ký giao dịch này cho mục đích khôi phục như tôi đã mô tả ở trên, thì nó phải xem lại khi bắt đầu giao dịch.

Nếu bạn có một giao dịch mất nhiều thời gian hoặc thực hiện nhiều thay đổi, nhật ký không thể cắt ngắn điểm kiểm tra đối với bất kỳ thay đổi nào vẫn còn trong giao dịch mở hoặc đã bắt đầu kể từ khi giao dịch đó bắt đầu.

Điều này có nghĩa là việc xóa lớn, xóa hàng triệu hàng trong một câu lệnh xóa là một giao dịch và nhật ký không thể thực hiện bất kỳ việc cắt bớt nào cho đến khi xóa toàn bộ. Trong Full Recovery Model, xóa này được ghi lại và đó có thể là rất nhiều bản ghi nhật ký. Điều tương tự với công việc tối ưu hóa Index trong các cửa sổ bảo trì. Điều đó cũng có nghĩa là quản lý giao dịch kém và không theo dõi và đóng giao dịch mở có thể thực sự làm tổn thương bạn và tệp nhật ký của bạn.

Tôi có thể làm gì với những giao dịch dài hạn này?

Bạn có thể tự cứu mình ở đây bằng cách:

  • Định cỡ chính xác tệp nhật ký của bạn để giải thích cho trường hợp xấu nhất - như bảo trì của bạn hoặc các hoạt động lớn đã biết. Và khi bạn phát triển tệp nhật ký của mình, bạn nên xem hướng dẫn này (và hai liên kết cô ấy gửi cho bạn) của Kimberly Tripp. Kích thước bên phải là siêu quan trọng ở đây.
  • Xem sử dụng giao dịch của bạn. Đừng bắt đầu một giao dịch trong máy chủ ứng dụng của bạn và bắt đầu có các cuộc trò chuyện dài với SQL Server và có nguy cơ để mở một giao dịch quá lâu.
  • Xem các giao dịch ngụ ý trong các báo cáo DML của bạn. Ví dụ: UPDATE TableName Set Col1 = 'New Value'là một giao dịch. Tôi đã không đặt BEGIN TRANở đó và tôi không phải làm thế, đó vẫn là một giao dịch chỉ tự động thực hiện khi hoàn thành. Vì vậy, nếu thực hiện các thao tác trên số lượng lớn các hàng, hãy xem xét việc gộp các hoạt động đó thành nhiều phần dễ quản lý hơn và cho thời gian đăng nhập để phục hồi. Hoặc xem xét kích thước phù hợp để đối phó với điều đó. Hoặc có thể xem xét thay đổi mô hình phục hồi trong cửa sổ tải số lượng lớn.

Có phải hai lý do này cũng áp dụng cho Log Shipping?

Câu trả lời ngắn gọn: có. Câu trả lời dài hơn dưới đây.

Câu hỏi: "Tôi đang sử dụng vận chuyển nhật ký, vì vậy các bản sao lưu nhật ký của tôi được tự động ... Tại sao tôi vẫn thấy tăng trưởng nhật ký giao dịch?"

Trả lời: đọc tiếp.

Đăng nhập vận chuyển là gì?

Nhật ký vận chuyển chỉ là những gì nó nghe giống như - bạn đang vận chuyển sao lưu nhật ký giao dịch của mình đến một máy chủ khác cho mục đích DR. Có một số khởi tạo nhưng sau đó quá trình này khá đơn giản:

  • Một công việc để sao lưu nhật ký trên một máy chủ,
  • một công việc sao chép bản sao lưu nhật ký đó và
  • một công việc để khôi phục nó mà không cần phục hồi (hoặc NORECOVERYhoặc STANDBY) trên máy chủ đích.

Ngoài ra còn có một số công việc để theo dõi và cảnh báo nếu mọi thứ không diễn ra như bạn đã lên kế hoạch.

Trong một số trường hợp, bạn chỉ có thể muốn thực hiện khôi phục nhật ký vận chuyển một lần một ngày hoặc mỗi ngày thứ ba hoặc một lần một tuần. Điều đó là tốt. Nhưng nếu bạn thực hiện thay đổi này trên tất cả các công việc (bao gồm sao lưu nhật ký và sao chép công việc), điều đó có nghĩa là bạn đang chờ đợi tất cả thời gian để thực hiện sao lưu nhật ký. Điều đó có nghĩa là bạn sẽ có rất nhiều sự tăng trưởng nhật ký - bởi vì bạn đang ở chế độ khôi phục hoàn toàn mà không cần sao lưu nhật ký - và nó cũng có thể có nghĩa là một tệp nhật ký lớn để sao chép. Bạn chỉ nên sửa đổi lịch trình của công việc khôi phục và để sao lưu nhật ký và bản sao xảy ra thường xuyên hơn, nếu không bạn sẽ gặp phải vấn đề đầu tiên được mô tả trong câu trả lời này.


Xử lý sự cố chung thông qua mã trạng thái

Có những lý do khác ngoài hai điều này, nhưng đây là những lý do phổ biến nhất. Bất kể nguyên nhân là gì: có một cách bạn có thể phân tích lý do của mình cho sự tăng trưởng / thiếu bản ghi không rõ nguyên nhân này và xem chúng là gì.

Bằng cách truy vấn sys.databaseschế độ xem danh mục, bạn có thể thấy thông tin mô tả lý do tệp nhật ký của bạn có thể đang chờ rút ngắn / tái sử dụng.

Có một cột được gọi log_reuse_waitvới ID tra cứu của mã lý do và một log_reuse_wait_desccột có mô tả lý do chờ. Từ các sách tham khảo bài viết trực tuyến là phần lớn các lý do (những lý do bạn có thể thấy và những lý do chúng tôi có thể giải thích lý do. Những người mất tích hoặc không sử dụng hoặc sử dụng nội bộ) với một vài lưu ý về việc chờ đợi chữ nghiêng :

  • 0 = Không có
    gì Nghe giống như vậy .. Không nên chờ đợi

  • 1 = Điểm kiểm tra
    Đang chờ điểm kiểm tra xảy ra. Điều này sẽ xảy ra và bạn sẽ ổn thôi - nhưng có một số trường hợp cần tìm ở đây để có câu trả lời hoặc chỉnh sửa sau này.

  • 2 = Sao lưu nhật ký
    Bạn đang chờ sao lưu nhật ký xảy ra. Hoặc bạn đã lên lịch cho chúng và nó sẽ xảy ra sớm hoặc bạn có vấn đề đầu tiên được mô tả ở đây và bây giờ bạn biết cách khắc phục

  • 3 = Sao
    lưu hoặc khôi phục hoạt động Một hoạt động sao lưu hoặc khôi phục đang chạy trên cơ sở dữ liệu

  • 4 = Giao dịch hoạt động
    Có một giao dịch đang hoạt động cần hoàn thành (bằng cách nào đó - ROLLBACKhoặc COMMIT) trước khi nhật ký có thể được sao lưu. Đây là lý do thứ hai được mô tả trong câu trả lời này.

  • 5 = Phản chiếu cơ sở dữ liệu
    Hoặc một gương đang ở phía sau hoặc dưới một độ trễ nào đó trong tình huống phản chiếu hiệu suất cao hoặc phản chiếu bị tạm dừng vì một số lý do

  • 6 = Sao chép
    Có thể có các vấn đề với sao chép sẽ gây ra điều này - như tác nhân đọc nhật ký không chạy, cơ sở dữ liệu nghĩ rằng nó được đánh dấu để sao chép không còn và nhiều lý do khác. Bạn cũng có thể thấy lý do này và nó hoàn toàn bình thường vì bạn đang xem xét đúng thời điểm, giống như các giao dịch đang được người đọc nhật ký sử dụng

  • 7 = Tạo ảnh chụp nhanh cơ sở dữ liệu
    Bạn đang tạo ảnh chụp nhanh cơ sở dữ liệu, bạn sẽ thấy điều này nếu bạn nhìn vào đúng thời điểm khi ảnh chụp nhanh được tạo

  • 8 = Log Scan
    Tôi vẫn chưa gặp phải vấn đề gì với việc này chạy mãi mãi. Nếu bạn nhìn đủ lâu và đủ thường xuyên, bạn có thể thấy điều này xảy ra, nhưng nó không phải là nguyên nhân của sự tăng trưởng nhật ký giao dịch quá mức, mà tôi đã thấy.

  • 9 = Bản sao thứ cấp của Nhóm Luôn sẵn sàng đang áp dụng các bản ghi nhật ký giao dịch của cơ sở dữ liệu này cho cơ sở dữ liệu thứ cấp tương ứng. Về mô tả rõ ràng nhất ..


1
Chia tách trang sẽ tăng đăng nhập. Một lý do quan trọng (theo kinh nghiệm của tôi) đã không được đề cập cho sự tăng trưởng lớn có thể yêu cầu thu hẹp thường xuyên đã được giải quyết trong nhiều trường hợp của tôi là sử dụng các lựa chọn chỉ số thích hợp bao gồm cả mgF FillFactor thích hợp. Tôi sử dụng các cài đặt sau đây, với sự quan sát chặt chẽ. Cài đặt FF: (0/100) bảng có mức đọc cao / ghi thấp, (90) đối với sửa đổi một chút, (80) đọc trung bình / ghi thấp, (70) ghi cao, (60) Tôi khó đạt được điều này cấp độ hoặc một cái gì đó khác có thể sai. Sử dụng sau đó lịch trình quản lý chỉ mục phù hợp với khối lượng dữ liệu.
SnapJag

113

Vì tôi không thực sự hài lòng với bất kỳ câu trả lời nào về Stack Overflow , bao gồm cả gợi ý được bình chọn nhiều nhất và bởi vì có một vài điều tôi muốn giải quyết mà câu trả lời của Mike không có, tôi nghĩ tôi sẽ cung cấp đầu vào của tôi ở đây quá. Tôi đã đặt một bản sao của câu trả lời này là tốt.

Làm cho một tệp nhật ký nhỏ hơn thực sự nên được dành riêng cho các tình huống mà nó gặp phải sự tăng trưởng bất ngờ mà bạn không mong muốn xảy ra lần nữa. Nếu tệp nhật ký sẽ phát triển trở lại cùng kích thước, thì sẽ không thực hiện được nhiều bằng cách thu nhỏ tạm thời. Bây giờ, tùy thuộc vào mục tiêu khôi phục cơ sở dữ liệu của bạn, đây là những hành động bạn nên thực hiện.

Đầu tiên, hãy sao lưu toàn bộ

Không bao giờ thực hiện bất kỳ thay đổi nào đối với cơ sở dữ liệu của bạn mà không đảm bảo bạn có thể khôi phục nó nếu có sự cố.

Nếu bạn quan tâm đến việc phục hồi tại thời điểm

(Và bằng cách khôi phục tại thời điểm, ý tôi là bạn quan tâm đến việc có thể khôi phục lại bất cứ thứ gì ngoài bản sao lưu đầy đủ hoặc khác biệt.)

Có lẽ cơ sở dữ liệu của bạn đang ở FULLchế độ phục hồi. Nếu không, hãy chắc chắn rằng nó là:

ALTER DATABASE yourdb SET RECOVERY FULL;

Ngay cả khi bạn đang thực hiện sao lưu đầy đủ thường xuyên, tệp nhật ký sẽ phát triển và phát triển cho đến khi bạn thực hiện sao lưu nhật ký - đây là để bảo vệ bạn, không cần phải ăn mất không gian đĩa. Bạn nên thực hiện các bản sao lưu nhật ký này khá thường xuyên, theo mục tiêu phục hồi của bạn. Ví dụ: nếu bạn có một quy tắc kinh doanh nói rằng bạn có thể đủ khả năng để mất không dưới 15 phút dữ liệu trong trường hợp xảy ra thảm họa, bạn nên có một công việc sao lưu nhật ký cứ sau 15 phút. Đây là một tập lệnh sẽ tạo các tên tệp được đánh dấu thời gian dựa trên thời gian hiện tại (nhưng bạn cũng có thể thực hiện điều này với các kế hoạch bảo trì, v.v., đừng chọn bất kỳ tùy chọn thu nhỏ nào trong các kế hoạch bảo trì, chúng thật tồi tệ).

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\yourdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

Lưu ý rằng \\backup_share\phải ở trên một máy khác đại diện cho một thiết bị lưu trữ bên dưới khác. Sao lưu chúng vào cùng một máy (hoặc cho một máy khác sử dụng cùng một đĩa bên dưới hoặc một VM khác trên cùng một máy chủ vật lý) không thực sự giúp bạn, vì nếu máy nổ, bạn đã mất cơ sở dữ liệu của mình bản sao lưu của nó. Tùy thuộc vào cơ sở hạ tầng mạng của bạn, có thể có ý nghĩa hơn để sao lưu cục bộ và sau đó chuyển chúng đến một vị trí khác phía sau hậu trường; trong cả hai trường hợp, bạn muốn đưa chúng ra khỏi máy cơ sở dữ liệu chính càng nhanh càng tốt.

Bây giờ, một khi bạn có các bản sao lưu nhật ký thường xuyên đang chạy, sẽ rất hợp lý khi thu nhỏ tệp nhật ký thành một cái gì đó hợp lý hơn bất cứ thứ gì nó được thổi cho đến bây giờ. Điều này không có nghĩa là chạy đi chạy SHRINKFILElại cho đến khi tệp nhật ký là 1 MB - ngay cả khi bạn thường xuyên sao lưu nhật ký, nó vẫn cần điều chỉnh tổng của bất kỳ giao dịch đồng thời nào có thể xảy ra. Các sự kiện autogrow tệp nhật ký rất tốn kém, vì SQL Server phải loại bỏ các tệp (không giống như các tệp dữ liệu khi bật khởi tạo tệp tức thời) và các giao dịch của người dùng phải chờ trong khi điều này xảy ra. Bạn muốn thực hiện thói quen tăng-giảm-tăng-thu nhỏ này càng ít càng tốt và bạn chắc chắn không muốn làm cho người dùng của mình trả tiền cho nó.

Lưu ý rằng bạn có thể cần sao lưu nhật ký hai lần trước khi có thể thu nhỏ (cảm ơn Robert).

Vì vậy, bạn cần phải đưa ra một kích thước thực tế cho tệp nhật ký của bạn. Không ai ở đây có thể cho bạn biết đó là gì mà không biết nhiều về hệ thống của bạn, nhưng nếu bạn thường xuyên thu hẹp tệp nhật ký và nó đã phát triển trở lại, một hình mờ tốt có thể cao hơn 10-50% so với lớn nhất . Giả sử có tới 200 MB và bạn muốn bất kỳ sự kiện tự động phát sinh tiếp theo nào là 50 MB, thì bạn có thể điều chỉnh kích thước tệp nhật ký theo cách này:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

Lưu ý rằng nếu tệp nhật ký hiện tại> 200 MB, bạn có thể cần chạy tệp này trước:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

Nếu bạn không quan tâm đến việc phục hồi tại thời điểm

Nếu đây là cơ sở dữ liệu kiểm tra và bạn không quan tâm đến việc khôi phục tại thời điểm, thì bạn nên đảm bảo rằng cơ sở dữ liệu của mình đang ở SIMPLEchế độ khôi phục.

ALTER DATABASE yourdb SET RECOVERY SIMPLE;

Đặt cơ sở dữ liệu ở SIMPLEchế độ khôi phục sẽ đảm bảo rằng SQL Server sử dụng lại các phần của tệp nhật ký (về cơ bản loại bỏ các giao dịch không hoạt động) thay vì phát triển để giữ một bản ghi của tất cả các giao dịch (như FULLphục hồi cho đến khi bạn sao lưu nhật ký). CHECKPOINTcác sự kiện sẽ giúp kiểm soát nhật ký và đảm bảo rằng nó không cần phát triển trừ khi bạn tạo ra nhiều hoạt động t-log giữa CHECKPOINTcác s.

Tiếp theo, bạn nên chắc chắn tuyệt đối rằng sự tăng trưởng nhật ký này thực sự là do một sự kiện bất thường (giả sử, làm sạch mùa xuân hàng năm hoặc xây dựng lại các chỉ số lớn nhất của bạn), và không phải do sử dụng hàng ngày, bình thường. Nếu bạn thu nhỏ tệp nhật ký thành kích thước nhỏ một cách lố bịch và SQL Server chỉ cần phát triển lại để phù hợp với hoạt động bình thường của bạn, bạn đã đạt được gì? Bạn có thể tận dụng không gian đĩa mà bạn đã giải phóng tạm thời không? Nếu bạn cần sửa chữa ngay lập tức, thì bạn có thể chạy như sau:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
-- 200 MB
DBCC SHRINKFILE(yourdb_log, 200);
GO

Nếu không, thiết lập một kích thước phù hợp và tốc độ tăng trưởng. Theo ví dụ trong trường hợp khôi phục tại thời điểm, bạn có thể sử dụng cùng mã và logic để xác định kích thước tệp nào là phù hợp và đặt tham số tự động hợp lý.

Một số điều bạn không muốn làm

  • Sao lưu nhật ký với TRUNCATE_ONLYtùy chọn và sau đóSHRINKFILE . Đối với một, TRUNCATE_ONLYtùy chọn này đã không được chấp nhận và không còn có sẵn trong các phiên bản hiện tại của SQL Server. Thứ hai, nếu bạn đang ở trong FULLmô hình khôi phục, điều này sẽ phá hủy chuỗi nhật ký của bạn và yêu cầu một bản sao lưu mới, đầy đủ.

  • Tháo cơ sở dữ liệu, xóa tệp nhật ký và đính kèm lại . Tôi không thể nhấn mạnh mức độ nguy hiểm của nó. Cơ sở dữ liệu của bạn có thể không hoạt động trở lại, nó có thể xuất hiện dưới dạng nghi ngờ, bạn có thể phải quay lại bản sao lưu (nếu bạn có), v.v.

  • Sử dụng tùy chọn "thu nhỏ cơ sở dữ liệu" . DBCC SHRINKDATABASEvà tùy chọn kế hoạch bảo trì để làm tương tự là những ý tưởng tồi, đặc biệt nếu bạn thực sự chỉ cần giải quyết vấn đề về nhật ký. Nhắm mục tiêu tệp bạn muốn điều chỉnh và điều chỉnh độc lập, sử dụng DBCC SHRINKFILEhoặc ALTER DATABASE ... MODIFY FILE(ví dụ ở trên).

  • Thu nhỏ tệp nhật ký thành 1 MB . Điều này có vẻ hấp dẫn bởi vì, hey, SQL Server sẽ cho phép tôi làm điều đó trong một số tình huống nhất định và xem xét tất cả không gian mà nó giải phóng! Trừ khi cơ sở dữ liệu của bạn chỉ được đọc (và đó là, bạn nên đánh dấu nó như vậy bằng cách sử dụng ALTER DATABASE), điều này hoàn toàn sẽ dẫn đến nhiều sự kiện tăng trưởng không cần thiết, vì nhật ký phải điều chỉnh các giao dịch hiện tại bất kể mô hình phục hồi. Điểm giải phóng không gian đó tạm thời là gì, để SQL Server có thể lấy lại từ từ và đau đớn?

  • Tạo một tệp nhật ký thứ hai . Điều này sẽ cung cấp cứu trợ tạm thời cho ổ đĩa đã lấp đầy đĩa của bạn, nhưng điều này giống như cố gắng sửa chữa phổi bị thủng bằng băng hỗ trợ. Bạn nên trực tiếp xử lý tệp nhật ký có vấn đề thay vì chỉ thêm một vấn đề tiềm năng khác. Khác với việc chuyển hướng một số hoạt động nhật ký giao dịch sang một ổ đĩa khác, tệp nhật ký thứ hai thực sự không có gì cho bạn (không giống như tệp dữ liệu thứ hai), vì mỗi lần chỉ có một tệp có thể được sử dụng. Paul Randal cũng giải thích lý do tại sao nhiều tệp nhật ký có thể cắn bạn sau này .

Được chủ động

Thay vì thu nhỏ tệp nhật ký của bạn xuống một số tiền nhỏ và để nó tự động liên tục ở một tỷ lệ nhỏ, hãy đặt nó ở một kích thước lớn hợp lý (một trong đó sẽ chứa tổng số các giao dịch đồng thời lớn nhất của bạn) và đặt tự động hợp lý thiết lập như một dự phòng, để nó không phải phát triển nhiều lần để đáp ứng các giao dịch đơn lẻ và do đó nó sẽ tương đối hiếm khi nó phải phát triển trong các hoạt động kinh doanh thông thường.

Các cài đặt tồi tệ nhất có thể có ở đây là tăng trưởng 1 MB hoặc tăng trưởng 10%. Hài hước lắm, đây là những mặc định cho SQL Server (tôi đã phàn nàn và yêu cầu thay đổi không có kết quả ) - 1 MB cho các tệp dữ liệu và 10% cho các tệp nhật ký. Cái trước quá nhỏ trong thời đại ngày nay và cái sau dẫn đến các sự kiện dài hơn và dài hơn mỗi lần (giả sử, tệp nhật ký của bạn là 500 MB, tăng trưởng đầu tiên là 50 MB, tăng trưởng tiếp theo là 55 MB, tăng trưởng tiếp theo là 60,5 MB , v.v. - và trên I / O chậm, tin tôi đi, bạn sẽ thực sự chú ý đến đường cong này).

đọc thêm

Xin đừng dừng lại ở đây; trong khi nhiều lời khuyên bạn thấy ngoài kia về việc thu hẹp các tệp nhật ký vốn đã xấu và thậm chí có khả năng gây thảm họa, có một số người quan tâm đến tính toàn vẹn dữ liệu hơn là giải phóng không gian đĩa.


27

Bạn cũng có thể xem nội dung của tệp nhật ký của bạn. Để làm điều đó, bạn có thể sử dụng fn_dblogtrình đọc nhật ký giao dịch không có giấy tờ , chẳng hạn như Nhật ký ApexQuery .

Nó không hiển thị sắp xếp chỉ mục, nhưng nó cho thấy tất cả các DML và DDL sự kiện khác nhau: ALTER, CREATE, DROP, kích hoạt bật / tắt, cấp / thu hồi quyền, đối tượng đổi tên.

ApexSQLLogProject.temp - ApexSQL.log

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho ApexSQL với tư cách là Kỹ sư hỗ trợ


5

Đây là vấn đề phải đối mặt thường xuyên nhất đối với hầu hết các DBA, nơi các bản ghi phát triển và lấp đầy đĩa.

• một số lý do khiến nhật ký giao dịch phát triển quá lớn là gì?

  1. Giao dịch dài hạn
  2. Các giao dịch ghi nhật ký cao như Xây dựng lại chỉ mục, tổ chức lại, Chèn hàng loạt, Xóa, v.v.
  3. Bất kỳ HA nào như Sao chép, Phản chiếu được định cấu hình giữ nhật ký và không cho phép giải phóng không gian nhật ký

• Tại sao tệp nhật ký của tôi quá lớn?

Kiểm tra log_reuse_wait_descột c trong sys.databasesbảng để biết những gì đang giữ các bản ghi từ cắt ngắn:

select name, log_reuse_wait_desc 
from sys.databases

• một số cách để ngăn chặn vấn đề này xảy ra là gì?

Sao lưu nhật ký sẽ giúp bạn kiểm soát sự tăng trưởng của nhật ký trừ khi có một cái gì đó đang giữ các bản ghi khỏi bị tái sử dụng.

• Tôi phải làm gì khi tự mình đi đúng hướng với nguyên nhân cơ bản và muốn đưa tệp nhật ký giao dịch của mình lên kích thước khỏe mạnh?

Nếu bạn đã xác định được những gì thực sự gây ra nó thì hãy cố gắng khắc phục nó như được giải thích trong trang dưới đây.

https://www.brentozar.com/archive/2016/03/my-favorite-system-column-log_Vuse_wait_desc/

Có các bản sao lưu nhật ký thích hợp được lên lịch là cách tốt nhất để đối phó với sự tăng trưởng của bản ghi trừ khi có tình huống bất thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.