Ad Widget
Collapse
База данных Zabbix стала быстро разрастаться
Collapse
X
-
Ну для начала перед удалением сделайте просто селект и посмотрите в какую сторону вам знак нужен.
Ну и судя по скрину вы у себя выставляли 7 дней хранения истории, зачем вам история с начала года?Code:select * FROM public.history where clock > 1704056400
Comment
-
Вроде если хочешь удалить всё до нового года, то нужен знак < 1704056400, так как все числа до НГ меньше чем 1704056400
По поводу 7 дней - НГ это просто пример. Кстати, а чем отличается тренды от хистори?Comment
-
Тренды - это то, что в русском переводе названо "динамика изменений" (ссылка).
Используется для числовых типов, в двух словах - вместо всех собранных значений сохраняется только 4 числа за каждый час: минимум, максимум, среднее и количество значений за этот час.Comment
-
Да, это верно, что знак может стоять в ту сторону. Я просто приводил пример, как можно удалить что-либо, хотя обычно это делают более осмысленно.
Также хотелось бы напомнить, что задавать вопросы, не относящиеся к теме топика, — плохая практика. Топики, заполненные посторонними вопросами, которые можно легко найти в документации или через поиск в интернете, не приносят пользы форуму.
Цель топика на форуме — найти решение проблемы. Когда решение найдено и отмечено, в будущем это может помочь другим пользователям справиться с аналогичной задачей.Comment
-
Спасибо. Так я всё об этом, как справится с проблемой возросшей базой Zabbix.
Да, это верно, что знак может стоять в ту сторону. Я просто приводил пример, как можно удалить что-либо, хотя обычно это делают более осмысленно.
Также хотелось бы напомнить, что задавать вопросы, не относящиеся к теме топика, — плохая практика. Топики, заполненные посторонними вопросами, которые можно легко найти в документации или через поиск в интернете, не приносят пользы форуму.
Цель топика на форуме — найти решение проблемы. Когда решение найдено и отмечено, в будущем это может помочь другим пользователям справиться с аналогичной задачей.
Я планирую выполнить следующие действия:
1. Клонировать машину, чтобы провести на ней тесты.
2. Удалить все данные из больших таблиц хистори через delete FROM
3. Затем пока не определился - попытаться сделать VACUUM FULL или сразу установить timescaledb и конвертнуть таблицы.Comment
-
На тестовой машине по результатам всего плана:
delete FROM public.history where clock < 1723842000; 88минут заняло удаление
delete FROM public.history_uint where clock < 1723842000; 100минут заняло удаление
delete FROM public.history_text where clock < 1723842000; 570минут заняло удаление
VACUUM FULL public.history_text; 13:12 - 13:41 29минут
VACUUM FULL public.history_uint; 13:42 - 14:33 51минута
VACUUM FULL public.history; 14:34 - 15:15 41минута
timescaleDB старт миграции 159минут
Итоговый размер базы около 257гб.
Результат до и после:
relation | total_size
--------------------------+------------
public.history_text | 927 GB
public.history_uint | 645 GB
public.history | 552 GB
public.trends_uint | 77 GB
public.trends | 38 GB
public.item_discovery | 13 GB
relation | total_size
--------------------------+------------
public.trends_uint | 79 GB
public.history_uint | 48 GB
public.history | 39 GB
public.trends | 39 GB
public.history_text | 37 GBComment
-
-
Не могу пока точно сказать. В логах до всех этих операций housekeeper ничего удалял - везде было по нулям. После очистки в логах появились записи об удалениях, которых не было раньше вообще.
Почему не могу определить в данный момент - я очистил данные с запасом, но по факту меня попросили хранить хистори в 30 дней, поэтому пока не упрусь в 30 дней не смогу убедится, что данные удаляются и рост базы остановился. Могу отписать позже.
Сегодня запустил конвертацию таблиц на боевом сервере.Comment
-
Ничего не получилось(
Хотя на клоне всё прекрасно отработало и таблицы конвертнулись...
2024-09-02 22:07:54.829 MSK [2131010] LOG: starting PostgreSQL 13.11 (Debian 13.11-0+deb11u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2024-09-02 22:07:54.830 MSK [2131010] LOG: listening on IPv4 address "0.0.0.0", port 5432
2024-09-02 22:07:54.830 MSK [2131010] LOG: listening on IPv6 address "::", port 5432
2024-09-02 22:07:54.831 MSK [2131010] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2024-09-02 22:07:54.841 MSK [2131011] LOG: database system was shut down at 2024-09-02 22:07:50 MSK
2024-09-02 22:07:54.864 MSK [2131010] LOG: database system is ready to accept connections
2024-09-02 22:07:54.865 MSK [2131017] LOG: TimescaleDB background worker launcher connected to shared catalogs
2024-09-02 22:09:05.728 MSK [2131122] LOG: the "timescaledb" extension is not up-to-date
2024-09-02 22:09:05.728 MSK [2131122] HINT: The most up-to-date version is 2.16.1, the installed version is 2.15.3.
2024-09-02 23:10:44.756 MSK [2131121] WARNING: terminating background worker "Telemetry Reporter [1]" due to timeout
2024-09-02 23:10:44.757 MSK [2132524] FATAL: terminating connection due to administrator command
2024-09-02 23:10:44.766 MSK [2131010] LOG: background worker "Telemetry Reporter [1]" (PID 2132524) exited with exit code 1
2024-09-02 23:10:44.766 MSK [2131121] LOG: job 1 failed
2024-09-03 00:17:34.150 MSK [2131121] WARNING: terminating background worker "Telemetry Reporter [1]" due to timeout
2024-09-03 00:17:34.152 MSK [2133072] FATAL: terminating connection due to administrator command
2024-09-03 00:17:34.161 MSK [2131010] LOG: background worker "Telemetry Reporter [1]" (PID 2133072) exited with exit code 1
2024-09-03 00:17:34.161 MSK [2131121] LOG: job 1 failed
2024-09-03 00:40:28.916 MSK [2131317] zabbix@zabbix WARNING: column type "character varying" used for "source" does not follow best practices
2024-09-03 00:40:28.916 MSK [2131317] zabbix@zabbix HINT: Use datatype TEXT instead.
2024-09-03 00:40:28.916 MSK [2131317] zabbix@zabbix CONTEXT: SQL statement "SELECT create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true)"
PL/pgSQL function inline_code_block line 66 at PERFORM
2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix LOG: could not send data to client: Broken pipe
2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix CONTEXT: SQL statement "SELECT create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true)"
PL/pgSQL function inline_code_block line 66 at PERFORM
2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix STATEMENT: DO $$
DECLARE
minimum_postgres_version_major INTEGER;
minimum_postgres_version_minor INTEGER;
current_postgres_version_major INTEGER;
current_postgres_version_minor INTEGER;
current_postgres_version_full VARCHAR;
minimum_timescaledb_version_major INTEGER;
minimum_timescaledb_version_minor INTEGER;
current_timescaledb_version_major INTEGER;
current_timescaledb_version_minor INTEGER;
current_timescaledb_version_full VARCHAR;
current_db_extension VARCHAR;
BEGIN
SELECT 10 INTO minimum_postgres_version_major;
SELECT 9 INTO minimum_postgres_version_minor;
SELECT 2 INTO minimum_timescaledb_version_major;
SELECT 0 INTO minimum_timescaledb_version_minor;
SHOW server_version INTO current_postgres_version_full;
IF NOT found THEN
RAISE EXCEPTION 'Cannot determine PostgreSQL version, aborting';
END IF;
SELECT substring(current_postgres_version_full, '^(\d+).') INTO current_postgres_version_major;
SELECT substring(current_postgres_version_full, '^\d+.(\d+)') INTO current_postgres_version_minor;
IF (current_postgres_version_major < minimum_postgres_version_major OR
(current_postgres_version_major = minimum_postgres_version_major AND
current_postgres_version_minor < minimum_postgres_version_minor)) THEN
RAISE EXCEPTION 'PostgreSQL version % is NOT SUPPORTED (with TimescaleDB)! Minimum is %.%.0 !',
current_postgres_version_full, minimum_postgres_version_major,
minimum_postgres_version_minor;
ELSE
RAISE NOTICE 'PostgreSQL version % is valid', current_postgres_version_full;
END IF;
SELECT extversion INTO current_timescaledb_version_full FROM pg_extension WHERE extname = 'timescaledb';
IF NOT found THEN
RAISE EXCEPTION 'TimescaleDB extension is not installed';
ELSE
RAISE NOTICE 'TimescaleDB extension is detected';
END IF;
SELECT substring(current_timescaledb_version_full, '^(\d+).') INTO current_timescaledb_version_major;
SELECT substring(current_timescaledb_version_full, '^\d+.(\d+)') INTO current_timescaledb_version_minor;
IF (current_timescaledb_version_major < minimum_timescaledb_version_major OR
(current_timescaledb_version_major = minimum_timescaledb_version_major AND
current_timescaledb_version_minor < minimum_timescaledb_version_minor)) THEN
RAISE EXCEPTION 'TimescaleDB version % is UNSUPPORTED! Minimum is %.%.0!',
current_timescaledb_version_full, minimum_timescaledb_version_major,
minimum_timescaledb_version_minor;
ELSE
RAISE NOTICE 'TimescaleDB version % is valid', current_timescaledb_version_full;
END IF;
SELECT db_extension FROM config INTO current_db_extension;
PERFORM create_hypertable('history', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('history_text', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('history_str', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('auditlog', 'auditid', chunk_time_interval => 604800,
time_partitioning_func => 'cuid_timestamp', migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('trends', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('trends_uint', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
IF (current_db_extension = 'timescaledb') THEN
RAISE NOTICE 'TimescaleDB extension is already installed; not changing configuration';
ELSE
UPDATE config SET db_extension='timescaledb',hk_history_global=1,hk_ trends_global=1;
UPDATE config SET compression_status=1,compress_older='7d';
END IF;
RAISE NOTICE 'TimescaleDB is configured successfully';
END $$;
2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix FATAL: connection to client lost
2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix CONTEXT: SQL statement "SELECT create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true)"
PL/pgSQL function inline_code_block line 66 at PERFORM
2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix STATEMENT: DO $$
DECLARE
minimum_postgres_version_major INTEGER;
minimum_postgres_version_minor INTEGER;
current_postgres_version_major INTEGER;
current_postgres_version_minor INTEGER;
current_postgres_version_full VARCHAR;
minimum_timescaledb_version_major INTEGER;
minimum_timescaledb_version_minor INTEGER;
current_timescaledb_version_major INTEGER;
current_timescaledb_version_minor INTEGER;
current_timescaledb_version_full VARCHAR;
current_db_extension VARCHAR;
BEGIN
SELECT 10 INTO minimum_postgres_version_major;
SELECT 9 INTO minimum_postgres_version_minor;
SELECT 2 INTO minimum_timescaledb_version_major;
SELECT 0 INTO minimum_timescaledb_version_minor;
SHOW server_version INTO current_postgres_version_full;
IF NOT found THEN
RAISE EXCEPTION 'Cannot determine PostgreSQL version, aborting';
END IF;
SELECT substring(current_postgres_version_full, '^(\d+).') INTO current_postgres_version_major;
SELECT substring(current_postgres_version_full, '^\d+.(\d+)') INTO current_postgres_version_minor;
IF (current_postgres_version_major < minimum_postgres_version_major OR
(current_postgres_version_major = minimum_postgres_version_major AND
current_postgres_version_minor < minimum_postgres_version_minor)) THEN
RAISE EXCEPTION 'PostgreSQL version % is NOT SUPPORTED (with TimescaleDB)! Minimum is %.%.0 !',
current_postgres_version_full, minimum_postgres_version_major,
minimum_postgres_version_minor;
ELSE
RAISE NOTICE 'PostgreSQL version % is valid', current_postgres_version_full;
END IF;
SELECT extversion INTO current_timescaledb_version_full FROM pg_extension WHERE extname = 'timescaledb';
IF NOT found THEN
RAISE EXCEPTION 'TimescaleDB extension is not installed';
ELSE
RAISE NOTICE 'TimescaleDB extension is detected';
END IF;
SELECT substring(current_timescaledb_version_full, '^(\d+).') INTO current_timescaledb_version_major;
SELECT substring(current_timescaledb_version_full, '^\d+.(\d+)') INTO current_timescaledb_version_minor;
IF (current_timescaledb_version_major < minimum_timescaledb_version_major OR
(current_timescaledb_version_major = minimum_timescaledb_version_major AND
current_timescaledb_version_minor < minimum_timescaledb_version_minor)) THEN
RAISE EXCEPTION 'TimescaleDB version % is UNSUPPORTED! Minimum is %.%.0!',
current_timescaledb_version_full, minimum_timescaledb_version_major,
minimum_timescaledb_version_minor;
ELSE
RAISE NOTICE 'TimescaleDB version % is valid', current_timescaledb_version_full;
END IF;
SELECT db_extension FROM config INTO current_db_extension;
PERFORM create_hypertable('history', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('history_text', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('history_str', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('auditlog', 'auditid', chunk_time_interval => 604800,
time_partitioning_func => 'cuid_timestamp', migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('trends', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
PERFORM create_hypertable('trends_uint', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
IF (current_db_extension = 'timescaledb') THEN
RAISE NOTICE 'TimescaleDB extension is already installed; not changing configuration';
ELSE
UPDATE config SET db_extension='timescaledb',hk_history_global=1,hk_ trends_global=1;
UPDATE config SET compression_status=1,compress_older='7d';
END IF;
RAISE NOTICE 'TimescaleDB is configured successfully';
END $$;
2024-09-03 00:47:06.451 MSK [2133330] postgres@postgres ERROR: relation "timescaledb_information.hypertables" does not exist at character 29
2024-09-03 00:47:06.451 MSK [2133330] postgres@postgres STATEMENT: SELECT hypertable_name FROM timescaledb_information.hypertables;
2024-09-03 00:47:13.240 MSK [2131010] LOG: received fast shutdown request
2024-09-03 00:47:13.253 MSK [2131010] LOG: aborting any active transactions
2024-09-03 00:47:13.253 MSK [2131121] FATAL: terminating connection due to administrator command
2024-09-03 00:47:13.253 MSK [2131017] FATAL: terminating connection due to administrator command
2024-09-03 00:47:13.257 MSK [2131010] LOG: background worker "logical replication launcher" (PID 2131018) exited with exit code 1
2024-09-03 00:47:13.257 MSK [2131010] LOG: background worker "TimescaleDB Background Worker Launcher" (PID 2131017) exited with exit code 1
2024-09-03 00:47:13.268 MSK [2131010] LOG: background worker "TimescaleDB Background Worker Scheduler" (PID 2131121) exited with exit code 1
2024-09-03 00:47:14.067 MSK [2131012] LOG: shutting down
2024-09-03 00:47:18.160 MSK [2131010] LOG: database system is shut down
Comment
-
Выполнил конвертацию на боевом сервере, работы были сопряжены со сложностями миграции виртуальной машины между двумя Дата-центрами, простой занял около суток.
По итогу когда конвертация прошла, боевая база вместо 2.3ТБ, стала весить 136гб, сжатие данных старше 7 дней включено.👍 1Comment
Comment