Khi cơ sở dữ liệu được ngoại tuyến


9

Tôi đang cố gắng tìm ra cách để biết khi nào một vài cơ sở dữ liệu sql của tôi đã bị ngoại tuyến.

Tôi đã kiểm tra nhật ký nhưng không thể tìm thấy bất kỳ thông tin nào như vậy và hơn nữa không có dấu vết mặc định nào được bật.

Tôi chỉ có một thông tin rằng trước đó có một DBA đã ngoại tuyến, nhưng không có email hoặc một giao tiếp bằng văn bản như vậy ..

Chúng ta có thể tìm thấy một thông tin về điều này?

xin đề nghị, cảm ơn!

Câu trả lời:


11

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ị @p1nế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/ NULLtổ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_readerrorlogkhô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).


Xin chào Aaron, tôi không có đăng nhập ngoại tuyến trong nhật ký Máy chủ SQL của mình. Có bất kỳ cài đặt để cho chúng tôi bắt thay đổi này? Cảm ơn,
DBALUKE HUANG

@DBALUKEHUANG Không, nếu nó xảy ra trước mục nhập sớm nhất trong nhật ký lỗi và không có gì trong trình xem sự kiện , bạn đã hết may mắn.
Aaron Bertrand

Có Aaron, không có gì liên quan đến ngoại tuyến trong nhật ký SQL Server. Đối với trực tuyến, nó có nhật ký ... Tôi chỉ tự hỏi liệu có bất kỳ cài đặt đặc biệt nào để cho SQL Server nắm bắt điều này không?
DBALUKE HUANG

@DBALUKEHUANG Chỉ cần nhớ rằng một cơ sở dữ liệu có thể ngoại tuyến vì những lý do khác hơn là ai đó thiết lập nó một cách rõ ràng OFFLINE. Có offlinethực sự là tình trạng trong sys.databases?
Aaron Bertrand

4

Nếu cơ sở dữ liệu được đặt ngoại tuyến:

I E

alter database AdventureWorks2012
set offline;
go

Bạn thực sự sẽ thấy một thông báo đã ghi trong nhật ký lỗi SQL Server:

Đặt tùy chọn cơ sở dữ liệu OFFLINE thành BẬT cho cơ sở dữ liệu 'AdventureWorks2012'.

select *
from sys.messages
where language_id = 1033
and text like '%setting database option%for database%';

ID tin nhắn 5084 nếu bạn đang theo dõi thay đổi tùy chọn cơ sở dữ liệu.

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.