我正试着创建一个cronjob,在灾难发生之前每晚备份我的数据库。看起来这个命令应该能满足我的需求:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
只是在运行之后,它要求我输入密码。如果我从cron运行它,我就做不到这一点。我怎样才能自动输入一个?
我正试着创建一个cronjob,在灾难发生之前每晚备份我的数据库。看起来这个命令应该能满足我的需求:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
只是在运行之后,它要求我输入密码。如果我从cron运行它,我就做不到这一点。我怎样才能自动输入一个?
当前回答
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
其他回答
或者您可以设置crontab来运行脚本。在这个脚本中,你可以像这样设置一个环境变量: 出口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
如本文所述,有两种方法可以非交互式地向PostgreSQL实用程序(如“pg_dump”命令)提供密码:或者使用“PGPASSWORD”环境变量。
对于单行程序,例如迁移数据库,您可以使用——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_dump [params] <[包含密码的文件路径]
对于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的内容不能以空格结尾(密码后),否则会出现错误。