Esta é a maneira correta de esperar por um catálogo de banco de dados ocioso antes de restaurar um log (para envio de log do Sql Server)?

1

Eu quero ter uma instância separada do Sql Server dedicada a uma função de "relatório". Decidi preencher esse servidor via Log Shipping (já que o espelhamento não funcionará e o Availability Groups é muito caro). Eu percebi que simplesmente preciso fazer backup dos logs de transação em um intervalo, copiá-los para um local acessível pela instância de relatório e, em seguida, executar a restauração na instância de destino.

O problema que eu não encontrei uma solução amplamente aceita é que não é possível restaurar o log sem acesso exclusivo ao catálogo de destino. Desejo atualizar os dados com frequência, mas o processo de atualização deve aguardar por quaisquer relatórios / consultas ativos sendo executados pelos usuários finais; você não pode simplesmente rastrear conexões abertas por causa do pool de conexões. Portanto, a chave da minha solução é poder determinar se o catálogo do banco de dados está "ocupado". Eu criei essa consulta que lista as consultas "ativas" - aquelas que meu processo deve esperar. Alguém sabe por que isso não funcionaria, ou alguém pode confirmar que isso acontecerá? (por exemplo, as informações de bloqueio importam além do que eu já estou verificando?)

SELECT USER_NAME(user_id) AS LoginName
    , DB_NAME(database_id) AS DbCat
    , blocking_session_id AS BlockedBy
    , open_transaction_count AS OpenTrans
    , status AS ExecStatus
    , cpu_time AS CpuTime
    , logical_reads AS LogicalReads
    , *
    FROM sys.dm_exec_requests
    WHERE session_id != @@SPID
        AND database_id = DB_ID()
        AND status != 'background' --always non-client activity; not something that should block log-shipping.
        AND (open_transaction_count > 0 --open transactions always need to be waited on
            OR status != 'sleeping' --sleeping=idle, except when there's an open transaction.
        );

Essencialmente, se esta consulta retornar zero linhas, o catálogo está ocioso e eu faço a restauração. Se isso não acontecer, a restauração não acontecerá dessa vez.

    
por Granger 19.02.2014 / 22:23

2 respostas

0

A consulta funciona bem. Eu estou usando com sucesso em um trabalho de restauração. Nenhum processo foi expulso do banco de dados quando está no meio de uma consulta.

    
por 26.04.2014 / 16:03
0

Eu não tentei isso sozinho, mas acho que a funcionalidade que você precisa está embutida, se você desmarcar a caixa de seleção "Desconectar usuários no banco de dados ao restaurar backups" ao configurar o envio de logs secundário.

    
por 20.02.2014 / 12:54