CentOS で PostgreSQL を使ってみよう!(3)
Appendix A: PostgreSQL のログ
デフォルトでは、データベースクラスタの「pg_log」というディレクトリに、起動した日の曜日名のついたファイルを作ってログを書き込んでいます。
[root @server1 ~]# ls /var/lib/pgsql/data/pg_log/ postgresql-Tue.log
しかし、「そのログがいつ記録されたか」という必須情報が、デフォルトの設定では出力されません。デフォルトでは、たとえば存在しないテーブルを参照する "SELECT * FROM abc;" という SQL を実行すると、エラーになりますが、
ERROR: relation "abc" does not existというような形で記録され、エラー発生日時を確認できません。これを、記録日時が確認できるように設定してみましょう。
★ 例:ログ記録日時の出力を設定する
PostgreSQL のさまざまな設定は、「postgresql.conf」というテキストファイルで行ないます。このファイルはデータベースクラスタにあり、『変数 = 値』という形式で設定されています。こういった設定用の変数は、"パラメータ" や "GUC 変数" と呼ばれます。
また、どんな値の設定できるのかといったことは、postgresql.conf にコメントとしてに書いてあります。PostgreSQL のマニュアル を見ると、もっと細かく知ることができます。
- 「postgresql.conf」をテキストエディタで開きます。「gedit」コマンドで GNOME テキストエディタというものを起動することができます。
[root @server1 ~]# gedit /var/lib/pgsql/data/postgresql.conf
- ログの記録日時を出力するように設定するのは、『log_line_prefix』というパラメータです。この文字列を検索すると、以下のようになっています。
#log_line_prefix = ''
「#」より後ろはコメントとして扱われ、設定としては反映されません。したがって、この「#」を消したうえで、パラメータの値を変更します。
今回は、以下のように設定してみます。値には、特殊な文字を使います。『%t』は日時、『%d』はデータベース名、『%p』はプロセス番号、『%l』は行番号です。
log_line_prefix = '%t %d [%p-%l] '
- 設定を変更したら、保存します。
- 変更した設定を適用するには、設定の再読み込み をする必要があります。これは以下のコマンドでできます。
[root @server1 ~]# service postgresql reload
- ログの出力が変わったか確認します。同じく存在しない abc テーブルを対象に SELECT します。そのあとログを確認します。
[root @server1 ~]# tail data/pg_log/postgresql-Tue.log
以下のように出力されて、エラーの発生日時を確認できるようになりました。
2009-04-21 16:06:36 JST postgres [4958-1] ERROR: relation "abc" does not exist
設定を変更すれば他にも、実行された SQL や、SQL 実行に何秒かかったか、どんなクライアントから接続があったか、といったことも記録することができます。
Appendix B: SELinux の影響
SELinux が有効(Enforcing, Permissive)な場合、PostgreSQL がうまく動かない場合があります。
※ SELinux とは、ファイルやプロセスなどの "オブジェクト" を、所有ユーザ・グループやパーミッション以外の "セキュリティコンテキスト" という概念によって、権限管理する仕組みです。
★ 例: 起動できない!
postgres アカウントで「initdb」コマンドを使って データベースクラスタを自分で作成したあと、「service」コマンドで起動しようとすると失敗してしまいます。
-bash-3.1$ whoami postrges -bash-3.1$ initdb --no-locale -E UTF8 -D /var/lib/pgsql/data/ -bash-3.1$ exit [root @server1 ~]# service postgresql start postgresql サービスを開始中: [失敗]
これは、データベースクラスタ「/var/lib/pgsql/data/」のセキュリティコンテキストが、root で起動するのに不都合であるためです。「ls -Z」コマンド で確認すると、ユーザが『root』、タイプが『var_lib_t』となっています。
[root @server1 ~]# ls -Zd /var/lib/pgsql/data/ drwx------ postgres postgres root:object_r:var_lib_t /var/lib/pgsql/data/
「service」コマンドで起動できるようにするには、データベースクラスタのすべてのファイルのセキュリティコンテキストを「chcon」コマンド や「restorecon」コマンド で修正します。
[root @server1 ~]# restorecon -R /var/lib/pgsql/data/ [root @server1 ~]# ls -Zd /var/lib/pgsql/data/ drwx------ postgres postgres system_u:object_r:postgresql_db_t /var/lib/pgsql/data/
ユーザが『system_u』、タイプが『postgresql_db_t』となると、今度は「service」コマンドで起動できるようになります。
[root @server1 ~]# service postgresql start postgresql サービスを開始中: [ OK ]
そのほか、他のディレクトリにコピーした設定ファイルを元へ戻したときなど、さまざまな状況で SELinux の影響を受ける場合があります。なぜかうまくいかない、というときは、SELinux が原因という可能性も疑ってみましょう。
(2009年5月11日公開)