きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

postgresql × Log設定まわりを中心に × 基本的なことまとめてみた

この記事の目的

この記事では、
postgresの設定に必要な情報を簡単にまとめること
を目的としています。

Docker image のpostgresを利用しています。
このイメージでは、以下のパスにDBのデータがまとめられています。
/var/lib/postgresql/dataにpostgres

//参考(環境構築には、以下のコマンドを実行しました。)
 docker run -d -v $(pwd):/var/lib/postgresql/data postgres


本題

★postgresの特徴

postgresは、追記型アーキテクチャを採用しています。
削除するときは、物理削除せず、削除フラグを立てるだけ。
更新するときは、更新フラグを立て、更新した情報を新しく追加する。
といったイメージです。
そのため、Insert,Delete処理は速く、Update処理が遅いという性質があります。
…あります(´▽`)

postgresは、libpqプロトコルを使ってクライアント-サーバー通信を行います。

||libpqは、C言語によるアプリケーションプログラマ用のPostgreSQLインタフェースです。 libpqは、クライアントプログラムからPostgreSQLのバックエンドサーバに問い合わせを渡し、その結果を受け取るためのライブラリ関数の集合です。

www.postgresql.jp




postgresは、マルチプロセスモデルを採用しています。
1つのDB接続に対し、1つのプロセスを作成し、通信を行います。
そのため、接続/切断が頻繁に発生するアプリケーションを開発する場合は、
poolingの設定が必要になってきます。
npgsqlを使えば、デフォルトでコネクションプールを100個利用する設定になっています。
※↓”その他”のDBMSとの比較をまとめた表があったので、リンク張っておきます。
https://www.pgecons.org/wp-content/uploads/PGECons/2015/WG2/14_Appendix_01_Architecture.pdf






★初期DBについて

postgrsインストールしたらいつも勝手にできているけど、無視してしまっていた子達…
postgresを起動して初めに作られている初期データベースがこれです。
f:id:kinakomotitti:20190302232252p:plain

Template0は読み込み専用のテンプレートです。
Template1のもととなるテンプレートとして利用されます。
Template1は、今後作成するすべてのデータベースのもとになるテンプレートです。
今後作るデータベースに共通する設定があれば、Template1に設定しておくらしいです。

…らしいです(´▽`)


ディレクトリ構成

全体像と、代表的なディレクトリを把握しておきます。

//データベース"クラスタ"全体の情報が入ったディレクトリ↓
/var/lib/postgresql/data
├── PG_VERSION  //postgresのバージョンが記載されている
├── base [error opening dir]  //データベースの情報
├── global [error opening dir] //クラスタ全体にかかわる設定(権限、ユーザーなど)
├── pg_commit_ts [error opening dir]
├── pg_dynshmem [error opening dir]
├── log[error opening dir] //ログ
├── pg_hba.conf
├── pg_ident.conf
├── pg_logical [error opening dir]
├── pg_multixact [error opening dir]
├── pg_notify [error opening dir]
├── pg_replslot [error opening dir]
├── pg_serial [error opening dir]
├── pg_snapshots [error opening dir]
├── pg_stat [error opening dir]
├── pg_stat_tmp [error opening dir]
├── pg_subtrans [error opening dir]
├── pg_tblspc [error opening dir]
├── pg_twophase [error opening dir]
├── pg_wal [error opening dir] //WALログ
├── pg_xact [error opening dir]
├── postgresql.auto.conf
├── postgresql.conf
├── postmaster.opts
└── postmaster.pid


★postgrsql.confの設定確認

psqlのSHOWコマンドを使うことで、今動いているpostgresで有効な設定を確認できます。
※内容はpostgresql.confの内容と同じです。
f:id:kinakomotitti:20190302232322p:plain
configファイルを見ればいいという話もありますが、圧倒的に見やすいと思います。
Filterもかけられるので検索はこれが便利そうです。
「設定なしでデフォルト値」みたいな設定も、このコマンドを使えば、何がデフォルト値かわかるところも便利だと思います。


★ログの設定

開発時にいつもお世話になるログ出力の設定についてです。
自分の場合ログはいつもファイルに出力することが多いです。
ということで、ファイルに出力する設定を中心にまとめていきます。
参考)
www.postgresql.jp

設定項目名 デフォルト値 変更後 簡単な説明
log_directory 'log' その時々… 出力ディレクトリ名
log_filename 'postgresql-%Y-%m-%d_%H%M%S.log' そのまま ファイル名規則
logging_collector off on ログファイル作るかどうかの設定
log_min_messages warning そのまま
log_min_error_statement Error そのまま エラーの原因となったSQLの詳細を表示
log_connections Off ON コネクション接続時のログ
log_disconnections Off ON コネクション切断時のログ
log_duration  Off ON SQL実行時間
log_statement  none ALL 構文エラーを持つ文以外のSQL
log_line_prefix  空文字 '%m [%p] %a %u %p %c %v ' 各ログ行の先頭に出力する字列

Log_line_prefixでセッションIDを設定したときの例↓
接続されてから切断されるまでトレースができた(∩´∀`)∩ワーイ
※この例では、log_connectionsとlog_disconnectionsをOnにしています。
f:id:kinakomotitti:20190302232339p:plain


★log_min_error_statementの設定

エラーの原因となったSQLの詳細ということでしたが、よくわからなかったので、
設定を色々変えて「SELECT * FROM hogehoge;」を実行してみました。
結果として、デフォルト設定のErrorのままでよいということになりました。

実験結果↓

Errorの場合(デフォルト)と、それより上の設定の場合
f:id:kinakomotitti:20190302233440p:plain

faitalの場合
f:id:kinakomotitti:20190302233450p:plain

panicの場合
出力なし。

★npgsqlを用いた接続文字列

接続文字列の設定もいつもよく忘れるので、メモしておきます。

www.npgsql.org

//最小設定の接続文字列例
//portはだいたい5432なので、省略
Host=localhost;Username=postgres;Password=password;Database=sample_db