2013-07-16 94 views
73

Tôi có một quy trình chạy dài giữ mở giao dịch trong toàn bộ thời gian.Nhật ký giao dịch cho cơ sở dữ liệu đầy đủ

Tôi không kiểm soát cách thực hiện điều này.

Vì giao dịch được mở trong toàn bộ thời gian, khi nhật ký giao dịch đầy, SQL Server không thể tăng kích cỡ tệp nhật ký.

Vì vậy, quá trình không thành công với lỗi "The transaction log for database 'xxx' is full".

Tôi đã cố ngăn chặn điều này bằng cách tăng kích thước tệp nhật ký giao dịch trong thuộc tính cơ sở dữ liệu, nhưng tôi gặp lỗi tương tự.

Không chắc mình nên thử gì tiếp theo. Quá trình này diễn ra trong vài giờ nên không dễ chơi thử và lỗi.

Bất kỳ ý tưởng nào?

Nếu có ai quan tâm, quá trình này là một nhập tổ chức trong Microsoft Dynamics CRM 4.0.

Có rất nhiều không gian đĩa, chúng tôi có các bản ghi trong chế độ khai thác gỗ đơn giản và đã sao lưu các bản ghi trước khi đá ra khỏi quá trình này.

- = - = - = - = - CẬP NHẬT - = - = - = - = -

Cảm ơn tất cả các ý kiến ​​cho đến nay. Sau đây là những gì khiến tôi tin rằng các bản ghi sẽ không phát triển do các giao dịch mở:

Tôi nhận được lỗi sau ...

Import Organization (Name=xxx, Id=560d04e7-98ed-e211-9759-0050569d6d39) failed with Exception: 
System.Data.SqlClient.SqlException: The transaction log for database 'xxx' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases 

Vì vậy, theo lời khuyên mà tôi đã đi đến "log_reuse_wait_desc column in sys.databases" và nó giữ giá trị "ACTIVE_TRANSACTION".

Theo Microsoft: http://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx

Điều đó có nghĩa như sau:

Một giao dịch đang hoạt động (tất cả các mô hình phục hồi). • Giao dịch dài hạn có thể tồn tại khi bắt đầu sao lưu nhật ký. Trong trường hợp này, giải phóng không gian có thể yêu cầu một bản sao lưu nhật ký khác. Để biết thêm thông tin, hãy xem "Giao dịch hoạt động trong thời gian dài", sau này trong chủ đề này.

• Giao dịch được hoãn lại (SQL Server 2005 Enterprise Edition và các phiên bản mới hơn). Giao dịch hoãn lại là một giao dịch hoạt động hiệu quả mà tính năng rollback bị chặn do một số tài nguyên không có sẵn. Để biết thông tin về nguyên nhân của giao dịch hoãn lại và cách chuyển chúng ra khỏi trạng thái hoãn lại, hãy xem Giao dịch hoãn lại.

Tôi đã hiểu nhầm điều gì đó chưa?

- = - = - = - CẬP NHẬT 2 - = - = - = -

Chỉ cần khởi quá trình với kích thước tập tin đăng nhập ban đầu thiết lập để 30GB. Quá trình này sẽ mất vài giờ để hoàn thành.

- = - = - = - Chung kết CẬP NHẬT - = - = - = -

Vấn đề này đã thực sự gây ra bởi các tập tin log tiêu thụ tất cả các không gian đĩa có sẵn.Trong nỗ lực cuối cùng tôi giải phóng 120GB và nó vẫn sử dụng tất cả và cuối cùng thất bại.

Tôi đã không nhận ra điều này đã xảy ra trước đây bởi vì khi quá trình chạy qua đêm, nó đã quay trở lại thất bại. Lần này tôi đã có thể kiểm tra kích thước tệp nhật ký trước khi khôi phục.

Cảm ơn tất cả những gì bạn đã nhập.

+0

lại "... và đã sao lưu nhật ký" .... nếu cơ sở dữ liệu ở chế độ Đơn giản, bạn sẽ không thể sao lưu nhật ký, sao lưu nhật ký không áp dụng cho chế độ đơn giản. Có đăng nhập hàng loạt không? – SqlACID

+1

Tôi đã sao lưu toàn bộ DB và thu nhỏ nó khiến cho Nhật ký thu hẹp lại thành 1MB. Sau đó tôi tăng kích thước của tệp nhật ký lên 20GB ban đầu và bây giờ là 30 GB. – Jimbo

Trả lời

12

Đây có phải là tập lệnh một lần hoặc công việc thường xuyên xảy ra không?

Trước đây, đối với các dự án đặc biệt tạm thời yêu cầu nhiều không gian cho tệp nhật ký, tôi đã tạo tệp nhật ký thứ hai và làm cho tệp đó trở nên lớn. Khi dự án hoàn tất, chúng tôi sẽ xóa tệp nhật ký bổ sung.

+0

Tôi sẽ không nói đó là công việc một lần, nhưng hiếm khi chúng tôi phải làm điều đó. Tôi không tạo tệp nhật ký thứ hai, nhưng tôi đã tăng kích thước ban đầu của tệp nhật ký hiện tại lên 30GB. Trong lần chạy cuối cùng của tôi, nó đã được đặt thành 20 GB và nó vẫn không thành công. – Jimbo

+0

Sẽ có một tập tin nhật ký thứ hai tốt hơn bằng cách nào đó hơn là có một lớn nhất cho rằng tôi chỉ có một ổ đĩa để làm việc với? – Jimbo

+0

Khi tôi nhớ lại, tệp bổ sung chủ yếu cho phép chúng tôi truy cập ổ đĩa lớn hơn. –

