Время прочтения: 4 мин.

В практике аудита использование СУБД SQL Server для хранения и анализа данных – одно из непременных условий, существенно повышающих качество проводимой работы.

А обслуживание базы данных, включающее, в том числе, резервное копирование данных, крайне важно для обеспечения ее бесперебойной работы.

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

Но для начала немного простых примеров использования sqlcmd (все данные тестовые).

Посмотрим, как это работает в интерактивном режиме.

Запускаем командную строку Windows – cmd.

Чтобы подключиться к именованному экземпляру SQL Server, укажем имя сервера и имя экземпляра SQL Server (в примере соответственно DESKTOP\SQLEXPRESS), с которым необходимо соединиться.

sqlcmd -S DESKTOP\SQLEXPRESS –E

где:

S указывает на server\instance_name;

E –trusted connection (доверительное соединение).

Отображаемая в командной строке цифра 1> означает, что подключение состоялось и есть готовность принимать запросы для исполнения.

Если ранее при создании пользователя SQL Server для пользователя была включена аутентификацию SQL Server,

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

Чтобы это выполнить, предварительно необходимо выйти из sqlcmd и заново войти с указанием учетных данных:

sqlcmd -S DESKTOP\SQLEXPRESS –U DB_User 

Командная строка запросит пароль для пользователя DB_User, который необходимо ввести с клавиатуры.

При желании можно указать пароль в командной строке, хотя это не рекомендуется по соображениям безопасности:

sqlcmd -S DESKTOP\SQLEXPRESS –U DB_User –P 12345678

Давайте теперь проверим текущую базу данных.

При создании входа в SQL Server  можно определить базу данных, в которую необходимо войти, по умолчанию. Если она не указана, то базой данных по умолчанию будет является основная база данных (master).

select db_name()
go

Следующий пример использования sqlcmd – вывод списка баз данных в экземпляре SQL:

select name from sys.databases
go

Теперь давайте посмотрим на запуск sqlcmd в командном режиме.

Получим список таблиц в базе данных db1, выведя его в файл tables.txt, используя в sqlcmd подготовленный заранее и сохраненный на жестком диске ПК, сценарий tablesList.sql со следующим содержанием:

select 	table_name from db1.information_schema.tables;

Затем вызовем sqlcmd для выполнения созданного сценария tablesList.sql:

sqlcmd -S DESKTOP\SQLEXPRESS -E -iC:\Users\User\SQL\Scripts\tablesList.sql -oC:\Users\User\SQL\tables.txt

где:

i используется для указания ввода,  указывается файл сценария, в примере это сохраненный tablesList.sql;
o используется для отображения результатов вывода в файл, в примере это tables.txt

В tables.txt отображается следующий результат (для примера выбрана тестовая база данных, состоящая из одной таблицы):

Теперь вернемся к нашей задаче автоматизации резервного копирования с использованием sqlcmd и планировщика задач Windows.

Во-первых, создадим файл сценария резервного копирования базы данных db1 и сохраним его в файле backup.sql:

declare @Backup nvarchar(400)
set @Backup=concat('C:\Users\User\SQL\Backup\db1-',(format(getdate(),'yyyy-MM-dd-hh-mm-ss-tt')),'.bak')
backup database [db1] to disk=@Backup
with noformat, noinit,  name = n'db1-Backup', skip, norewind, nounload, stats=10
go

Файл резервной копии в результате выполнения этого сценария сохраняется в каталог C:\Users\User\SQL\Backup\.

Далее создаем командный файл run-sqlcmd-backup.bat следующего содержания:

@Echo off
sqlcmd -S DESKTOP\SQLEXPRESS -E -iC:\Users\User\SQL\Scripts\backup.sql

И, наконец, открываем Планировщик заданий Windows (подробнее о планировщике заданий Windows можно прочесть в официальных документах Microsoft по этой тематике), для того, чтобы создать задачу резервного копирования базы данных db1, запускающую командный файл run-sqlcmd-backup.bat по необходимому расписанию.

В итоге с помощью sqlcmd мы получили регулярное резервное копирование выбранной нами базы данных.