2010-07-30

Автоматический backup базы MSSQL

Дано: некая база данных на сервере MSSQL 2005 Express.
Нужно: производить резервное копирование БД одним кликом или даже вообще без клика, автоматически.
Насколько я знаю, в полной версии (не Express) есть готовые инструменты для этого, и очень неплохие. Но она платная. Поэтому будем обходиться тем, что есть. И у нас получится.

Итак, резервное копирование, как и многое другое, может выполняться путем запроса T-SQL. Как узнать, как выглядит такой запрос? Можно, конечно погуглить, и вгрызаться в документацию, но есть способ проще. Кто не знал - сейчас покажу.
Запускаем SQL Server Management Studio Express. Выбираем свою базу и...



Все, теперь у нас есть sql-файл с готовым сценарием, делающим backup. Назовем его, к примеру, mssql_backup.sql, и положим на диск D.
Теперь осталось его запустить извне. Для этого есть консольная утилита sqlcmd, которая входит в состав сервера (респект парням из MS!). Пользоваться так:

sqlcmd -S .\SQLEXPRESS -i "d:\mssql_backup.sql"
где -S .\SQLEXPRESS - указание на имя сервера, по умолчанию оно такое.
Создаем bat-файл с этой командой, запускаем, наблюдаем процесс. Красота!

Осталось пара моментов.
1) Как сделать, чтобы это происходило по расписанию? Cron тут нету, есть планировщик заданий, но в моем XP он не пожелал сохранять задание в расписании, ругался на отсутствие прав... Погуглив, я узнал, что это баг и чинить его, видимо, уже не будут.
Поэтому, не заморачиваясь, кинул скрипт в автозапуск. Комп включается ежедневно, так что бэкап каждое утро меня вполне устраивает.
2) Как сделать, чтобы файл резервной копии не перезаписывался каждый раз? Хотелось бы, чтобы имя файла говорило мне, от какого числа эта копия.
Что ж, невозможного нет: правим сохраненный ранее сценарий:

DECLARE @filedate VARCHAR(20)
SET @filedate=REPLACE(REPLACE(CONVERT(VARCHAR(20),GETDATE(),20),':','.'),' ','_')

DECLARE @file_path VARCHAR(256)
SET @file_path='D:\MSSQL_DataBases\main_'+@filedate+'.bak'

BACKUP DATABASE [main] TO  DISK = @file_path WITH NOFORMAT, INIT,  NAME = N'main-Полная База данных Резервное копирование', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Теперь файлы будут выглядеть как main_2010-07-30_09.14.19.bak, что нам и требовалось. Можно дописать в bat-файл команду для их копирования куда-нибудь еще, например в сеть. Для надежности.
Ясное дело, что ни о каких наворотах или вопросах безопасности тут речи нет. Я просто показал пример, как это можно сделать.

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

Сергей комментирует...

реально понадобилось в одном проекте. благодарю за пост)

ipoodi комментирует...

Реально пригодилось в больнице. Спасибо Вам!

Анонимный комментирует...

С SQL столкнулся впервые в жизни и за 3 часа сделал. Может и долго, но таки сделал! Спасибо Добрым людям, которые помогают сохранить безценное - *.bat