Мы используем встроенную в SQLServer отправку журналов для входа на наш сайт аварийного восстановления, но раз в месяц проводим тест аварийного восстановления, который требует, чтобы мы перемещались между нашими Live и BAckup серверами. Мы запускаем несколько (30) баз данных в системе, поэтому ручное резервное копирование окончательных журналов и отключение заданий - это слишком много работы и занимает слишком много времени. У меня нет проблем, я напишу его сценарий, но у меня возникли проблемы с ним, всегда жалуясь, что окончательное логирование слишком рано для применения, хотя я не экспортирую окончательный журнал, пока не переведу базу данных в режим без восстановления. Во-первых, нет ли у кого-нибудь простого и надежного способа сделать это? Я локализовался в каком-то стороннем программном обеспечении (я думаю, что это было redgate sqlbackup), но в этой ситуации это тоже не облегчило задачу. То, что я хочу сделать, это в основном запустить сценарий (серию хранимых процедур), чтобы привести меня к аварийному восстановлению, и запустить другой, чтобы вернуть меня без потери данных. На данный момент мои скрипты очень упрощены, но вот они:
2 сервера Primary Paris Secondary ParisT
StartAgentJobAndWait - это сценарий, написанный кем-то другим (ta), и он просто проверяет, закончились ли задания, или завершает их, если они никогда не заканчиваются.
На данный момент я просто использую тестовую базу данных под названием BOB2, но если я смогу заставить ее работать, я передам базу данных и имена вакансий.
из Парижа:
/* Disable backup job */
exec msdb..sp_update_job @job_name = 'LSBackup_BOB2', @enabled = 0
exec PARIST.msdb..sp_update_job @job_name = 'LSCopy_PARIS_BOB2', @enabled = 0
exec PARIST.msdb..sp_update_job @job_name = 'LSRestore_PARIS_BOB2', @enabled = 0
exec PARIST.master.dbo.DRStage2
ParisT DRStage2
DECLARE @RetValue varchar (10)
EXEC @RetValue = StartAgentJobAndWait LSCopy_PARIS_BOB2 , 2
SELECT ReturnValue=@RetValue
if @RetValue = 1
begin
print 'The Copy Task completed Succesffuly'
END
ELSE
print 'The Copy task failed, This may or may not be a problem, check restore state of database'
SELECT @RetValue = 0
EXEC @RetValue = StartAgentJobAndWait LSRestore_PARIS_BOB2 , 2
SELECT ReturnValue=@RetValue
if @RetValue = 1
begin
print 'The Restore Task completed Succesffuly'
END
ELSE
print 'The Copy task failed, This may or may not be a problem, check restore state of database'
exec PARIS.master.dbo.DRStage3
/* Do the last logship and move it to Trumpington */
BACKUP log "BOB2"
to disk='c:\drlogshipping\BOB2.bak'
with compression, norecovery
EXEC xp_cmdshell 'copy c:\drlogshipping \\192.168.7.11\drlogshipping'
EXEC PARIST.master.dbo.DRTransferFinish
AS
BEGIN
restore database "BOB2"
from disk='c:\drlogshipping\bob2.bak'
with recovery
Чтобы дать вам представление о создании сценариев автоматической генерации для восстановления, вот сценарий, который я написал для автоматизации создания сценария восстановления для конкретной базы данных.
http://tenbulls.co.uk/2011/02/08/t-sql-tuesday-015-%E2%80%93-spend-time-now-to-save-time-later/
Обратите внимание, что многое, если не все, что вы хотите сделать, можно сделать с помощью сочетания Powershell, SMO и T-SQL. Это просто зависит от того, лучше ли потратить время на полное или частичное решение. Лично я бы выбрал частичное, поэтому вам всегда нужно, чтобы при выполнении подобных задач использовался ручной элемент.
С уважением, Марк.
Является ли это иногда хоть работать? Мне приходилось делать то же самое для тестирования DR, но я не сталкивался с этим. То, что вы делаете, должно технически работать.
Проверяли ли вы, выполняется ли в настоящее время задание LSBackup в этой базе данных, прежде чем запускать задание LSCopy? Похоже, вам просто не хватает самой последней резервной копии до резервного копирования без восстановления. Работа LSCopy может просто не получить все.
Попробуйте снова запустить LSCopy после того, как вы запустите резервное копирование без восстановления, к тому времени планировщик завершит все резервные копии, и все будет в порядке. Кроме того, если вы установите задание LSCopy для сохранения вывода в файл, я считаю, что вы увидите ошибку, если есть резервная копия журнала, которую нельзя скопировать (например, если она используется, потому что резервная копия в настоящее время записывает в нее ).