如何密码传递给pg_dump的?如何密码传递给pg_dump的?(How to pass in pa

2019-05-12 18:15发布

我试图创建一个cronjob每天晚上备份我的数据库有灾难性发生之前。 它看起来像这个命令应该满足我的需求:

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

除了运行后,它希望我在键入密码。 我不能这样做,如果我从cron运行它。 我怎样才能通过一个自动?

Answer 1:

创建一个.pgpass在该帐户的主目录文件pg_dump会运行。 见PostgreSQL文档libpq的-pgpass的格式(包括最后一段在那里解释,如果你不将模式设置它将被忽略的细节0600 )。



Answer 2:

或者,你可以设置crontab来运行的脚本。 内部的脚本,您可以这样设置环境变量: export PGPASSWORD="$put_here_the_password"

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

我同意约书亚,使用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


Answer 3:

如果你想这样做在一个命令:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump


Answer 4:

对于一衬垫,例如迁移,你可以使用一个数据库--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文件我会保存连接字符串作为一个环境变量。

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



Answer 5:

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


Answer 6:

@Josue亚历山大伊巴拉回答工作在CentOS 7和9.5版本,如果--dbname不通过。

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 


Answer 7:

这一个班轮帮助我,而创建一个单一的数据库转储。

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


Answer 8:

纠正我,如果我错了,但如果系统用户是相同的数据库用户,PostgreSQL将不要求输入密码 - 它依赖的系统上进行验证。 这可能是配置的问题。

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



Answer 9:

使用临时.pgpass凭据并推到S3在具有密码的ssh备份:

#!/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用户可以须藤,例如EC2实例与ubuntu用户,因此使用.pgpass ,以便与不同的主机账户,以确保这些凭证,可能是没有意义的。



Answer 10:

正如详细这篇博客中,有两种方法可以非交互方式提供密码才能PostgreSQL的实用程序,如“pg_dump的”命令:使用“.pgpass”文件,或使用‘PGPASSWORD’环境变量。



Answer 11:

需要注意的是,在Windows中, pgpass.conf文件必须在以下文件夹:

%APPDATA%\postgresql\pgpass.conf

如果没有postgresql内部文件夹%APPDATA%文件夹中创建它。

pgpass.conf文件内容是这样的:

localhost:5432:dbname:dbusername:dbpassword

干杯



Answer 12:

另一个(可能不安全)的方式来传递密码使用输入重定向,即主叫

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



Answer 13:

在我看来,最简单的方法,这样的:你编辑主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

和它的工作没有密码



文章来源: How to pass in password to pg_dump?