Estou tentando determinar a melhor maneira de distribuir scripts SQL para centenas de servidores distribuídos. Eu tenho um pacote SSIS lento e um processo OSQL/BATCH muito rápido.
Estou em um projeto em que temos várias centenas de servidores de banco de dados implantados no campo. Preciso ser capaz de consultar rotineiramente os servidores e/ou aplicar scripts de atualização de banco de dados.
Quando tínhamos apenas 20 servidores, criei um pacote SSIS para obter uma lista de servidores e processá-los um por vez. O pacote SSIS funciona muito bem, tem toneladas de tratamento e registro de erros, etc. Ele é capaz de capturar conjuntos de resultados de cada servidor e armazená-los em um local central para análise posterior. Devido à maneira como o construí, no entanto, ele processa cada servidor em série. 20 servidores leva cerca de 10 minutos para processar. Estou em um ponto em que esse método é simplesmente muito lento.
Antes de investir mais tempo reescrevendo este pacote para gerar outros pacotes (um para cada servidor), esperava obter alguns conselhos de outras pessoas que enfrentaram uma situação semelhante.
Você usaria o SSIS dessa maneira ou mudaria para powershell ou até mesmo OSQL?
Quase como uma brincadeira, vasculhei meus arquivos e retirei um processo em lote que escrevi há 12 anos para aplicar scripts em servidores remotos. Fiz alguns ajustes (mudei para OSQL) e ele roda incrivelmente rápido. Posso processar 100 servidores em menos de 20 segundos. Eu o inicio de uma máquina com Windows 7, que não engasga com tantas janelas de comando sendo abertas.
A desvantagem da solução OSQL/BATCH é que o arquivo em lote é codificado com nomes de servidor e senhas. Mas é tão rápido que continuarei a usá-lo até encontrar uma solução melhor.
Pacote SSIS - O pacote SSIS atual faz o seguinte: - conecta-se a um servidor central - recupera uma lista de servidores que precisam ser consultados - usando um contêiner forloop, conecta-se a cada servidor (em série) e executa a consulta - se a consulta retorna um conjunto de resultados, esta informação é capturada e armazenada no servidor central - o servidor central é atualizado para refletir o sucesso/falha de cada servidor - todos os erros são registrados no servidor central
Eu adaptaria sua solução rápida para algo mais facilmente extensível, como PowerShell .
Seria trivial fazer com que o PS lesse um arquivo de texto para obter uma lista de servidores a serem executados e outro arquivo ou arquivos para quais comandos executar.
Você também pode adicionar tratamento de erros e coisas do tipo em seu lote SSIS e fazer com que ele seja acionado de forma assíncrona para que funcione em todos os seus servidores simultaneamente.
O PowerShell é a resposta, mas se você já tem um script extremamente rápido, pode considerar o uso da funcionalidade Central Management Server . Ele não faz muitas coisas que tenho tentado fazer ultimamente, mas faz uma coisa super bem que atinge muitos servidores rapidamente com o script se você já estiver no SSMS.