Скрипт удобного восстановления базы MSSQL при дифференциальном резервировании

Публикация № 80477

Администрирование - Архивирование (backup)

23
Если у Вас база на MSSQL и Вы пользуетесь разностными бекапами, то, скорее всего, столкнулись с тем, что поднять базу/копию базы из имеющихся резервных файлов  не столь удобно, как того хотелось бы.
В этой статье приведен скрипт по теме.

Для начала немного истории.

Так сложилось, что в моей компании резервированием баз 1С, которые у нас лежат на MSSQL, занимаюсь лично я. Вначале, пока база еще не так сильно разрослась, все было просто: каждую ночь выгружался dt-файл. Этот путь не понравился по 3-м причинам: долго восстанавливается, при бекапе в базе не должно быть пользователей, на диске временного каталога должно быть место, расное файлу бекапа.

Время шло, база росла, было решено делать бекап базы MSSQL. Но банный файл оказался гораздо больше файла dt. Пришлось засесть за интернет и узнать как реализовать и потом реализовать на практике разностный бекап. Но так как у нас есть команда программистов, то для каждого программиста выделили еще и по паре тестовых баз.

Через некоторое время мне надоело заниматься копипастом постоянно изменяя в скрипте имя базы и добавляя блоки для каждого файла разностного бекапа в итоге было потрачено немного времени и получился следующий скрипт:


--Здесь ничего не трогаем
declare @SQLString nvarchar(4000), @TableName nvarchar(16)
declare @t table (fname NVARCHAR(50))
DECLARE @counter INT, @backupfile NVARCHAR(50)
SET @counter = 0

---------------------------------------------------------------------------
-- Здесь изменяем имя базы

set @TableName = N'Ins_3_3'
-- Здесь вставляем необходимое количество бекапов.

-- Вначале полный, потом все разностные
INSERT INTO @t (fname) VALUES ('2011-01-16_ins.bak')
INSERT INTO @t (fname) VALUES ('2011-01-17_ins_diff.bak')
INSERT INTO @t (fname) VALUES ('2011-01-18_ins_diff.bak')

---------------------------------------------------------------------------
--Далее ничего не трогаем

DECLARE bkf CURSOR LOCAL FAST_FORWARD FOR SELECT * FROM @t;

OPEN bkf;
FETCH bkf INTO @backupfile;
WHILE @@FETCH_STATUS=0
BEGIN
IF @counter = 0
BEGIN
set @SQLString = N'restore Database ' + @TableName + '
FROM DISK = N''N:\Backup1C\' + @backupfile + '''
with NORECOVERY,
move ''Ins81'' to N''F:\SQLBases\Data\' + @TableName + '.mdf'',
move ''Ins81_log'' to N''F:\SQLBases\Data\' + @TableName + '_Log.ldf'',
STATS = 5'
END
ELSE
BEGIN
set @SQLString = N'restore Database ' + @TableName + '
FROM DISK = N''N:\Backup1C\' + @backupfile + '''
with NORECOVERY'
END
exec sp_executesql @SQLString
set @counter = @counter + 1
FETCH bkf INTO @backupfile;
END;
CLOSE bkf;
DEALLOCATE bkf;
set @SQLString = N'restore Database ' + @TableName + '
with RECOVERY'
exec sp_executesql @SQLString


Надеюсь, скрипт будет полезным.

Новая база будет создаваться по пути F:\SQLBases\Data\. Исправьте путь согласно своему серверу.

Бекапы у меня лежать в N:\Backup1C\. Естественно этот путь нужно тоже поменять.

Если что-то не понятно - спрашиваем.

23

См. также

Специальные предложения