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
.pgpass在pg_dump将运行的帐户的主目录中创建一个文件.见PostgreSQL文档libpq的-pgpass的格式(包括最后一段在那里解释,如果你不设置模式,它会被忽略的细节0600).
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)
git*_*rik 161
如果要在一个命令中执行此操作:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
Run Code Online (Sandbox Code Playgroud)
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
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)
小智 14
您可以使用以下命令将密码直接传递给 pg_dump:
pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql
Run Code Online (Sandbox Code Playgroud)
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)
干杯
如果我错了,请纠正我,但如果系统用户与数据库用户相同,PostgreSQL 不会要求输入密码 - 它依赖于系统进行身份验证。这可能是配置问题。
因此,当我希望数据库所有者postgres每晚备份他的数据库时,我可以为它创建一个 crontab:crontab -e -u postgres. 当然,postgres需要被允许执行 cron 作业;因此它必须在 中列出/etc/cron.allow,或者/etc/cron.deny必须为空。
小智 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)