pg_dumpにパスワードを渡す方法は?


294

壊滅的な事態が発生する前に、毎晩データベースをバックアップするcronjobを作成しようとしています。このコマンドは私のニーズを満たしているようです:

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

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


pg_restoreの自動化について書いた可能性のある役立つ投稿!medium.com/@trinity/…–
kittyminky

ここで接続文字列を使用して回答:stackoverflow.com/a/29101292/1579667
Benj

回答:


304

実行.pgpassするアカウントのホームディレクトリにファイルを作成しますpg_dump。形式の詳細については、Postgresqlのドキュメントlibpq-pgpassを参照してください(モードをに設定しないと無視されることを説明する最後の段落を含む0600)。


99
localhost:5432:mydbname:postgres:mypassを使用して〜/ .pgpassを作成し、その後chmod 600〜/ .pgpass
Mircea Stanciu

6
おそらく役立つ:Ubuntuでは、「sudo su postgres」で「postgres」ユーザーに切り替えてから、.pgpassファイルを作成してダンプを実行します。
fivedogit

1
私はあなたの答えに従いましたが、それでもバックアップファイルを正常に作成できませんでした。私のリンクをご覧ください:unix.stackexchange.com/questions/257898/…。ありがとうございました。
alyssaeliyah 2016年

9.6.2で動作します:o)
Andrew

2
注意sudo su postgres:Unixユーザーは必ずしも存在しません。必要はありません。しかし、DBユーザーはそうすべきです。
Fabien Haddadi、2018

216

または、crontabを設定してスクリプトを実行することもできます。このスクリプト内で、次のように環境変数を設定できます。 export PGPASSWORD="$put_here_the_password"

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

ジョシュアにも同意します。使用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

3
これは理想的ではありません。それを投入すると、.pgpass間接的なレイヤーを追加することなく、すべてを1か所に保持できます。さらに、変数のエクスポートでやりたいことがすべてある場合は、.bashrcファイルまたはそれが何であれそれを行います。
mpen 2011年

9
.pgpassファイルがより良い解決策になる理由がわかります。私はちょうどそれが:)しかしdownvoteに値するないように注意してください場合は、代替手段を与えていた
マックス

13
私は反対票を投じなかった。それは別の誰かでした。私もそれが反対投票を正当化するとは思わなかった。それを補うために+1を持っています。
mpen 2011年

7
とても嫌いです。私はこの答えに感謝し、自分のアプリケーションに採用しています。
James T Snell

8
ドキュメントpostgresql.org/docs/current/static/libpq-envars.htmlでは、PGPASSWORD環境変数の設定は推奨されていません。この環境変数の使用は、セキュリティ上の理由からお勧めできません。 rootユーザーは、psを介してプロセス環境変数を表示します。代わりに〜/ .pgpassファイルの使用を検討してください
bouchon

175

1つのコマンドで実行する場合:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

