UMGUM.COM (лучше) 

Bacula + PostgreSQL backup ( Резервное копирование "баз данных" PostgreSQL посредством Bacula. )

12 ноября 2010  (обновлено 22 января 2019)

OS: "Linux Debian 6/7/8/9 (Squeeze/Wheezy/Jessie/Stretch)".
Application: "Bacula 5.2/7.4", "pg_dumpall" и "pg_basebackup".

Задача: наладить выгрузку резервной копии "баз данных" СУБД "PostgreSQL" посредством "Bacula".

Резервное копирование содержимого "баз данных" прямым копированием из файлов как правило невозможно и требуется предварительная выгрузка консистентного "дампа" в заранее известную директорию. Сделаем это, воспользовавшись встроенной возможностью "Bacula" исполнения произвольных скриптов на стороне клиента до и после процедуры непосредственного резервного копирования.


Предварительная настройка СУБД.

Есть два способа получить резервную копию "баз данных" PostgreSQL: выгрузка SQL-дампа и снятие "бинарного дампа".

Подготавливать к выгрузке SQL-дампа сервер СУБД не требуется. Нужен только доступ от имени обладающего достаточными привилегиями пользователя - но процедуры резервного копирования обычно запускаются в контексте суперпользователя, что снимает все ограничения.

К снятию "бинарного дампа" нужно готовиться, изменяя настройки сервера СУБД. Процедура детально описана в отдельной инструкции.

Конфигурирование "Bacula".

Дополняем описание задания резервного копирования сервиса "PostgreSQL" следующими блоками конфигурации, в зависимости от выбранного способа.

Выгрузка SQL-дампа:

# vi /etc/bacula/client.d/example.net.conf

....
FileSet {
....

  Include {
    ....

    # Директория резервных копий "дампов баз данных"
    File = "/var/backups/bacula-pg_dump"
  }
}
....

Job {
  Name = "example.net"
  Type = Backup
  ....

  # Запуск выгрузки резервной копии всех локальных "баз данных" PostgreSQL в формате SQL:
  RunScript {
    RunsWhen = Before
    FailJobOnError = No

    # Зачищаем и воссоздаём место для сохранения "дампа"
    Command = "rm -rf /var/backups/bacula-pg_dump"
    Command = "mkdir -p /var/backups/bacula-pg_dump"
    Command = "chown -R postgres:postgres /var/backups/bacula-pg_dump"

    # Запускаем выгрузку резервной копии БД
    Command = "/bin/bash -c 'sudo -u postgres pg_dumpall --clean --inserts --verbose --file=/var/backups/bacula-pg_dump/`date +\"%%Y-%%m-%%d_%%H:%%M\"`.sql 2>/var/log/bacula-pg_dump.log'"
  }
  #
  RunScript {
    RunsWhen = After
    RunsOnFailure = yes

    # По завершению всех процедур задания высвобождаем ресурсы
    Command = "rm -rf /var/backups/bacula-pg_dump"
  }
}

Снятие "бинарного дампа":

# vi /etc/bacula/client.d/example.net.conf

....
FileSet {
....

  Include {
    ....

    # Директория резервных копий "дампов баз данных"
    File = "/var/backups/bacula-pg_basebackup"
  }
}
....

Job {
  Name = "example.net"
  Type = Backup
  ....

  # Запуск выгрузки "бинарной" резервной копии всех локальных "баз данных" PostgreSQL:
  RunScript {
    RunsWhen = Before
    FailJobOnError = No

    # Зачищаем и воссоздаём место для сохранения "дампа"
    Command = "rm -rf /var/backups/bacula-pg_basebackup"
    Command = "mkdir -p /var/backups/bacula-pg_basebackup"
    Command = "chown -R postgres:postgres /var/backups/bacula-pg_basebackup"

    # Запускаем выгрузку резервной копии БД
    Command = "/bin/bash -c 'sudo -u postgres pg_basebackup -v -P -X fetch -R -D /var/backups/bacula-pg_basebackup 2>/var/log/bacula-pg_basebackup.log'"
  }
  #
  RunScript {
    RunsWhen = After
    RunsOnFailure = yes

    # По завершению всех процедур задания высвобождаем ресурсы
    Command = "rm -rf /var/backups/bacula-pg_basebackup"
  }
}

Проверяем корректность конфигурации и применяем таковую:

# bacula-dir -c /etc/bacula/bacula-dir.conf -t
# /etc/init.d/bacula-dir reload

Выше я заворачиваю содержимое директивы "Command" в дополнительный контейнер из "/bin/bash" - это требуется потому, что по умолчанию "Bacula FD" запускает свои команды в интерпретаторе "Dash", синтаксис которого отличается от привычного мне "Bash".


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )