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

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

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


当前回答

如果我说错了请纠正我,但是如果系统用户和数据库用户是相同的,PostgreSQL将不会询问密码——它依赖于系统进行身份验证。这可能是构型的问题。

因此,当我想让数据库所有者postgres每晚备份他的数据库时,我可以为它创建一个crontab: crontab -e -u postgres。当然,postgres需要被允许执行cron作业;因此它必须列在/etc/cron.中Allow或/etc/cron.deny必须为空。

其他回答

对于Windows, pgpass.conf文件应该存在于以下路径:

%APPDATA%\postgresql\pgpass.conf

在我的Windows 10绝对路径上是:

C:\Users\Ognjen\AppData\Roaming\postgresql\pgpass.conf

注意:如果%APPDATA%中没有postgresql文件夹,请创建一个包含pgpass.conf文件的postgresql文件夹。

pgpass.conf的内容可以是:

*:5432:*:*:myDbPassword

或者更具体的内容可以是:

localhost:5432:dbName:username:password

注意:pgpass.conf的内容不能以空格结尾(密码后),否则会出现错误。

传递密码的安全方法是将其存储在.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

对于单行程序,例如迁移数据库,您可以使用——dbname,后面跟着pg_dump手册中规定的连接字符串(包括密码)

从本质上说。

pg_dump——dbname = postgresql: / /用户名:password@127.0.0.1:5432 / mydatabase

注意:请确保您使用选项——dbname而不是较短的-d,并使用有效的URI前缀postgresql://或postgres://。

一般的URI形式是:

postgresql: / /[[用户]@][netloc密码][:][/ dbname] [? param1 =港value1& ...]

在您的情况下的最佳实践(cron中的重复任务),由于安全问题,不应该这样做。如果不是.pgpass文件,我会将连接字符串保存为环境变量。

出口MYDB = postgresql: / /用户名:password@127.0.0.1:5432 / mydatabase

然后在你的crontab

= $ 0 3 * * * pg_dump——dbname MYDB | gzip > ~ /备份/ db /美元(日期+ Y % - % - % d) .psql.gz

你只需要打开pg_hba.conf并在所有方法中设置信任。这对我来说很合适。因此,安全是空的。

如果我说错了请纠正我,但是如果系统用户和数据库用户是相同的,PostgreSQL将不会询问密码——它依赖于系统进行身份验证。这可能是构型的问题。

因此,当我想让数据库所有者postgres每晚备份他的数据库时,我可以为它创建一个crontab: crontab -e -u postgres。当然,postgres需要被允许执行cron作业;因此它必须列在/etc/cron.中Allow或/etc/cron.deny必须为空。