При обслуживании больших информационных баз 1С на базе MS SQL Server системные администраторы часто сталкиваются со ситуацией, когда штатная операция сжатия базы данных (Shrink Database) завершается аварийно или выдает ошибку по таймауту. Особенно остро эта проблема проявляется при ограниченном свободном месте на диске хранилища.
Рассмотрим причины возникновения этой проблемы и разберем эффективные способы ее обхода с использованием инструментов SQL Server Management Studio (SSMS) и команд T-SQL.
Проанализируем основные факторы, которые мешают выполнению сжатия в графическом интерфейсе SQL Server Management Studio:
.ldf) стремительно разрастается и заполняет оставшийся диск, что приводит к остановке операции.Чтобы избежать отмены операции по таймауту графического интерфейса, выполним сжатие путем непосредственного запуска T-SQL скрипта в окне запроса. Это позволит серверу выполнять задачу в фоновом режиме без ограничений клиентского таймера.
Разберем алгоритм получения и запуска скрипта по шагам:
Попытка сжать сразу всю базу данных зачастую не приносит результата, так как операция пытается обработать данные и журнал единым блоком. Посмотрим на альтернативный подход: выполнение сжатия для конкретных файлов — файла данных (.mdf) и файла журнала (.ldf) по отдельности.
В окне сжатия файлов выберем тип файла Данные (Data). Чтобы сервер выполнил реорганизацию страниц с перемещением их в начало файла, установим переключатель в положение Реорганизовать страницы перед освобождением неиспользуемого места (Reorganize pages before releasing unused space) и зададим желаемый целевой размер.
Если на диске критически мало свободного места, сжатие файла данных большого размера целесообразно делать небольшими порциями (шагами) или использовать режим мгновенной обрезки без перемещения страниц.
Рассмотрим варианты команд DBCC SHRINKFILE:
1. Мгновенная обрезка неиспользуемого пространства в конце файла (TRUNCATEONLY)
Данный режим не перемещает страницы данных внутри файла, за счет чего выполняется мгновенно и не выказывает нагрузки на журнал транзакций:
-- Мгновенная обрезка файла данных без перемещения страниц
DBCC SHRINKFILE (Имя_Логического_Файла, TRUNCATEONLY);
2. Порционное сжатие файла данных
Для постепенного уменьшения физического размера файла зададим целевой размер TargetSizeMB, шаг за шагом уменьшая его объем:
-- Перевод базы в простую модель восстановления для минимизации роста журнала
ALTER DATABASE [Имя_Базы] SET RECOVERY SIMPLE;
-- Порционное сжатие файла данных до 40000 МБ
DBCC SHRINKFILE (Имя_Логического_Файла, 40000);
-- Сжатие файла журнала транзакций до минимального размера
DBCC SHRINKFILE (Имя_Логического_Файла_Лога, 1);
Для узнавания точного логического имени файла выполним системный запрос sp_helpfile или посмотрим свойства файла в консоли SSMS.
Проанализируем важные нюансы, которые следует учитывать при проведении сжатия:
DBCC FREEPROCCACHE.