Назад | Перейти на главную страницу

pgagent для рутинной очистки с помощью сценария bash

Ожидалось, что я создам обычную уборку, чтобы иметь возможность планировать уборку в менее загруженные часы.

Я искал способ регулярно пылесосить столы, которые не пылесосили в течение 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, заключается в том, что сценарий sql postgresql не позволял использовать Execute 'vacuum analyse $table'. Это приводит к ошибке VACUUM не может быть выполнен из функциональной или мульти-командной строки. Я много чего перепробовал. Основное правило не разрешать использовать begin...end, который является причиной ошибки, мне не удалось удалить. Каждая функция требует области видимости и поэтому приведет к ошибке. Поэтому единственным способом решения проблемы было выполнение вакуума с изолированной командой. Таким образом, bash.

Я надеюсь, что это сэкономит людям много времени на поиски решения.