我正在尝试创建一个cronjob,以便在发生灾难性事件之前每晚备份我的数据库。看起来这个命令应该满足我的需求:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
除了运行之后,它希望我输入密码。如果我从cron运行它,我不能这样做。我怎样才能自动传递一个?
答案 0 :(得分:247)
在.pgpass
将运行的帐户的主目录中创建pg_dump
文件。有关格式的详细信息,请参阅Postgresql文档libpq-pgpass(如果未将模式设置为0600
,则包括解释它的最后一段将被忽略)。
答案 1 :(得分:180)
或者您可以设置crontab来运行脚本。在该脚本中,您可以设置如下环境变量:
export PGPASSWORD="$put_here_the_password"
这样,如果您有多个需要密码的命令,您可以将它们全部放在脚本中。如果密码发生变化,您只需在一个地方(脚本)进行更改。
我同意约书亚,使用pg_dump -Fc
生成最灵活的导出格式并且已经压缩。有关详细信息,请参阅:pg_dump documentation
E.g。
# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump
# restore the database
pg_restore -d newdb db.dump
答案 2 :(得分:141)
如果您想在一个命令中执行此操作:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
答案 3 :(得分:106)
对于单行,例如迁移数据库,您可以使用--dbname
后跟连接字符串(包括密码),如pg_dump manual
本质上。
pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase
注意:确保使用选项--dbname
而不是较短的-d
,并使用有效的URI前缀postgresql://
或{{1} }。
常规URI表单是:
postgres://
在您的情况下的最佳做法(cron中的重复性任务)由于安全问题,不应该这样做。如果它不是postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
文件,我会将连接字符串保存为环境变量。
.pgpass
然后在你的crontab中
export MYDB=postgresql://username:password@127.0.0.1:5432/mydatabase
答案 4 :(得分:42)
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
答案 5 :(得分:16)
@Josue Alexander Ibarra回答适用于centos 7和9.5版 如果未传递--dbname。
pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase
答案 6 :(得分:9)
这一行可以帮助我创建单个数据库的转储。
PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql
答案 7 :(得分:5)
您可以使用以下命令直接将密码传递到pg_dump:
pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql
答案 8 :(得分:4)
如果我错了,请纠正我,但如果系统用户与数据库用户相同,PostgreSQL将不会要求输入密码 - 它依赖于系统进行身份验证。这可能是配置问题。
因此,当我希望数据库所有者postgres
每晚备份他的数据库时,我可以为它创建一个crontab:crontab -e -u postgres
。当然,需要允许postgres
执行cron作业;因此,它必须列在/etc/cron.allow
中,或/etc/cron.deny
必须为空。
答案 9 :(得分: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实例,因此使用{{1}
答案 10 :(得分:3)
如this blog post中所述,有两种方法以非交互方式向PostgreSQL实用程序提供密码,例如“ pg_dump”命令:使用“。pgpass” 文件或使用“ PGPASSWORD” 环境变量。
答案 11 :(得分:1)
对于 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
的内容不能以空格(密码后)结尾,否则会发生错误。
答案 12 :(得分:0)
请注意,在Windows中,pgpass.conf
文件必须位于以下文件夹中:
%APPDATA%\postgresql\pgpass.conf
如果postgresql
文件夹中没有%APPDATA%
文件夹,请创建它。
pgpass.conf
文件的内容类似于:
localhost:5432:dbname:dbusername:dbpassword
欢呼
答案 13 :(得分:0)
通过密码的一种安全方法是将其存储在.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
答案 14 :(得分:0)
您只需要打开pg_hba.conf并设置所有方法的信任即可。那对我有用。因此,安全性为空。
答案 15 :(得分:-1)
另一种(可能不安全)传递密码的方法是使用输入重定向,即调用
pg_dump [params] < [path to file containing password]
答案 16 :(得分:-3)
在我看来最简单的方法,这个: 你编辑主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
它没有密码