SQL Server를 운영하다보면

 

SQL Server has encountered 3 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file [D:\************.MDF] in database [**********] (18). The OS file handle is 0x00000CE8. The offset of the latest long I/O is: 0x000066f16b0000

 

이런 에러가 발생하는 경우가 있다.

 

최악의 경험으로는 백업하다 에러가 발생해서 Database가 내려간 경험도 있다.

( 새벽에 IDC로 뛰어 갔다... ㅠㅠ )

 

여러 가지 원인이 있는 것 같다. 검색을 해보면 하드웨어 문제라는 것이 대부분의 글들이다.

 

아래의 URL은 해당 에러에 대한 글이다.

 

http://blogs.msdn.com/b/sqlsakthi/archive/2011/02/09/troubleshooting-sql-server-i-o-requests-taking-longer-than-15-seconds-i-o-stalls-amp-disk-latency.aspx

 

내가 해결(?)한 방법으로는

 

1. SAN 의 컨트롤러 교체 - 하나의 컨트롤러가 문제가 발생하고 교체를 하였지만 나머지 하나도 문제가 발생해서 교체 후에 해당 15 I/O가 사라졌다.

2. Table Scan이 발생하는 쿼리 수정 - Perfmon으로 해당 DB의 Table Scan을 측정하자 평균 400 ~ 500 정도가 발생.

임시테이블 사용을 제외한 쿼리의 Table Scan을 Seek로 변경. 200 ~ 300 로 내려가자 15 I/O가 사라짐.

 

경험의 결론은 하드웨어 문제 일수도 있고 디스크 사용량이 너무 많은 경우도 문제가 발생할 수 있다.

 

대륙간에 Replication이 설정되는 상황에서 큰 테이블의 경우 Replication의 snapshot이 네트워크의 느린 처리나 끊김으로 안넘어가는 경우 발생 할 수 있다.

 

그런 경우 아래의 방법을 사용하면 해결 될 것 같다.

 

http://blogs.msdn.com/b/repltalk/archive/2010/03/07/tips-to-improve-performance-when-applying-snapshot-in-transactional-replication.aspx

MDF 파일을 attach 할 때 SSMS의 UI 를 이용하면 원래 Database 이름이 나타난다.

이걸 어떻게 알아 낼까?

이 자료 찾는 것이 쉽지 않았다

 

dbcc checkprimaryfile(N'[filepath]' , 2) 

 

첫번째 parameter : 파일 path

두번째 parameter :

아래 샘플 확인

 

두번째 parameter : 0

 

 

두번째 parameter : 1

 2012 에서는 에러가 난다. ㅡㅡ

 

두번째 parameter : 2

 

 

두번째 parameter : 3

 

 

 

DB에서 특정 시간이 되면 Table lock도 없는데

시스템의 쿼리들이 멈추는 현상이 발생을 했다.

 

멈추는 순간에 wait info를 분석해 보니

DBMIRROR_DBM_EVENT wait가 발생을 했다.

 

DB Mirror 구성을 High Safety 로 구성되어 있었다.

 

DB 구성시 High Safety 로 구성을 하면 이런 현상이 발생 할 수 도 있다.

미러 상태 확인 쿼리

 

 SELECT
DB_NAME(database_id) As DatabaseName,
CASE WHEN mirroring_guid IS NOT NULL THEN 'Mirroring is On' ELSE 'No mirror configured' END AS IsMirrorOn,
mirroring_state_desc,
CASE WHEN mirroring_safety_level=1 THEN 'High Performance' WHEN mirroring_safety_level=2 THEN 'High Safety' ELSE NULL END AS MirrorSafety,
mirroring_role_desc,
mirroring_partner_instance AS MirrorServer
FROM sys.database_mirroring
GO

 

 

Service 계정에 정말 정책이 잘 적용되었는지 아래의 방법으로 확인 할 수 있다.

SSMS 에 접속하여 해당 명령어를 실행하면 된다.

물론 command를 서비스 계정으로 실행해도 된다.

EXEC sp_configure 'show advanced options', 1

GO

RECONFIGURE WITH OVERRIDE

GO

 

 

EXEC sp_configure 'xp_cmdshell', 1

GO

RECONFIGURE WITH OVERRIDE

GO

 

EXEC xp_cmdshell 'whoami'

GO

 

EXEC xp_cmdshell 'whoami /priv'

GO

 

EXEC sp_configure 'xp_cmdshell', 0

GO

RECONFIGURE WITH OVERRIDE

GO

 

 

EXEC sp_configure 'show advanced options', 0

GO

RECONFIGURE WITH OVERRIDE

GO

 

결과

+ Recent posts