Я уже писал о том как вручную удалять старые тома из базы и с диска. Казалось что это однократная операция. Однако пришлось делать это во второй раз. Попутно выявилась проблема с приоритетом команды restore. Диск с бэкапами заполнился, задания застряли в очереди и команда restore создала задание которое послушно встало в хвост очереди. Приоритеты очереди работают только в том случае если очередь движется. Bacula не приостанавливает ткущее задание чтобы выполнить задание с более высоким приоритетом. А оно стоит в очереди и не может выполниться изза нехватки места на диске. Гугл не смог найти ответ как же запустить рестор вне очереди. Пришлось очистить очередь, при помощи команды cancel в bconsole после чего отработал рестор.
Это всё отступления, вернёмся-же к автоматизации:
Скрипт удаляет бэкапы которые последний раз записывались более чем 190 дней от текущей даты. Список томов получает из bconsole. Прочитав список томов из базы данных скрипт подсчитывает размер файлов для удаления и выводит на экран их имена. Непосредственно перед удалением записей из каталогаи файлов скрипт делает “последнее китайское предупреждение”. В качестве параметра можно передать начало VolumeName тогда скрипт выберет только указанные записи.
cat purge-bareos-db-and-files.sh
#!/bin/bash
# several days ago
DATEFROM=`date --date='190 days ago' '+%Y-%m-%d'`
BACKUPFOLDER="/mnt/bpool"
if [ $# -eq 1 ] ; then
FILTER="$1%"
echo -e "Useing filter : \"${FILTER}\""
else
FILTER=""
echo -e "Filter is not using..."
fi
echo -e "Check all backups before ${DATEFROM}"
# get list of files to prune
#
echo "Reading VolumeName list from catalog"
if [ -z "${FILTER}" ] ; then
DELETELIST=`echo -e "sqlquery\nselect VolumeName from Media where LastWritten < '${DATEFROM}' order by VolumeName;\n.\nexit" | bconsole | grep '^|' | grep -v ' VolumeName ' | sed -e 's/[ ]*|[ ]*//g' | sed -e '/^[ \t]*$/d'`
else
DELETELIST=`echo -e "sqlquery\nselect VolumeName from Media where VolumeName LIKE '${FILTER}' order by VolumeName;\n.\nexit" | bconsole | grep '^|' | grep -v ' VolumeName ' | sed -e 's/[ ]*|[ ]*//g' | sed -e '/^[ \t]*$/d'`
fi
if [[ -z "${DELETELIST}" ]] ; then
echo "No records found earlier than ${DATEFROM}"
exit 1
else
DELETELISTRECORDCOUNT=`echo -e "${DELETELIST}" | wc -l`
echo " ${DELETELISTRECORDCOUNT} records found earlier than ${DATEFROM}"
read -p 'Type Y if you want to display it: ' input
echo
if [[ ${input,,} =~ ^y$ ]]; then
echo -e "${DELETELIST}" | sed -e 's/^./ -x- &/;'
read -p 'Press ENTER to continue: ' input
fi
fi
LONGESTLINE=`echo -e "${DELETELIST}" | sed -e 's|^.|'${BACKUPFOLDER}'/&|' | wc -L`
# подсчитать суммарный размер файлов в мегабайтах
echo -e "${DELETELIST}" | xargs -I{} stat --format="%n:%s" "${BACKUPFOLDER}/{}" | awk -v format="%${LONGESTLINE}s %15d\n" -F: 'BEGIN{size=0}{size=size+$2; printf(format, $1, $2);} END {print "\nCommon file size: "size/1024/1024" M"}'
echo
echo "WARNING: IT WILL DESTROY THAT FILES ON THE DISK"
echo "Are you sure you want to proceed?"
read -p 'Type YES if you really want to proceed: ' input
echo
if [[ ${input} != "YES" ]]; then
echo "Ok. Aborting."
exit 1
fi
# delete records from catalog database
echo -e "${DELETELIST}" | xargs -I '{}' echo delete yes volume='{}' | bconsole
# show command and execute
echo -e "${DELETELIST}" | xargs -I '{}' echo -e rm ${BACKUPFOLDER}/'{}' | while read LINE ; do echo -e "${LINE}"; ${LINE}; done