![Cron 作业无法备份 Postgres 数据库](https://linux22.com/image/580540/Cron%20%E4%BD%9C%E4%B8%9A%E6%97%A0%E6%B3%95%E5%A4%87%E4%BB%BD%20Postgres%20%E6%95%B0%E6%8D%AE%E5%BA%93.png)
我不确定这里发生了什么:
我有一个可以在 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