Thu hẹp Nhật ký giao dịch máy chủ SQL


8

Tôi hiện đang phải đối phó với nhật ký giao dịch SQL Server đã vượt khỏi tầm kiểm soát. Tuyên bố miễn trừ trách nhiệm: Tôi không phải là một dba và đây không phải là lĩnh vực chuyên môn của tôi vì vậy hãy đồng ý với tôi.

Hiện tại tôi có tệp nhật ký giao dịch 115GB cho cơ sở dữ liệu 500 MB (rõ ràng) được quản lý kém trong một thời gian để nó có được trạng thái này.

Ưu tiên hàng đầu là lấy lại không gian trên đĩa được lấy bởi tập tin này trước khi chúng tôi hết! Tôi đã được thông báo rằng việc tăng kích thước của ổ đĩa không phải là một lựa chọn, thậm chí là tạm thời và dựa trên sự tăng trưởng trong quá khứ, chúng ta cần phải hành động khá sớm.

Theo tôi hiểu, cách tiếp cận tốt nhất là giữ db ở chế độ khôi phục hoàn toàn nhưng thực hiện sao lưu thường xuyên tệp nhật ký, theo dõi điều này trong một khoảng thời gian và điều chỉnh kích thước ban đầu và gia tăng cho phù hợp. Tất cả ổn.

Thấy rằng chúng tôi thường xuyên sao lưu db đầy đủ vào nửa đêm, tôi có thể tạm thời đặt cơ sở dữ liệu vào Chế độ khôi phục đơn giản (sau khi một trong các bản sao lưu này chạy), thu nhỏ tệp nhật ký để lấy lại (hầu như tất cả) không gian và sau đó đưa nó trở lại Full Recovery với chiến lược sao lưu được đề cập ở trên?

Tôi nghĩ rằng nếu có gì đó xảy ra trong khoảng thời gian này, chúng ta có thể khôi phục lại toàn bộ bản sao lưu mà không cần sử dụng nhật ký.

CẬP NHẬT

Một vài chi tiết bổ sung để trả lời một số câu trả lời và bình luận:

  • Chúng tôi muốn giữ lại khả năng thực hiện khôi phục tại thời điểm để cơ sở dữ liệu vẫn ở chế độ khôi phục hoàn toàn.

  • Lý do mà tệp t-log đã phát triển quá lớn là vì nó chưa bao giờ được sao lưu . Được xác minh là log_Vuse_wait_desc trả về 'LOG_BACKUP'.


Bạn có kiểm tra bất kỳ giao dịch mở hoặc bất kỳ loại nhiệm vụ đặc biệt hoặc theo lịch trình nào có thể khiến nhật ký giao dịch tăng lên không? Xác định lý do có thể giúp bạn lập kế hoạch tăng trưởng phù hợp.
KASQLDBA

Ngay khi bạn chuyển nó sang chế độ Đơn giản, bạn không còn có thể thực hiện khôi phục nhật ký giao dịch qua thời điểm đó, cho đến khi sao lưu toàn bộ tiếp theo của bạn. Ngay cả khi bạn chuyển nó trở lại Chế độ khôi phục hoàn toàn, sao lưu / khôi phục nhật ký giao dịch sẽ không bắt đầu hoạt động trở lại cho đến khi bạn thực hiện sao lưu đầy đủ khác. Vì vậy, hãy chắc chắn để có một bản sao lưu đầy đủ ngay lập tức sau khi bạn chuyển nó trở lại phục hồi hoàn toàn.
RBarryYoung

Lý do thông thường cho các tệp nhật ký ngoài tầm kiểm soát như thế này là 1) không thực hiện sao lưu toàn bộ thường xuyên, 2) không thực hiện sao lưu nhật ký giao dịch thông thường hoặc 3) một số cài đặt trong sao lưu toàn bộ hoặc nhật ký của bạn (chẳng hạn như chỉ sao chép ) đó là ngăn chặn các dấu sao lưu bình thường được thiết lập.
RBarryYoung

@RBarryYoung Chúng tôi đã xác minh rằng đó là vì không có bản sao lưu t-log nào được thực hiện. Bạn có khuyên bạn nên làm như tôi đã đề xuất ban đầu nhưng thực hiện sao lưu toàn bộ thủ công ngay sau khi trả lại db để khôi phục hoàn toàn để tránh các vấn đề bạn đã đề cập không? Điều bắt buộc là chúng ta phải lấy một phần dung lượng đĩa khai hoang càng sớm càng tốt.
Kraig Walker

AFAIK, không có điểm nào ở chế độ khôi phục hoàn toàn nếu bạn không thực hiện sao lưu nhật ký. Nếu bạn không có kế hoạch thực hiện sao lưu nhật ký thì hãy để nó ở chế độ đơn giản. Dù sao đi nữa, các bản sao lưu đầy đủ của bạn vẫn sẽ được lưu lại, bạn chỉ có thể thực hiện khôi phục / khôi phục, nhưng dù sao bạn cũng không thể làm điều đó nếu không có bản sao lưu nhật ký.
RBarryYoung

Câu trả lời:


4

Nhật ký giao dịch cho cơ sở dữ liệu đó chứa tất cả các giao dịch kể từ lần sao lưu nhật ký giao dịch cuối cùng hoặc lần cuối cùng được chuyển từ chế độ khôi phục đơn giản. Thực hiện các thao tác sau để có câu trả lời dứt khoát về lý do tại sao SQL Server không thể cắt bớt nhật ký và sau đó là lý do tại sao nhật ký đang phát triển.

SELECT  d.Name
        ,d.log_reuse_wait_desc
