Не самый элегатный способ, но возможно кому-то пригодится данная конструкция.
Удаление на примере базы для Zabbix - оставляет 50 чанков, количество для сохранения чанков указываем в конвеере awk '{ count = $1 - 51; print count }' n+1
таблица history_uint:
lschk_h_u=$(sudo -u postgres psql -d zabbix -c "SELECT public.show_chunks('history_uint');" 2> /dev/null | sed '1,2d'); count_lschk_h_u=$(echo "$lschk_h_u" | wc -l | awk '{ count = $1 - 51; print count }' | sed 's/^-.*/0/'); echo "$lschk_h_u" | head -n $count_lschk_h_u | awk '{CMD = "sudo -u postgres psql -d zabbix -c \"DROP TABLE " $1 ";\" 2> /dev/null"; system(CMD); }' ; unset lschk_h_u; unset count_lschk_h_u
таблица history:
lschk_h=$(sudo -u postgres psql -d zabbix -c "SELECT public.show_chunks('history');" 2> /dev/null | sed '1,2d'); count_lschk_h=$(echo "$lschk_h" | wc -l | awk '{ count = $1 - 51; print count }' | sed 's/^-.*/0/'); echo "$lschk_h" | head -n $count_lschk_h | awk '{CMD = "sudo -u postgres psql -d zabbix -c \"DROP TABLE " $1 ";\" 2> /dev/null"; system(CMD); }' ; unset lschk_h; unset count_lschk_h
эта команда выполняет следующие действия:
- Загружает список чанков (фрагментов данных) для таблицы `history` в переменную `lschk_h`.
- Вычисляет количество строк, которые необходимо удалить (в переменной `count_lschk_h`).
- Удаляет указанное количество таблиц, используя команду `DROP TABLE` в PostgreSQL для каждой таблицы из списка чанков.
Подробное описание команды
Эта команда выполняет несколько операций для удаления таблиц в базе данных PostgreSQL.
1. `lschk_h=$(sudo -u postgres psql -d zabbix -c "SELECT public.show_chunks('history');" 2> /dev/null | sed '1,2d')`:
- `sudo -u postgres` позволяет выполнять команду от имени пользователя `postgres`, который обычно используется для администрирования PostgreSQL.
- `psql -d zabbix` открывает соединение с базой данных `zabbix`.
- `SELECT public.show_chunks('history');` выполняет SQL-запрос `show_chunks('history')` в схеме `public`. Эта функция возвращает список чанков (фрагментов данных) для таблицы `history`.
- `2> /dev/null` перенаправляет сообщения об ошибках в `/dev/null`, чтобы они не выводились на экран.
- `sed '1,2d'` удаляет первые две строки вывода. Необходимо для удаления заголовков и другой лишней информации.
2. `count_lschk_h=$(echo "$lschk_h" | wc -l | awk '{ count = $1 - 51; print count }' | sed 's/^-.*/0/')`:
- `echo "$lschk_h"` выводит содержимое переменной `lschk_h`.
- `wc -l` считает количество строк в выводе.
- `awk '{ count = $1 - 51; print count }'` вычитает 51 из количества строк и выводит результат. Значение n+1 где n количество чанков для сохранения.
- `sed 's/^-.*/0/'` заменяет отрицательные значения на 0.
3. `echo "$lschk_h" | head -n $count_lschk_h | awk '{CMD = "sudo -u postgres psql -d zabbix -c \"DROP TABLE " $1 ";\" 2> /dev/null"; system(CMD); }'`:
- `echo "$lschk_h"` выводит содержимое переменной `lschk_h`.
- `head -n $count_lschk_h` отображает только первые `$count_lschk_h` строк.
- `awk '{CMD = "sudo -u postgres psql -d zabbix -c \"DROP TABLE " $1 ";\" 2> /dev/null"; system(CMD); }'` выполняет команду для каждой строки. Команда выполняется с использованием `sudo -u postgres` и выполняет SQL-запрос `DROP TABLE <table_name>` для каждой таблицы, указанной в строке.
4. `unset lschk_h; unset count_lschk_h`
очищает переменные `lschk_h` и `count_lschk_h` после выполнения команды.
P.s. Не забудьте учитывать сортировку вывода show_chunks
в каждом отдельном случаи, а также именование chunks
, в примере имя chunks
выглядит так: _timescaledb_internal._hyper_2_2529_chunk