如何将密码传递给pg_dump?
我正在尝试创build一个cronjob来备份我的数据库,每晚在发生灾难之前。 看起来这个命令应该满足我的需求:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
除了运行后,它希望我input一个密码。 如果我从cron运行它,我不能这样做。 我怎么能自动通过一个?
在pg_dump将运行的帐户的主目录中创build一个.pgpass文件:有关格式的详细信息,请参阅http://www.postgresql.org/docs/current/static/libpq-pgpass.html (包括最后一段在这里解释它将被忽略,如果你没有设置模式为0600)。
或者你可以设置crontab来运行一个脚本。 在这个脚本里面你可以像这样设置一个环境variables: export PGPASSWORD="$put_here_the_password"
这样,如果你有多个需要密码的命令,你可以把它们全部放在脚本中。 如果密码更改,则只需在一个地方更改(脚本)。
我同意约书亚,使用pg_dump -Fc
生成最灵活的导出格式,并已压缩。 欲了解更多信息,请参阅: pg_dump文档
例如
# dump the database in custom-format archive pg_dump -Fc mydb > db.dump # restore the database pg_restore -d newdb db.dump
如果你想用一个命令来做:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
对于单线程,如迁移数据库,可以使用--dbname
后跟一个连接string(包括密码),如pg_dump手册中所述
在本质上。
pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase
注意:请确保使用选项--dbname
而不是--dbname
-d
并使用有效的URI前缀postgresql://
或postgres://
。
一般的URIforms是:
postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
在你的情况下最好的做法(在cron中的重复任务)这不应该由于安全问题。 如果它不是.pgpass
文件,我会将连接string保存为一个环境variables。
export MYDB=postgresql://username:password@127.0.0.1:5432/mydatabase
然后在你的crontab中
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
如果我错了,纠正我,但如果系统用户与数据库用户相同,PostgreSQL将不会要求input密码 – 它依赖于系统进行身份validation。 这可能是一个configuration问题。
因此,当我希望数据库所有者postgres
每天晚上备份他的数据库时,我可以为它创build一个crontab: crontab -e -u postgres
。 当然, postgres
需要被允许执行cron作业; 因此它必须列在/etc/cron.allow
,否则/etc/cron.deny
必须为空。
@Josue亚历山大Ibarra答案工作在centos 7和9.5版本,如果–dbname没有通过。
pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase
另一个(可能不安全)的方式来传递密码是使用inputredirect即调用
pg_dump [params] < [path to file containing password]
在我看来,这是最简单的方法:你编辑你的主要postgresconfiguration文件:pg_hba.conf那里你必须添加以下行:
host <you_db_name> <you_db_owner> 127.0.0.1/32 trust
在此之后,您需要启动您的cron:
pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz
它没有密码工作