壊滅的な事態が発生する前に、毎晩データベースをバックアップするためのcronジョブを作成しようとしています。このコマンドは私のニーズを満たすはずです:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
それを実行した後を除いて、それは私がパスワードを入力することを期待しています。cronから実行した場合、それはできません。どうすれば自動的に渡すことができますか?
壊滅的な事態が発生する前に、毎晩データベースをバックアップするためのcronジョブを作成しようとしています。このコマンドは私のニーズを満たすはずです:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
それを実行した後を除いて、それは私がパスワードを入力することを期待しています。cronから実行した場合、それはできません。どうすれば自動的に渡すことができますか?
.pgpass
実行するアカウントのホーム ディレクトリにファイルを作成しますpg_dump
。
形式は次のとおりです。
hostname:port:database:username:password
次に、ファイルのモードを に設定します0600
。それ以外の場合は無視されます。
chmod 600 ~/.pgpass
詳細については、Postgresql のドキュメントlibpq-pgpassを参照してください。
または、スクリプトを実行するように 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
1 つのコマンドで実行する場合は、次のようにします。
PGPASSWORD="mypass" pg_dump mydb > mydb.dump
以下を使用して、パスワードを pg_dump に直接渡すことができます。
pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql
間違っていたら訂正してください。ただし、システム ユーザーがデータベース ユーザーと同じ場合、PostgreSQL はパスワードを要求しません。認証はシステムに依存します。これは設定の問題かもしれません。
したがって、データベース所有者postgres
にデータベースを毎晩バックアップしてもらいたい場合、そのための crontab を作成できますcrontab -e -u postgres
。もちろん、postgres
cron ジョブの実行を許可する必要があります。したがって、 にリストされている/etc/cron.allow
か、/etc/cron.deny
空である必要があります。
パスワードを渡す安全な方法は、パスワードを.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
パスワードを渡す別の (おそらく安全ではない) 方法は、入力リダイレクトを使用することです。
pg_dump [params] < [path to file containing password]