Циклический бэкап по дням недели

12.12.19

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

В интернете часто можно встретить статьи о том, как написать скрипты для автоматического архивирования баз MSSQL. Методика, в них предлагаемая создает новый архив каждый новый день. Более подробно об этом можно почитать в http://outcoldman.ru/ru/blog/show/127 Я предлагаю незначительное усовершенствование скриптов и генерацию архивов по дням недели с циклической их перезаписью. Скрипт тоже не полностью мой, а скомпонован из различных примеров, найденных в интернете, но, надеюсь, именно представленный вариант будет полезен не только мне.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Циклический бэкап по дням недели
.docx 15,55Kb
282
282 Скачать (1 SM) Купить за 1 850 руб.

 

Циклический бэкап по дням недели.

 

В интернете часто можно встретить статьи о том, как написать скрипты для автоматического архивирования баз MSSQL. Методика, в них предлагаемая создает новый архив каждый новый день.

Более подробно об этом можно почитать в http://outcoldman.ru/ru/blog/show/127

   Я предлагаю незначительное усовершенствование скриптов и генерацию архивов по дням недели с циклической их перезаписью. Скрипт тоже не полностью мой, а скомпонован из различных примеров, найденных в интернете, но, надеюсь, именно представленный вариант будет полезен не только мне.

 

Для бэкапирования SQL сервера используется обычный скрипт:

DECLARE @pathName NVARCHAR(512)

SET @pathName = 'D:\Backup\db_backup_' + Convert(varchar(8), GETDATE(), 112) + '.bak'

BACKUP DATABASE [MyDataBase] TO DISK = @pathName WITH NOFORMAT, INIT, NAME = N'db_backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10

 

Этот скрипт создает бекап с именем файла db_backup_YYYYDDMM.bak где YYYYDDMM – это текущая дата.  Дата в имени файла позволит нам создавать каждый день бекап в новом файле. Запустите и проверьте что бекап действительно создается такой, какой вам и нужен. Этот скрипт сохраняем в какой-нибудь папке под именем schedule.sql, предположим c:\sheduled tasks. В этой же папке создадим исполняемый файл backup.bat, следующего содержания:

@Echo Off

SetLocal EnableExtensions EnableDelayedExpansion

 

For /F "Tokens=1* Delims==" %%i In ('WMIC Path Win32_LocalTime Get /Value ^| Find "="') Do (

  Set V=%%j

  Set $%%i=!V:~0,-1!

)

If "%$DayOfWeek%"=="0" Set $DayOfWeek=7

 

For /F "Tokens=%$Month%" %%i In ("January February March April May June July August September October November December") Do Set $MonthName=%%i

For /F "Tokens=%$DayOfWeek%" %%i In ("Monday Tuesday Wednesday Thursday Friday Saturday Sunday") Do Set $DayOfWeekName=%%i

 

Echo --------------------------------------

Echo Day            : %$Day%

Echo Month          : %$MonthName% (%$Month%-й месяц года)

Echo Year           : %$Year%

Echo --------------------------------------

Echo DayOfWeek      : %$DayOfWeekName% (%$DayOfWeek%-й день недели)

Echo Quarter        : %$Quarter%

Echo --------------------------------------

Echo Hour           : %$Hour%

Echo Minute         : %$Minute%

Echo Second         : %$Second%

Echo --------------------------------------

 

sqlcmd -S SEVERNAME -U UserName -P Password -i schedule.sql

del D:\Backup\db_backup _%$DayOfWeekName%.rar

"C:\Program Files (x86)\WinRAR\Rar.exe" a -m2 D:\Backup\db_backup _%$DayOfWeekName%.rar D:\Backup\db_backup _*.bak

If "%$Day%"=="1" copy D:\Backup\db_backup _%$DayOfWeekName%.rar D:\Backup\db_backup _%$MonthName%.rar

del D:\Backup\db_backup _*.bak

 

