Uzyskiwanie dostępu do informacji diagnostycznych klienta natywnego programu SQL Server w dzienniku zdarzeń rozszerzonych
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Ważny
klienta natywnego programu SQL Server (SNAC) nie jest dostarczany z:
- SQL Server 2022 (16.x) i nowsze wersje
- SQL Server Management Studio 19 i nowsze wersje
Program SQL Server Native Client (SQLNCLI lub SQLNCLI11) oraz starszy dostawca microsoft OLE DB dla programu SQL Server (SQLOLEDB) nie są zalecane w przypadku tworzenia nowych aplikacji.
W przypadku nowych projektów użyj jednego z następujących czynników:
- sterownik Microsoft ODBC dla programu SQL Server
- sterownik Microsoft OLE DB dla programu SQL Server
W przypadku programu SQLNCLI, który jest dostarczany jako składnik aparatu bazy danych programu SQL Server (wersje 2012–2019), zobacz ten wyjątek cyklu wsparcia .
Począwszy od programu SQL Server 2012 (11.x), funkcja SQL Server Native Client i śledzenie dostępu do danych (śledzenie dostępu do danych) zostały zaktualizowane, aby ułatwić uzyskiwanie informacji diagnostycznych o błędach połączeń z buforu pierścienia łączności i informacji o wydajności aplikacji z dziennika zdarzeń rozszerzonych.
Aby uzyskać informacje o odczytywaniu dziennika zdarzeń rozszerzonych, zobacz Wyświetl dane sesji zdarzeń.
Nuta
Ta funkcja jest przeznaczona tylko do rozwiązywania problemów i celów diagnostycznych i może nie być odpowiednia do celów inspekcji lub zabezpieczeń.
Uwagi
W przypadku operacji połączenia klient natywny programu SQL Server wyśle identyfikator połączenia klienta. Jeśli połączenie zakończy się niepowodzeniem, możesz uzyskać dostęp do buforu pierścienia łączności (rozwiązywanie problemów z łącznością w programie SQL Server 2008 za pomocą buforu pierścienia łączności) i znaleźć pole ClientConnectionID i uzyskać informacje diagnostyczne dotyczące błędu połączenia. Identyfikatory połączeń klienta są rejestrowane w buforze pierścienia tylko wtedy, gdy wystąpi błąd. (Jeśli połączenie nie powiedzie się przed wysłaniem pakietu przedlogin, identyfikator połączenia klienta nie zostanie wygenerowany). Identyfikator połączenia klienta to 16-bajtowy identyfikator GUID. Identyfikator połączenia klienta można również znaleźć w obiekcie docelowym danych wyjściowych zdarzeń rozszerzonych, jeśli akcja client_connection_id zostanie dodana do zdarzeń w sesji zdarzeń rozszerzonych. Możesz włączyć śledzenie dostępu do danych i ponownie uruchomić polecenie połączenia i obserwować ClientConnectionID pole w ślad dostępu do danych dla operacji zakończonej niepowodzeniem, jeśli potrzebujesz dalszej pomocy diagnostycznej.
Jeśli używasz odBC w kliencie natywnym programu SQL Server i połączenie powiedzie się, możesz uzyskać identyfikator połączenia klienta przy użyciu atrybutu SQL_COPT_SS_CLIENT_CONNECTION_ID z SQLGetConnectAttr.
Klient natywny programu SQL Server wysyła również identyfikator działania specyficzny dla wątku. Identyfikator działania jest przechwytywany w sesjach zdarzeń rozszerzonych, jeśli sesje są uruchamiane z włączoną opcją TRACK_CAUSALITY. W przypadku problemów z wydajnością aktywnego połączenia można pobrać identyfikator działania ze śledzenia dostępu do danych klienta (pole ActivityID), a następnie zlokalizować identyfikator działania w danych wyjściowych zdarzeń rozszerzonych. Identyfikator działania w zdarzeniach rozszerzonych to 16-bajtowy identyfikator GUID (nie taki sam jak identyfikator GUID dla identyfikatora połączenia klienta) dołączony z cztero bajtowym numerem sekwencji. Numer sekwencji reprezentuje kolejność żądania w wątku i wskazuje względną kolejność instrukcji wsadowych i RPC dla wątku. ActivityID jest opcjonalnie wysyłany dla instrukcji wsadowych SQL i żądań RPC, gdy śledzenie dostępu do danych jest włączone, a 18 bit w słowie konfiguracji śledzenia dostępu do danych jest włączony.
Poniżej znajduje się przykład, który używa Transact-SQL do uruchomienia sesji zdarzeń rozszerzonych, która będzie przechowywana w buforze pierścieniowym i będzie rejestrować identyfikator działania wysyłany z klienta w operacjach RPC i wsadowych.
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)
Plik kontrolny
W programie SQL Server 2012 (11.x) zawartość pliku sterowania natywnego klienta programu SQL Server (ctrl.guid.snac11) to:
{8B98D3F2-3CC6-0B9C-6651-9649CCE5C752} 0x00000000 0 MSDADIAG.ETW
{2DA81B52-908E-7DB6-EF81-76856BB47C4F} 0xFFFFFFFF 0 SQLNCLI11.1
Plik MOF
W programie SQL Server 2012 (11.x) zawartość pliku mof klienta natywnego programu SQL Server to:
#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;
};