Как настроить логирование и контроль выполнения регламентных операций в MS SQL Server Express для 1С?

Системный администратор IT и автоматизация бизнеса
← На главную

При обслуживании информационных баз 1С, работающих под управлением бесплатной редакции MS SQL Server Express, системные администраторы часто сталкиваются с ограничениями СУБД. В версии Express отсутствуют компонент SQL Server Agent и встроенный мастер планов обслуживания (Maintenance Plans). Поэтому регламентные процедуры (дефрагментация индексов, обновление статистики, очистка кэша планов) приходится запускать с помощью автономных T-SQL скриптов и командной утилиты sqlcmd через Планировщик задач Windows (Windows Task Scheduler).

Однако при таком подходе возникает распространенная проблема: после выполнения скриптов лог-файлы оказываются пустыми или не формируются вовсе, и невозможно определить, успешно ли прошли регламентные операции или возникли ошибки доступа и сбои. Разберем по шагам, почему так происходит и как настроить полноценный контроль выполнения процедур обслуживания.

Почему не выводятся логи при выполнении стандартных команд T-SQL?

Проанализируем работу стандартных команд обслуживания SQL Server. Такие инструкции, как:


UPDATE STATISTICS ? WITH FULLSCAN
DBCC FREEPROCCACHE

По умолчанию работают «молча». Если команда выполняется без ошибок, SQL Server не возвращает в поток стандартного вывода никаких информационных сообщений. При запуске через sqlcmd или даже в среде SQL Server Management Studio (SSMS) вы увидите пустую вкладку сообщений или статус Commands completed successfully без деталей о том, какие именно таблицы были обработаны.

Кроме того, важную роль играют права учетной записи, от имени которой запускается скрипт в Планировщике задач Windows. Если используется Windows-аутентификация (параметр -E в sqlcmd), то пользователь ОС, под которым исполняется задание, должен иметь роль sysadmin или права владельца базы данных (db_owner). В противном случае команда USE [ИмяБазы] завершится ошибкой авторизации.

Способ 1. Перенаправление вывода утилиты sqlcmd в лог-файл

Рассмотрим, как настроить сохранение результатов работы утилиты sqlcmd в текстовый файл. Для этого используется параметр -o, задающий путь к лог-файлу.

Чтобы перенаправить не только стандартный вывод, но и сообщения об ошибках командной строки, скорректируем команду вызова в командном файле (.bat или .cmd):


sqlcmd -S SERVER\INSTANCE -E -d retail -i C:\Scripts\UpdateStat.sql -o C:\Logs\UpdateStat.log 2>&1

Посмотрим на ключи запуска:

  1. -S SERVER\INSTANCE — указывает имя сервера и экземпляра MS SQL Server.
  2. -E — использовать доверительное соединение Windows (текущий пользователь ОС).
  3. -d retail — явно указывает целевую базу данных.
  4. -i C:\Scripts\UpdateStat.sql — путь к файлу со скриптом T-SQL.
  5. -o C:\Logs\UpdateStat.log — путь к файлу, куда будет записан вывод.
  6. 2>&1 — перенаправление потока ошибок (STDERR) в поток стандартного вывода (STDOUT), чтобы ошибки ОС и утилиты попадали в тот же лог.

Способ 2. Использование хранимой процедуры sp_updatestats

Если для обновления статистики использовать команду UPDATE STATISTICS, текстовых сообщений в логе всё равно не будет (за исключением критических ошибок). Чтобы получить детальный отчет по каждой таблице, разберем замену этой команды на системную процедуру sp_updatestats.

В отличие от точечного обновления, системная процедура sp_updatestats выводит подробную информацию о каждой обработанной таблице и количестве обновленных статистик.

Создадим файл UpdateStat.sql со следующим содержимым:


USE retail;
GO
EXEC sp_updatestats;
GO

Запустим выполнение через sqlcmd с ключом вывода в лог:


sqlcmd -S .\SQLEXPRESS -E -i C:\Scripts\UpdateStat.sql -o C:\Logs\UpdateStat_Result.log

При таком подходе в файле UpdateStat_Result.log зафиксируется детальный протокол с перечислением всех таблиц базы 1С и результатом обновления статистики по каждой из них.

Обратите внимание на разницу в работе команд:

Способ 3. Модернизация скриптов обслуживания индексов