Где меняем SERVERNAME – имя сервера, UserName – имя пользователя, Password – пароль пользователя, schedule.sql – имя сохраненного скрипта. Вторая и третья строка батника архивирует бекап в rar файл и удаляет сам файл бекапа. Для того чтобы работала архивация необходимо установить архиватор WinRAR и прописать полные пути до исполняемого файла Rar.exe. Дополнительно в этом варианте скрипта создается ежемесячный архив. Если он не нужен, уберите строчку: If "%$Day%"=="1" copy D:\Backup\db_backup _%$DayOfWeekName%.rar D:\Backup\db_backup _%$MonthName%.rar. Возможны другие варианты архивации (ежемесячная, ежеквартальная и т.д.) с помощью незначительной модификации скрипта,

 

 Теперь можем запустить исполняемый файл backup.bat и проверить проработает ли он так как нужно. Последний шаг это записать schedule в задачи windows. Запускаем Task Scheduler из меню Пуск, либо набираем в командной строке taskschd.msc. В разных версиях Windows это выглядит по-разному, да и информацию о том, как сделать задачу можно прочитать в помощи Windows. Основное – это запускать задачу от имени пользователя с достаточными правами на используемые папки. При помощи таких действий можно так же запрограммировать и любые другие задачи. В скрипте schedule.sql можно перед бекапом вызвать какие-либо необходимые процедуры, может переиндексирование или сжатие базы данных.

 

 

Акция! Вы можете скачать эту разработку в  составе архива всех моих разработок, которые я предлагаю за StartMone, по Специальной  цене//infostart.ru/public/960899/#archive

См. также

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

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

1 стартмани

30.08.2024    354    0    kot1c    0    

0

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

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

1 стартмани

02.01.2017    15610    12    mt111    21    

0

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

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

1 стартмани

02.12.2016    16579    5    mt111    9    

3

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

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

1 стартмани

09.12.2014    39870    12    denisk37    72    

27

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

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

1 стартмани

16.05.2013    75278    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    14154    16    slava81    5    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. arteast 100 15.06.10 16:25 Сейчас в теме
Ммм...доброго времени суток. А чем этот подход принципиально лучше механизма бэкапов средствами SQL?
7. milkers 2918 16.06.10 11:44 Сейчас в теме
(1) Принципиальной разницы нет чем пользоваться. Следует напомнить, что все средства бэкапирования SQL баз рассчитаны на конкретный тип SQL сервера, как правило, платные, или не имеют достаточной гибкости. Скрипт абсолютно прозрачен, легко контролируем и достаточно надежен, к тому же абсолютно бесплатен и может быть адаптирован под любой тип SQL сервера.

(2)(3) Не у всех клиентов такие большие базы. Как правило, на сервере с 4-8 процессорами параллельное архивирование базы не заметно даже в дневные часы. Но по сценарию я запускаю архивирование в ночное время суток. Для больших баз от архивирования надо отказываться и использовать достаточно большие внешние носители, благо с размеров жестких дисков сейчас проблем нет. Копирование по сети тоже не единственный вариант бэкапа. Сеть тоже разной бывает по пропускной способности.
2. German 413 15.06.10 18:53 Сейчас в теме
Все это очень не надежно.

Сколько будет бекапится файл в 500ГГ? А потом еще и по сетке переливаться?

И все это еще и будет делать рабочий сервер, если нужен такой функционал то лучше использовать
http://www.red-gate.com/products/SQL_Backup/index.htm

лучше решения нет. ;)

