web-dev-qa-db-ja.com

bashスクリプトを使用した定期的なバキュームのpgagentジョブ

忙しくない時間に掃除機をスケジュールできるように、定期的な掃除機を作成することが期待されていました。

私は、x日間掃除機をかけなかったテーブルを定期的に掃除機で掃除する方法を探していました。 Postgresqlを使用すると、完全に掃除機をかけることができます。これは開始され、所要時間を制御することはできません。

したがって、x時間評価されていないテーブルを検索する手段が必要です。次に、現在の時刻が時間枠内にある場合は、掃除機をかけます。

1
Bart Dirks

これはコードです:

#!/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。

これにより、解決策を探す時間を大幅に節約できることを願っています。

2
Bart Dirks