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


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

 

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

 

В интернете часто можно встретить статьи о том, как написать скрипты для автоматического архивирования баз 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 можно перед бекапом вызвать какие-либо необходимые процедуры, может переиндексирование или сжатие базы данных.

 

 

Файлы обработки:

-