はじめに
DBの一部のデータを定期的に消したい場合ありますよね?AWS S3だとライフサイクルで消せますよね。同じようにPostgreSQLでも自動で経過日数を指定しておけば、消せる機能があります。MogoDBにもTTL機能がありますが、機能的には同じです。
PostgreSQL TTL機能
PostgreSQLでは、TTL(Time to Live)機能を使用して、自動的に日付でデータを削除することができます。TTL機能はPostgreSQLには標準機能としては含まれていないため、外部のツールやライブラリを使用する必要があります。
pg_partmanというツールを使用することで、TTL機能を実現することができます。
pg_partmanは、PostgreSQLの拡張機能の1つで、パーティション管理を行うことができます。パーティションは、テーブルを論理的に分割して、データを保管する方法です。
pg_partmanを使用すると、特定のテーブルの特定の列に基づいて、指定された時間が経過した後に自動的にデータを削除することができます。たとえば、以下のようにしてTTL機能を有効にすることができます。
SELECT partman.create_parent('mytable', 'created_at', 'native', 'interval', '1 day');
上記の例では、mytable
テーブル内のcreated_at
列を基準に、1日後にデータを削除するパーティションが作成されます。
また、消すためには別途、メンテナンス関数を用意して定期的に実行する必要があります。
メンテナンス関数の例
run_maintenance
関数を使用して、30日以上経過した古いパーティションを削除する例です。
SELECT partman.run_maintenance(p_analyze := true, p_index := true, p_vacuum := 'FULL', p_delete := true, p_keep := INTERVAL '30 days');
上記の例では、p_delete
パラメータをtrue
に設定しています。これにより、30日以上経過したパーティションが削除されます。また、p_keep
パラメータを使用して、30日以内のパーティションを保持するように設定しています。
run_maintenance
関数は、pg_schedule
やpg_cron
などのスケジューリングツールと組み合わせて、定期的に自動実行させます。
AWS RDSで利用出来るか?
結論から言って、利用出来ます。ただし、バージョン 12.6 以上です。
以下、RDSの設定例です。