web-dev-qa-db-ja.com

pg_dumpにパスワードを渡すにはどうすればいいですか?

私は毎晩私のデータベースをバックアップするためのcronjobを作成しようとしています。このコマンドは私のニーズを満たすはずです。

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

それを実行した後を除いて、それは私がパスワードを入力することを期待しています。 cronから実行するとそれはできません。自動的に引き渡す方法は?

232
mpen

.pgpassを実行するアカウントのホームディレクトリにpg_dumpファイルを作成します。フォーマットの詳細についてはPostgresqlのドキュメント libpq-pgpass を参照してください(モードが0600に設定されていない場合は無視されます)。

247
araqnid

あるいは、スクリプトを実行するようにcrontabを設定することもできます。そのスクリプトの中で、あなたはこのような環境変数を設定することができます:export PGPASSWORD="$put_here_the_password"

このように、パスワードを必要とするコマンドが複数ある場合は、それらすべてをスクリプトに含めることができます。パスワードが変わった場合は、一箇所で変更するだけです(スクリプト)。

pg_dump -Fcを使用すると最も柔軟なエクスポート形式が生成され、すでに圧縮されているので、Joshuaに同意します。詳細については、 pg_dumpのドキュメント を参照してください。

例えば。

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump
181
Max

あなたが1つのコマンドでそれをしたいならば:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump
143
gitaarik

データベースを移行するようなワンライナーの場合は、 pg_dump manual に記述されているように--dbnameの後に接続文字列(パスワードを含む)を続けることができます。

本質的に。

pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase

注:短い--dbnameの代わりにオプション-dを使用し、有効なURI接頭部postgresql://またはpostgres://を使用するようにしてください。

一般的なURI形式は次のとおりです。

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

あなたの場合のベストプラクティス(cronでの繰り返しのタスク)これはセキュリティ問題のために行われるべきではありません。もしそれが.pgpassファイル用でなければ、接続文字列を環境変数として保存します。

export MYDB=postgresql://username:[email protected]:5432/mydatabase

それからあなたのcrontabに持ってください

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

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

--dbnameが渡されない場合、@ Jose Alexander Ibarraの回答はcentos 7とバージョン9.5で機能します。

pg_dump postgresql://username:[email protected]:5432/mydatabase 
16
Jauyzed

単一のデータベースのダンプを作成しながら、この1つのライナーは私を助けます。

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

一時的な.pgpass資格情報とS3へのプッシュを使用して、パスワードでsshでバックアップします。

#!/usr/bin/env bash
cd "$(dirname "$0")"

DB_Host="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_Host="[email protected]_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バックアップ部分に興味がない人は、それを取り出してください-当然です。

環境によっては、デフォルトのSSHユーザーがパスワードなしでSudoを実行できるため、このスクリプトは.pgpassの資格情報を削除します。たとえば、ubuntuユーザーを持つEC2インスタンスは、異なるホストアカウントで.pgpassを使用してそれらを保護します資格情報は無意味かもしれません。

4
MikeM

私の間違いであれば訂正してください。しかし、システムユーザーがデータベースユーザーと同じであれば、PostgreSQLはパスワードを要求しません - 認証はシステムに依存します。これは設定の問題かもしれません。

したがって、データベースの所有者postgresが毎晩自分のデータベースをバックアップするようにしたい場合は、そのためのcrontabを作成できます。crontab -e -u postgres。もちろん、postgresはcronジョブの実行を許可される必要があります。したがって、/etc/cron.allowにリストされているか、/etc/cron.denyが空である必要があります。

4
Tobias

このブログ記事 で詳しく説明されているように、 "pg_dump"コマンドのようにPostgreSQLユーティリティに非対話的にパスワードを提供する方法は2つあります。 "。pgpass"を使うファイルを使用するか、 "PGPASSWORD"環境変数を使用する。

3
manfall19

Windowsでは、pgpass.confファイルは次のフォルダになければなりません。

%APPDATA%\postgresql\pgpass.conf

%APPDATA%フォルダー内にpostgresqlフォルダーがない場合は作成します。

pgpass.confファイルの内容は次のようなものです。

localhost:5432:dbname:dbusername:dbpassword

乾杯