Выясним, как правильно организовать обслуживание индексов и получить отклик в протоколе. Во многих старых инструкциях встречается использование команды DBCC DBREINDEX и системной процедуры sp_msforeachtable.

Важно: Инструкция DBCC DBREINDEX считается устаревшей (deprecated) и не рекомендуется к использованию в современных версиях MS SQL Server. Кроме того, недокументированная процедура sp_msforeachtable в некоторых случаях может пропускать таблицы.

Вместо устаревших команд рекомендуется использовать конструкции ALTER INDEX. Рассмотрим пример T-SQL скрипта для дефрагментации и перестроения индексов с явным выводом протокола через PRINT:


USE retail;
GO

SET NOCOUNT ON;

DECLARE @TableName NVARCHAR(255);
DECLARE @SQL NVARCHAR(MAX);

DECLARE TableCursor CURSOR FOR
SELECT '[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';

OPEN TableCursor;
FETCH NEXT FROM TableCursor INTO @TableName;

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'Обработка таблицы: ' + @TableName;
    
    -- Перестроение индексов таблицы
    SET @SQL = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD WITH (FILLFACTOR = 80);';
    
    BEGIN TRY
        EXEC sp_executesql @SQL;
        PRINT 'Успешно перестроены индексы для ' + @TableName;
    END TRY
    BEGIN CATCH
        PRINT 'Ошибка при обработке таблицы ' + @TableName + ': ' + ERROR_MESSAGE();
    END CATCH;

    FETCH NEXT FROM TableCursor INTO @TableName;
END;

CLOSE TableCursor;
DEALLOCATE TableCursor;
GO

Этот скрипт перебирает все таблицы базы данных, выполняет перестроение индексов и выводит в текстовый лог понятные сообщения о ходе процесса и возникающих ошибках.

Способ 4. Перехват ошибок с помощью блоков TRY...CATCH

Чтобы гарантировать фиксирование любых сбоев при обслуживании базы 1С, рекомендуется оборачивать регламентные команды в блоки BEGIN TRY ... BEGIN CATCH.

Проанализируем пример универсального скрипта для очистки кэша планов и обновления статистики с логированием ошибок:


USE retail;
GO

PRINT '--- Начало обслуживания базы данных ---';
PRINT 'Время начала: ' + CONVERT(NVARCHAR, GETDATE(), 120);

BEGIN TRY
    PRINT 'Выполнение DBCC FREEPROCCACHE...';
    DBCC FREEPROCCACHE;
    PRINT 'Кэш планов успешно очищен.';
END TRY
BEGIN CATCH
    PRINT 'ОШИБКА при очистке кэша планов: ' + ERROR_MESSAGE();
END CATCH;

BEGIN TRY
    PRINT 'Обновление статистики через sp_updatestats...';
    EXEC sp_updatestats;
    PRINT 'Обновление статистики завершено.';
END TRY
BEGIN CATCH
    PRINT 'ОШИБКА при обновлении статистики: ' + ERROR_MESSAGE();
END CATCH;

PRINT 'Время окончания: ' + CONVERT(NVARCHAR, GETDATE(), 120);
PRINT '--- Обслуживание завершено ---';
GO

При запуске данного скрипта через sqlcmd -o C:\Logs\Maintenance.log вы получите информативный и структурированный лог-файл со штампами времени и текстом любых возникших ошибок.

Альтернативное решение: готовый комплекс скриптов Олы Холленгрена

Для профессиональной настройки регламентов на MS SQL Server Express часто используют готовое и бесплатное решение — SQL Server Maintenance Solution (скрипты Олы Холленгрена / Ola Hallengren).

Особенности использования этого решения на MS SQL Express:

Сводная таблица рекомендованных команд для обслуживания MSSQL Express:

  1. Обновление статистики: используем EXEC sp_updatestats для быстрого обновления изменившихся данных или оборачиваем UPDATE STATISTICS WITH FULLSCAN в блок с явным выводом PRINT.
  2. Обслуживание индексов: заменяем DBCC DBREINDEX на конструкцию ALTER INDEX ALL ON [Таблица] REBUILD (или REORGANIZE).
  3. Запуск скриптов: вызываем sqlcmd с обязательными ключами -o "C:\Path\To\File.log" и 2>&1.
  4. Права доступа: проверяем, что учетная запись службы Планировщика задач Windows внесена в MS SQL Server с ролью sysadmin.
← На главную