SQL Server 데이터베이스의 상태를 모니터링하는 데 가장 적합한 쿼리는 무엇입니까?


20

데이터베이스 상태에 대한 중요한 정보를 얻기 위해 쿼리를 실행할 수 있기를 원합니다. 즉, 쿼리가 데이터베이스의 상태가 양호한 지 여부를 알 수 있기를 원합니다.

이것은이 검사를 위해 상속받은 쿼리입니다.

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency],
  has_dbaccess(name) AS [HasDBAccess]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
   OR (has_dbaccess(name) = 0)

해당 쿼리가 결과를 반환하면 데이터베이스가 의심 스럽거나 잠재적으로 나쁜 상태 인 것으로 가정합니다.

더 좋은 방법이 있습니까?


보다 심층적 인 상태 점검에 관심이있는 경우 교착 상태, 디스크 IO 대기 시간, 초당 트랜잭션 등과 같은보다 중요한 WMI 성능 카운터를 모니터링 할 수 있습니다.

@RQDC-SQL Server 2008을 사용하는 경우 Management Datawarehouse를보다 쉽게 ​​설정할 수 있습니다.

@brett rogers- '최고 / 좋은'은 주관적인 질문으로 간주됩니다. 다시 문구를 입력하십시오.
CoderHawk

문구를 바꾸는 방법에 대한 제안을 보내 주시면 기꺼이 고려하겠습니다. "모범 사례"에서와 같이 "모범"을 찾고 있습니다. 나에게 그것을 표현하는 적절한 방법 인 것 같습니다.
brett rogers

@ brett-잘! 당신이 '최고'를 얻는 것을 기쁘게 생각합니다 :)
CoderHawk

답변:


12

SQL 2005+를 사용 중이고 DB가 "ONLINE"상태가 아닌 DB 이름 만 반환하려면 다음을 사용하십시오.

SELECT
    name
FROM sys.databases
WHERE state != 0;

미러링 또는 로그 전달에 참여하는 데이터베이스는 온라인 상태가 아니거나 정기적으로 상태가 변경 될 수 있습니다. sys.databases DMV에 대한 자세한 내용은 다음 설명서를 참조하십시오. http://msdn.microsoft.com/en-us/library/ms178534.aspx


9

나는 새로운 사용하십시오 하려면 sys.databases 되지는 sydatabases을 하지만 그렇지 않으면이 OK입니다

적어도 DATABASEPROPERTY 호출이 필요하지 않습니다.

SELECT
   name, state_desc
FROM
   sys.databases
WHERE
   state IN (4, 5, 6)

2

db 상태를 확인한 방법은 다음과 같이 DATABASEPROPERTYEX (database, property) 함수를 사용하는 것입니다.

DATABASEPROPERTYEX ( 'AdventureWorks', 'Status')를 선택하십시오.

상태는 매우 자명하다 :

온라인 = 데이터베이스를 쿼리에 사용할 수 있습니다.

OFFLINE = 데이터베이스가 명시 적으로 오프라인 상태가되었습니다.

RESTORING = 데이터베이스를 복원 중입니다.

RECOVERING = 데이터베이스가 복구 중이며 아직 쿼리 준비가되지 않았습니다.

SUSPECT = 데이터베이스가 복구되지 않았습니다.

EMERGENCY = 데이터베이스가 긴급한 읽기 전용 상태입니다. 액세스는 sysadmin 회원으로 제한됩니다

올라 Hallengren의 블로그 (AN SQL MVP), 데이터베이스 무결성을 확인하기 위해 자신의 도구에서, 나는 그가 DB 상태를 조회하는 뷰 sys.database_recovery_status를 사용하고 발견했다. db에이보기에 행이 있으면 라이브 상태이며 발로 차거나 그렇지 않으면 오프라인 상태입니다.

추신 : 사용하는 데이터베이스 속성 기능은 향후 버전에서 제거 될 예정이므로 데이터베이스 속성이이를 대체합니다.


나는 asker가 특정 복구 정보를 찾고 있다고 생각하지 않고 일반적인 건강 검사를 요청합니다. sys.databases는 오프라인 데이터베이스를 볼 수있는 충분한 권한으로 실행되고 있다고 가정하면 db 상태를 찾는 것이 더 좋습니다. sys.databases에 없으면 삭제되거나 분리됩니다.
AndrewSQL

1
예, 무슨 말인지 알지만, 데이터베이스가 액세스 가능한 것으로 처리하고 그렇지 않은 경우 데이터베이스를 액세스 할 수없는 것으로 처리 한 것보다 db가 해당보기에 있는지 확인하고 있다고 대답했습니다. 그래서 이것은 두 번째 점검이 될 수 있습니다 :). 나에게, 좋은 시작 상태 점검은 해당 db에서 하나의 작은 테이블을 쿼리하는 것이며 해당 쿼리가 데이터를 반환하면 db가 처음에 액세스 가능한 것으로 간주합니다.
Marian

2

특정 조건에 대한 쿼리 대신 state_desc <> 'ONLINE'인 sys.databases에서 무엇이든 살펴 보겠습니다. 또한 수행하려는 작업에 따라 has_dbaccess가 잘못된 긍정을 던질 수 있습니다.


0

난이게 좋아:

SELECT name, state_desc 
FROM   sys.databases

name                            state_desc
------------------------------- ----------------
master                          ONLINE
tempdb                          ONLINE
model                           ONLINE
msdb                            ONLINE
TestTableDatabase2005           RECOVERY_PENDING
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.