확장 이벤트 로그에서 SQL Server Native Client 진단 정보에 액세스
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
Important
SNAC(SQL Server Native Client)는 다음과 함께 제공되지 않습니다.
- SQL Server 2022(16.x) 이상 버전
- SQL Server Management Studio 19 이상 버전
SQL Server Native Client(SQLNCLI 또는 SQLNCLI11)와 레거시 Microsoft OLE DB Provider for SQL Server(SQLOLEDB)는 새로운 응용 프로그램 개발에 권장되지 않습니다.
새 프로젝트의 경우 다음 드라이버 중 하나를 사용합니다.
SQL Server 데이터베이스 엔진(버전 2012부터 2019까지)의 구성 요소로 제공되는 SQLNCLI의 경우 이 수명 주기 예외 지원을 참조하세요.
SQL Server 2012(11.x)부터 SQL Server Native Client 및 데이터 액세스 추적(데이터 액세스 추적)이 업데이트되어 확장 이벤트 로그에서 연결 링 버퍼 및 애플리케이션 성능 정보에서 연결 오류에 대한 진단 정보를 쉽게 얻을 수 있습니다.
확장 이벤트 로그를 읽는 방법에 대한 자세한 내용은 이벤트 세션 데이터 보기를 참조하세요.
참고 항목
이 기능은 문제 해결 및 진단 목적으로만 사용되며 감사 또는 보안 용도로는 적합하지 않을 수 있습니다.
설명
연결 작업의 경우 SQL Server Native Client는 클라이언트 연결 ID를 보냅니다. 연결이 실패하는 경우 연결 링 버퍼에 액세스할 수 있으며(연결 링 버퍼가 있는 SQL Server 2008의 연결 문제 해결) ClientConnectionID 필드를 찾아서 연결 실패에 대한 진단 정보를 얻을 수 있습니다. 클라이언트 연결 ID는 오류가 발생한 경우에만 링 버퍼에 로그인됩니다. 사전 로그인 패킷을 전송하기 전에 연결에 실패할 경우 클라이언트 연결 ID가 생성되지 않습니다. 클라이언트 연결 ID는 16바이트 GUID입니다. 확장 이벤트 세션의 이벤트에 client_connection_id 작업이 추가된 경우 확장 이벤트 출력 대상에서 클라이언트 연결 ID를 찾을 수도 있습니다. 추가 진단 지원이 필요한 경우 데이터 액세스 추적을 사용하도록 설정하고 연결 명령을 다시 실행하고 실패한 작업에 대한 데이터 액세스 추적의 ClientConnectionID 필드를 관찰할 수 있습니다.
SQL Server Native Client에서 ODBC를 사용하고 연결이 성공하면 SQLGetConnectAttr에서 SQL_COPT_SS_CLIENT_CONNECTION_ID 특성을 사용하여 클라이언트 연결 ID를 가져올 수 있습니다.
또한 SQL Server Native Client는 스레드별 작업 ID를 보냅니다. TRACK_CAUSAILITY 옵션이 설정된 상태로 세션이 시작된 경우 확장 이벤트 세션에 동작 ID가 캡처됩니다. 활성 연결의 성능 문제의 경우 클라이언트의 데이터 액세스 추적(ActivityID 필드)에서 활동 ID를 가져오고 확장 이벤트 출력에서 활동 ID를 찾을 수 있습니다. 확장 이벤트의 활동 ID는 4 바이트 시퀀스 번호가 추가된 16 바이트 GUID(클라이언트 연결 ID의 GUID와 동일하지 않음)입니다. 시퀀스 번호는 스레드 내의 요청 순서를 나타내며 스레드에서 일괄 처리 및 RPC 문의 상대적인 순서를 나타냅니다. 데이터 액세스 추적을 사용하도록 설정하고 데이터 액세스 추적 구성 단어의 18번째 비트가 켜진 경우 ActivityID 는 선택적으로 SQL 일괄 처리 문 및 RPC 요청에 대해 전송됩니다.
다음은 Transact-SQL을 사용하여 링 버퍼에 저장되고 RPC 및 일괄 처리 작업 시 클라이언트에서 전송된 작업 ID를 기록하는 확장 이벤트 세션을 시작하는 샘플입니다.
create event session MySession on server
add event connectivity_ring_buffer_recorded,
add event sql_statement_starting (action (client_connection_id)),
add event sql_statement_completed (action (client_connection_id)),
add event rpc_starting (action (client_connection_id)),
add event rpc_completed (action (client_connection_id))
add target ring_buffer with (track_causality=on)
제어 파일
SQL Server 2012(11.x)에서 SQL Server Native Client 컨트롤 파일(ctrl.guid.snac11)의 내용은 다음과 같습니다.
{8B98D3F2-3CC6-0B9C-6651-9649CCE5C752} 0x00000000 0 MSDADIAG.ETW
{2DA81B52-908E-7DB6-EF81-76856BB47C4F} 0xFFFFFFFF 0 SQLNCLI11.1
MOF 파일
SQL Server 2012(11.x)에서 SQL Server Native Client mof 파일의 내용은 다음과 같습니다.
#pragma classflags("forceupdate")
#pragma namespace ("\\\\.\\Root\\WMI")
/////////////////////////////////////////////////////////////////////////////
//
// MSDADIAG.ETW
[
dynamic: ToInstance,
Description("MSDADIAG.ETW"),
Guid("{8B98D3F2-3CC6-0B9C-6651-9649CCE5C752}"),
locale("MS\\0x409")
]
class Bid2Etw_MSDADIAG_ETW : EventTrace
{
};
[
dynamic: ToInstance,
Description("MSDADIAG.ETW"),
Guid("{8B98D3F3-3CC6-0B9C-6651-9649CCE5C752}"),
DisplayName("msdadiag"),
locale("MS\\0x409")
]
class Bid2Etw_MSDADIAG_ETW_Trace : Bid2Etw_MSDADIAG_ETW
{
};
[
dynamic: ToInstance,
Description("MSDADIAG.ETW formatted output (A)"),
EventType(17),
EventTypeName("TextA"),
locale("MS\\0x409")
]
class Bid2Etw_MSDADIAG_ETW_Trace_TextA : Bid2Etw_MSDADIAG_ETW_Trace
{
[
WmiDataId(1),
Description("Module ID"),
read
]
uint32 ModID;
[
WmiDataId(2),
Description("Text StringA"),
extension("RString"),
read
]
object msgStr;
};
[
dynamic: ToInstance,
Description("MSDADIAG.ETW formatted output (W)"),
EventType(18),
EventTypeName("TextW"),
locale("MS\\0x409")
]
class Bid2Etw_MSDADIAG_ETW_Trace_TextW : Bid2Etw_MSDADIAG_ETW_Trace
{
[
WmiDataId(1),
Description("Module ID"),
read
]
uint32 ModID;
[
WmiDataId(2),
Description("Text StringW"),
extension("RWString"),
read
]
object msgStr;
};
/////////////////////////////////////////////////////////////////////////////
//
// SQLNCLI11.1
[
dynamic: ToInstance,
Description("SQLNCLI11.1"),
Guid("{2DA81B52-908E-7DB6-EF81-76856BB47C4F}"),
locale("MS\\0x409")
]
class Bid2Etw_SQLNCLI11_1 : EventTrace
{
};
[
dynamic: ToInstance,
Description("SQLNCLI11.1"),
Guid("{2DA81B53-908E-7DB6-EF81-76856BB47C4F}"),
DisplayName("SQLNCLI11.1"),
locale("MS\\0x409")
]
class Bid2Etw_SQLNCLI11_1_Trace : Bid2Etw_SQLNCLI11_1
{
};
[
dynamic: ToInstance,
Description("SQLNCLI11.1 formatted output (A)"),
EventType(17),
EventTypeName("TextA"),
locale("MS\\0x409")
]
class Bid2Etw_SQLNCLI11_1_Trace_TextA : Bid2Etw_SQLNCLI11_1_Trace
{
[
WmiDataId(1),
Description("Module ID"),
read
]
uint32 ModID;
[
WmiDataId(2),
Description("Text StringA"),
extension("RString"),
read
]
object msgStr;
};
[
dynamic: ToInstance,
Description("SQLNCLI11.1 formatted output (W)"),
EventType(18),
EventTypeName("TextW"),
locale("MS\\0x409")
]
class Bid2Etw_SQLNCLI11_1_Trace_TextW : Bid2Etw_SQLNCLI11_1_Trace
{
[
WmiDataId(1),
Description("Module ID"),
read
]
uint32 ModID;
[
WmiDataId(2),
Description("Text StringW"),
extension("RWString"),
read
]
object msgStr;
};