Я уже писал о том как вручную удалять старые тома из базы и с диска. Казалось что это однократная операция. Однако пришлось делать это во второй раз. Попутно выявилась проблема с приоритетом команды 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