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