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

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

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

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. Выполнить запрос

<div>select name, setting
from pg_settings
where name in ('autovacuum_analyze_threshold', 'autovacuum_analyze_scale_factor');</div>

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 для таблиц в ручном режиме и мониторить состояние таблиц

<div>vacuum <tablename>;</div>

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

ХарактеристикаVACUUM FULLAUTOVACUUM
ОперацияРучная, полная перезапись таблицыАвтоматическая, легковесная очистка
Блокировка таблицыДа, блокирует таблицу на времяНет, не блокирует таблицу
Возврат дискового пространстваДа, возвращает пространство операционной системеНет, повторное использование пространства внутри таблицы
Влияние на производительностьВысокое (ресурсоемкая операция)Низкое (фоновый процесс)
Типичный сценарий использованияПосле массового удаления данных, периодическое обслуживаниеРутинное обслуживание
ТриггерРучной запускАвтоматический, на основе пороговых значений


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
После исполнения скрипта так же надо будет сделать процедуру вакуума, чтобы удалить "мертвые" строки

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