O fornecedor deseja executar o trabalho MSDB a cada 5 minutos no Business Application

15

Temos um fornecedor terceirizado tentando integrar 2 aplicativos diferentes, nos quais os dois bancos de dados residem em nossa instância do SQL Server com mais de 150 outros bancos de dados, e eles desejam criar um trabalho do MSDB para "sincronizar" os dois aplicativos diferentes a cada 5 minutos (no início eles queria executá-lo a cada minuto).

Meu palpite inicial é que eles deveriam fazer isso de alguma forma na camada de aplicativos com um trabalho agendado para Windows ou talvez até com um gatilho temido (ao qual normalmente recorremos em situações como essa).

Prefiro manter os trabalhos do MSDB reservados para as tarefas do DBA, tanto quanto possível, para reduzir a confusão e também ter uma consulta lenta do MSDB ao exibir históricos de trabalhos com trabalhos super ativos como este (que também afogam e eliminam históricos de trabalhos importantes de coisas mais importantes, como históricos de backup). Mas, novamente, talvez minhas preferências estejam erradas e eu precise abrir espaço para a camada Aplicativo no MSDB, arregaçar as mangas e corrigir problemas nos históricos de tarefas que demoram muito para carregar quando preciso reter muito mais entradas do histórico para capturar o coisas importantes, como backups (ou limpe as entradas de trabalho hiperativas).

Outro problema que tenho é que agora preciso conceder direitos de "sysadmin" a esse fornecedor, em vez de apenas "dbo", apenas em seus bancos de dados, quando eles executam suas atualizações por meio da GUI e esperam que não expliquem a instância em que minha missão é crítica Os DBs são (uma das desvantagens da consolidação).

Acho que posso colocá-los em outra instância "isolada" em que colocamos todos os fornecedores que não são bons, mas precisamos reconfigurar os aplicativos para apontar para a nova instância SQL ( suspiro infelizmente não é trivial neste caso).

O fornecedor já recusou minhas preocupações, falando sobre o quão ruim é o gatilho. Então, eu "pesquisei" um pouco sobre isso e vim vazio. Alguém viu algum link por aí com "aparência autoritária" de que essa é uma má idéia e eu posso encaminhá-la a ela? Ou devo abraçar a abordagem deles?

Eu não acredito que eu já tenha postado em um fórum sql antes de pedir ajuda, por isso espero que minha consulta esteja devidamente estruturada.

Edição: Estamos executando o SQL Server 2008 Enterprise R2 x64 SP1 (Obrigado por apontar que eu esqueci de mencionar a versão!). Hmmm, espero que eles não precisem alterar os scripts de atualização do MSDB quando formos para uma versão mais recente.

Obrigado pelo seu tempo! Rico

rzuech
fonte
Bem redigido é. Talvez você possa adicionar uma tag com a versão específica usada (e também mencionar na pergunta da edição). Não tenho certeza se existem diferenças entre o Standard e o Enterprise, mas isso pode ser relevante.
ypercubeᵀᴹ
Você sempre pode dizer ao trabalho para limpar seu próprio histórico (é possível excluir das tabelas do MSDB com bastante facilidade), para que a "consulta lenta das tabelas de histórico" não deva ser um fator. Eu ficaria mais nervoso ao deixar um processo externo lidar com isso, precisamente porque teria menos controle sobre a história. Além disso, se 5 minutos são "atuais o suficiente", por que ativar gatilhos que afetarão todas as operações DML em tempo real?
Aaron Bertrand
PS Eu duvido que qualquer um dos scripts de criação de tarefas tenha alterações entre 2008 R2 e 2012, a menos que eles realmente alterem a funcionalidade da tarefa (o que não seria específico para a versão, a menos que tirassem vantagem de algum novo recurso). O script do trabalho em si não deve mudar.
Aaron Bertrand
2
Você não precisa necessariamente dar a eles sysadminpara permitir que modifiquem os trabalhos do agente SQL - consulte msdn.microsoft.com/en-us/library/ms188283(v=sql.105).aspx
SQLFox
Obrigado pela rápida resposta a todos! Abraçarei a abordagem deles e observarei a purga, sem dar a eles sysadmin.
rzuech

Respostas:

12

OMI seu fornecedor está realmente no caminho certo.

