我正试着创建一个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 mydb > mydb.dump
当您在命令前加上VAR="val"前缀时,这些变量将被设置为该命令执行上下文的环境变量。所以它不会在shell会话中全局设置。根据您的情况,这可能是向pg_dump命令提供密码的合适方式。
其他回答
在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"
如本文所述,有两种方法可以非交互式地向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将运行的帐户的主目录中创建一个.pgpass文件。
格式为:
hostname:port:database:username:password
然后,将文件模式设置为0600。否则,它将被忽略。
chmod 600 ~/.pgpass
更多细节请参阅Postgresql文档libpq-pgpass。
在我看来,最简单的方法是: 编辑postgres主配置文件: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 > /备份/ db /美元(日期+ Y % - % - % d) .psql.gz
而且它不需要密码就能工作