壊滅的な事態が発生する前に、毎晩データベースをバックアップする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
)。
sudo su postgres
:Unixユーザーは必ずしも存在しません。必要はありません。しかし、DBユーザーはそうすべきです。
または、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
.pgpass
間接的なレイヤーを追加することなく、すべてを1か所に保持できます。さらに、変数のエクスポートでやりたいことがすべてある場合は、.bashrc
ファイルまたはそれが何であれそれを行います。
.pgpass
ファイルがより良い解決策になる理由がわかります。私はちょうどそれが:)しかしdownvoteに値するないように注意してください場合は、代替手段を与えていた
1つのコマンドで実行する場合:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
postgres://
構文で動作させる方法を理解できませんでした。.pgpass
私のpostgressユーザーがホームディレクトリを持っていないため、試さなかった。
ワンライナーの場合、データベースの移行と同様--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 Alexander Ibarraの回答は、-dbnameが渡されない場合、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
そしてそれはパスワードなしで働いた