web-dev-qa-db-ja.com

cronを介して古いpostgresql行を定期的に削除する

Django postgresql9.3.10バックエンドを備えたWebサイトがあります。Webサイトには動的なユーザー生成コンテンツが含まれています(9gagの形式と考えてください)。定期的に削除するテーブルがいくつかあります。古くなった行。データベースはdbnameと呼ばれ、ユーザーpostgresを介してログインします。以下はそのようなルーチン削除の2つの例です。

begin;
DELETE FROM links_groupseen WHERE which_reply_id IN (SELECT id FROM links_reply where "submitted_on" < now() - interval '7 days');
DELETE FROM links_reply WHERE "submitted_on" < now() - interval '7 days';
commit;

begin;
DELETE FROM links_vote WHERE link_id IN (SELECT id FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted_on" < now() - interval '1 hour');
DELETE FROM links_photoobjectsubscription WHERE which_link_id IN (SELECT id FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted_on" < now() - interval '1 hour');
DELETE FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted_on" < now() - interval '1 hour';
commit;

私が実行するそのような操作は他に10個まであります。現時点では、すべてを手動で行っています。これらを自動化して、特定の低使用時間で実行したいと考えています。それ、どうやったら出来るの?誰かが私に実例を教えてもらえますか?


私自身の基本的な知識によると、最初に次のシェルスクリプトを/etc/cron.dailyに保存する必要があると考えています。

#!/bin/sh

dbname="dbname"
username="postgres"
psql $dbname $username << EOF
begin;
DELETE FROM links_groupseen WHERE which_reply_id IN (SELECT id FROM links_reply where "submitted_on" < now() - interval '7 days');
DELETE FROM links_reply WHERE "submitted_on" < now() - interval '7 days';
commit;
begin;
DELETE FROM links_vote WHERE link_id IN (SELECT id FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted_on" < now() - interval '1 hour');
DELETE FROM links_photoobjectsubscription WHERE which_link_id IN (SELECT id FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted_on" < now() - interval '1 hour');
DELETE FROM links_link WHERE id NOT IN (select answer_to_id from links_publicreply) AND "submitted_on" < now() - interval '1 hour';
commit;
EOF

次に、上記のスクリプトを次のようにcrontabに追加します。

30 4 * * * /etc/cron.daily/mypgscript

そしてservice crond restart

1
Hassan Baig

2013年に、同様の質問がありました( cronのようなツールを使用せずにPostgresqlデータベースで定期的なタスクを実行する方法 )。 crontabまたはpgAgentが唯一の方法でした。

バージョン9.3の場合、すでにバックグラウンドワーカープロセスがあります。ただし、バージョン9.5.2のドキュメントでも、使用に関する警告があります。

cronソリューションは良い方法だと思いますが、データベースへのアクセスを確認してください。ユーザーのアクセスを1つのサーバーに制限します。そうしないと、誰でもこのユーザーをどこからでも使用して削除でき、古いサーバーだけを削除できない可能性があるためです。

1
Marco

私が役立つと思う方法は、メインのプログラミングフレームワーク(つまり、あなたの場合はDjango)にクリーンアップコードを実装し、その関数をURLを介して公開することです。次に、crontabでwgetまたはcurlを使用してクリーンアップURLを呼び出します。このように、cronファイルはスケジューリング部分のみを担当し、クリーンアップを実行するコードは、クリーンアップが必要なデータを作成するコードと一緒に保持されます。

2
jjanes