我试图创建一个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运行它。 我怎样才能通过一个自动?
创建一个.pgpass
在该帐户的主目录文件pg_dump
会运行。 见PostgreSQL文档libpq的-pgpass的格式(包括最后一段在那里解释,如果你不将模式设置它将被忽略的细节0600
)。
或者,你可以设置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
如果你想这样做在一个命令:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
对于一衬垫,例如迁移,你可以使用一个数据库--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
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
@Josue亚历山大伊巴拉回答工作在CentOS 7和9.5版本,如果--dbname不通过。
pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase
这一个班轮帮助我,而创建一个单一的数据库转储。
PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql
纠正我,如果我错了,但如果系统用户是相同的数据库用户,PostgreSQL将不要求输入密码 - 它依赖的系统上进行验证。 这可能是配置的问题。
因此,当我想要的数据库所有者postgres
每天晚上备份数据库了,我可以为它创建一个crontab: crontab -e -u postgres
。 当然, postgres
需要被允许执行cron作业; 因此它必须在列出/etc/cron.allow
,或/etc/cron.deny
必须是空的。
使用临时.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
,以便与不同的主机账户,以确保这些凭证,可能是没有意义的。
正如详细这篇博客中,有两种方法可以非交互方式提供密码才能PostgreSQL的实用程序,如“pg_dump的”命令:使用“.pgpass”文件,或使用‘PGPASSWORD’环境变量。
需要注意的是,在Windows中, pgpass.conf
文件必须在以下文件夹:
%APPDATA%\postgresql\pgpass.conf
如果没有postgresql
内部文件夹%APPDATA%
文件夹中创建它。
该pgpass.conf
文件内容是这样的:
localhost:5432:dbname:dbusername:dbpassword
干杯
另一个(可能不安全)的方式来传递密码使用输入重定向,即主叫
pg_dump [params] < [path to file containing password]
在我看来,最简单的方法,这样的:你编辑主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
和它的工作没有密码