27
ドキュメント(postgresql.org/docs/current/static/libpq-envars.htmlでは、PGPASSWORD環境変数の設定は推奨されていません。この環境変数の使用は、セキュリティ上の理由からお勧めできません。 rootユーザーは、psを介してプロセス環境変数を表示します。代わりに〜/ .pgpassファイルの使用を検討してください
bouchon

18
それはまだ有用なコメントです。これがまだ役立つ展開ケースはたくさんあります。
Iain Duncan

1
「ユーザー「username」のピア認証が失敗しました」というエラーが常に表示されました。解決策:PGPASSWORD = "mypass" pg_dump -U username -h localhost> mydb.dump
Martin Pabst

4
私の意見では、暗号化されていない既知の場所と同じように、環境変数(ユーザーが制御できる場所、パスワードをどこどのように格納するか)を設定する方がはるかに良いと思います。postgresql docのこの部分は不完全であり、この答えは良いものです。
peterh-モニカを2017年

1
パスワードに「@」が含まれていました。これはうまくいきました。postgres://構文で動作させる方法を理解できませんでした。.pgpass私のpostgressユーザーがホームディレクトリを持っていないため、試さなかった。
jmathew 2017

136

ワンライナーの場合、データベースの移行と同様--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


Postgreのバージョン9.1は、dbnameに不明なオプションを出力します
akohout

これは、archおよびRHELのバージョン9.4および9.3でそれぞれテストされました。接続文字列を投稿できますか?もちろん匿名化。
Josue Alexander Ibarra 2015年

ありがとう、@ JosueIbarra。PostgreSQL 9.3、Ubuntu 14.04でテスト済み。
Cao Minh Tu

1
@EntryLevelRあなたはそれを保存するためにファイルに出力をパイプする必要があります。この関連する質問を参照してくださいaskubuntu.com/questions/420981/…–
Josue Alexander Ibarra

4
これは受け入れられる答えになるはずです。1つのライナー、クリア。
swdev

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

いいのですが、残念ながらうまくいきません。「クエリが失敗しました:エラー:リレーションdirection_lookupのアクセスが拒否されました」
James T Snell

@Doc必要な権限をpgユーザーに与えようとしましたか?
Francisco Luz

33

この1つのライナーは、単一のデータベースのダンプを作成するときに役立ちます。

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

1
たくさん助けてくれました... thnxxx
ronit

19

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

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 

1
あなたが正しい、それはそのように見えるはずです、私は数年前に間違っていたのは私のシェル構成だったと思います。だからこそ、私が使用することが不可欠でした--dbname
Josue Alexander Ibarra

7

Windowsでは、pgpass.confファイルは次のフォルダにある必要があります。

%APPDATA%\postgresql\pgpass.conf

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

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

localhost:5432:dbname:dbusername:dbpassword

乾杯


4

私が間違っている場合は修正してください。ただし、システムユーザーがデータベースユーザーと同じである場合、PostgreSQLはパスワードを要求しません。認証はシステムに依存しています。これは構成の問題である可能性があります。

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


あなたはちょっとここにいます。デフォルトのPostgres構成は、ローカルシステムアカウントにTRUST認証を使用します。ただし、RDBMSをインストールするとすぐに、ほとんどの本番環境のセットアップでこのブロックが取り除かれます。
Jacek Prucia、2014

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これらの認証情報を保護するために別のホストアカウントで使用しても意味がない場合があります。


パスワードはhistoryこの方法で端末に記録されますか?
mpen

1
@mpenローカル、はい。リモートではありません。私の場合、リモートアクセスを許可しない安全なVMであるため、ローカル履歴に保持しても問題ありません。あなたのケースでそれがOKではない場合は、ちょうどしてくださいhistory -c。Jenkinsで使用するInject passwords to the build as environment variables場合は、オプションを使用してパスワードをマスクします
MikeM

4

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


-1

パスワードを渡す別の(おそらく安全ではない)方法は、入力リダイレクト、つまり呼び出しを使用することです

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


セキュリティについて-このファイルは、対象のユーザーのみが読み取り可能である必要があります。ただし、root権限を持つユーザーはセキュリティ設定を変更できるため、暗号化されていないパスワードを読み取ることができます。はい、これは安全ではありません...
Tobias

3
@トビアスは代替手段はありますか?root権限を持つユーザーは、パスワードを対話形式で入力する以外の方法に関係なく、常にパスワードを見ることができるように見えます(質問はcronに関するものです)。postgresql.org/docs/9.3/static/auth-methods.html#GSSAPI-AUTHはシングルサインオンをサポートするGSSAPIについて言及していますが、それが非対話的に機能する場合は言及していません。
ロスブラッドベリ、

4
root権限を持つユーザーは、推奨される方法である.pgpassも読み取ることができます。したがって、ルートアクセスをセキュリティリスクとは見なしません。
最大

-1

以下を使用して、pg_dumpに直接パスワードを渡すことができます。

pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql

Stack Overflowへようこそ!あなたの答えはうまくいくかもしれませんが、それは深刻なセキュリティ上の影響を持っています。コマンドの引数はps(1)に表示されるため、プロセスがps(1)を監視している場合、パスワードが危険にさらされます。
Jonathan Rosa

-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

そしてそれはパスワードなしで働いた


そして、あなたはシステムのセキュリティを破壊しました。開発ボックスには問題ありませんが、他には何もありません。
セオドアR.スミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.