我正在尝试创建一个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运行它,我将无法做到这一点。如何自动传递一个?
Answers:
.pgpass
在pg_dump
将运行身份的帐户的主目录中创建一个文件。有关格式的详细信息,请参见Postgresql文档libpq-pgpass(包括最后一段,其中说明了该格式,如果未将mode设置为,则将被忽略0600
)。
sudo su postgres
:Unix用户不一定存在。不需要。但是数据库用户应该。
或者,您可以设置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
.pgpass
可以将所有内容都放在一个地方,而无需添加额外的间接层。另外,如果我只想导出变量,则可以在.bashrc
文件中执行,也可以执行。
.pgpass
文件将是更好的解决方案。我只是提供一个替代方案,虽然不确定是否值得投票:)
如果要在一个命令中执行此操作:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
postgres://
语法一起使用。没有尝试,.pgpass
因为我的postgress用户没有主目录。
对于单行代码,就像迁移数据库一样,您可以使用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
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
如果未传递--dbname,则@Josue Alexander Ibarra答案适用于centos 7和9.5版。
pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase
--dbname
请注意,在Windows中,该pgpass.conf
文件必须位于以下文件夹中:
%APPDATA%\postgresql\pgpass.conf
如果postgresql
文件夹内没有文件%APPDATA%
夹,请创建它。
该pgpass.conf
文件内容是这样的:
localhost:5432:dbname:dbusername:dbpassword
干杯
如果我错了,请纠正我,但是如果系统用户与数据库用户相同,则PostgreSQL不会要求输入密码-它依赖于系统进行身份验证。这可能是配置问题。
因此,当我希望数据库所有者postgres
每晚都备份他的数据库时,可以为其创建一个crontab crontab -e -u postgres
。当然,postgres
将需要允许执行cron作业;因此,它必须在中列出/etc/cron.allow
,或者/etc/cron.deny
必须为空。
使用临时.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
其他主机帐户来保护这些凭据可能没有意义。
history
这种方式登录到终端,不是吗?
history -c
。当与Jenkins一起使用时,请使用该Inject passwords to the build as environment variables
选项以使密码被屏蔽
传递密码的另一种(可能不安全)方法是使用输入重定向,即调用
pg_dump [params] < [path to file containing password]
您可以使用以下命令直接将密码传递到pg_dump:
pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql
在我看来,最简单的方法是:编辑主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
它没有密码就可以工作