Yukiです。
今日はいよいよ設定ファイルです。
PostgreSQLは、基本的にpostgresql.confとpg_hba.confという2つのテキストファイルで設定します。
OracleがSPFILEというバイナリファイルに設定するのと違いますね。PFILEというテキストファイルも使いますが、Oracleからコマンドで変更できないので、あまり使っているところを見ません。
その点、PostgreSQLはテキストファイルを変更してreloadで読み直せるのでお手軽ですね。
なお、一部のパラメータは、変更にPostgreSQL再起動が必要です。
postgresql.conf
ほとんどすべての設定をこのファイルに書きます。
「#」以降はコメントです。
いくつかわかりにくかったパラメータを上げます。
listen_addresses
接続元のクライアント側ではなく、サーバ側のIPアドレスを設定します。
例えばNICが2つ刺さっていたとして、片方だけPostgreSQLに接続できるようにするといったことができます。「*」を指定しておくと、どちらでも接続できるようになります。
logging_collector
「ログ収集機構を有効にする」というのが、なかなか理解できませんでした。最初、これがないとどうなるのかとか、何のための設定かというのがピンとこなかったです。
そこで、マニュアルを見たところ、以下の注記がありました。
ログ収集機構を使用せずにstderrのログを取ることは可能です。 ログメッセージはサーバのstderrが指し示すいかなる場所にも向かうだけです。 しかし、その方法はログファイルを巡回させる都合のよい方法を提供しないので、ログ容量が小さい場合のみに適しています。 同時に、ログ収集機構を使用しないいくつかのプラットフォームにおいては、ログ出力が失われたり、文字化けします。なぜなら、同一のログファイルに同時に書き込みを行うマルチプロセッサはそれぞれの出力を上書きできるからです。
なるほど。
stderr → (loggin collectorプロセス) → ログファイル
- logging_collectorパラメータをONにしておくとlogging collectorバックグラウンドプロセスが起動する(ログ収集機構が有効化)
- logging collectorプロセスが、いったんstderrを捕捉してログファイルにリダイレクトする
- それによって、出力順やログの喪失、文字化けの問題が起きないようにしてくれる
ということですね。
pg_hba.conf
接続元でアクセス制御するための設定ファイルです。
hbaは、host based accessの略です。
パスワード認証するかどうかもこのファイルで設定します。
設定は上の行から順番に評価して、最初にマッチした設定が適用されるのがポイントですね。
SET文/SHOW文
SET文で設定変更、SHOW文では有効な設定の表示ができます。
わかりにくかったのは、postgresql.confで設定すると言ってたかと思ったら、今度はSET文で設定するとはどういうことかということでした。SET文で変更したらpostgresql.confの設定をオーバライドするのかなとか、別の接続にも即時に影響が出るのかとか、再起動したら元に戻るのかなとかです。
結局、SET文での変更は実行した接続の中でだけ有効で、ほかの接続には影響ないと理解しました。変更が有効な期間については、SET LOCAL で指定するとそのトランザクションの終了まで、SET SESSION(省略時デフォルト)で指定するとセッション終了までです。(ただし、ロールバックすると無効になる)
一方、対となるSHOW文では、下記のうち、どのパラメータ設定が有効になっているか確認できます。
SET
文postgresql.conf
設定ファイル- 環境変数
PGOPTIONS
postgres
サーバの始動時のコマンドラインフラグ
パラメータでややこしいのは、下記ですね。
- SETコマンドで変更可能なパラメータがある
- スーパーユーザだけ変更できるパラメータがある
これは一つずつ覚えるしかないのでしょうか?
覚え方とかあるんですかね?
内部の仕組みがわかれば、わかるようになるのかな。
最後に、お恥ずかしいのですが、一つ、はまった話しをします。
SET文とSHOW文は、コマンド最後に「;」(セミコロン)が必要です。
例えば、以下のような感じです。
× =# SET search_path="$user", public
〇 =# SET search_path="$user", public;
注意深く見ると「;」なしで改行すると、プロンプトが2行目以降の入力を示す「-#」に変わるのですが、気づかずにコマンド打っても反応がないなとしばらくはまってました。
Oracleだと、SHOW~の後、「;」は要らないんですけど…
ちなみに、search_pathは、スキーマの指定を省略したときに、どのスキーマから検索するかという設定です。
そう。スキーマもOracleと少し違いますね。Oracleはスキーマとユーザが1対1になっていて、例えば、SCOTTユーザのスキーマはSCOTTスキーマというように固定です。これはOracleが特殊みたいですが。
まとめ
今日は設定ファイルについて勉強しました。
代表的な設定だけ勉強しましたが、たくさんの設定がありますね。
機能を勉強しながら、関連するパラメータを覚えていく感じでしょうか。
まだまだ、マスターまでの道のりは長いです。
Photo by Bisakha Datta on Unsplash
コメント