Создание бэкапов по расписанию в MS SQL Express

MS SQL Express лишен агента, при помощи которого можно выполнять задачи по расписанию, но можно воспользоваться и стандартными средствами Windows.

Очень часто для небольших проектов хватает и Express версии SQL сервера. Одна из проблем –это то, что у Express версии нет SQL Agent службы, при помощи которой можно делать некоторые задачи по расписанию. Взамен можно использовать SQLCMD и стандартный Scheduled Tasks от Windows. Первое, что нужно сделать, это написать скрипт, который создавал бы для нас необходимые бекапы. Для его генерации можно воспользоваться MS Management Studio (ее тоже можно скачать для Express версии) и на окне создания бекапа нажать не OK, а “Script Actions to …”.

Я же использую обычно в таких задачах следующий скрипт:

DECLARE @pathName NVARCHAR(512) 
SET @pathName = 'D:\Backup\db_backup_' + Convert(varchar(8), GETDATE(), 112) + '.bak' 
BACKUP DATABASE [MyDataBase] TO  DISK = @pathName WITH NOFORMAT, NOINIT,  NAME = N'db_backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

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

sqlcmd -S SEVERNAME -U UserName -P Password -i schedule.sql
7z a -tzip D:\Backup \db_backup_%date%.zip -i! D:\Backup\db_backup_*.bak
del d:\Backup\db_backup_*.bak

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

Комментарии (13)

Дмитрий ( ) #
gravatar
Спасибо, как раз пригодилось
Андрей ( ) #
gravatar
Интересный способ обойтись в Express версии без SQL Agent'a. А вот в задаче, например, в которой ежедневно нужно запускать какую-нибудь хранимую процедуру в 0:00 такой подход есть смысл применять? Или лучше привязать запуск процедуры к какому-нибудь особенному событию?
Denis Gladkikh ( ) #
gravatar
Конечно, почему нет? Мы использовали такой подход у клиента - отлично отрабатывал, каждую ночь выполняли специальную чистку - запуск процедуры.
Максим ( ) #
gravatar
Большое спасибо за данную статью))))Только я ни хрена не понял, ибо к скриптам и языкам программирования имею самое отдаленное отношение.Мне нужно чтоб каждую ночь БД копировалось на какую нибудь сетевую машину с глубиной бэкапов примерно недели в две)))А можно вариант статьи для даунов?
Denis Gladkikh ( ) #
gravatar
Максим, думаю, что вам просто нужно обратиться за платной помощью к каким-нибудь администраторам/разработчикам. Как проще, я не знаю.
Максим ( ) #
gravatar
Спасибо за совет, Денис!Но я человек нудный-разберусь сам)))Инженер я или не инженер))))
Anton ( ) #
gravatar
Лучше всё же в MSSQL использовать стандартные средства для бекапа, там и расписание есть, и базу не положите сторонними использованиями.
Denis Gladkikh ( ) #
gravatar
Anton это и есть стандартные средства, а в Express версии "расписания" нет.
Шахло ( ) #
gravatar
Здравствуйте! Помогите, пожалуйста, что делать в такой ситуации, каждое утро мне приходится на текстовым (*txt) файле заменять текущею дату на 13 дней назад а на других на 2 дня назад и этих (*txt) файлов очень много и я не успеваю до автоматизации этих справок. А можно ли создать бат файл и там перечислить этих sql (“1.sql”, “1-.sql”, “2.sql”, … “3653.sql”) файлов и внутри них указать строку даты, который надо менять каждый день. Ну, если можно тогда на эту дату каждый день добавить 1 день. Здесь, например, указанно data = '17.12.2011' в него надо добавить +1, то есть 17+1=18. и тогда будет data = '18.12.2011'

Вот пример: 1.sql файл

(SELECT round (float (sum (kolpp)) / float (sum (kolm)), 3) * 100 "Проц. реализ.",

round (float (sum (pkm)) / float (sum (kolpp)), 1) "Сред.дальн."

FROM expbd.nsrezd

WHERE ((expbd.nsrezd.tipv <> ' ' AND expbd.nsrezd.tipv <> 'М')

-- ukazivaem nujnuyu datu: '00.00.0000 dlya sutki'

AND data = '17.12.2011')
i4iro ( ) #
gravatar
anton в этом методе нет НЕстороннего использования архивирование делает сам SQL
Артемий ( ) #
gravatar
http://outcoldman.com/ru/blog/show/127#comment_1687 что вы тут имеете в виду?

В Express версии чего нет расписания? И что вы подразумеваете под расписанием?
Denis Gladkikh ( ) #
gravatar
Тогда, когда я писал этот блог пост - SQL Express не включал в себя SQL Agent, но сейчас есть версия SQL Express with Advanced Services, в которой он есть.
Алексей ( ) #
gravatar
Проще воспользоваться утилитой SQLBackupAndFTP. Есть возможность планировать выполнение бэкапов (full, diff and log tran) и сохранять образы в локальную или сетевую папку, Dropbox, Box, Google Drive, Amazon S3, SkyDrive.
Добавить комментарий
Если вы хотите получать уведомления о новых комментариях к данному топику, укажите, пожалуйста, email и отметьте соответствующий пункт в форме. Если вы хотите добавить код в тексте комментария, то заключите его внутри тега [code]...[/code], более того можно уточнить язык, на котором написан данный код при помощи [code cs]...[/code], где вместо cs могут быть cs, html, xml, java, js, php, sql, cpp, css.

 

busy