11

Bạn có Bật Tự động phát hiệnTăng trưởng tệp không hạn chế cả hai được bật cho tệp nhật ký không? Bạn có thể chỉnh sửa những thông tin này qua SSMS trong "Thuộc tính cơ sở dữ liệu> Tệp"

+0

Có. Nó được thiết lập để autogrow 10%, không hạn chế. Vấn đề là autogrow sẽ không hoạt động trong khi có một giao dịch mở. – Jimbo

+1

Bạn có biết giao dịch sẽ lớn như thế nào không? cố gắng đặt kích thước Nhật ký giao dịch lớn hơn ước tính đó, dù sao nếu phân bổ đĩa không phải là vấn đề, hãy phân bổ ở không gian bắt đầu nhiều, cho dữ liệu và đăng nhập. Nó cải thiện hiệu suất. Không phải chúng tôi * autogrow bởi 10% *, làm điều đó bởi một số vài GB, do đó, hiệu suất sẽ là đủ tốt. –

+3

Máy chủ SQL * sẽ * tự động ghi nhật ký trong một giao dịch nếu cần thêm dung lượng để hoàn tất giao dịch đó. –

8

Đây là phương pháp tiếp cận trường học cũ, nhưng nếu bạn đang thực hiện cập nhật lặp lại hoặc chèn hoạt động trong SQL, điều gì đó chạy trong một thời gian dài, đó là một ý tưởng tốt để định kỳ (theo chương trình) gọi là "điểm kiểm tra". Gọi "checkpoint" làm cho SQL ghi vào đĩa tất cả những thay đổi chỉ dành cho bộ nhớ (các trang bẩn, chúng được gọi) và các mục được lưu trữ trong nhật ký giao dịch. Điều này có tác dụng làm sạch ra nhật ký giao dịch của bạn theo định kỳ, do đó ngăn ngừa các vấn đề như mô tả.

+1

Thật không may là tôi không thể kiểm soát quá trình thực hiện. Dynamics CRM là một ứng dụng của Microsoft và quá trình nhập tổ chức là một phần của ứng dụng đó. – Jimbo

+1

hiểu ... chúc may mắn – Brian

1

Sau đây sẽ cắt bớt nhật ký.

USE [yourdbname] 
GO 

-- TRUNCATE TRANSACTION LOG -- 
DBCC SHRINKFILE(yourdbname_log, 1) 
BACKUP LOG yourdbname WITH TRUNCATE_ONLY 
DBCC SHRINKFILE(yourdbname_log, 1) 
GO 

-- CHECK DATABASE HEALTH -- 
ALTER FUNCTION [dbo].[checker]() RETURNS int AS BEGIN RETURN 0 END 
GO 
+4

Hey Pinal, chức năng này đã bị xóa hoàn toàn khỏi SQL Server 2008 trở lên: http://www.brentozar.com/archive/2009/08/backup-log-with-truncate-only-in -sql-server-2008/ – Conor

+3

Với các phiên bản sau, hãy thử BACKUP LOG ĐẾN DISK = N'NUL: ' – HansLindgren

25

Tôi đã gặp lỗi này một lần và kết thúc là ổ đĩa cứng của máy chủ hết dung lượng đĩa.

63

Để khắc phục vấn đề này, thay đổi Phục hồi mẫu để Simple sau đó Shrink tập tin Log

1. Database Properties> Tùy chọn> Phục hồi Model> Simple

2. Công việc cơ sở dữ liệu> Thu hẹp> Tệp> Nhật ký

Xong.

Sau đó kiểm tra kích thước tập tin log db của bạn tại Database Properties> Files> Cơ sở dữ liệu Files> Đường dẫn

Để kiểm tra đầy đủ log sql server: mở Viewer Log File tại SSMS> Cơ sở dữ liệu> Quản lý> SQL Server Logs > Hiện tại

+7

Không, điều đó không khắc phục được sự cố. Vấn đề là tệp nhật ký đã phát triển trong một quá trình chạy dài cho đến khi nó hết dung lượng đĩa. Nó đã được sửa chữa bằng cách tạm thời di chuyển tệp nhật ký sang một ổ đĩa khác có sẵn 1TB không gian. Bạn không thể thu nhỏ tệp nhật ký trong khi quá trình đang chạy dài - đang giữ một giao dịch đang mở - đang diễn ra. Quá trình đó hoàn toàn chịu trách nhiệm cho sự phát triển của tệp. – Jimbo

+0

Như @Jimbo đã nói, điều này không khắc phục được vấn đề của OP. Nó có thể giải phóng một số không gian hiện chưa sử dụng, nhưng ngay sau khi một giao dịch dài đang chạy trở lại, không gian sẽ được đưa lên một lần nữa (và có thể thất bại ngay cả trước đó) – Marcel

+0

Hoàn hảo! Cảm ơn! –

1

Nếu mô hình khôi phục cơ sở dữ liệu của bạn đầy và bạn không có kế hoạch bảo trì sao lưu nhật ký, bạn sẽ gặp lỗi này vì nhật ký giao dịch trở nên đầy đủ do LOG_BACKUP.

Điều này sẽ ngăn chặn bất kỳ hành động nào trên cơ sở dữ liệu này (ví dụ: thu nhỏ) và Công cụ cơ sở dữ liệu SQL Server sẽ tăng lỗi 9002.

Để khắc phục hành vi này, tôi khuyên bạn nên kiểm tra điều này The transaction log for database ‘SharePoint_Config’ is full due to LOG_BACKUP để hiển thị các bước chi tiết để giải quyết vấn đề.