3. webester 26 16.06.10 03:01 Сейчас в теме
(2) Решение то неплохое но 300$ за возможность делать бэкапы многовато как то, не находите?
5. German 413 16.06.10 09:04 Сейчас в теме
(3) но оно того стоит, работает безупречно и дает полную уверенность в том что все хорошо.
8. webester 26 16.06.10 12:17 Сейчас в теме
(5) Вопрос не только в том стоит или не стоит, вопрос еще в том что сравнивать приложение за 300$ и скрипт сделанный в обеденные перерывы как то неправильно. Это продукты из разных категорий. Но открытые решения всегда больше нравились в силу сказанного в (7)
6. Ivon 676 16.06.10 11:09 Сейчас в теме
(3)(4)(5)Вот код для SQL Job
------------------------------------------------------
IF DATEPART(dw, getdate()) = 1
BEGIN
BACKUP DATABASE [MyDB]
TO DISK = N'G:\BackUp\MyDB_full.bak'
WITH NOFORMAT, NOINIT,
NAME = N'MyDB-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
END
ELSE
BEGIN
BACKUP DATABASE [MyDB]
TO DISK = N'G:\BackUp\MyDB_diff.bak'
WITH DIFFERENTIAL , NOFORMAT, NOINIT,
NAME = N'MyDB-Differential Database Backup',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
END
----------------------------------------------------------
Делает в воскресенье полный бекап и во все остальные дни разностный.
Если у кого Express-версия - копать в сторону sqlcmd. В этом случаевышеупомянутый код записываем в текстовый файл mybackupscript.sql и запускаем его на сервере MSSQL Express с помощью sqlcmd. Соответственно все это дело можно запихнуть в планировщик.
Если не Express версия, то рекомендую вместе с данным скриптом использовать Log shipping.
diocon; clsmk; +2 Ответить
4. clsmk 16.06.10 08:28 Сейчас в теме
А чем этот подход принципиально лучше механизма бэкапов средствами SQL?


В Express версии нет SQL Agent
Скрипты SQL соответственно запускать по расписанию удобнее вот так.
9. DMSDeveloper 148 16.06.10 13:34 Сейчас в теме
(4) А в Express версии SQL-Server agent и не нужен!
По условиям лицензирования Microsoft - SQL Express предназначен для разработчиков программного обеспечения и нивкоем случае не должен использоваться при осуществлении коммерческой деятельности.
Т.е. Разработать программу для SQL и затем продавать программу вы можете, а вот использовать его как движок для своей рабочей базы - нельзя.
10. nikakoy 43 16.06.10 13:36 Сейчас в теме
У нас так реализовано...
На сервере, не сильно загруженном в дневное время, запускается назначенное задание, через 10 мин. (вычислено эмпирически, с большим запасом).
В файлы год_месяц_дата_MD и год_месяц_дата бекапируются файлы MD,DDS,USR и SQL бекап в отдельный файл (потому что это занимает порядочное время) .
Технология - файлы структуры копируются, переименовываются и упаковываются в архив.
Файл бэкапа переименовывается и архивируется.
Имена файлов формируются час_минуты.расширение.
поскольку бекапирование каждый час, на имени файлов не морочился, используется текущее время сервера.

Собственно сам VBS скрипт


Const OverwriteExisting = TRUE
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
l= len(CStr(time))
'формирование новых имен файлов
if l=8 then
NewName = CStr(Mid( time,1,2) & "_" & Mid(time,4,2) & "_" & "Base_" & ".bak")
NewNameMD = CStr(Mid( time,1,2) & "_" & Mid(time,4,2) & "_" & "Base_" & ".MD")
NewNameDDS = CStr(Mid( time,1,2) & "_" & Mid(time,4,2) & "_" & "Base_" & ".DDS")
NewNameUSR = CStr(Mid( time,1,2) & "_" & Mid(time,4,2) & "_" & "Base_" & ".USR")
else
NewName = CStr(Mid( time,1,1) & "_" & Mid(time,3,2) & "_" & "Base_" & ".bak")
NewNameMD = CStr(Mid( time,1,1) & "_" & Mid(time,3,2) & "_" & "Base_" & ".MD")
NewNameDDS = CStr(Mid( time,1,1) & "_" & Mid(time,3,2) & "_" & "Base_" & ".DDS")
NewNameUSR = CStr(Mid( time,1,1) & "_" & Mid(time,3,2) & "_" & "Base_" & ".USR")
end if

'C:\BKP\ временная папка на сервере выполняющем архивацию
'N:\Base\ путь к каталогу базы данных

