Cron 作业无法备份 Postgres 数据库

Cron 作业无法备份 Postgres 数据库

我不确定这里发生了什么:

我有一个可以在 root 下正常运行的备份脚本。它在正确的目录中生成一个 >300kb 的数据库转储。

但是,当使用完全相同的命令将其作为 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

答案1

您需要指定完整路径pg_dump——cron 默认以非常严格的限制运行其脚本PATH

答案2

假设:

我假设您的 postgress 数据库凭据存储在中,~/.pgpass并且文件的权限设置为0600,并且您正在使用PG*环境变量。

原因:

从终端运行时备份命令有效(创建数据库备份),而从 crontab 运行时无效(创建空文件),原因是环境。

原因:

当您在 crontab 中运行命令时(即使您强制以所需用户身份执行该命令(例如su - root -c 'my_aesome_command'),请求用户的环境变量与用户登录终端时设置的环境变量不同。

解决方案:

我在加载备份脚本时(实际上是在我加载容器时,因为我正在使用 docker)/etc/environment执行此命令,将特定用户的环境变量添加到文件中,从而解决了这个问题env >> /etc/environment

相关内容