如何将密码传递给pg_dump?

mpe*_*pen 258 postgresql bash shell crontab

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

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

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

ara*_*nid 271

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

  • 用localhost创建〜/ .pgpass:5432:mydbname:postgres:mypass然后chmod 600~/.pgpass (89认同)
  • 可能有用:在Ubuntu上,"sudo su postgres"切换到"postgres"用户,然后创建.pgpass文件并执行转储. (5认同)
  • 关于 `sudo su postgres` 的注意事项:Unix 用户不一定存在。它不需要。但数据库用户应该。 (2认同)

Max*_*Max 193

或者您可以设置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
Run Code Online (Sandbox Code Playgroud)

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

git*_*rik 161

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

PGPASSWORD="mypass" pg_dump mydb > mydb.dump
Run Code Online (Sandbox Code Playgroud)

  • **文档(http://www.postgresql.org/docs/current/static/libpq-envars.html)不建议使用PGPASSWORD环境变量:_建议不要使用此环境变量安全性原因,因为某些操作系统允许非root用户通过ps查看进程环境变量; 而是考虑使用〜/ .pgpass文件_ (21认同)
  • 它仍然是一个有用的评论.有许多部署案例仍然有用. (11认同)
  • 我的观点是,在已知的未加密位置设置环境变量(您可以控制,*其中*和*如何*存储密码)要好得多.postgresql文档的这一部分是错误的,这个答案很好. (4认同)
  • 我总是收到错误消息“用户“用户名”的对等身份验证失败。解决方案是: PGPASSWORD="mypass" pg_dump -U username -h localhost > mydb.dump (2认同)
  • 我的密码中有一个“@”。这奏效了。我无法弄清楚如何使用 `postgres://` 语法使其工作。没有尝试 `.pgpass`,因为我的 postgress 用户没有主目录。 (2认同)

Jos*_*rra 115

对于单行,如迁移数据库,您可以使用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

  • 这应该是公认的答案。一根衬里,清楚。 (3认同)

Fra*_*Luz 44

$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
Run Code Online (Sandbox Code Playgroud)


小智 17

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

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 
Run Code Online (Sandbox Code Playgroud)


Aar*_*rvy 15

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

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql
Run Code Online (Sandbox Code Playgroud)

  • 帮助了很多...thnxxx (3认同)
  • 这应该是公认的答案。谢谢! (2认同)

小智 14

您可以使用以下命令将密码直接传递给 pg_dump:

pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到堆栈溢出!虽然您的答案可能有效,但它具有严重的安全隐患。**命令的参数在 ps(1) 中可见**,因此如果进程监视 ps(1),则密码就会被泄露。 (5认同)
  • 是的,@JonathanRosa,你是对的。但拉里·斯宾塞刚刚回答了这个问题。因此,如果这是在 docker 中完成的,那么安全问题就不是问题。 (2认同)

Fer*_*mes 10

请注意,在 Windows 中,该pgpass.conf文件必须位于以下文件夹中:

%APPDATA%\postgresql\pgpass.conf
Run Code Online (Sandbox Code Playgroud)

如果postgresql文件夹内没有文件%APPDATA%夹,则创建它。

pgpass.conf文件内容是这样的:

localhost:5432:dbname:dbusername:dbpassword
Run Code Online (Sandbox Code Playgroud)

干杯


小智 9

正如这篇博客文章中所详述,有两种方法可以非交互地向 PostgreSQL 实用程序(例如“pg_dump”命令)提供密码:使用“.pgpass”文件或使用“PGPASSWORD”环境变量。


Tob*_*ias 5

如果我错了,请纠正我,但如果系统用户与数据库用户相同,PostgreSQL 不会要求输入密码 - 它依赖于系统进行身份验证。这可能是配置问题。

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

  • 你就在这里。默认 Postgres 配置对本地系统帐户使用 TRUST 身份验证。然而,大多数生产设置在安装 RDBMS 后立即摆脱这个块。 (2认同)

小智 5

在Windows中,您可以在使用pg_dump.exe之前使用密码设置变量,并且可以在bat文件中自动执行所有操作,例如:

C:\>SET PGPASSWORD=dbpass
C:\>"folder_where_is_pg_dump\pg_dump.exe" -f "dump_file" -h "db_host" -U db_usr --schema "db_schema" "db_name"
Run Code Online (Sandbox Code Playgroud)