Назад | Перейти на главную страницу

Задание Cron не может создать резервную копию базы данных Postgres

Я не уверен, что здесь происходит:

У меня есть сценарий резервного копирования, который отлично работает под root. Он создает дамп базы данных размером> 300 КБ в нужном каталоге.

Однако при запуске его как задания cron с точно такой же командой появляется пустой файл gzip, в котором ничего нет.

Журнал cron не показывает ошибок, просто команда была запущена.

Это сценарий:

#! /bin/bash

DIR="/opt/backup"
YMD=$(date "+%Y-%m-%d")
su -c "pg_dump -U postgres mydatabasename | gzip -6 > "$DIR/database_backup.$YMD.gz" " postgres

# delete backup files older than 60 days
OLD=$(find $DIR -type d -mtime +60)
if [ -n "$OLD" ] ; then
    echo deleting old backup files: $OLD
    echo $OLD | xargs rm -rfv
fi

При изменении на:

 pg_dump -U postgres mydatabasename | gzip -6 > "$DIR/database_backup.$YMD.gz"

То же самое происходит.

И работа cron:

01 10 * * * root sh /opt/daily_backup_script.sh

Он создает файл database_backup, просто пустой. Кто-нибудь знает, что здесь происходит?

редактировать:

Хорошо, упрощено до этого, но он все еще не работает через cron

#! /bin/bash

DIR="/opt/backup"
YMD=$(date "+%Y-%m-%d")

pg_dumpall -U postgres > "$DIR/database_backup.$YMD"

И

01 10 * * * root /opt/daily_backup_script.sh

Вам нужно указать полный путь к pg_dump - cron запускает свои скрипты с очень ограниченными PATH по умолчанию.

Предположения:

Я предполагаю, что ваши учетные данные для базы данных postgress хранятся в ~/.pgpass и права доступа к файлу установлены на 0600 и что вы используете PG* переменные среды.

Причина:

Причина, по которой ваша команда резервного копирования работает (создает резервную копию базы данных) при запуске с терминала и не работает (создает пустой файл) при запуске из crontab, - это среда.

Причина:

Когда вы запускаете команду в crontab (даже если вы принудительно выполняете ее от имени желаемого пользователя (например, su - root -c 'my_aesome_command') переменные среды для запрошенного пользователя отличаются от переменных среды, поскольку они устанавливаются, когда пользователь входит в терминал.

Решение:

Я исправил эту проблему, добавив переменные среды конкретного пользователя в /etc/environment файл, выполнив эту команду env >> /etc/environment когда я загружаю свой сценарий резервного копирования (фактически, когда я загружаю свой контейнер, так как я работаю с докером)