Skip to Content

Очистка аналитической базы данных

Функциональность доступна начиная с Primo RPA Orchestrator 1.25.7.

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

Поддерживаемые СУБД: PostgreSQL и Microsoft SQL Server. Администратор запускает очистку вручную или настраивает её выполнение по расписанию. Создание процедуры не приводит к автоматическому запуску очистки.

Описание назначения и настройки аналитического компонента приведено в статье Служба Analytic.

Подготовка к удалению устаревших записей

Перед выполнением очистки:

  1. Создайте резервную копию базы данных ltoolsanalytic.

  2. Определите срок хранения данных с учётом требований организации к отчётности и аудиту.

  3. Убедитесь, что процедура очистки создана в нужной базе данных и у учётной записи есть необходимые разрешения.

  4. Проверьте очистку в тестовом окружении. Первый запуск в рабочей среде выполните в период минимальной нагрузки.

⚠️

Очистка удаляет записи из аналитической базы данных. Убедитесь, что удаляемые данные больше не требуются. В таблицах ExchangeQueueItemProcessing и ExchangeQueueItemProcessing2 необходимо дополнительно исключать записи с незавершённой обработкой.

Создание хранимых процедур очистки

СУБДПроцедураПорядок создания
PostgreSQLanalytics_purge_old_rowsВ версиях до 1.26.11 процедуру analytics_purge_old_rows необходимо создавать вручную. Начиная с 1.26.11 она создаётся при применении миграций БД.
Microsoft SQL Serverdbo.AnalyticsPurgeOldRowsПеред использованием необходимо проверить наличие процедуры dbo.AnalyticsPurgeOldRows. Автоматическое создание через миграции требует дополнительного подтверждения.

Ручное создание процедуры PostgreSQL (версии до 1.26.11)

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

CREATE OR REPLACE PROCEDURE analytics_purge_old_rows( p_table regclass, p_date_column text, p_older_than_days int, p_batch_size int DEFAULT 5000, p_delay_ms int DEFAULT 200, p_extra_condition text DEFAULT NULL ) LANGUAGE plpgsql AS $$ DECLARE v_deleted_total bigint := 0; v_deleted_batch int; v_threshold timestamp := (now() at time zone 'utc') - make_interval(days => p_older_than_days); v_condition text; v_sql text; BEGIN v_condition := format('%I < $1', p_date_column); IF p_extra_condition IS NOT NULL THEN v_condition := v_condition || ' AND (' || p_extra_condition || ')'; END IF; LOOP v_sql := format( 'DELETE FROM %s WHERE ctid IN ' || '(SELECT ctid FROM %s WHERE %s ORDER BY %I LIMIT %s)', p_table, p_table, v_condition, p_date_column, p_batch_size ); EXECUTE v_sql USING v_threshold; GET DIAGNOSTICS v_deleted_batch = ROW_COUNT; v_deleted_total := v_deleted_total + v_deleted_batch; COMMIT; RAISE NOTICE '%: удалено % строк в пакете (всего %)', p_table, v_deleted_batch, v_deleted_total; EXIT WHEN v_deleted_batch < p_batch_size; PERFORM pg_sleep(p_delay_ms / 1000.0); END LOOP; END; $$;

Начиная с версии 1.26.11 повторно выполнять этот скрипт после обновления не требуется, если миграции применились успешно и процедура присутствует в базе данных.

Параметры процедур очистки

PostgreSQLMicrosoft SQL ServerНазначениеЗначение по умолчанию
p_table@TableNameТаблица, из которой удаляются записиОбязательный
p_date_column@DateColumnСтолбец даты, по которому определяется возраст записиОбязательный
p_older_than_days@OlderThanDaysУдалять записи старше указанного количества днейОбязательный
p_batch_size@BatchSizeМаксимальное количество строк в одном пакете удаления5000
p_delay_ms@DelayMsПауза между пакетами, мс200
p_extra_condition@ExtraConditionДополнительное условие отбора записейNULL

Размер пакета выбирайте с учётом объёма данных и производительности сервера. Увеличение размера пакета может повысить нагрузку на базу данных и продолжительность блокировок.

Ручной запуск очистки в PostgreSQL

Подключитесь к базе данных ltoolsanalytic в psql, pgAdmin или другом SQL-клиенте и выполните CALL для нужной таблицы.

Например, чтобы удалить записи об использовании лицензий роботов старше 90 дней:

CALL analytics_purge_old_rows('public."RobotLicenseUsage"', 'TakeAtUtc', 90);

Чтобы удалить записи об обработке элементов очереди старше 90 дней, не затрагивая незавершённую обработку:

CALL analytics_purge_old_rows( 'public."ExchangeQueueItemProcessing"', 'BeginAt', 90, 5000, 200, '"EndAt" IS NOT NULL' );