FROM    sys.databases d
ORDER BY
        d.name

Nếu bạn muốn khôi phục kịp thời điểm thì hãy để DB trong mô hình khôi phục hoàn toàn và thực hiện sao lưu nhật ký thường xuyên. Mỗi bản sao lưu nhật ký sẽ chứa tất cả các giao dịch kể từ lần sao lưu nhật ký cuối cùng. Quá trình sao lưu nhật ký cũng chịu trách nhiệm xóa nhật ký và đánh dấu không gian để sử dụng lại, tức là giao dịch tiếp theo được thực hiện trong DB sẽ được ghi vào đầu nhật ký bị cắt theo kiểu vòng tròn. Sao lưu và tái sử dụng nhật ký này là những gì ngăn chặn tệp nhật ký phát triển.

Nếu bạn không quan tâm đến việc khôi phục kịp thời và muốn đơn giản hóa việc quản trị cơ sở dữ liệu. Sau đó đặt cơ sở dữ liệu thành mô hình khôi phục đơn giản và không thực hiện sao lưu t-log. SQL Server sẽ tự động cắt bớt nhật ký giao dịch sau mỗi giao dịch được cam kết. Có nghĩa là một khi giao dịch đã được cam kết với nhật ký, hồ sơ sẽ bị ghi đè bởi giao dịch tiếp theo, v.v.

Dù bằng cách nào, một khi bạn đã đưa ra một trong hai quyết định này, bạn có thể thu nhỏ tệp nhật ký xuống kích thước hợp lý hơn. Lưu ý lý tưởng là bạn muốn làm cho nó đủ lớn để nó không phát triển nhưng không lớn đến mức bạn sẽ cần phải thu nhỏ lại. Cũng lưu ý rằng bạn không thể thu nhỏ phần hoạt động của nhật ký.

Tải xuống và triển khai https://ola.hallengren.com/ giải pháp quản trị cơ sở dữ liệu để bao gồm các bản sao lưu, phân mảnh chỉ mục, thống kê và CHECKDB.

Bạn cũng có thể thấy báo cáo 'sử dụng đĩa' được trả về bằng cách nhấp chuột phải vào DB trong Object Explorer> Báo cáo> Báo cáo chuẩn> 'sử dụng đĩa' hữu ích để trả lại không gian trống trong nhật ký t.

Tôi cũng khuyên bạn nên Google tại sao điều quan trọng là giữ cho chuỗi nhật ký không bị ảnh hưởng từ quan điểm DR và ​​cách chuyển từ đầy đủ sang đơn giản phá vỡ chuỗi khiến bạn bị mất dữ liệu.


3

Thấy rằng chúng tôi thường xuyên sao lưu db đầy đủ vào nửa đêm, tôi có thể tạm thời đặt cơ sở dữ liệu vào Chế độ khôi phục đơn giản (sau khi một trong các bản sao lưu này chạy), thu nhỏ tệp nhật ký để lấy lại (hầu như tất cả) không gian và sau đó đưa nó trở lại Full Recovery với chiến lược sao lưu được đề cập ở trên?

Có, sẽ an toàn nếu bạn can thiệp vào không có giao dịch khi bạn thực hiện việc này, chẳng hạn như tải đêm muộn. Nói chung, nếu cơ sở dữ liệu phải ở chế độ khôi phục hoàn toàn, bạn muốn sao lưu T-Log thường xuyên. Điều này sẽ làm giảm vấn đề bạn gặp phải. Tôi viết "nói chung" bởi vì trong một số trường hợp, tôi đã thấy mọi người đặt cơ sở dữ liệu đầy đủ mà không biết lý do tại sao họ làm điều đó. Hãy giả sử đây không phải là trường hợp đó.

Tuy nhiên, bạn có thể muốn xem xét tại sao nhật ký có kích thước này so với kích thước cơ sở dữ liệu. Một cơ sở dữ liệu 500 MB với nhật ký 116 GB dường như không cân xứng cho một sự kiện một lần. Tôi sẽ đề nghị theo dõi những gì đang xảy ra trên cơ sở dữ liệu để xem làm thế nào nó đến kích thước đó ở nơi đầu tiên.


Theo những gì tôi hiểu, điều này đã được đánh dấu trong sáu tháng trở lên với bảo trì bằng không, do đó kích thước. Tôi sẽ làm như bạn đề xuất mặc dù và theo dõi sự phát triển của tập tin một khi tôi sắp xếp vấn đề ngay lập tức.
Kraig Walker

Thành thật mà nói, tôi muốn bỏ phiếu trả lời này.
jyao

1
Trên thực tế, không an toàn khi chuyển từ FULL sang Simple recovery và sau đó bắt đầu thực hiện thu nhỏ. Từ mô tả của Kraig Walker, đôi khi tôi đoán db này không có bất kỳ bản sao lưu t-log nào. Vì vậy, điều đầu tiên cần làm là kiểm tra chế độ khôi phục db và sao lưu tlog cuối cùng được thực hiện là gì (nếu đó không phải là chế độ khôi phục đơn giản). Nếu có một bản sao lưu tlog, thì hãy kiểm tra tại sao sao lưu tlog không xóa nhật ký bằng cách kiểm tra [log_Vuse_wait_desc] từ chế độ xem sys.database. Kinh nghiệm của tôi là nếu phần lớn tệp nhật ký trống, bạn có thể thu nhỏ trực tiếp.
jyao

@jyao Dự đoán của bạn là đúng, không có bản sao lưu nhật ký và đó là lý do tệp quá lớn.
Kraig Walker
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.