Monitorando Backup no Managed Instance (MI) Azure.

Boa tarde a todos,

como estão?

Já precisaram monitorar os backups que o próprio Managed Instance faz da instancia?

Para quem não sabe: O Banco de Dados SQL do Azure e a Instância Gerenciada de SQL do Azure utilizam a tecnologia de SQL Server para criar backups completos toda semana, backups diferenciais a cada 12-24 horas e backups de log de transações a cada 5 a 10 minutos. A frequência dos backups de logs de transações é baseada no tamanho da computação e na quantidade de atividade do banco de dados.

Para mais informações do que é o Managed instancia, segue uma série do Fabricio Lima explicando vários conceitos:

Pois bem, no errorlog da instancia conseguimos ter algumas informações.. mas nada muito específico, então validei essa informação via extend event, script a seguir da criação:

CREATE EVENT SESSION [Acompanhamento backup trace] ON SERVER 
ADD EVENT sqlserver.backup_restore_progress_trace(
    WHERE (
              [operation_type]=(0) AND (
              [trace_message] like '%100 percent%' OR 
              [trace_message] like '%BACKUP DATABASE%' OR [trace_message] like '%BACKUP LOG%'))
       )
ADD TARGET package0.ring_buffer
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=ON)

ALTER EVENT SESSION [Acompanhamento backup trace] ON SERVER
STATE = start;

Após criar basta habilitar o Watch Live Data, conforme imagem abaixo:

Assim que iniciar os backups, conforme a frequência de cada um explicada no inicio do post, podemos monitorar em tempo de execução.

Caso a imagem acima não atenda suas necessidades, podemos ver as informações do trace dessa forma.

WITH
a AS (SELECT xed = CAST(xet.target_data AS xml)
FROM sys.dm_xe_session_targets AS xet
JOIN sys.dm_xe_sessions AS xe
ON (xe.address = xet.event_session_address)
WHERE xe.name = 'Acompanhamento backup trace'),
b AS(SELECT
d.n.value('(@timestamp)[1]', 'datetime2') AS [timestamp],
ISNULL(db.name, d.n.value('(data[@name="database_name"]/value)[1]', 'varchar(200)')) AS database_name,
d.n.value('(data[@name="trace_message"]/value)[1]', 'varchar(4000)') AS trace_message
FROM a
CROSS APPLY  xed.nodes('/RingBufferTarget/event') d(n)
LEFT JOIN master.sys.databases db
ON db.physical_database_name = d.n.value('(data[@name="database_name"]/value)[1]', 'varchar(200)'))
SELECT * FROM b

E caso precise, é só persistir isso em uma tabela para acompanhamento.

Dúvidas? Só mandar ai!

Links utilizados:

https://docs.microsoft.com/en-us/azure/azure-sql/managed-instance/backup-activity-monitor?view=azuresql

https://docs.microsoft.com/pt-BR/sql/relational-databases/backup-restore/full-database-backups-sql-server?view=sql-server-ver16

Standard

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s