Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Стратегия тестового восстановления из full backup  [new]
Начинучка
Guest
Всем привет!

Есть боевой сервер с MS SQL Server 2012. Один инстанс. В нём пара десятков баз. Ежесуточно делается full backup всех баз + несколько раз в час резервируется журнал транзакций (настроены соответствующие планы обслуживания в SSMS) .
Есть тестовый сервер. По конфигурации аналогичен боевому. Единственное, что на нем выключен SQL Server Agent, во избежании отработки джобов и т.д.
Есть задача - проверять возможность восстановления из созданных боевым сервером резервных копий баз.
Планируется, что процесс восстановления будет выглядеть примерно следующим образом:
На тестовом сервере настраивается "линкованный сервер" к боевому. Пишется скрипт, который по линку будет получать с боевого сервера информацию о существующих базах, последнем успешном полном бэкапе по каждой из баз, список файлов, попавших в резервную копию. По полученной информации скрипт будет формировать команды восстановления для каждой базы и выполнять полученные команды. В качестве среды исполнения команд решено использовать sqlcmd. Весь процесс будет выполнятся на тестовом сервере из шедулера операционной системы.

Собственно вопрос - правильно ли выбраны стратегия и инструменты реализации? Возможно ли будет обойтись только sqlcmd или потребуется что-то ещё?
20 сен 17, 07:50    [20807804]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
aleks222
Guest
Что-то слишком просто все у вас.
Надо отключить службу MS SQL и бякапы восстанавливать врукопашную. На бумагу.

ЗЫ. Херней не майтесь.
20 сен 17, 08:55    [20807863]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
Начинучка
Guest
aleks222
Что-то слишком просто все у вас.
А как надо?
20 сен 17, 09:01    [20807866]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
А вариант RESTORE VERIFYONLY чем плох?
20 сен 17, 09:08    [20807872]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Начинучка,

Backup'ы проверять надо, но делать это каждый день я думаю не стоит.
Включить на 2 сервере агента и просто добавить джоб на restore что мешает?
20 сен 17, 09:22    [20807891]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
Начинучка
Guest
AlanDenton,

Нужна тестовая, регулярно актуализируемая копия базы для проверки разного рода манипуляций как с самой базой, так и с хранящимися в ней данными...
20 сен 17, 09:24    [20807896]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
Начинучка
Guest
aleksrov,

возможно, отсутствие знаний/понимания того, как в планировщик теста передать имена файлов резервных копий с боевого...
файл бэкапа каждый день имеет новое имя, которое формируется по принципу "имя базы" + "дата формирования" + "случайное число"
20 сен 17, 09:32    [20807907]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
КусокАналитика
Guest
Начинучка
aleksrov,

возможно, отсутствие знаний/понимания того, как в планировщик теста передать имена файлов резервных копий с боевого...
файл бэкапа каждый день имеет новое имя, которое формируется по принципу "имя базы" + "дата формирования" + "случайное число"


А что Вам мешает это имя "имя базы" + "дата формирования" + "случайное число" записывать в таблицу спец. БД на тестовом сервере вместе с указанием места расположения файла резервной копии и именем БД?
20 сен 17, 09:35    [20807913]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
Начинучка
Guest
КусокАналитика,

зачем это писать в таблицу, если сервер сам такое пишет при создании резервной копии?
Данную информацию получаю запросом:

select top 1 with ties 
       database_name
     , backup_set_id
     , name
     , physical_device_name
from   msdb.dbo.backupset as t1 
join   msdb.dbo.backupmediafamily as t2
  on   t2.media_set_id = t1.media_set_id
 and   t1.type = 'D' 
order by row_number() 
                      over(
                            partition by t1.database_name
                                order by t1.backup_start_date desc
                          )
20 сен 17, 09:40    [20807927]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
КусокАналитика
Guest
Начинучка, тогда Вы сможете натравить на эту табличку агент тестового сервера и восстановить все базы, а так же оставить отметку о времени операции и успехе/ неудаче.

Впрочем Вам виднее:)
20 сен 17, 09:59    [20807971]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
Начинучка
Guest
КусокАналитика,

про "натравите" подробнее можно? Как и где на уровне агента это будет настраиваться? Собственно, вопрос же потому и возник - что не ясно было, как это сделать штатными средствами агента. Поэтому начал изобретать свой "кривенький" велосипед на треугольных колесах...
20 сен 17, 10:18    [20808038]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
Начинучка,

