如何将密码传递给pg_dump?

我正试着创建一个cronjob,在灾难发生之前每晚备份我的数据库。看起来这个命令应该能满足我的需求:

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

只是在运行之后,它要求我输入密码。如果我从cron运行它,我就做不到这一点。我怎样才能自动输入一个?

415090 次浏览

在将要运行pg_dump的帐户的主目录中创建一个.pgpass文件。

格式为:

hostname:port:database:username:password

然后,将文件的模式设置为0600。否则,它将被忽略。

chmod 600 ~/.pgpass

更多细节请参见Postgresql文档libpq-pgpass

或者你可以设置crontab来运行脚本。在这个脚本中,你可以像这样设置一个环境变量: export PGPASSWORD="$put_here_the_password" < / p >

这样,如果您有多个需要密码的命令,您可以将它们都放在脚本中。如果密码改变了,你只需要在一个地方(脚本)修改它。

我同意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

另一种(可能不安全)传递密码的方法是使用输入重定向,即调用

pg_dump [params] < [path to file containing password]

如果我说错了请纠正我,但是如果系统用户和数据库用户是相同的,PostgreSQL将不会询问密码——它依赖于系统进行身份验证。这可能是构型的问题。

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

如果你想在一个命令中完成:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

当你在命令前加上VAR="val" 前缀时,这些变量将被设置为该命令执行上下文的环境变量。所以它不会在shell会话中全局设置。根据您的情况,这可能是为pg_dump命令提供密码的适当方式。

$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename

对于一行程序,比如迁移数据库,你可以使用--dbname,后面跟着一个连接字符串(包括密码),就像pg_dump手册

从本质上说。

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文件,我会将连接字符串保存为环境变量。

< p > <代码>出口MYDB = postgresql: / /用户名:password@127.0.0.1:5432 / mydatabase < /代码> < / p >

然后在你的crontab

0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

@Josue Alexander Ibarra回答适用于centos 7和9.5版本 如果——dbname没有被传递。< / p >
pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase

在我看来最简单的方法是: 编辑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 > /backup/db/$(date +%Y-%m-%d).psql.gz

而且它不需要密码就能工作

使用临时的.pgpass凭据通过ssh备份密码并推送到S3:

#!/usr/bin/env bash
cd "$(dirname "$0")"


DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="my_user@host.my_domain.com"
BUCKET_PATH="bucket_name/backup"


if [ $# -ne 2 ]; then
echo "Error: 2 arguments required"
echo "Usage:"
echo "  my-backup-script.sh <DB-name> <password>"
echo "  <DB-name> = The name of the DB to backup"
echo "  <password> = The DB password, which is also used for GPG encryption of the backup file"
echo "Example:"
echo "  my-backup-script.sh my_db my_password"
exit 1
fi


DATABASE=$1
PASSWORD=$2


echo "set remote PG password .."
echo "$DB_HOST:5432:$DATABASE:$DB_USER:$PASSWORD" | ssh "$SSH_HOST" "cat > ~/.pgpass; chmod 0600 ~/.pgpass"
echo "backup over SSH and gzip the backup .."
ssh "$SSH_HOST" "pg_dump -U $DB_USER -h $DB_HOST -C --column-inserts $DATABASE" | gzip > ./tmp.gz
echo "unset remote PG password .."
echo "*********" | ssh "$SSH_HOST" "cat > ~/.pgpass"
echo "encrypt the backup .."
gpg --batch --passphrase "$PASSWORD" --cipher-algo AES256 --compression-algo BZIP2 -co "$DATABASE.sql.gz.gpg" ./tmp.gz


# Backing up to AWS obviously requires having your credentials to be set locally
# EC2 instances can use instance permissions to push files to S3
DATETIME=`date "+%Y%m%d-%H%M%S"`
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/"$DATETIME".sql.gz.gpg
# s3 is cheap, so don't worry about a little temporary duplication here
# "latest" is always good to have because it makes it easier for dev-ops to use
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/latest.sql.gz.gpg


echo "local clean-up .."
rm ./tmp.gz
rm "$DATABASE.sql.gz.gpg"


echo "-----------------------"
echo "To decrypt and extract:"
echo "-----------------------"
echo "gpg -d ./$DATABASE.sql.gz.gpg | gunzip > tmp.sql"
echo
显然,只需要用你需要的任何东西替换前两行配置。 对于那些对S3备份部分不感兴趣的人,显然可以将其删除

该脚本随后删除.pgpass中的凭据,因为在某些环境中,默认的SSH用户可以不需要密码就可以执行sudo,例如,EC2实例的ubuntu用户,因此使用.pgpass和不同的主机帐户来保护这些凭据,可能是毫无意义的。

这一行帮助我创建一个数据库的转储。

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql

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

注意,在windows中,pgpass.conf文件必须在以下文件夹中:

%APPDATA%\postgresql\pgpass.conf

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

pgpass.conf文件内容类似于:

localhost:5432:dbname:dbusername:dbpassword

干杯

您可以通过以下方式直接将密码传递到pg_dump:

pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql

传递密码的安全方法是将其存储在.pgpass文件中

.pgpass文件的内容格式为:

db_host:db_port:db_name:db_user:db_pass


#Eg
localhost:5432:db1:admin:tiger
localhost:5432:db2:admin:tiger


现在,将该文件存储在权限为u=rw (0600) or less的用户的主目录中

查找用户的主目录,使用 echo $HOME < / p >

限制文件权限 chmod 0600 /home/ubuntu/.pgpass < / p >

你只需要打开pg_hba.conf并在所有方法中设置信任。这对我来说很合适。因此,安全是空的。

对于Windows, pgpass.conf文件应该存在于以下路径:

%APPDATA%\postgresql\pgpass.conf

在我的Windows 10绝对路径上是:

C:\Users\Ognjen\AppData\Roaming\postgresql\pgpass.conf

Note:如果在%APPDATA%中没有postgresql文件夹,创建一个包含pgpass.conf文件的文件夹。

pgpass.conf的内容可以是:

*:5432:*:*:myDbPassword

或者更具体的内容可以是:

localhost:5432:dbName:username:password

Note: pgpass.conf的内容不能以空格(密码后)结束,否则将发生错误。

在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"