objFSO.CopyFile "N:\Base\1Cv7.MD" , "C:\BKP\" & NewNameMD , OverwriteExisting
objFSO.CopyFile "N:\Base\1Cv7.DDS" , "C:\BKP\" & NewNameDDS , OverwriteExisting
objFSO.CopyFile "N:\Base\usrdef\users.usr" , "C:\BKP\" & NewNameUSR , OverwriteExisting

'файл rar.exe положил в C:\Program Files\1Cv77
'файлы после завершения упаковки удаляются rar_ом...

RunStr ="C:\Progra~1\1Cv77\RAR a \\CетевоеИмяКудаПоложитьАрхив\BKP$\Base_" & Mid(Date,9,2) & "_" & Mid(Date,4,2) & "_" & Mid(Date,1,2) & "_MD C:\BKP\*.* -DW"
WshShell.Run runstr

WScript.Sleep 12000

objFSO.MoveFile "\\Srv02\bkp$\Base_backup.bak" ,"\\Srv02\bkp$\" & NewName
RunStr ="C:\Progra~1\1Cv77\RAR a \\CетевоеИмяКудаПоложитьАрхив\BKP$\Base_" & Mid(Date,9,2) & "_" & Mid(Date,4,2) & "_" & Mid(Date,1,2) & ".rar \\СетевоеИмяSQLсервера\bkp$\" & NewName & " -DW"

WshShell.Run runstr
mike_grig; +1 Ответить
11. nikakoy 43 16.06.10 13:42 Сейчас в теме
Может кому-то пригодится..
Ежесуточный (средствами 1С) выполняется скриптом.

On Error Resume Next
dim ParamFile,BasePath,User,UserPassvord,Arhiv,RunString
Set objShellApp = CreateObject("Shell.Application")
BasePath = "N:\Base\"
User = "UsVeR"
UserPassvord = "UsVeR_Pass"

Arhiv = CStr("N:\Base\InOut\Base_" & Mid(Date,9,2) & "_" & Mid(Date,4,2) & "_" & Mid(Date,1,2) & ".zip")
ParamFile = CStr(BasePath & "\arhiv.prm")
Set FSO = CreateObject("Scripting.FileSystemObject")
'MsgBox paramfile, vbInformation
Set File = FSO.CreateTextFile(ParamFile)
file.WriteLine "[general]"
file.WriteLine "Quit=1"
file.WriteLine "UnloadData=1"
file.WriteLine "[UnloadData]"
file.WriteLine "IncludeUserDef=1"
file.WriteLine "UnloadToFile=""" & Arhiv & """"
RunStr = """C:\Program Files\1Cv77\BIN\1cv7s.exe"" Config /D" & """" & BasePath & """ /N" & User & " /P" & UserPassvord & " /@""" & paramFile & """"
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run runstr
If Err.Number <> 0 Then
MsgBox "Чет не срослось!", vbInformation
End If
Мединцентр; clsmk; +2 Ответить
12. Baglandir 20.09.11 13:09 Сейчас в теме
Сделал себе бекапы на основании этой статьи.
Рекомендую в дополнение к статьи скачать видеоуроки по бекопированию. Оказалось все не так сложно как казалось на первый взгляд.

В дополнение добавлю что возникли трудности с очисткой лог файла которые решаются с помощю скриптов .
13. Ichigo 03.10.11 15:13 Сейчас в теме
Хороший скрипт, очень удобный!

Поставили и забыли про бэкапы :) каждый день (ночью) автоматом запускается и делается бэкап. Человеческий фактор уходит (забывчивость).
14. wolf2012x 05.10.11 23:06 Сейчас в теме
15. пользователь 19.09.13 05:43
Сообщение было скрыто модератором.
...
16. skelelaz 20.03.14 00:10 Сейчас в теме
Бэкаплю bat-файлом с WinRAR 3 раза в сутки. Тоже нормально. На счет цикличности - предпочитаю чистить от лишних архивов вручную, а так пускай собираются, сколько места хватит. Бывает, что надо архив полугодовой давности посмотреть.
Оставьте свое сообщение