База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Почему база 1С на SQL 25ГБ тормозит, если логи регулярно чистятся?
- В этой теме 1 ответ, 2 участника, последнее обновление 13 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
10 ноября 2026 в 8:55 #38994
база 1с SQL 25Gb стала сильно тормозить логи раз в неделю вычищаются
-
10 ноября 2026 в 8:55 #38995
25 ГБ для базы 1С на SQL Server не является большим размером. Сам по себе размер базы обычно не объясняет сильные тормоза. В вашем случае в первую очередь нужно проверить:
1. Не переполняется ли журнал транзакций.
2. Какая модель восстановления установлена.
3. Выполняются ли резервные копии журнала.
4. Не запускается ли раз в неделю тяжелая очистка или уменьшение журнала.
5. Нет ли блокировок, фрагментации индексов и устаревшей статистики.
6. Хватает ли места на дисках и оперативной памяти.## 1. Сначала определить причину роста журнала
Выполните в SQL Server Management Studio:
MySQL123456SELECTname,recovery_model_desc,log_reuse_wait_descFROM sys.databasesWHERE name = N'ИмяБазы1С';Вместо
ИмяБазы1Сукажите фактическое имя базы.Возможные результаты
log_reuse_wait_desc:—
NOTHING, журнал может использоваться повторно, проблема не в невозможности очистки;
—LOG_BACKUP, для базы в модели FULL не выполняются резервные копии журнала;
—ACTIVE_TRANSACTION, есть незавершенная или зависшая транзакция;
—DATABASE_MIRRORING, проблема связана с зеркалированием;
—AVAILABILITY_REPLICA, проблема связана с Always On;
—REPLICATION, журнал удерживается репликацией;
—ACTIVE_BACKUP_OR_RESTORE, идет резервное копирование или восстановление;
—OLDEST_PAGE, старая версия данных удерживается активной транзакцией.Также проверьте фактическое заполнение журнала:
MySQL123USE [ИмяБазы1С];DBCC SQLPERF(LOGSPACE);Более современный вариант:
MySQL1234567USE [ИмяБазы1С];SELECTtotal_log_size_in_bytes / 1024.0 / 1024 AS TotalLogSizeMB,used_log_space_in_bytes / 1024.0 / 1024 AS UsedLogSizeMB,used_log_space_in_percent AS UsedPercentFROM sys.dm_db_log_space_usage;## 2. Проверьте модель восстановления
MySQL12345SELECTname,recovery_model_descFROM sys.databasesWHERE name = N'ИмяБазы1С';### Если установлена модель FULL
В этом случае журнал транзакций не будет освобождаться просто от обычного полного резервного копирования базы. Необходимо регулярно делать резервные копии журнала.
Обычно для базы 1С достаточно выполнять их каждые 15 минут, 30 минут или 1 час, в зависимости от требований к восстановлению.
Пример резервной копии журнала:
MySQL123456BACKUP LOG [ИмяБазы1С]TO DISK = N'D:SQLBackupИмяБазы1С_log.trn'WITHINIT,COMPRESSION,STATS = 10;Важно: файл резервной копии журнала не нужно каждый раз перезаписывать через
INIT, если вы хотите хранить цепочку резервных копий. Обычно используются разные имена файлов или настроенный SQL Server Agent.После настройки резервного копирования журнала его физический размер сам по себе может остаться большим. Это нормально. Главное, чтобы внутри него освобождалось место для повторного использования.
### Если резервные копии журнала не нужны
Для большинства обычных баз 1С можно использовать модель
SIMPLE:MySQL12ALTER DATABASE [ИмяБазы1С]SET RECOVERY SIMPLE;После переключения модель восстановления сама по себе может не уменьшить физический файл журнала. Если журнал уже раздулся, его можно один раз уменьшить до разумного размера.
Сначала определите логическое имя файла:
MySQL12345678USE [ИмяБазы1С];SELECTname,type_desc,size * 8 / 1024 AS SizeMB,physical_nameFROM sys.database_files;Затем однократно:
MySQL123USE [ИмяБазы1С];DBCC SHRINKFILE (N'ИмяЛогическогоФайлаЛога', 2048);Здесь
2048означает 2 ГБ. Это только пример. Размер нужно выбирать по фактической нагрузке.Не рекомендуется выполнять
SHRINKFILEкаждую неделю. После уменьшения SQL Server будет снова увеличивать журнал, что приводит к дополнительным паузам, фрагментации и тормозам.## 3. Не путайте очистку журнала с уменьшением файла
Есть две разные операции:
1. Освободить занятые внутри журнала участки для повторного использования.
2. Уменьшить физический файл.ldf.Регулярное уменьшение
.ldfобычно является ошибкой. Правильная схема:— для
FULLнастроить резервное копирование журнала;
— дляSIMPLEне уменьшать журнал постоянно;
— один раз подобрать размер журнала с запасом;
— настроить нормальный шаг авторасширения, например 512 МБ или 1 ГБ;
— не использовать авторасширение в процентах.Проверить параметры файлов можно так:
MySQL12345678910SELECTDB_NAME(database_id) AS DatabaseName,name,type_desc,size * 8 / 1024 AS SizeMB,growth,is_percent_growth,physical_nameFROM sys.master_filesWHERE database_id = DB_ID(N'ИмяБазы1С');Если
is_percent_growth = 1, лучше заменить процентное увеличение на фиксированное:MySQL123456ALTER DATABASE [ИмяБазы1С]MODIFY FILE(NAME = N'ИмяЛогическогоФайлаЛога',FILEGROWTH = 512MB);## 4. Проверьте, не тормозит ли база во время еженедельной процедуры
Если тормоза появляются примерно в один и тот же день или время, очень вероятно, что запускается одно из заданий:
— уменьшение файлов базы;
— перестроение всех индексов;
— обновление статистики всей базы;
— проверка целостности;
— полное резервное копирование;
— резервное копирование журнала;
— обслуживание баз сразу нескольких информационных баз;
— удаление данных в 1С;
— очистка регистра сведений;
— регламентное задание 1С;
— обновление полнотекстового индекса;
— обработка копий базы данных или 1С:Аналитики.Проверьте задания SQL Server Agent и регламентные задания в 1С.
Особенно подозрительны задания, в которых присутствуют команды:
MySQL12345DBCC SHRINKDATABASEDBCC SHRINKFILEALTER INDEX ... REBUILDUPDATE STATISTICSDBCC CHECKDBDBCC CHECKDBсам по себе полезен, но на рабочей базе объемом 25 ГБ он может создавать заметную нагрузку. Его лучше запускать ночью и не одновременно с резервным копированием или регламентными заданиями 1С.## 5. Проверьте активные блокировки
Во время тормозов выполните:
MySQL1234567891011121314SELECTr.session_id,r.blocking_session_id,r.status,r.command,r.wait_type,r.wait_time,r.cpu_time,r.total_elapsed_time,DB_NAME(r.database_id) AS DatabaseName,t.text AS SqlTextFROM sys.dm_exec_requests AS rCROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS tWHERE r.database_id = DB_ID(N'ИмяБазы1С');Если
blocking_session_idне равен0, один сеанс блокирует другой.Для просмотра открытых транзакций:
MySQL1DBCC OPENTRAN (N'ИмяБазы1С');Если найдена очень старая активная транзакция, она может не давать SQL Server переиспользовать журнал. Причиной может быть:
— зависший сеанс 1С;
— длительная обработка;
— незавершенная транзакция в расширении;
— массовое проведение документов;
— удаление большого объема данных;
— зависшая фоновая задача.Нельзя без проверки сразу завершать сеанс командой
KILL. Сначала нужно определить, что это за пользователь, что он выполняет и не идет ли важная операция.## 6. Проверьте индексы и статистику
На базе 1С не стоит бездумно перестраивать абсолютно все индексы каждый день. Но если база давно не обслуживалась, фрагментация может влиять на скорость.
Проверка фрагментации:
MySQL123456789101112131415161718192021222324USE [ИмяБазы1С];SELECTOBJECT_SCHEMA_NAME(ips.object_id) AS SchemaName,OBJECT_NAME(ips.object_id) AS TableName,i.name AS IndexName,ips.index_type_desc,ips.avg_fragmentation_in_percent,ips.page_countFROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'LIMITED') AS ipsINNER JOIN sys.indexes AS iON ips.object_id = i.object_idAND ips.index_id = i.index_idWHERE ips.database_id = DB_ID()AND ips.index_id > 0AND ips.page_count > 1000ORDER BY ips.avg_fragmentation_in_percent DESC;Ориентировочно:
— до 10% , ничего не делать;
— от 10 до 30% , обычноREORGANIZE;
— более 30% , возможноREBUILD, но лучше не выполнять это в рабочее время.Пример:
MySQL123ALTER INDEX [ИмяИндекса]ON [dbo].[ИмяТаблицы]REORGANIZE;или:
MySQL123ALTER INDEX [ИмяИндекса]ON [dbo].[ИмяТаблицы]REBUILD;При
REBUILDсущественно увеличивается нагрузка и может резко вырасти журнал транзакций. Если база работает в моделиFULL, перед таким обслуживанием особенно важно, чтобы резервные копии журнала выполнялись штатно.Обновить статистику можно так:
MySQL123USE [ИмяБазы1С];EXEC sys.sp_updatestats;Но на рабочей базе это также может дать нагрузку. Запускайте ночью и предварительно сделайте резервную копию.
## 7. Проверьте крупные таблицы базы
Размер базы 25 ГБ нужно разложить на данные и индексы:
MySQL1234567891011121314151617USE [ИмяБазы1С];SELECTt.name AS TableName,SUM(a.total_pages) * 8 / 1024 AS TotalMB,SUM(a.used_pages) * 8 / 1024 AS UsedMB,SUM(a.data_pages) * 8 / 1024 AS DataMBFROM sys.tables AS tINNER JOIN sys.indexes AS iON t.object_id = i.object_idINNER JOIN sys.partitions AS pON i.object_id = p.object_idAND i.index_id = p.index_idINNER JOIN sys.allocation_units AS aON p.partition_id = a.container_idGROUP BY t.nameORDER BY TotalMB DESC;Если среди крупнейших объектов находятся таблицы:
—
_DbCopiesTrLogs;
—_DbCopiesTrTables;
—_DbCopiesTrChanges;
—_DbCopiesTrChObj;
—_DbCopiesInitialLast;
—_DbCopiesUpdates;то в базе может накапливаться механизм «Копии баз данных», который используется, в том числе, 1С:Аналитикой. Такие таблицы иногда становятся причиной существенного роста базы.
Удалять данные напрямую из таблиц 1С через SQL нельзя без понимания структуры и резервной копии. Сначала нужно отключать ненужные копии базы штатными средствами 1С и проверять результат. Прямое удаление из таблиц 1С может повредить логическую целостность базы.
## 8. Проверьте свободное место
Нужно проверить свободное место минимум на следующих дисках:
— диск с файлами данных
.mdfи.ndf;
— диск с журналом.ldf;
— диск для временной базыtempdb;
— диск для резервных копий.Если файл журнала растет, а на диске мало свободного места, 1С может начать выдавать ошибки и сильно замедляться.
Рекомендуется размещать отдельно:
— файлы данных;
— файл журнала;
—tempdb;
— резервные копии.Для небольшой базы это не всегда обязательно, но при постоянных тормозах разделение дисков помогает определить узкое место.
## 9. Проверьте настройки SQL Server и 1С
Для SQL Server стоит проверить:
— разрядность SQL Server, желательно 64 bit;
— достаточный объем оперативной памяти;
— ограничение максимальной памяти SQL Server;
— наличие свободной памяти на сервере;
— загрузку дисков;
— размерtempdb;
— число файловtempdb;
— включенную автостатистику;
— отсутствие запуска тяжелых заданий в рабочее время.Если SQL Server забирает всю память сервера, оставляя недостаточно памяти операционной системе и серверу 1С, работа также будет замедляться.
Проверьте параметры памяти:
MySQL123456789SELECTname,value_in_useFROM sys.configurationsWHERE name IN('max server memory (MB)','min server memory (MB)');Для сервера, где одновременно работают SQL Server и сервер 1С, нельзя отдавать SQL Server всю оперативную память. Нужно оставить запас для Windows,
rphost,rmngr, антивируса и других служб.## Что исправить в первую очередь
Практический порядок действий такой:
1. Узнать
recovery_model_descиlog_reuse_wait_desc.
2. Проверить фактический размер и заполнение.ldf.
3. Если модельFULL, настроить резервное копирование журнала каждые 15 минут, 30 минут или 1 час.
4. Если модельSIMPLE, не выполнять еженедельныйSHRINK.
5. Один раз уменьшить чрезмерно раздутый журнал после устранения причины роста.
6. Найти еженедельное задание, во время которого начинаются тормоза.
7. Проверить блокировки и активные транзакции именно в момент тормозов.
8. Проверить фрагментацию индексов и статистику.
9. Найти самые крупные таблицы.
10. Проверить свободное место, память,tempdbи нагрузку на диски.Наиболее вероятные причины при вашем описании:
— журнал не резервируется, а раз в неделю принудительно уменьшается;
— раз в неделю выполняется тяжелыйREBUILDилиSHRINK;
— зависает длительная транзакция;
— база работает вFULL, но резервные копии журнала не настроены;
— накопились таблицы механизма «Копии баз данных»;
— тормоза вызываются регламентным заданием 1С, а не размером самой базы.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.