我正在尝试创建一个cronjob,以便在发生灾难性事件之前每晚备份我的数据库.看起来这个命令应该满足我的需求:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
除了运行之后,它希望我输入密码.如果我从cron运行它,我不能这样做.我怎样才能自动传递一个?
.pgpass
在pg_dump
将运行的帐户的主目录中创建一个文件.见PostgreSQL文档libpq的-pgpass的格式(包括最后一段在那里解释,如果你不设置模式,它会被忽略的细节0600
).
或者您可以设置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
如果要在一个命令中执行此操作:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
对于单行,如迁移数据库,您可以使用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
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
@Josue Alexander Ibarra答案适用于centos 7和9.5版,如果没有传递--dbname.
pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase
在创建单个数据库的转储时,这一行可以帮助我。
PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql