Bacula удаление старых томов

В процессе многолетней эксплуатации Bacula у меня возникла ситуация когда мониторинг ругался что диск заполнен, а Bacula даже не собиралась удалять старые тома. Пришлось чистить ручками.

UPDATED: Автоматизация процесса.

Запускаем консоль

# bconsole

Переходим в режим SQL запросов к каталогу

*sqlquery
Entering SQL query mode.
Terminate each query with a semicolon.
Terminate query mode with a blank line.
Enter SQL query:
Чтобы выйти из режима sqlquery нужно ввести точку.
Получаем список имён томов куда последняя запись проводилась например до 1 января 2013 года. И к каждой записи добавяется приставка в виде команды “prune yes volume=”

select concat('prune yes volume=',VolumeName) from Media where LastWritten < '2013-01-01' order by VolumeName;

На выходе список был обрамлён псевдографикой и я «выкосил» её поточным редактором sed и только после этого запостил список прямо в bconsole из клипборда. Не забудьте выйти из SQL режима bconsole.

*prune yes volume=s01.youngblog.hoster-ok.com_Monthly.2013-02-12-09-53
....

Командой приведённой ниже выводится список тех томов которые bacula «почистит» при первой необходимости в свободном пространстве для новых бэкапов. В выводе должны присутствовать тома которые были только что помечены на удаление. Эту команду нужно давать в режиме SQL запросов к каталогу как было описано ранее.

select * from Media where VolStatus = 'Purged';

При желании освободить место на диске немедленно нужно удалить тома сначала командой delete, и только потом удалить файлы с диска.
Для этого способом который приводился выше получаем такой же список но со словом delete.

select concat('delete yes volume=',VolumeName) from Media where LastWritten < '2013-01-01' order by VolumeName;

отчищаем от псевдографики и вставляем в bconsole.

* delete yes volume=s01.youngblog.hoster-ok.com_Monthly.2013-02-12-09-53

Теперь эти записи удалены из каталога что можно проверить выполнив первую команду select. Обратите внимание что команда delete удаляет только записи из каталога и все связанные с ней задания если они есть. Но она не касается файлов бэкапа которые хранятся на диске. Поэтому файлы нужно удалить вручную. Я взял этот же список из команды select и заменив в нём начало “delete yes volume=”на “rm ” с пробелом получил список команд который выполнил в bash в целевом каталоге и удалил эти самые файлы с диска. Конечно речь идёт о списке в клипборде так как select после удаления записей вернёт пустое множество.

Во время просмотра таблицы Media обнаружились записи со статусом Error я их тоже удалил. А потом такой командой проверил что вывод пустой.

select * from Media where VolStatus = 'Error';

При работе список я вставлял из клипборда прямо в bconsole. Но при желании список можно скармливать файлик через и конвеер stdin:

for vol in "список строк что скармливать"; do
  echo "delete yes volume=$vol"
done | bconsole