忙しくない時間に掃除機をスケジュールできるように、定期的な掃除機を作成することが期待されていました。
私は、x日間掃除機をかけなかったテーブルを定期的に掃除機で掃除する方法を探していました。 Postgresqlを使用すると、完全に掃除機をかけることができます。これは開始され、所要時間を制御することはできません。
したがって、x時間評価されていないテーブルを検索する手段が必要です。次に、現在の時刻が時間枠内にある場合は、掃除機をかけます。
これはコードです:
#!/bin/bash
beginTime="0000"
endTime="0700"
time=$(date +"%H%M")
timeToRun=true
while $timeToRun;do
if [ $time -lt $beginTime ]
then
echo "Begin Time not yet reached"
timeToRun=false
else
if [ $time -lt $endTime ]
then
echo "you may start"
echo "Vacuum table"
resultToBeVacuumed=$(Sudo -u postgres psql -c "select '!'|| schemaname ||'.' || relname||'!' from pg_stat_user_tables where (last_autovacuum IS NULL or (now() - last_autovacuum > interval '5' day) ) and (last_vacuum IS NULL or (now() -last_vacuum > interval '5' day)) order by last_vacuum asc limit 1;")
echo "$resultToBeVacuumed"
toBeVacuumed=$(echo $resultToBeVacuumed| cut -d '!' -f 2)
echo "$toBeVacuumed"
echo "Vacuum started"
if [[ $toBeVacuumed != *"----"* ]]; then
echo "$toBeVacuumed"
Sudo -u postgres psql -c "vacuum analyse verbose $toBeVacuumed"
else
timeToRun=false
fi
else
echo "End Time passed"
timeToRun=false
fi
fi
done
私がbashスクリプトにたどり着いた理由は、postgresqlsqlスクリプトがExecute 'vacuum analyse $table'
の使用を可能にしなかったためです。これにより、エラーが発生しますVACUUMは関数またはマルチコマンド文字列から実行できません。私はたくさんのことを試みました。エラーの原因であるbegin...end
の使用を許可しないという基本的なルールにより、削除できませんでした。すべての関数にはスコープが必要であるため、エラーが発生します。したがって、問題を解決する唯一の方法は、分離されたコマンドでバキュームを実行することでした。したがって、bash。
これにより、解決策を探す時間を大幅に節約できることを願っています。