У меня сделано так:
В агенте настроен джоб, который для каждой БД
- по линку получает путь к последнему полному бэкапу @BackupPath.
- восстанавливает БД - RESTORE DATABASE [Db] FROM DISK = @BackupPath
- Заодно делает CHECKDB, чтобы не делать это на боевом сервере
INSERT INTO Errors(...) EXEC('DBCC CHECKDB([Db]) WITH ALL_ERRORMSGS, TABLERESULTS, NO_INFOMSGS)
- Удаляет восстановленную БД - DROP DATABASE [Db]

- Другой джоб утром высылает отчет по CHECKDB (содержимое таблицы Errors) и всем джобам, завершившимся ошибкой, из sysjobhistory.
20 сен 17, 11:35    [20808382]     Ответить | Цитировать Сообщить модератору
 Re: Стратегия тестового восстановления из full backup  [new]
odisssey
Member

Откуда:
Сообщений: 64
у меня когда то была задача, восстанавливать каждую ночь тестовую базу.
тогда реализовал вот так, создав джоб на тестовом сервере и предварительно слинковав сервера.

+
предварительно нужно связать сервера.
USE [master]
GO
EXEC master.dbo.sp_addlinkedserver
@server = N'SRVR002\ACCTG',
@srvproduct=N'SQL Server' ;
GO


declare @DBName varchar(128), @PathBD varchar(500), @PathFull varchar(500), @PathDiff varchar(500)
declare @fileBD varchar(128), @FileBDLog varchar(128)
declare @full varchar(128), @diff varchar(128)
declare @pathBakNameFull varchar(500), @pathBakNameDiff varchar(500)
declare @FileName1 varchar(128), @FileName2 varchar(128)

-- @FileNameLog varchar(4000), @FileName1 varchar(4000), @FileName2 varchar(4000), @FileNameb varchar(4000), @FileNameb2 varchar(4000)

--прописываем пути и имя новой базы
select @DBName = 'название базы которая поднимается' --имя базы

select @PathBD = 'F:\mssql' -- путь где база будет жить
select @PathFull = 'F:\BackUp\10.10.254.10\full' -- путь к фулл бэкапу
select @PathDiff = 'F:\BackUp\10.10.254.10' -- путь к дифф бэкапу

select @fileBD = 'родительская база' -- логическое имя базы в бэкапе, как узнать командой?
select @FileBDLog = @fileBD +'_log'

-- имя файла бэкапа, узнаем из msdb прилинкованного сервера
select @full = (select SUBSTRING (physical_device_name, charindex ('база',physical_device_name),28) from [10.10.254.10].msdb.dbo.backupmediafamily where media_set_id = (select max (media_set_id) from [10.10.254.10].msdb.dbo.backupmediafamily where physical_device_name like '%база%full%'))
select @diff = (select SUBSTRING (physical_device_name, charindex ('база',physical_device_name),28) from [10.10.254.10].msdb.dbo.backupmediafamily where media_set_id = (select max (media_set_id) from [10.10.254.10].msdb.dbo.backupmediafamily where physical_device_name like '%база%diff%'))


select @pathBakNameFull = @PathFull + @full -- путь к бэкапу + имя последнего фулл бэкапа
select @pathBakNameDiff = @PathDiff + @diff --путь к бэкапу + имя последнего дифф бэкапа

select @FileName1 = @PathBD + @DBName + '.mdf' --формируем новое имя файлп мдф
select @FileName2 = @PathBD + @DBName + '_log.ldf' --формируем новое имя файлп лдф
use mis_actual
alter database 'название базы которая поднимается' set single_user with rollback immediate

use master
if (select max (media_set_id) from [10.10.254.10].msdb.dbo.backupmediafamily where physical_device_name like '%mis%full%') >
(select max (media_set_id) from [10.10.254.10].msdb.dbo.backupmediafamily where physical_device_name like '%mis%diff%')
begin
use master
restore database @DBName
from disk = @pathBakNameFull
with
move @fileBD to @FileName1,
move @FileBDLog to @FileName2,
stats=1, recovery, replace
end
else
begin
use master
restore database @DBName
from disk = @pathBakNameFull
with
move @fileBD to @FileName1,
move @FileBDLog to @FileName2,
stats=1, norecovery, replace

restore database @DBName
from disk = @pathBakNameDiff
with
move @fileBD to @FileName1,
move @FileBDLog to @FileName2,
stats=1, recovery, replace
end


понимаю что не оптимальное решение, есть минус когда добавляется вайл в БД, приходится дорабатывать этот скрипт, но тем не менее отработал он пару лет без ошибок и вмешательств, все хотел доработать но руки так и не дошли и надобность отпала.
20 сен 17, 17:37    [20809761]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить