Контроль размера базы данных

Последние изменения: 26.06.2025

При работе с сервисом ТестОпс можно иногда наблюдать неконтролируемый рост объема базы данных, как правило для этого есть две причины:

1. Крупные таблицы в которых происходит много операций insert и delete копят "мертвые строки" и объем занимаемого места на диске растет. Что бы этого избежать необходимо выполнять удаление таких пустых строк.
2. Большое количество старых запусков

Для решения проблемы необходимо производить:

1. Вакуум БД
2. Удаление старых запусков скриптом

1. Процедура вакуума БД, настройка автовакуума


Для определения количества пустых строк необходимо выполнить:

select
schemaname,
    relname,
    n_live_tup,
    n_dead_tup,
    last_vacuum,
    last_autovacuum,
    last_analyze,
    last_autoanalyze
from pg_stat_all_tables
where schemaname = 'public'
order by n_dead_tup desc

n_dead_tup - количество мертвых строк в таблице
n_live_tup - количество живых\актуальных строк в таблицеЕсли n_dead_tup огромные числа и при этом last_autovacuum не выполнялся давно, значит есть два варианта:

Вариант 1. Настроить автовакуум


1. Выполнить запрос

select name, setting
from pg_settings
where name in ('autovacuum_analyze_threshold', 'autovacuum_analyze_scale_factor');

2. Рассчитать на каких количествах мертвых строк будет запускаться autovacuum
Формула для определения необходимости ANALYZE : 

autovacuum_analyze_threshold + (autovacuum_analyze_scale_factor* количество строк в таблице).

К примеру, 

в таблице test_fixture_result_children 13834619 записей, плюс 619398 мертвых. 
Последний раз autovacuum запускался 2024-05-09 08:27:32.604604+00.

Значение параметров:
autovacuum_analyze_threshold = 0.05, autovacuum_analyze_threshold = 50.
Рассчет:
50 + (0.05 * 13833401) = 691720 (5%). т.е автовакум сработает после изменения 72 322 строк.

Вариант 2. 

Выполнять vacuum для таблиц в ручном режиме и мониторить состояние таблиц

vacuum <tablename>;

Отличия операции VACUUM и AUTOVACUUM

Характеристика

VACUUM FULL

AUTOVACUUM

Операция

Ручная, полная перезапись таблицы

Автоматическая, легковесная очистка

Блокировка таблицы

Да, блокирует таблицу на время

Нет, не блокирует таблицу

Возврат дискового пространства

Да, возвращает пространство операционной системе

Нет, повторное использование пространства внутри таблицы

Влияние на производительность

Высокое (ресурсоемкая операция)

Низкое (фоновый процесс)

Типичный сценарий использования

После массового удаления данных, периодическое обслуживание

Рутинное обслуживание

Триггер

Ручной запуск

Автоматический, на основе пороговых значений


2. Инструмент для удаления старых запусков

Данный скрипт используется для удаление старых запусков по всем проектам инстанса (решение по критерию что является "старым запуском" для удаления пользователь принимает в рамках требований, в разных проектах это могут быть разные даты)

Параметры, настраиваемые перед запуском скрипта:

docker run -e "ALLURE_ENDPOINT=http://localhost:8080" \
-e "ALLURE_USERNAME=admin" \
-e "ALLURE_PASSWORD=admin" \
-e "PROJECT_ID=2" \
-e "LAUNCH_FILTER=tag = \"delete\"" \
-e "LAUNCH_CREATEDBEFORE=30d 0h 0m" \
ghcr.io/eroshenkoam/allure-testops-utils clean-launches
После исполнения скрипта на значительном количестве запусков, так же стоит запланировать процедуру вакуума, чтобы удалить "мертвые" строки и вернуть пространство, особенно касается таблиц:

TEST_RESULT
TEST_RESULT_CUSTOM_FIELD

Помогла ли вам статья?