pg_dumpの実行時にパスワード入力を省略する

pgではpg_dump実行時に必ずインタラクティブなパスワードの入力を求められるのですが、cron jobでのpb_dump実行時に、パスワードの入力を省きたいって感じのことです。どうやらパスワードを渡す方法はないみたいですね。

PostgreSQL公式docのpg_dumpのところ

-wオプションのところで以下のような記述が。

-w –no-password パスワードの入力を促しません。 サーバがパスワード認証を必要とし、かつ、.pgpassファイルなどの他の方法が利用できない場合、接続試行は失敗します。 バッチジョブやパスワードを入力するユーザが存在しない場合にこのオプションは有用かもしれません。

ふむ、.pgpassなるファイルがあるのか。

d.hatena.ne.jp

公式doc

31.15. パスワードファイル

.pgpassというファイルをホームディレクトリに配置することで、pgは勝手にそれをパスワードとして使用してくれるみたいです。

.pgpassのフォーマットは以下のようにします。

hostname:port:database:username:password

最初の4フィールドに関してはワイルドカードもありみたいです。また、

Unixシステムにおいて、.pgpassの権限はグループ、他者へのアクセスをすべて拒否しなければなりません。 これはchmod 0600 ~/.pgpassといったコマンドによって行います。 権限をこれよりも緩くすると、このファイルは無視されます。

とのことなので、

$ sudo chmod 0600 ~/.pgpass

としておきましょう。

これで、

$ pg_dump -Ft -U USER_NAME -w DB_NAME > BACKUP_FILE

のように-wでパスワードを省略してpd_dumpを実行することができました。わーい

PostgreSQL初期設定 in EC2

以下を参考にさせていただきました。

http://dev.classmethod.jp/cloud/aws/install-postgresql-on-aws-ec2/

手順

PostgreSQLをインストールします。

$ sudo yum update -y
$ sudo yum install -y libxslt.i686
$ sudo yum install -y postgresql postgresql-server postgresql-devel postgresql-contrib postgresql-docs

バージョンを確認

$ psql --version

PostgreSQLのdataを初期化します。これは、PostgreSQLを使う上で一番最初に叩く必要があります。

$ sudo /sbin/service postgresql initdb

起動・停止・再起動は以下のようにします。

$ sudo /sbin/service postgresql start
$ sudo /sbin/service postgresql stop
$ sudo /sbin/service postgresql restart

chkconfigをonにしておきます。

$ sudo /sbin/chkconfig --list | grep postgresql
postgresql      0:off 1:off 2:off 3:off 4:off 5:off 6:off
$ sudo /sbin/chkconfig postgresql on
$ sudo /sbin/chkconfig --list | grep postgresql
postgresql      0:off 1:off 2:on  3:on  4:on  5:on  6:off

initdbやったら勝手に作成されるpostgresユーザのパスワードを設定してログインしてみます。PostgreSQLでは、このpostgresユーザがマスターユーザ的な扱いになるようです。

$ sudo passwd postgres
$ su - postgres

postgresユーザのまま、今度はPostgreSQLの設定ファイルをいじっていきます。

$ vi /var/lib/pgsql9/data/postgresql.conf

まずはpostgresql.conflisten_addresses*にします。

listen_addresses = '*'                  # what IP address(es) to listen on;

今度はpg_hba.confをいじっておきます。以下をファイルの最後に追記します。

$ vi /var/lib/pgsql9/data/pg_hba.conf
## ファイル内有効行全コメント→末尾に追加
local   all     all     trust
host    all     all     0.0.0.0/0       md5

ユーザ設定

では今度は実際のアプリケーションで使うユーザの作成・設定をしていきます。

実行ユーザはpostgresで。

$ su - postgres

以下のようにしてユーザを作成できます。

$ createuser -AdPE testuser

そしたら以下のようにしてそのユーザが使うデータベースを作成します。

$ createdb -E UTF8 -U testuser -W testdb

次に、exitしてLinux側でもユーザを作成しておきます。PostgreSQLは基本的にLinuxユーザとDBのユーザが一致するようになっています。

$ sudo adduser testuser
$ sudo passwd testuser

確認・使い方

ここまでで初期設定は終了です。確認してみます。

ログインします。

$ su - testuser

以下で、データベースの一覧を表示できます。

$ psql -l

データベースへの接続。SQLを叩けるプロンプトに入ります。

$ psql -d database_name

Capistranoデプロイ時にwheneverのタスクでinvalid byte sequenceのエラー

Capistranoでのデプロイ時に、デプロイフックでのタスク中で以下のようなエラーが出るようになりました。

DEBUG [67444af4] Command: cd /var/www/onebox/releases/20160426053048 && ( export RBENV_ROOT="/usr/local/rbenv" RBENV_VERSION="2.3.0" ; /usr/local/rbenv/bin/rbenv exec bundle exec whenever --update-crontab onebox_production --set environment=production --roles=web,app,db )
DEBUG [67444af4]        /var/www/onebox/shared/bundle/ruby/2.3.0/gems/whenever-0.9.4/lib/whenever/numeric_seconds.rb:12:in `gsub': invalid byte sequence in US-ASCII (ArgumentError)

ふむふむ。どうやらエンコーディングの問題ぽい。とはすぐ思いつくものの試行錯誤しつつ解決せず...。

と悩んでたら以下の記事が解決してくれました。

askubuntu.com

AWS側で/etc/environmentを以下のように修正してロケール情報を変更します。

LANG=en_US.utf-8
LC_ALL=en_US.utf-8

LANGLC_ALLという環境変数は以下を参考。

一般に、ロケール名は LANG 環境変数で指定します。ロケールカテゴリは LANG に従属しますが、個別に設定することも可能であり、そうした場合には、LANG よりそれらの設定が優先されます。LC_ALL 環境変数を設定すると、その設定が、LANG や個別のどのロケールカテゴリよりも優先されます。

ロケールとは - 国際化対応言語環境の利用ガイド

Rubyのencodingは以下の2つの記事がとてもおもしろくて参考になりました。

tmtms.hatenablog.com

blog.livedoor.jp