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
2013年に、同様の質問がありました( cronのようなツールを使用せずにPostgresqlデータベースで定期的なタスクを実行する方法 )。 crontab
またはpgAgent
が唯一の方法でした。
バージョン9.3の場合、すでにバックグラウンドワーカープロセスがあります。ただし、バージョン9.5.2のドキュメントでも、使用に関する警告があります。
cron
ソリューションは良い方法だと思いますが、データベースへのアクセスを確認してください。ユーザーのアクセスを1つのサーバーに制限します。そうしないと、誰でもこのユーザーをどこからでも使用して削除でき、古いサーバーだけを削除できない可能性があるためです。
私が役立つと思う方法は、メインのプログラミングフレームワーク(つまり、あなたの場合はDjango)にクリーンアップコードを実装し、その関数をURLを介して公開することです。次に、crontabでwgetまたはcurlを使用してクリーンアップURLを呼び出します。このように、cronファイルはスケジューリング部分のみを担当し、クリーンアップを実行するコードは、クリーンアップが必要なデータを作成するコードと一緒に保持されます。