pgagent job para vácuo de rotina com script bash

1

Esperava-se que eu criasse uma aspiração de rotina para agendar o vácuo em menos horas de trabalho.

Eu tenho procurado por um meio de aspirar rotineiramente as mesas que não foram aspiradas por x dias. Postgresql permite esvaziar completamente. Que começa e não lhe dá controle sobre o tempo que leva.

Portanto, eu gostaria de ter um meio de procurar por tabelas que não foram exploradas por x time. Então as aspire se a hora atual estiver em uma janela de tempo.

    
por Bart Dirks 07.02.2017 / 09:43

1 resposta

2

Este é o código:

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

A razão pela qual acabei em um script bash é que o script sql postgresql não tornou possível usar um Execute 'vacuum analyse $table' . Isso resulta em um erro VACUUM não pode ser executado a partir de uma função ou string multi-comando . Eu tentei muitas coisas. A regra básica de não permitir usar um begin...end , que é a causa do erro, não consegui remover. Cada função requer um escopo e, portanto, resultará em um erro. Portanto, a única maneira de resolver o problema era executar o vácuo com um comando isolado. Assim bash.

Espero que isso economize muito tempo nas pessoas procurando por uma solução.

    
por 07.02.2017 / 10:15