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.