При обслуживании информационных баз 1С, работающих под управлением бесплатной редакции MS SQL Server Express, системные администраторы часто сталкиваются с ограничениями СУБД. В версии Express отсутствуют компонент SQL Server Agent и встроенный мастер планов обслуживания (Maintenance Plans). Поэтому регламентные процедуры (дефрагментация индексов, обновление статистики, очистка кэша планов) приходится запускать с помощью автономных T-SQL скриптов и командной утилиты sqlcmd через Планировщик задач Windows (Windows Task Scheduler).
Однако при таком подходе возникает распространенная проблема: после выполнения скриптов лог-файлы оказываются пустыми или не формируются вовсе, и невозможно определить, успешно ли прошли регламентные операции или возникли ошибки доступа и сбои. Разберем по шагам, почему так происходит и как настроить полноценный контроль выполнения процедур обслуживания.
Проанализируем работу стандартных команд обслуживания 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 [ИмяБазы] завершится ошибкой авторизации.
Рассмотрим, как настроить сохранение результатов работы утилиты sqlcmd в текстовый файл. Для этого используется параметр -o, задающий путь к лог-файлу.
Чтобы перенаправить не только стандартный вывод, но и сообщения об ошибках командной строки, скорректируем команду вызова в командном файле (.bat или .cmd):
sqlcmd -S SERVER\INSTANCE -E -d retail -i C:\Scripts\UpdateStat.sql -o C:\Logs\UpdateStat.log 2>&1
Посмотрим на ключи запуска:
-S SERVER\INSTANCE — указывает имя сервера и экземпляра MS SQL Server.-E — использовать доверительное соединение Windows (текущий пользователь ОС).-d retail — явно указывает целевую базу данных.-i C:\Scripts\UpdateStat.sql — путь к файлу со скриптом T-SQL.-o C:\Logs\UpdateStat.log — путь к файлу, куда будет записан вывод.2>&1 — перенаправление потока ошибок (STDERR) в поток стандартного вывода (STDOUT), чтобы ошибки ОС и утилиты попадали в тот же лог.Если для обновления статистики использовать команду 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С и результатом обновления статистики по каждой из них.
Обратите внимание на разницу в работе команд:
sp_updatestats — обновляет статистику только для тех таблиц, где с момента последнего обслуживания менялись данные. Это существенно снижает нагрузку на диски и процессор.UPDATE STATISTICS ... WITH FULLSCAN — принудительно пересчитывает статистику с полным сканированием всех таблиц. Для крупной базы 1С это дает максимально точные планы запросов, но процедура может выполняться очень долго и не выводит сообщений в лог без обработки.Выясним, как правильно организовать обслуживание индексов и получить отклик в протоколе. Во многих старых инструкциях встречается использование команды 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
Этот скрипт перебирает все таблицы базы данных, выполняет перестроение индексов и выводит в текстовый лог понятные сообщения о ходе процесса и возникающих ошибках.
Чтобы гарантировать фиксирование любых сбоев при обслуживании базы 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:
sqlcmd.dbo.CommandLog.REORGANIZE), если более 30% — полное перестроение (REBUILD).Сводная таблица рекомендованных команд для обслуживания MSSQL Express:
EXEC sp_updatestats для быстрого обновления изменившихся данных или оборачиваем UPDATE STATISTICS WITH FULLSCAN в блок с явным выводом PRINT.DBCC DBREINDEX на конструкцию ALTER INDEX ALL ON [Таблица] REBUILD (или REORGANIZE).sqlcmd с обязательными ключами -o "C:\Path\To\File.log" и 2>&1.sysadmin.