Очистка аналитической базы данных
Функциональность доступна начиная с Primo RPA Orchestrator 1.25.7.
В аналитической базе данных ltoolsanalytic можно удалять устаревшие записи с помощью хранимых процедур. Очистка выполняется пакетами с паузами между ними, чтобы сократить продолжительность блокировок при удалении большого количества записей.
Поддерживаемые СУБД: PostgreSQL и Microsoft SQL Server. Администратор запускает очистку вручную или настраивает её выполнение по расписанию. Создание процедуры не приводит к автоматическому запуску очистки.
Описание назначения и настройки аналитического компонента приведено в статье Служба Analytic.
Подготовка к удалению устаревших записей
Перед выполнением очистки:
-
Создайте резервную копию базы данных
ltoolsanalytic. -
Определите срок хранения данных с учётом требований организации к отчётности и аудиту.
-
Убедитесь, что процедура очистки создана в нужной базе данных и у учётной записи есть необходимые разрешения.
-
Проверьте очистку в тестовом окружении. Первый запуск в рабочей среде выполните в период минимальной нагрузки.
Очистка удаляет записи из аналитической базы данных. Убедитесь, что удаляемые
данные больше не требуются. В таблицах ExchangeQueueItemProcessing и
ExchangeQueueItemProcessing2 необходимо дополнительно исключать записи с
незавершённой обработкой.
Создание хранимых процедур очистки
| СУБД | Процедура | Порядок создания |
|---|---|---|
| PostgreSQL | analytics_purge_old_rows | В версиях до 1.26.11 процедуру analytics_purge_old_rows необходимо создавать вручную. Начиная с 1.26.11 она создаётся при применении миграций БД. |
| Microsoft SQL Server | dbo.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 повторно выполнять этот скрипт после обновления не требуется, если миграции применились успешно и процедура присутствует в базе данных.
Параметры процедур очистки
| PostgreSQL | Microsoft 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';Таблицы и параметры отбора записей
Ниже приведены примеры сроков хранения из инструкции разработчика. Значения не являются обязательными. Укажите сроки в соответствии с требованиями организации.
| Таблица | Столбец даты | Пример срока, дней | Дополнительное условие |
|---|---|---|---|
RobotLicenseUsage | TakeAtUtc | 90 | - |
StudioLicenseUsage | TakeAtUtc | 90 | - |
DpaEvents | EventAtUtc | 180 | - |
OperationProject | ProjectDownloadedAtUtc | 90 | - |
ExchangeQueueItemProcessing | BeginAt | 90 | EndAt IS NOT NULL |
ExchangeQueueItemProcessing2 | BeginAt | 90 | EndAt IS NOT NULL |
IntegrationSemaphore | DateEnd | 30 | - |
IntegrationSemaphore2 | DateEnd | 30 | - |
Таблицы 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.
- После настройки расписания контролируйте историю и ошибки выполнения заданий.