Автоматичне старіння (видалення) старих записів у Postgres


15

Чи має Postgres якісь функції для підтримки старіших старих записів?

Я хочу використовувати Postgres для ведення журналів, як свого роду черги, де записи (події журналу), старші двох тижнів, автоматично видаляються.


Використовуйте розділення. Просто видалення записів не зменшить розмір таблиці на диску.
— sivann

@sivann Чи не передбачає ваша рекомендація, що його проблема - це розмір диска? Якщо його проблема полягає в часі виконання запиту, здається, що видалення може бути більш простим відповіддю, ніж розділення, ні? (все ще намагаюся зрозуміти це)
— stephenmm

1
Проблема полягає лише в тому, що записи журналів через певний час більше не цікаві. Видалення старих рядків повинно звільнити нові свіжі рядки.
— Василь Бурк

Відповіді:


15

Немає вбудованої функції для автоматичного видалення рядків за часовим режимом (про який я б знав).

Ви можете виконувати щоденну роботу (ви вирішите) cron-завдання для планування простих DELETEкоманд або використання pgAgent для цієї мети.

Або ви можете використовувати розділення з тижневими розділами, які успадковуються з головної таблиці , давайте зможе викликати його log. Це зробить видалення дуже дешевим : просто дотримуйтесь останніх двох тижнів і скиньте старіші розділи.

Створіть a RULEабо a TRIGGERна головній таблиці, яка перенаправляє INSERTs до розділу поточного тижня на основі системного часу. Завжди увійдіть у головну таблицю log. Створюйте дочірні таблиці достроково. Зробіть це на кілька тижнів вперед, щоб бути впевненим і виконайте щотижневу роботу з крон, яка додає майбутні дочірні таблиці ...

У посібнику є приклади коду .
Відповідна відповідь з функцією plpgsql створює таблиці автоматично:

Пов'язане рішення відтворює RULEперенаправлення INSERT. Функція тригера може динамічно записувати на поточний розділ ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.