Project

General

Profile

Автоматическая очистка МБД

В версиях с 2.15.37 появился функционал, который позволяет автоматизировать очистку МБД.

ВНИМАНИЕ: При установке данного функционала, необходимо выполнить перезапуск службы MS SQL Server!!!

Автоматизация очистки

Изменение поведения должно вступить в силу автоматически при изменении структуры МБД - выполнением скрипта mdb_update.sql. Таким образом все новые создаваемые МБД будут очищаться автоматически. Автоматизация работает на SQL Server начиная с 2005 версии, в т.ч. и на бесплатной версии Express.

В mdb_update внесены шаги по разворачиванию необходимых процедур и таблиц на МБД. Сам скрипт mdb_clean оформлен в виде хранимой процедуры, в которой сохранен весь функционал скрипта.

В БД master создается хранимая процедура BootstrapBackgroundTask, запуск которой привязывается к запуску сервера.
Эта процедура ожидает время равное 5 минут и запускает другую процедуру БД master DoBackgroundTask, которая начинает бесконечно циклически выполняться. Именно эта процедура определяет периодичность выполнения задач. Ее вызов сделан раз в час.
DoBackgroundTask обеспечивает выполнение периодических задач во всех МБД, присутствующих на данном сервере.
В МБД создается хранимая процедура с фиксированным именем, MdbBackgroundTask, которую DoBackgroundTask ищет по имени во всех имеющихся на сервере БД. И, найдя, запускает ее.

Внутри MdbBackgroundTask будет выполняется операция поиска в таблице PARAMETERS записей содержащих

  • .Interval
    где - имя запускаемой задачи.

Найдя соответствующие записи в таблице будет вызвана хранимая процедура RunBackgroundTask с параметром sp_name = TaskName.

При вызове RunBackgroundTask проверяет параметры работы , хранимые в таблице PARAMETERS, определяющие периодичности вызова ("MdbClean.Interval - 168" - такая запись в таблице означает, что хранимая процедура MdbClean должна вызываться раз в 168 часов.) и решает, надо ему запускаться или нет. Расчет производится исходя из времени последнего запуска и Interval(168ч). Если значение текущего времени больше, то произойдет выполнение процедуры.

mdb_clean.sql как хранимая процедура

Скрипт mdb_clean.sql внесен в МБД в виде хранимой процедуры MdbClean.
Эта процедура будет вызываться из RunBackgroundTask.
После выполнения MdbClean в таблицу BackgroundTaskHistory вносится запись о запуске с указанием времени и название выполненной процедуры.

Скрипт mdb_clean удаляет:

  • Новостные элементы, старше 14 дней
  • Очищает список удаленных элементов
  • Удаляет из базы информацию о расписаниях и элементах расписания, старше 3х дней (но не сами элементы из базы данных)
  • Удаляет историю воспроизведения, старше 100 дней
  • Удаляет историю планирования, старше 100 дней
  • Удаляет историю генерации в маге старше 14 дней

Таким образом, если ваш материал хранится в базе данных (не новостные элементы), то они не будут удалены системой, пока вы самостоятельно не удалите их из базы данных.

Скрипт только вычищает базу данных от старых, ненужных записей. Для удаления самих звуковые файлы, на которые никто не ссылается, необходимо использовать Систему удаления неиспользуемого материала.

Версионность структуры master

Из-за того, что таблица master одна на все МБД и вполне может получиться, что на сервере выполняется сначала скрипт mdb_update более поздней версии, а позже от более ранней, то для контроля структуры БД master в ней реализована система, аналогичная используемой в МБД - [[digidev:Обновление_структуры_МБД_с_использованием_компонент]]

master.components

name veri
SP.BootstrapBackgroundTask 1

Версионность хранимых процедур в МБД хранится в таблице components

name veri

SP.RunBackgroundTask

1

SP.MdbBackgroundTask

1

SP.MdbClean

1

SP.MdbClean

2

Обновлена процедура очистки до версии 2 в которой по мотивам #40642 была произведена замена инструкции сокращения размера файлов данных и журналов БД

Отказоустойчивость

Ошибки в выполняемых DoBackgroundTask запросах и процедурах не приводят к остановке цикла вызова задач.
Т.е. DoBackgroundTask отслеживает и подавляет исключения, возникающие при вызове процедур других БД.

Таблица BackgroundTaskHistory

В таблицу BackgroundTaskHistory попадает информация об истории выполнения скриптов

При срабатывании выполнения процедуры в таблицу добавляется запись

ProcName

LastExec

Result

MdbClean

2015-03-28 03:00:00.000

NULL

При завершении выполнения запись обновляется

ProcName

LastExec

Result

MdbClean

2015-03-28 03:00:00.00

0

Result = 0 - говорит о том, что все операции прошли без ошибок. Все остальные результаты сигнализируют о том, что произошла какая-то непредвиденная ситуация и был записан код ошибки.

Настройка

Для использования автоматической очистки необходимо выполнить mdb_update.sql над МБД.

Если в МБД в таблице MODIFY_DATES количество записей превышает 13 000 000, то система будет развернута, но выполняться скрипт не будет. Для запуска необходимо внести вручную запись в таблицу PARAMETERS (пример: MdbClean.Interval - 168). После этого процедура начнет выполняться по расписанию.

Проверка настройки сервера

При правильной настройке сервера процедура BootstrapBackgroundTask должна запускаться при старте SQL-сервера.
Проверить это можно запросом:

use master;
SELECT [name]
FROM sysobjects
WHERE type = 'P' AND OBJECTPROPERTY(id, 'ExecIsStartUp') = 1;

В результирующем списке должна быть процедура BootstrapBackgroundTask. Это значит, что после перезапуска сервера будет запущен механизм очистки.
Для того, чтобы узнать, запущен ли он в настоящее время, необходимо выполнить скрипт

SELECT  start_time, status, command, text
FROM    sys.dm_exec_requests  
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)  
        Where session_id != @@SPID  

В результирующем списке должна быть запись, поле text которой начинающаяся на: CREATE PROCEDURE [dbo].DoBackgroundTask AS...

Add picture from clipboard (Maximum size: 742 MB)