我正试着创建一个cronjob,在灾难发生之前每晚备份我的数据库。看起来这个命令应该能满足我的需求:

0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

只是在运行之后,它要求我输入密码。如果我从cron运行它,我就做不到这一点。我怎样才能自动输入一个?


当前回答

传递密码的安全方法是将其存储在.pgpass文件中

.pgpass文件的内容格式如下:

db_host:db_port:db_name:db_user:db_pass

#Eg
localhost:5432:db1:admin:tiger
localhost:5432:db2:admin:tiger

现在,将该文件存储在权限为u=rw(0600)或更小的用户的主目录中

要查找用户的主目录,请使用 echo $ HOME

限制文件权限 Chmod 0600 /home/ubuntu/.pgpass . txt

其他回答

如果你想在一个命令中完成:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

当您在命令前加上VAR="val"前缀时,这些变量将被设置为该命令执行上下文的环境变量。所以它不会在shell会话中全局设置。根据您的情况,这可能是向pg_dump命令提供密码的合适方式。

另一种(可能不安全)传递密码的方法是使用输入重定向,即调用

Pg_dump [params] <[包含密码的文件路径]

@Josue Alexander Ibarra回答适用于centos 7和9.5版本 如果——dbname没有被传递。

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 

在pg_dump将运行的帐户的主目录中创建一个.pgpass文件。

格式为:

hostname:port:database:username:password

然后,将文件模式设置为0600。否则,它将被忽略。

chmod 600 ~/.pgpass

更多细节请参阅Postgresql文档libpq-pgpass。

这一行帮助我创建一个数据库的转储。

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql