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

20.01.11

База данных - Архивирование (backup)

Если у Вас база на 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\. Естественно этот путь нужно тоже поменять.

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

См. также

Архивирование (backup) Системный администратор Платформа 1С v7.7 Абонемент ($m)

Эти далекие 2000е... мы архивировали как могли. Пример командного файла для windows -- архивациия базы SQL 1С:Предприятие 7.7 средствами платформы.

1 стартмани

30.08.2024    356    0    kot1c    0    

0

Архивирование (backup) Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Программа, написанная на Delphi7 для автоматизации сохранения БД.

1 стартмани

02.01.2017    15612    12    mt111    21    

0

Архивирование (backup) Системный администратор Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Всё началось с того, что я лентяй. Когда пришел на работу в первый раз, мне сообщили, что уже лет 10 делают сохранение  базы каждый день в конце рабочего дня. Из этого вытекает, что  если кто-то решит подтянуть свои хвосты, то мне приходится сидеть на работе тоже. Честно, мягко говоря, меня это не особо радовало... Порывшись на просторах инета, было принято решение сделать "автосохранялку". Как уже говорилось, "Я ЛЕНИВЫЙ", поэтому мне было попросту лень ставить всякие утилиты и программки, реализовал все штатными средствами.

1 стартмани

02.12.2016    16582    5    mt111    9    

3

Архивирование (backup) Программист Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Абонемент ($m)

Архив файловой базы 1С можно сделать за 30 секунд. Делаем предварительные настройки.

1 стартмани

09.12.2014    39882    12    denisk37    72    

27

Архивирование (backup) Системный администратор Программист Бухгалтер Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Абонемент ($m)

Бэкапер-1С: версия 1.5.0. Появилась гибкая система удаления старых копий! А также: автоматический поиск баз, архивация документов, встроенный архиватор 7-Zip, целостность создаваемых копий, шифрование, отправка отчетов на почту и каталогизация. Ещё никогда резервное копирование не делалось так просто.

1 стартмани

16.05.2013    75284    638    alexey.karmanov    181    

84

Архивирование (backup) Системный администратор Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Архивация баз данных 1С 7.7 (при небольшом редактировании и версий 1С 8.х) средствами командной строки и архиватора Izarc Архивация каталога базы данных при размещении на Linux (smb-сервере к примеру) средствами linux.

1 стартмани

11.05.2012    14156    16    slava81    5    

3

Архивирование (backup) Системный администратор OpenConf Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Обработка при помощи WinRar архивирует каталог с БД.

1 стартмани

06.04.2012    13018    34    l2d808    20    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. cool.vlad4 2 20.01.11 13:05 Сейчас в теме
Для пользователей было бы не плохо написать обработку по формированию этого скрипта...сделать это несложно, чтобы вручную не ковырятся в скрипте.
2. Ivon 676 23.01.11 15:35 Сейчас в теме
(1). Тут и так сделано максимально удобно.
3. cool.vlad4 2 23.01.11 23:25 Сейчас в теме
(2) В чем же максимальная удобность, когда надо вручную менять пути и имя базы? Раз уж это ресурс для 1С, то можно сделать обработку для этого, где вводится эта информация и создается ваш скрипт, либо сделать для этого скрипт vbs, можно на powershell - но это был совет, если не хотите не делайте. Благо скрипт не сложный и можно сделать ручками.
4. Ivon 676 24.01.11 10:00 Сейчас в теме
(3). Согласен, что обработку сделать не сложно. Скрипт сам по себе сложнее.
kalyuzhnyyp; +1 Ответить
5. Valerich 1636 26.01.11 16:33 Сейчас в теме
Гм... странный подход....
Переменные объявил всякие разные, а основные, которые напрашиваются сами собой нет.

Логичнее всего было в первую очередь объявить переменные, которые содержат имя базы и путь к бэкапам, чтобы их менять в начале скрипта. а не лазить по всему скрипту в поиске мест, требующих внимания...

Но тут, очевидно, об удобстве использования никто не задумывался - "Мы не ищем легких путей...(С)"
Famza; bserge; +2 Ответить
6. Ivon 676 10.10.13 11:34 Сейчас в теме
Ну вот...
Дал, разжевал, а им все плохо. Вот до чего люди ленивы стали...
kalyuzhnyyp; +1 Ответить
7. bahcha8 31.01.14 16:20 Сейчас в теме
Спасибо, за скрипт. Кому не нравится - пусть поменяют пути на переменные, это не сложно. Восстанавливать разностные копии действительно не очень удобно. Но вот мы делаем два бэкапа полных - днем и ночью, а днем до и осле обеда разностные. И восстанавливать из разностных приходится крайне редка. Чаще всего достаточно дневной или ночной копии. Если не делать долго (например два дня) полный бэкам - размер разностных не отличается от полного.
8. Ivon 676 31.01.14 16:52 Сейчас в теме
(7) bahcha8, Мы делаем в воскресенье полный, в остальные дни разностный. Можно так же не возиться с бекапами, а настроить репликацию БД на другой сервер. У меня такое было настроено, пока резервный сервер не забрали под разработку, репликации сваливались с одного сервера на другой раз в 15 минут. Таким образом у меня всегда была копия базы с разницей не более 15 минут.
10. strange2007 144 05.09.16 21:18 Сейчас в теме
(8) пардон, что не по теме. Просто вопрос: восстанавливать из такого бакапа пробовали? В смысле платформа 1С такую репликацию воспринимает нормально? Ведь транзакция СУБД <> транзакции 1С. Мы и с репликациями и с этими супер бакапами возились, которые каждые 10 минут работали, один фиг то одно отвалится, то другое, а порой база вообще рассыпалась.
11. Ivon 676 06.09.16 10:38 Сейчас в теме
(10) strange2007, Да, у меня все отлично работало. Полный бэкап делался в ночь с субботы на воскресенье, в остальные дни делался разностный бэкап. Рабочий сервер у нас не ложился ни разу, но бэкапы использовались активно, чтобы обновить тестовые базы у разработчиков. Все восстановления из бэкапов были успешные. Репликация работала не очень, время от времени что-то отваливалось и приходилось запускать ее заново, хотя первые пол годика реплики через каждые 15 минут без проблем ходили с рабочего на стэндбай. В итоге через 2 года решили репликацию отключить, оставить только резервирование.
9. lesenoklenok 35 14.02.14 10:45 Сейчас в теме
Оставьте свое сообщение