Bạn có thể khám phá tất cả các sự kiện trong chu kỳ nhật ký sự kiện hiện tại bằng cách sử dụng sp_readerrorlog
:
EXEC sys.sp_readerrorlog @p1 = 0, @p2 = 1, @p3 = N'OFFLINE';
Bạn có thể chuyển qua các giá trị @p1
nếu bạn không tìm thấy nó trong nhật ký sự kiện hiện tại. Theo mặc định, bạn sẽ có thể đọc 6 tệp nhật ký lỗi hiện tại và trước đó, vì vậy hãy sử dụng 0-6 làm đối số ở đó để quay lại càng xa càng tốt (trên hệ thống của tôi, tôi không thể nhận 0
/ NULL
tổng hợp trên tất cả các tệp nhật ký; YMMV ).
Sẽ trả lại một cái gì đó như thế này:
LogDate ProcessInfo Text
------------- ----------- ---------------------------------------------------------
yyyy-mm-dd... spid72 Setting database option OFFLINE to ON for database 'foo'.
Tất nhiên, có một cơ hội là nhật ký lỗi được điền đủ để (các) sự kiện xảy ra trước tập nhật ký lỗi hiện tại. Trong trường hợp đó, bạn đã hết may mắn. Để giữ lịch sử chạy lâu hơn trong tương lai, bạn có thể thay đổi số lượng nhật ký lỗi được lưu giữ. Trong Object Explorer, mở rộng Quản lý, bấm chuột phải vào Nhật ký máy chủ SQL và chọn Cấu hình. Ở đó bạn có thể thay đổi cài đặt tái chế tệp nhật ký lỗi, bao gồm theo kịp 99 tệp trước đó. Cũng xem câu trả lời này .
Lưu ý rằng sp_readerrorlog
không có giấy tờ và không được hỗ trợ, mặc dù nhiều người đã viết về nó . Cuối cùng, các tệp nhật ký lỗi chỉ là các tệp văn bản thuần túy, vì vậy bạn có thể viết PowerShell, CLR của riêng bạn, vv chỉ phân tích các tệp và trả về cùng một thông tin. Bạn có thể xác định vị trí các tệp nhật ký lỗi trong trường hợp này bằng cách sử dụng:
SELECT SERVERPROPERTY('ErrorLogFileName');
Các tập tin sẽ được đặt tên ERRORLOG
, ERRORLOG.1
, ERRORLOG.2
, vv Bạn có thể đi và mở các tập tin trong một trình soạn thảo văn bản cơ bản để xem cấu trúc, mặc dù tôi sẽ thận trọng về việc mở tập tin hiện tại đang sử dụng ( ERRORLOG
).