SQL 연결 18056 오류
- Version : SQL Server 2005, 2008, 2008R2, 2012
SQL Server를 운영하면서 가장 많이 받는 질문 중 하나가 SQL Server 연결 실패에 관한 내용이다. SQL Server는 연결 실패 또는 오류에 따라 다양한 메시지를 나타내며 이 메시지에 따라 처리 방법이 매우 다양하다.
이전 포스트에서 SQL Server 인증 실패 시 반환되는 클라이언트메시지 정보에 대해서 다루었다.
- 관련 링크 : http://sqlmvp.kr/140186042807
이번 시간에는 클라이언트가 세션을 다시 시작할 수 없는 18056 오류와 어떤 흐름으로 제어되는지 알아보자.
이 포스트는 CSS SQL Server Engineer 블로그에 게시된 내용으로 필자가 읽고 이해한 내용을 정리하였으며 번역의 오류나 기술적 오류가 있음을 미리 알려둔다. 자세한 내용은 원문을 참고 하길 바란다.
아래 그림은 일반적인 18056 오류의 발생에 대한 흐름을 표현 하였다. 응용 프로그램은 풀을 이용하여 연결을 재사용한다. 다음 명령을 실행 할 때 문제가 발생하면 클라이언트 드라이버는 TDS 헤더에 리셋 비트를 설정한다. 예제에서는 ODBC의 SQLExecDirect를 사용하였다.
- 명령어는 SQL Server에서 수신된 작업자에 할당하고 처리를 시작한다. 리셋 비트가 있는 경우 sp_reset_connection 로직이 호출 된다.
- RPC를 추적하는 경우 시작 및 논리적 연결 끊기 이벤트가 생성된다.
- 로그인이 다시 실행되고 있는지 암호가 만료되지 않았는지, 데이터베이스는 존재하는지, 사용자는 데이터베이스에 권한을 가지고 있는지 검증이 이루어진다.
- 클라이언트 명시적 취소(SQL Cancel) 또는 쿼리 시간 만료가 클라이언트 드라이버에서 SQL Server로 전송 한다. SQL Server는 정보를 읽고 스타트 시간을 캡처하고 취소요청을 통보하고 중지 한다.
- 이러한 모든 검사 로직은 쿼리 취소(행동)가 도착하는지 확인한다. 그리고 다시 로그인 실행 처리가 중단되는 경우 18056이 보고되고 처리가 중지 된다.
- 주의 이벤트는 항상 완료 이벤트 후에 생성된다. 이벤트는 시간을 기록하고 표시 한다..
다음 코드는 위의 그림과 같은 패턴을 생성한다. 풀링 된 연결을 사용하지 않은 경우 재설정 활동이 일어나지 않아 쿼리 자체가 중단될 것이다.
dim cn dim rs set cn = CreateObject("ADODB.Connection") set rs = CreateObject("ADODB.Recordset") for i = 1 to 1000 cn.Open "Provider=SQLNCLI10;Integrated Security=SSPI;Data Source=SQL2K8Server; initial catalog =whatever;" rs.ActiveConnection = cn rs.CursorLocation = 2 ' 48 = adAsyncExecute + adAsyncFetch rs.Open "select * from whatever", cn, 0, 1, 48 cn.Cancel cn.Close next |
내부적으로 3617 오류로 발생하고 SQL Server 오류 핸들러에 의해 요청이 실행 중지가 된다. Sys.dm_os_ring_buffers에서 3617오류를 볼 수 있으며 추적 이벤트에서 확인 할 수 있다.
<Record id= "1715" type="RING_BUFFER_EXCEPTION" time="12558630"><Exception><Task address= 0x11B4D1B88</Task><Error>3617</Error><Severity>25</Severity><State>23</State><UserDefined>0</UserDefined></Exception><Stack |
[참고자료]
- SQL Server 인증 실패 시 반환되는 클라이언트메시지 정보 :
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp