Temos uma tarefa diária de sobrescrever vários bancos de dados de desenvolvimento usando backups dos bancos de dados de produção associados. Os backups são produzidos por planos de manutenção no servidor de produção e depois transferidos para o servidor de desenvolvimento por FTP. Todos os dias, executamos uma instrução SQL semelhante a esta para sobrescrever cada banco de dados:
RESTORE DATABASE [Database1]
FROM DISK = N'D:\path\to\Database1_backup_2015_02_05_190004_7401803.bak'
WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10
GO
Cada vez que executamos isso, temos que substituir o nome do arquivo pelo arquivo correto mais recente. Eu gostaria de automatizar isso de alguma forma para minimizar a chance de erro do operador. O problema é que não podemos controlar o nome do .bak
arquivo (embora o formato seja consistente - nome do banco de dados, data, hora e qualquer que seja o número de sete dígitos), e a pasta geralmente contém vários dias de backups.
Como todos os detalhes dos backups são mantidos no banco de dados msdb, você deve apenas extrair o nome do arquivo de backup do servidor de origem.
Você pode criar um servidor vinculado a partir do seu servidor de desenvolvimento para acessar o banco de dados msdb do servidor de produção. Ou você pode usar OPENQUERY para consultar os mesmos dados. (OPENQUERY pode ser mais rápido, pois a consulta está realmente sendo executada no servidor de produção.)
Por exemplo:
Isso mostra a execução de um procedimento armazenado sem parâmetros, o que pode se adequar ao seu plano de restauração diário.
Se você pesquisar "gerar automaticamente scripts de restauração do banco de dados do servidor SQL", encontrará muitos scripts. Um exemplo de Paul Brewer é
sp_RestoreGene
que você pode usar como está ou como base para criar seu próprioExecDailyRestore
procedimento armazenado.https://paulbrewer.wordpress.com/sp_restoregene/
Aqui estão os parâmetros suportados por sp_restoregene:
E aqui está um script de amostra:
Os DBAs aqui provavelmente vão jogar ovos e tomates em mim, mas vou jogar isso de qualquer maneira.
Você pode usar um trabalho de serviços de integração para executar isso. Primeiro, crie um loop para cada arquivo e configure-o para ser executado para cada arquivo nesse local.
Mapeie o resultado para uma variável.
Em seguida, crie e execute a tarefa SQL dentro do contêiner.
Feito isso, você poderá criar um trabalho SQL e agendá-lo adequadamente. Não estou dizendo que esta é a melhor solução, mas deve funcionar.
Isso deve resolver o problema para você exatamente. Obviamente, se você estiver restaurando para um banco de dados em que o mdf/ldf tenha nomes diferentes, talvez seja necessário ajustar ligeiramente o comando de restauração final. Isso funciona apenas listando os backups em um diretório e escolhendo com base em um padrão. Acho que poderia ter feito do padrão uma variável também, mas você entendeu.