Gostaria de configurar um SQL Server secundário e espelhado para fins de relatório.
O banco de dados de relatórios não precisa estar atualizado com o primário e geralmente pode ficar atrás do banco de dados de produção em até um dia, talvez mais.
Estou tentando conseguir algo assim há alguns dias com pouco ou nenhum sucesso, usando o SQL-Server-First-Responder-Kit de Brent Ozar e o sp_AllNightLog
.
Geralmente, o primeiro backup FULL é restaurado e, às vezes, até alguns backups de LOG, mas depois fica travado, para de ver os backups mais recentes e fica em loop, sem fazer nada.
A solução de problemas parece indicar para mim que sp_AllNightLog @Restore = 1
ocorre um erro ao restaurar um banco de dados, ou talvez um arquivo LOG, registra isso na restore_worker
tabela, o que impede que todas as outras restaurações sejam emitidas. Se eu limpar o error_number
(-1) e last_error_date
da tabela, ele começa a restaurar novamente mas depois dá um erro novamente porque começa a restaurar o backup COMPLETO ao invés de continuar com as restaurações de LOG. Em seguida, ele registra a data do erro e o número do erro e para novamente.
Outra questão é que sp_DatabaseRestore
(do Kit) deixa os bancos de dados restaurados, seja de uma restauração FULL ou restauração de LOG, em um estado não recuperado (sempre usa NORECOVERY
e nunca executa RESTORE WITH RECOVERY
). Isso torna os bancos de dados ilegíveis no secundário, a menos que eu mude sp_AllNightLog
de using @RunRecovery = 0
para @RunRecovery = 1
:
-- Line 1302
IF @restore_full = 0
BEGIN
IF @Debug = 1 RAISERROR ('Starting Log only restores', 0, 1) WITH NOWAIT;
EXEC master.dbo.sp_DatabaseRestore @Database = @database,
@BackupPathFull = @restore_path_full,
@BackupPathLog = @restore_path_log,
@ContinueLogs = 1,
@RunRecovery = 1,
@OnlyLogsAfter = @only_logs_after,
@Debug = @Debug
END
IF @restore_full = 1
BEGIN
IF @Debug = 1 RAISERROR ('Starting first Full restore from: ', 0, 1) WITH NOWAIT;
IF @Debug = 1 RAISERROR (@restore_path_full, 0, 1) WITH NOWAIT;
EXEC master.dbo.sp_DatabaseRestore @Database = @database,
@BackupPathFull = @restore_path_full,
@BackupPathLog = @restore_path_log,
@ContinueLogs = 0,
@RunRecovery = 1,
@Debug = @Debug
END
Preciso excluir o histórico de backup antes de configurar isso? Alguém já escreveu um guia completo para configurar algo assim? Eu realmente não consigo encontrar um mesmo enquanto pesquisando no Google.
Qualquer ajuda é muito apreciada!