четверг, 1 декабря 2011 г.

Создания задания по расписания в MS SQL Express редакции

Установив у себя MS SQL 2005/2008 версий Express редакции, вы обнаруживаете некоторые ограничения или отсутсвуещего функционала, конечно разумно их увидеть итак в мощной бесплатной версии СУБД.
Ограничения и возможности редакций можно увидеть на официальном сайте Microsoft, посвященный MS SQL.
Среди одних из этих  ограничений это наличие, а точнее отсутствие  MS SQL Agent-а. Частично данную проблему можно решить, использую пакетные файлы(проще говоря .bat файлы),Windows шелдура и приложение sqlcmd .
Итак, попробуем создать задание автоматического бекапирования БД по заданному расписанию.

Первое - нам необходимо создать скрипт резервного копирования с нашими условиями.
Для тех кто не помнит синтаксис инструкции Backup Database или кому лень писать, то все можно сделать через Management Studio.

после этого имеем примерно следующий скрипт:




BACKUP

DATABASE [AdventureWorks] TODISK = N'F:\ms sql\backup\AWbackup.bak'

WITH

NOFORMAT, NOINIT,

NAME = N'AdventureWorks- ',

SKIP, NOREWIND, NOUNLOAD,STATS = 10

GO


немного его преобразуем,к примеру каждый бекап в отдельный файл с датой создания :




declare @path varchar(200)

set @path=N'F:\ms sql\backup\AWbackup_'+convert(char(4),DATEpart(year, GETDATE()))+'_'+convert(char(2),DATEpart(m, getdate()))

+'_'+convert(char(2),DATEpart(day, getdate()))+'.bak'

BACKUP

DATABASE [AdventureWorks] TODISK = @path

WITH NOFORMAT, INIT,NAME = N'AdventureWorks- ',

SKIP, NOREWIND, NOUNLOAD,STATS = 10

GO
После этого сохраняем скрипт в файл, свой файл мы сохраним в F:\ms sql\backup.sql

Теперь второй пунк - создание нашего .bat файла.
Его легко сделать, посмотрев пример sqlcmd  в BOL, мы создадим аналогичную команду и сохраним все это в .bat файле.
Получим команду 

sqlcmd -i"f:\ms sql\backup.sql"

Сохраним в текстовый файл с расширением .bat, к примеру backup.bat.
Проверим его работу, запустим файл, должно быть что-то вроде этого:
Если появилось данное окно, файл бекапа создался, значит наш скрипт работает.

Осталось третье- запускать данный скрипт по расписанию.
Для решения данной задачи используем приложение Windows "Планировщик Заданий" (Программы -Стандартные  - Служебные).
Выбериет создание новой задачи на запуск нашего .bat файла, установите время запуска, к примеру 22-30, когда все пользователи ушли домой :) . 
Должно получиться что-то вроде этого

Важные моменты при создания задания:
- необходимо выбрать пункт "Выполнять вне зависимости от регистрации пользователя" вкладка "Общие", данный пункт предоставляет возможность запуска задание, даже если пользователь не произвел вход в  Windows. Так же здесь нужно установить служебную учетную запись, от которой будет запуск задания, и соответсвенно доступ к БД!!!, чтобы не было нежданного сюрприза в виде невыполнения скрипта, когда пароль учетной записи был поменян, или уч. запись была заблокирована.

- вкладка "Параметры" , установить параметр "Останавливать задачу, выполняемую дольше:" в разумное значение, к примеру, если вы знаете, что полный бекап у вас проходит не более чем  за 30 минут, то необходимо установить значение в 2 часа(с запасом небольшим). 

Кстати, еще одно замечание, чтобы задания в "Планировщике заданий" выполнялись, необходимо чтобы работала Windows служба -"Планировщик заданий" имя службы"Schedule".

Вот вроде и все.
Таким образом можно создать любое задание по обслуживанию нашей БД либо каких-то служебных заданий по обработке данных используя бесплатную редакцию MS SQL Express, съэкономив деньги нашему работодателю или себе.

P.S: чуть позже поправлю пост, на предмет скрипта с указанием sql логина в .bat-нике, а так же некоторые моменты.

3 комментария :

  1. У меня все заработало, спасибо автору

    ОтветитьУдалить
  2. declare @path varchar(50)
    DECLARE @d DATETIME = GETDATE();
    set @path=N'D:\backup-sql\backup\AWbackup_'+FORMAT( @d, 'yyyy-MM-dd HH:mm', 'en-US' )+'.bak' так дата правильнее пишется - пробелов в пути не будет

    ОтветитьУдалить
  3. EXECUTE master.dbo.xp_create_subdir N'D:\backup-sql\master'
    GO
    EXECUTE master.dbo.xp_create_subdir N'D:\backup-sql\model'
    GO
    EXECUTE master.dbo.xp_create_subdir N'D:\backup-sql\msdb'
    GO
    declare @patch varchar(50)
    DECLARE @d DATETIME = GETDATE();
    set @patch=N'D:\backup-sql\master\master_'+FORMAT( @d, 'yyyy.MM.dd_HH.mm')+'.bak'
    BACKUP DATABASE [master] TO DISK = @patch
    WITH
    RETAINDAYS = 60, NOFORMAT, NOINIT, SKIP, REWIND, NOUNLOAD, STATS = 10
    GO
    declare @patch varchar(50)
    DECLARE @d DATETIME = GETDATE();
    set @patch=N'D:\backup-sql\model\model_'+FORMAT( @d, 'yyyy.MM.dd_HH.mm')+'.bak'
    BACKUP DATABASE [model] TO DISK = @patch
    WITH
    RETAINDAYS = 60, NOFORMAT, NOINIT, SKIP, REWIND, NOUNLOAD, STATS = 10
    GO
    declare @patch varchar(50)
    DECLARE @d DATETIME = GETDATE();
    set @patch=N'D:\backup-sql\msdb\msdb_'+FORMAT( @d, 'yyyy.MM.dd_HH.mm')+'.bak'
    BACKUP DATABASE [msdb] TO DISK = @patch
    для 2017 sql

    ОтветитьУдалить