Автоматичне старіння (видалення) старих записів у 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.