Um trabalho da camada de aplicativo exigiria que ele refizesse muitos recursos prontos do SQL Agent (por exemplo, lógica para não executar um trabalho que já esteja em execução, crie uma solução de armazenamento de segurança e credenciais, integre os resultados do trabalho com relatório de erros e rastreamento de resultados no SQL etc etc etc etc). E, o mais importante, forneça uma solução de backup / HA / DC para o agendamento. Você não deseja que sua história de recuperação de desastre seja 'e, após concluir a recuperação do servidor em espera, crie essas 50 tarefas do agendador do NT'. Portanto, ele está certo ao se opor ao uso do agendador do sistema, que não possui nada dos recursos e capacidades do Agente.

Ele tem ainda mais razão em recuar contra os gatilhos. Substituir um trabalho periódico por um gatilho síncrono aumenta a latência da solicitação, aumenta a coesão e o acoplamento (pense no esquema alterado ...), aumenta o risco de tempo de inatividade devido a problemas de sincronização (erro de gatilho-> erro de aplicativo vs. erro de trabalho-> corrigir e tentar novamente mais tarde) , aumenta drasticamente os problemas de conflito (devido a atualizações cruzadas entre rastreados / rastreados) e tem muitos outros problemas.

A solução mais fácil é realmente um trabalho de agente e não msdbé de forma alguma reservada aos DBAs. Uma solução mais sofisticada seria usar temporizadores de conversação e ativação interna , o que teria algumas vantagens sobre os trabalhos do agente, principalmente devido à contenção (tudo está dentro do banco de dados do aplicativo, pense em espelhar os cenários de failover), mas eu posso entender totalmente se o seu fornecedor está relutante em experimentar algo que requer um conhecimento muito específico. BTW, espero que você não signifique um trabalho a cada 5 minutos por DB .

Quanto às permissões do sysadmin: o nome do jogo é assinatura de código . Você pode conceder qualquer permissão a procedimentos específicos, inspecionados e validados por você, assinando-os com seu certificado particular.

Remus Rusanu
fonte
Aqui está um link para sua resposta no Stack Overflow, que mostra um exemplo de timers de conversação e ativação interna: stackoverflow.com/a/4079716
Jon Seigel:
1
Marquei isso como a resposta aceita, que parece ser o consenso. A principal coisa que tirei de tudo isso é que os aplicativos podem usar trabalhos freqüentes do MSDB, e só precisarei usar os links aqui fornecidos para fazê-lo da maneira adequada para segurança. Todos muito perspicazes, e obrigado por seus comentários e tempo!
rzuech
2

Minha preferência pessoal seria usar gatilhos para lidar com pelo menos uma parte da sincronização. Não ligo particularmente para a sincronização programada de pesquisas, já que você precisa lidar com conflitos em potencial, dados obsoletos, impacto no desempenho da tarefa repetida etc. Se eles quiserem fazer isso de maneira tão agressiva quanto 1 a 5 minutos, acho é para mitigar conflitos e staleness, e o imediatismo de um gatilho resolveria isso.

Se tudo estiver acontecendo no mesmo servidor, você provavelmente colocará o código de sincronização dentro dos gatilhos ou fará com que os gatilhos chamem um procedimento armazenado que sincronize cada registro afetado. Se a sincronização abranger servidores, ou você desejar garantir que ter um banco de dados offline não impeça a utilização do outro banco de dados, consulte o Service Broker para lidar com atualizações assíncronas. Fiz isso para sincronizar os números das entradas de vendas com os dados do CRM entre dois servidores diferentes, permitindo que um dos servidores seja colocado offline, sem afetar o outro aplicativo. Depois que o backup é feito, o Service Broker entrega as mensagens e atualiza os dados no servidor remoto.

E realmente não há nada inerentemente ruim nos gatilhos, mas, como na maioria dos aspectos do T-SQL, é muito possível escrever código que tenha um desempenho horrível. Eu escrevi um artigo sobre as armadilhas comuns dos gatilhos, se isso ajuda.

Escrevendo gatilhos bem comportados

db2
fonte
Sim, os 2 bancos de dados estão na mesma instância do servidor. Pessoalmente, eu teria acionado gatilhos também e seus aplicativos são muito pequenos em relação a alguns dos DBs mais pesados ​​que temos lá. Mas acho que não consigo convencer o fornecedor de outra forma, já que não posso apontar para as "melhores práticas" disponíveis no que diz respeito a não usar tarefas do MSDB para sincronização de aplicativos. Além disso, respeito a opinião de Aaron um pouco, por isso não vou pressioná-las. db2 Eu li o seu link e achei bastante informativo, e o Service Broker é outra boa opção que eu nem considerei. Obrigado!
rzuech
Sim, se você estiver preocupado com a falha dos acionadores (banco de dados offline, alterações de esquema etc.), o Service Broker é o caminho a seguir, desde que você deseje (quase) sincronização instantânea.
db2 27/06