SQL: Большой размер БД Distribution MS SQL Server

06 ноябрь 2017, Понедельник
5 577
0
0 1
Иногда приходится сталкиваться с ситуацией, когда в Microsoft SQL Server с настроенной репликацией, начинает расти база данных distribution. В том что БД начинает расти после создания задания репликации ничего плохого нет. В базе данных distribution хранятся метаданные и данные журнала для всех типов репликации, а также транзакции для репликации транзакций. Однако есть спустя несколько недель после создания заданий репликации база данных продолжает расти это тревожный сигнал.Скорее всего не выполняется или выполняется некорректно задание по очистке базы данных. В момент создания репликации создается задание (job): Distribution clean up: distribution. В этой задании по расписанию запускается хранимая процедура: dbo.sp_MSdistribution_cleanup. Эта хранимая процедура выполняет очистку базы данных distribution.

Для выяснения причин, прежде всего стоит проверить:
1. Было ли создано задание по очистке базы данных distribution
2. Включено ли это задание
3. Проверить журнал выполнения задания на наличие ошибок, одной из частых ошибок является ситуация при которой учетная запись сотрудника из под которой выполняется задание заблокирована, либо имеет недостаточно прав на базу данных distribution.
4. Не настроено или отсутствует расписание запуска задания очистки
Если проблем в задании не обнаружено, то стоит проверить какой результат возвращает команда запускаемая в задании.

Для этого создайте новый запрос (New Query) и запустите скрипт:

USE [distribution]
GO

EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 72

Где, 72 - это продолжительность хранения метаданных и данных журнала репликаций. Обычно 72 часа, достаточно, но у вас могут быть свои мысли на этой счет.

Если база данных distribution не очищалась длительное время, то ожидание результата выполнения данной команды может затянуться на несколько часов. Это зависит от общего размера БД, времени прошедшего с момента последней очистки и производительности сервера.
В особо тяжелых случаях, например как этот: Удаление устаревших записей может затянуться не просто на часы, а на дни или даже недели. Дело в сильно разросшейся таблице MSrepl_commands и MSrepl_transactions. Так, на примере ниже количество записей почти 1,8 миллиарда.

В этой ситуации, для ускорения процедуры очистки двух наиболее разросшихся таблиц, можно вручную запустить очистку таблиц удалив основную часть данных при помощи команды:

USE distribution
GO
DECLARE @rowcountCom int = 1000000
DECLARE @rowcountTr int = 10000

DELETE TOP(@rowcountCom) MSrepl_commands WITH (PAGLOCK) 
FROM MSrepl_commands 
WITH (INDEX(ucMSrepl_commands)) 

DELETE TOP(@rowcountTr) MSrepl_transactions WITH (PAGLOCK) 
FROM MSrepl_transactions 
WITH (INDEX(ucMSrepl_transactions)) 


значение для @rowcountCom и @rowcountTr укажите не более чем 90% записей. которые у вас указаны в этих таблицах.

После того кактаблицы будут очищены от устаревших данных, можно выполнить финальную очистку при помощи команды:

EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 72
Комментарии:
Прокомментировать
При использовании материалов ссылка на сайт UserMan.ru обязательна.
Политика конфиденциальности
Пользовательское соглашение
UserMan.ru © 2017-2024
Соцсети: VK