Во время выполнения процедура выдаёт сообщения NOTICE с количеством удалённых строк.

Процедура PostgreSQL выполняет COMMIT после каждого пакета. Поэтому вызывайте её отдельной командой CALL, не помещая вызов внутрь явного блока транзакции BEGIN … COMMIT. В SQL-клиенте при необходимости включите автоматическое подтверждение транзакций (autocommit).

Ручной запуск очистки в Microsoft SQL Server

Подключитесь к базе данных ltoolsanalytic через SQL Server Management Studio или sqlcmd. После проверки наличия и корректности процедуры выполните, например:

EXEC dbo.AnalyticsPurgeOldRows @TableName = N'RobotLicenseUsage', @DateColumn = N'TakeAtUtc', @OlderThanDays = 90;

Пример удаления завершённых записей об обработке элементов очереди:

EXEC dbo.AnalyticsPurgeOldRows @TableName = N'ExchangeQueueItemProcessing', @DateColumn = N'BeginAt', @OlderThanDays = 90, @BatchSize = 5000, @DelayMs = 200, @ExtraCondition = N'[EndAt] IS NOT NULL';

Таблицы и параметры отбора записей

Ниже приведены примеры сроков хранения из инструкции разработчика. Значения не являются обязательными. Укажите сроки в соответствии с требованиями организации.

ТаблицаСтолбец датыПример срока, днейДополнительное условие
RobotLicenseUsageTakeAtUtc90-
StudioLicenseUsageTakeAtUtc90-
DpaEventsEventAtUtc180-
OperationProjectProjectDownloadedAtUtc90-
ExchangeQueueItemProcessingBeginAt90EndAt IS NOT NULL
ExchangeQueueItemProcessing2BeginAt90EndAt IS NOT NULL
IntegrationSemaphoreDateEnd30-
IntegrationSemaphore2DateEnd30-

Таблицы IntegrationJournal и IntegrationJournal2 очищать по этой инструкции не требуется.

Настройка периодической очистки

Создание процедуры не создаёт расписание её запуска. Для регулярной очистки настройте отдельное задание. Желательно выполнять очистку вне пиковой нагрузки и не запускать параллельно несколько заданий на одну и ту же таблицу.

Запуск PostgreSQL с помощью pg_cron

Если расширение pg_cron доступно и настроено для нужной базы данных, создайте задание. Пример ежедневной очистки записей об использовании лицензий роботов в 03:00:

SELECT cron.schedule( 'purge-robot-license-usage', '0 3 * * *', $$CALL analytics_purge_old_rows('public."RobotLicenseUsage"', 'TakeAtUtc', 90)$$ );

Для просмотра заданий:

SELECT * FROM cron.job;

Перед созданием расписания администратор должен установить и настроить pg_cron, в том числе проверить, в какой базе данных создаются и выполняются задания.

Запуск PostgreSQL с помощью cron в Linux

Подготовьте файл purge_all.sql с командами CALL для выбранных таблиц. Настройте подключение psql, например через pg_service.conf и .pgpass.

Пример записи в /etc/cron.d/analytics-purge для ежедневного запуска в 03:00:

0 3 * * * postgres /usr/bin/psql "service=ltoolsanalytic" -f /opt/ltools/scripts/purge_all.sql >> /var/log/analytics-purge.log 2>&1

Убедитесь, что указанные пути существуют, у пользователя postgres настроено подключение к ltoolsanalytic и есть права на запись журнала.

Запуск PostgreSQL через Планировщик заданий Windows

Для очистки с Windows-хоста создайте задачу, запускающую psql.exe с указанием базы данных и SQL-файла. Например, аргументы программы:

-d ltoolsanalytic -f "C:\ltools\scripts\purge_all.sql"

Параметры сервера, пользователя и аутентификации задайте в соответствии с конфигурацией подключения.

Запуск Microsoft SQL Server по расписанию

Если доступен SQL Server Agent, создайте задание с шагом Transact-SQL script (T-SQL), укажите базу данных ltoolsanalytic и команды EXEC для выбранных таблиц. Добавьте расписание, например ежедневный запуск в 03:00.

Если SQL Server Agent недоступен, настройте запуск SQL-файла через sqlcmd в Планировщике заданий Windows. До включения любого расписания проверьте процедуру вручную на тестовой базе данных.

Контроль выполнения и эксплуатационные рекомендации

- Начинайте с небольшого объёма данных и контролируйте влияние на производительность базы данных.

- Для таблиц ExchangeQueueItemProcessing и ExchangeQueueItemProcessing2 обязательно задавайте условие EndAt IS NOT NULL.

- После удаления большого объёма данных из PostgreSQL при необходимости выполните VACUUM (ANALYZE) для затронутых таблиц или дождитесь работы autovacuum.

- После настройки расписания контролируйте историю и ошибки выполнения заданий.