当前位置:  开发笔记 > 编程语言 > 正文

如何将密码传递给pg_dump?

如何解决《如何将密码传递给pg_dump?》经验,为你挑选了7个好方法。

我正在尝试创建一个cronjob,以便在发生灾难性事件之前每晚备份我的数据库.看起来这个命令应该满足我的需求:

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

除了运行之后,它希望我输入密码.如果我从cron运行它,我不能这样做.我怎样才能自动传递一个?



1> araqnid..:

.pgpasspg_dump将运行的帐户的主目录中创建一个文件.见PostgreSQL文档libpq的-pgpass的格式(包括最后一段在那里解释,如果你不设置模式,它会被忽略的细节0600).


用localhost创建〜/ .pgpass:5432:mydbname:postgres:mypass然后chmod 600~/.pgpass
可能有用:在Ubuntu上,"sudo su postgres"切换到"postgres"用户,然后创建.pgpass文件并执行转储.

2> Max..:

或者您可以设置crontab来运行脚​​本.在该脚本中,您可以设置如下环境变量: export PGPASSWORD="$put_here_the_password"

这样,如果您有多个需要密码的命令,您可以将它们全部放在脚本中.如果密码更改,您只需在一个位置(脚本)更改密码.

我同意Joshua,使用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


我没有投票.那是别的; 我不认为这也是一个暗示.有一个+1来弥补它.
我可以看到为什么`.pgpass`文件会是一个更好的解决方案.我只是给了一个替代品,不知道它是否值得一个downvote虽然:)
**文档**(http://www.postgresql.org/docs/current/static/libpq-envars.html)建议不要设置PGPASSWORD环境变量:_建议不要使用此环境变量安全性原因,因为某些操作系统允许非root用户通过ps查看进程环境变量; 而是考虑使用〜/ .pgpass文件_
这么多仇敌.我很欣赏这个答案,并将其用于我自己的应用程序.
这不太理想.将它放在`.pgpass`中也可以将所有内容保存在一个地方,而无需添加额外的间接层.另外,如果我想导出一个变量,我会在我的`.bashrc`文件中做这个,或者不管它是什么.
在某些环境中,例如Ubuntu EC2实例上的AWS,默认的“ ubuntu”用户可以在不使用密码的情况下进行sudo操作,因此使用环境变量的安全性并不是很低。实际上,与将.pgpass文件保留在磁盘上供该“ ubuntu”用户访问相比,使用环境变量可能更安全,然后再将其删除。
这实际上是docker容器的首选方式。

3> gitaarik..:

如果要在一个命令中执行此操作:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump


**文档(http://www.postgresql.org/docs/current/static/libpq-envars.html)不建议使用PGPASSWORD环境变量:_建议不要使用此环境变量安全性原因,因为某些操作系统允许非root用户通过ps查看进程环境变量; 而是考虑使用〜/ .pgpass文件_
它仍然是一个有用的评论.有许多部署案例仍然有用.
我的观点是,在已知的未加密位置设置环境变量(您可以控制,*其中*和*如何*存储密码)要好得多.postgresql文档的这一部分是错误的,这个答案很好.

4> Josue Alexan..:

对于单行,如迁移数据库,您可以使用pg_dump手册--dbname中所述的连接字符串(包括密码)

在本质上.

pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase

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

一般的URI形式是:

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

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

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


这应该是公认的答案。一根衬里,清楚。

5> Francisco Lu..:
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename



6> 小智..:

@Josue Alexander Ibarra答案适用于centos 7和9.5版,如果没有传递--dbname.

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



7> Aarvy..:

在创建单个数据库的转储时,这一行可以帮助我。

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

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有