きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

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