私は毎晩私のデータベースをバックアップするための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
を使用すると最も柔軟なエクスポート形式が生成され、すでに圧縮されているので、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
あなたが1つのコマンドでそれをしたいならば:
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
データベースを移行するようなワンライナーの場合は、 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
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename
--dbnameが渡されない場合、@ Jose Alexander Ibarraの回答はcentos 7とバージョン9.5で機能します。
pg_dump postgresql://username:[email protected]:5432/mydatabase
単一のデータベースのダンプを作成しながら、この1つのライナーは私を助けます。
PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql
一時的な.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
を使用してそれらを保護します資格情報は無意味かもしれません。
私の間違いであれば訂正してください。しかし、システムユーザーがデータベースユーザーと同じであれば、PostgreSQLはパスワードを要求しません - 認証はシステムに依存します。これは設定の問題かもしれません。
したがって、データベースの所有者postgres
が毎晩自分のデータベースをバックアップするようにしたい場合は、そのためのcrontabを作成できます。crontab -e -u postgres
。もちろん、postgres
はcronジョブの実行を許可される必要があります。したがって、/etc/cron.allow
にリストされているか、/etc/cron.deny
が空である必要があります。
このブログ記事 で詳しく説明されているように、 "pg_dump"コマンドのようにPostgreSQLユーティリティに非対話的にパスワードを提供する方法は2つあります。 "。pgpass"を使うファイルを使用するか、 "PGPASSWORD"環境変数を使用する。
Windowsでは、pgpass.conf
ファイルは次のフォルダになければなりません。
%APPDATA%\postgresql\pgpass.conf
%APPDATA%
フォルダー内にpostgresql
フォルダーがない場合は作成します。
pgpass.conf
ファイルの内容は次のようなものです。
localhost:5432:dbname:dbusername:dbpassword
乾杯