使用 bash 脚本进行例行清理的 pgagent 作业

使用 bash 脚本进行例行清理的 pgagent 作业

我希望能够制定例行吸尘计划,以便能够在不太忙的时候安排吸尘。

我一直在寻找一种方法来定期清理 x 天未清理过的表。Postgresql 允许您完全清理。这会启动,但您无法控制清理所需的时间。

因此,我希望有一种方法可以搜索 x 时间内未清理过的表。然后,如果当前时间在某个时间窗口内,则清理它们。

答案1

这是代码:

#!/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 脚本的原因是 postgresql sql 脚本无法使用Execute 'vacuum analyse $table'。这会导致错误VACUUM 无法从函数或多命令字符串执行。我尝试了很多方法。begin...end我无法删除不允许使用 的基本规则,这是导致错误的原因。每个函数都需要一个范围,因此会导致错误。因此,解决问题的唯一方法是使用隔离命令执行 vacuum。因此 bash。

我希望这可以节省人们寻找解决方案的大量时间。

相关内容