405

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

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

除了运行之后,它希望我输入密码。如果我从 cron 运行它,我不能这样做。我怎样才能自动传递一个?

4

17 回答 17

407

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

格式为:

hostname:port:database:username:password

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

chmod 600 ~/.pgpass

有关更多详细信息,请参阅 Postgresql 文档libpq-pgpass

于 2010-05-23T23:39:55.853 回答
281

或者您可以设置 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
于 2011-11-14T14:39:39.120 回答
231

如果您想在一个命令中执行此操作:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump
于 2014-06-11T09:13:09.747 回答
189

对于单行,如迁移数据库,您可以使用--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

于 2015-07-23T22:43:34.403 回答
75

在创建单个数据库的转储时,这一班轮可以帮助我。

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql
于 2018-12-17T04:10:06.657 回答
52
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
于 2014-07-25T10:18:29.463 回答
23

您可以使用以下命令直接将密码传递给 pg_dump:

pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql
于 2020-06-16T21:19:44.383 回答
20

如果 --dbname 未通过,@Josue Alexander Ibarra 答案适用于 centos 7 和 9.5 版。

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 
于 2017-02-02T18:07:15.250 回答
10

请注意,在 Windows 中,该pgpass.conf文件必须位于以下文件夹中:

%APPDATA%\postgresql\pgpass.conf

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

pgpass.conf文件内容类似于:

localhost:5432:dbname:dbusername:dbpassword

干杯

于 2019-03-26T18:58:35.323 回答
9

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

于 2018-12-18T14:07:27.017 回答
5

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

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

于 2013-09-17T17:26:04.900 回答
4

使用临时 .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,例如具有该ubuntu用户的 EC2 实例,因此使用.pgpass不同的主机帐户来保护这些凭证可能毫无意义。

于 2018-04-02T17:55:29.160 回答
3

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

%APPDATA%\postgresql\pgpass.conf

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

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

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

的内容pgpass.conf可能是:

*:5432:*:*:myDbPassword

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

localhost:5432:dbName:username:password

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

于 2021-05-27T10:57:34.923 回答
1

传递密码的一种安全方法是将其存储在.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

限制文件的权限 chmod 0600 /home/ubuntu/.pgpass

于 2020-09-26T09:33:48.540 回答
0

您只需要打开 pg_hba.conf 并设置对所有方法的信任。这对我有用。因此安全性为空。

于 2020-10-28T15:48:37.537 回答
-1

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

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

于 2013-05-14T09:29:21.563 回答
-4

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

它没有密码就可以工作

于 2017-07-31T17:05:04.920 回答