Установив у себя 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-нике, а так же некоторые моменты.
У меня все заработало, спасибо автору
ОтветитьУдалить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' так дата правильнее пишется - пробелов в пути не будет
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