Estou tentando adicionar uma sessão de Eventos Estendidos para rastrear eventos de conclusão de backup .
Estou fazendo isso como um precursor da atuação RESTORE HEADERONLY ... LOADHISTORY
no nó secundário de um Grupo de Disponibilidade com a intenção de que ambos os nós AG tenham detalhes precisos nas msdb.dbo.backupset
tabelas relacionadas. Grupos de Disponibilidade Contidos não são uma opção, pois estamos usando o SQL Server 2019. Também estamos usando Grupos de Disponibilidade Distribuídos, o que exclui AGs Contidos, portanto, mesmo que pudéssemos atualizar para o SQL Server 2022, os AGs Contidos ainda não ajudariam.
A definição do Evento Estendido é:
CREATE EVENT SESSION [backup_finished]
ON SERVER
ADD EVENT [D5149520-6282-11DE-8A39-0800200C9A66].[sqlserver].[backup_restore_progress_trace]
(
ACTION
(
[sqlserver].[client_app_name]
, [sqlserver].[client_hostname]
, [sqlserver].[database_name]
, [sqlserver].[nt_username]
, [sqlserver].[server_principal_name]
, [sqlserver].[session_id]
, [sqlserver].[sql_text]
)
WHERE
(
/* this is the database name where the BACKUP operation took place, not the database being backed up. */
[CE79811F-1A80-40E1-8F5D-7445A3F375E7].[sqlserver].[database_name] = N'maintenance'
/* this is the name of the database that was backed up */
AND [database_name] = N'<database_of_interest>'
/* 'Backup' or 'Restore' */
AND [operation_type] = N'Backup'
/*
0 -> Information of major steps in the operation
1 -> Verbose I/O related information
*/
AND [trace_level] = 0
AND
(
/* the trace_message contains one or more characters at the end */
[trace_message] LIKE N'BACKUP DATABASE finished%'
OR [trace_message] LIKE N'BACKUP LOG finished%'
)
)
)
WITH
(
MAX_MEMORY = 4096 KB
, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS
, MAX_DISPATCH_LATENCY = 30 SECONDS
, MAX_EVENT_SIZE = 0 KB
, MEMORY_PARTITION_MODE = NONE
, TRACK_CAUSALITY = OFF
, STARTUP_STATE = OFF
);
GO
[D5149520-6282-11DE-8A39-0800200C9A66]
é o GUID do módulo para sqlmin.dll
, que contém o código do [backup_restore_progress_trace]
Evento Estendido.
[CE79811F-1A80-40E1-8F5D-7445A3F375E7]
é o GUID do módulo para sqllang.dll
, que contém a maior parte do [sqlserver]
código do Evento Estendido.
Na cláusula where, tenho dois predicados para [database_name]
; o primeiro [CE79811F-1A80-40E1-8F5D-7445A3F375E7].[sqlserver].[database_name] = N'maintenance'
limita os eventos capturados a instruções que foram executadas no contexto do maintenance
banco de dados. Esse predicado é totalmente qualificado com o GUID do módulo para diferenciá-lo do [database_name]
nome do campo de evento com nome idêntico.
Os predicados [database_name]
, [operation_type]
, [trace_level]
e [trace_message]
não são totalmente qualificados porque não consigo determinar como qualificá-los totalmente.
Tentei qualificar os predicados não qualificados com todos os GUIDs de módulo que encontrei, mas nenhum deles resolveu, retornando este erro quando tento criar o Evento Estendido:
Msg 25706, Nível 16, Estado 8, Linha 62
O atributo do evento ou origem do predicado, "6D503F55-3041-4A62-BB8C-57C3CF081B7B.sqlserver.database_name", não foi encontrado.
Msg 15151, Nível 16, Estado 22, Linha 105
Não é possível alterar a sessão do evento 'backup_finished' porque ela não existe ou você não tem permissão.
A lista de módulos e seus guias estão listados nesta consulta:
SELECT
[module_guid] = QUOTENAME([dxp].module_guid)
, [package_name] = QUOTENAME([dxp].[name])
, [module_file_name] = RIGHT([dolm].[name], CHARINDEX(N'\', REVERSE([dolm].[name])) - 1)
FROM
[sys].[dm_xe_packages] [dxp]
INNER JOIN [sys].[dm_os_loaded_modules] [dolm] ON [dxp].[module_address] = [dolm].[base_address]
ORDER BY
[dxp].[name];
Resultados do meu servidor:
módulo_guid | nome do pacote | nome_do_arquivo_módulo |
---|---|---|
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [fluxo de arquivos] | sqllang.dll |
[5B2DA06D-898A-43C8-9309-39BBBE93EBBD] | [pacote0] | sqldk.dll |
[30E37A45-E152-4943-9189-2B235FCC4A6F] | [qds] | qds.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [SecAuditoria] | sqllang.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [sqlclr] | sqllang.dll |
[5B2DA06D-898A-43C8-9309-39BBBE93EBBD] | [sqlós] | sqldk.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [SQLSatélite] | sqllang.dll |
[6D503F55-3041-4A62-BB8C-57C3CF081B7B] | [servidor SQL] | sqllang.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [servidor SQL] | sqllang.dll |
[D5149520-6282-11DE-8A39-0800200C9A66] | [servidor SQL] | sqlmin.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [sqlsni] | sqllang.dll |
[CE79811F-1A80-40E1-8F5D-7445A3F375E7] | [ucs] | sqllang.dll |
[C2FE5706-A411-4F95-AFB1-5430439C8DE6] | [xesvlpkg] | svl.dll |
[DD554AF1-C3F5-4C5E-8F83-C31C49957F3F] | [XtpCompile] | hkcompile.dll |
[D0234D96-8A83-4636-A717-41459AF88D71] | [XtpEngine] | hkengine.dll |
[DE0EFEC2-B9F3-45C8-9FCA-8247CB57109C] | [XtpRuntime] | hkruntime.dll |
Alguém sabe o que devo usar para qualificar totalmente os predicados não qualificados?
Você pode qualificar os campos com o nome do evento para distingui-los.
por exemplo,
[backup_restore_progress_trace].[database_name]
versus[sqlserver].[database_name]
.Sessão completa:
Recapitular
Para simplificar a questão: Existe uma coluna nomeada em conflito
database_name
(uma é da ação global e a outra é a coluna do evento).Você quer ser determinista, então faz sentido adicionar mais qualificações. Mas usar menos realmente funciona.
A coluna de eventos não precisa ser qualificada. A coluna de ação deve ser qualificada com
sqlserver.
(mesmo que ambas vivam no mesmo pacote).Suponho que haja alguma lógica de curto-circuito que pesquisa primeiro o contexto mais próximo.
MVP
Isso funciona conforme o esperado.
Definir os filtros na GUI nos mostra a mesma coisa.
Criar scripts a partir da GUI nos daria um TSQL semelhante ao exemplo acima (embora com muito mais parênteses)
Guia do módulo
Eu testei o caminho totalmente qualificado também. A documentação CREATE SESSION menciona o opcional
module_guid
e pelos meus testes funciona:database_name
não funcionou para nenhum dos predicados - igual à sua pergunta.
Não vejo por que não deveria funcionar, mas não funciona. Eu capturei
error_reported
com umacallstack
ação e consegui isso (recuei a parte interessante)Portanto, falha durante a ligação, mas não acho que possamos obter mais informações do que isso. O único outro artigo que encontrei sobre isso foi este: Segredos, dicas e sugestões para SQL Server Extended Events