PostgreSQL12 関連情報とログ関係のpostgresql.confパラメータについて

本記事はPostgreSQL Advent Calendar 2019の5日目の記事です。

qiita.com

はじめに

昨年のPostgreSQL Advent Calendarの25日目の記事で、日頃PostgreSQLを触ってなく特にネタも無かったので記事のネタにするために OSS-DB Silver / Gold を受験して無事合格した体験記を書きました。

OSS-DB Silver / Gold 合格体験記 - kitayama_t's blog

これを書いた半年後の2019年6月から新しい会社に移ってなんとPostgreSQLのお仕事がメインとなりました!(パチパチパチ)。記事を書いた1年前はまったく想像していませんでしたが、新しい会社に入るきっかけともなり現在のお仕事は OSS-DB Silver / Gold 資格保持が必須だったので入社前に済ませておいてよかったです(^o^)。

ちなみに今回の記事は(内容は会社と大いに関係していますが(^^;))、個人的な立場でのエントリとなっていますのであらかじめご承知おきください。

今回書くこと

つい数か月前に出た新バージョンのPostgreSQL12に関する情報と、PostgreSQLを使う時にpostgresql.confでログに残すようにするパラメータ変更を色々しているのでそれをご紹介します。

PostgreSQL 12

PostgreSQL 12が2019年10月3日にリリースされました。ここ数年毎年安定して秋頃にリリースされています。その後最初のマイナーバージョンの12.1が2019年11月14日にリリースされて今日時点(2019年12月5日)の最新バージョンは12.1です。

PostgreSQLはマイナーバージョンアップでは原則バグフィックスのみで機能追加変更など無いので、安心して出来る限り新しいマイナーバージョンを使うようにしましょう。

PostgreSQL 12の情報

PostgreSQL 12ってどんなもの?という紹介を私がここで書くより、世の中には既によい資料がインターネット上にあるのでそれをご紹介します。

  • PostgreSQL 12の話
    ご存じ澤田さんの発表スライド。32ページのプレゼン資料で分かりやすく一通りの特徴(新機能)が紹介されているので、まず最初にこれを見て概要を把握するのがよいです。 
  • PostgreSQL 12 検証報告
    ご存じSRA OSS, Inc. 日本支社が公開している新機能検証レポートです。こちらは主要な新機能を選択して、それを実際に動かしてどうなるという新機能ハンズオンを兼ねたチュートリアル的な機能紹介となっています。上記ページの中にPostgreSQL 12 検証レポート(PDF)へのリンクがあります。
  • PostgreSQL 12 新機能検証結果 (GA) [日本語版]
    ご存じ篠田さんの虎の巻。かなり網羅的に調査していてリファレンスとして使っています。
    PostgreSQLの新しいバージョン(しかもベータ版から!)がリリースされるとすぐに新機能を検証した結果を公開されていて(たぶん一番で内容も濃い)、現在公開されているのはGA版ときちんと新しいリリースにも対応されています。ちなみに日本語版だけではなく英語版も公開されているので日本以外にも広く知られていると思います。
  • @nuko_yokohama さんのQiita
    ご存じnukoさんのQiitaでPostgreSQL12がやってくる!(11と10もあり)という連番のついたタイトルで新しいPostgreSQLの機能やパラメータ差分等について書いてます。PostgreSQLのレアなパラメータをググると日本語では篠田さんかnukoさんだけの時がよくありますw
  • SIOS Tech.Lab - PostgreSQL
    SIOSさんの技術ブログのPostgreSQLタグです。PostgreSQL12に関しても色々機能検証されています。
  • SRA OSS, Inc. 日本支社 - セミナー資料
    SRA OSSセミナーで発表した資料のPDFがずらっと並んでいます。ソフトウェア別の分類ではなく時系列でPostgreSQL以外にZabbixやRedis、Kubernetesなども混ざってます。一番下の2005年はPostgreSQL 8.1が最新版として紹介されてました(^^)
  •  Discovering Lesser-Known PostgreSQL 12 Features
    たまたま今日PostgreSQL Weeklyで見かけて、ちょうどよいレベル感で新機能を選定されたのでざっと眺めるにはよいです。

PostgreSQL 12の感想

まだがっつり触れてなくて一通り新機能や変更点を知っての感想です。
パラレルスキャンや宣言型パーティションテーブルなど大きな目玉があるリリースではなく、以前のバージョンで実装された機能が色々と改善されてより実用的になったバージョンだと思います。JITがパラメータ設定でデフォルトがONになったり、数千単位のパーティションでの性能改善やCTEでの性能改善など、普通に使っていたらレスポンスが改善されていたりするでしょう。
運用の観点ではREINDEXでCONCURRENTLYがサポートされたのが一番おおっと思いました。CREATE INDEXでは使えてましたが違う名前で別途作ってなどの手間が必要だったのが、REINDEXの内部で勝手にやってくれるようになりました。INDEXに対するVACUUM処理をOFFに出来るとかVACUUM対象テーブルがロックされていたらスキップするとか進捗状況がレポートされるなど、種々の細かな機能のよいところを把握したいと思っています。

postgresql.confでよくやるログ関係のパラメータ設定

PostgreSQL 12以外の話題としてpostgresql.confファイルでPostgreSQLを使う時にパラメータ設定としてログ関係でこんなん設定してますというメモです。

logging_collecter

メッセージをログに記録するために、まず最初にこれをonにしましょう。新規にDBを作った時に絶対これだけはonに設定しています。log_destinationはstderrのままです。
ちなみにソースコードからインストールしたらoffですが、rpmパッケージからインストールしたらonとなっていて、ソースコードrpmとでpostgresql.confファイルで設定されている値が違うことを初めて知りました。

log_line_prefix

ログファイルの行の先頭に共通的に付加する時刻や接続ユーザやプロセスIDなどを%記法で定義します。シングルクオーテーションで囲みますが、閉じる右側のシングルクオーテーションの前には必ずスペースを入れましょう(一度体験したら忘れない地味な落とし穴)。
バージョン10以前のデフォルト値は空白('')で時刻すら記録されてませんでしたが、バージョン10から'%m [ %p ] 'となりました(日時時刻(ミリ秒) [ プロセスID] )。
これ以外にもバージョン10で色々改善(変更)された点が多く(例:xlogがwalになったり、パラメータ設定で変更する箇所が減ったり)、バージョン10以前の9.xの人はそろそろ2桁バージョンにバージョンアップしましょう。

アシストさんのDatabase Support Blog の障害発生に備えて設定すべき3つのログ関連パラメーターでは、パラメータ設定のお勧めとして'[%t]%u %d %p[%l]'が記載されています。

 log_line_prefixで指定できるフォーマットはマニュアルの該当箇所を参照しましょう。PostgreSQL日本語マニュアルは右上でバージョンの切り替えが出来るのでとても便利です。

log_autovacuum_min_duration

自動VACUUMの実行をここで指定した数字のミリ秒以上かかったものをログに記録します。デフォルト値は-1で記録しませんが、私は自動VACUUMがいつ実行されたかを把握したいので0(すべて記録)を設定しています。

log_checkpoints

checkpointがいつ実行されたのかをログに残す習慣はOracleでやってたので普通にonを設定しています。checkpointが30分ぐらいの間隔になるようにcheckpoint関連パラメータを変更もしたりしますが、今回はログに残す設定関連だけ触れることにしています。

log_temp_files

work_memをどの程度まで増やせば一時ファイルが書かれなくなるかを調べる時に0に設定して一時ファイルの書き出しをチェックします。

log_min_duration_statement

まだ本気で設定したことがないのですが、本番稼働の環境ではロングトランザクションの存在が色々困ることの起因となるので、普通はこれ以上時間がかかるクエリはないというレベルの分単位(3分とか5分とか30分とか)を設定すると思います。とりあえず全部みたい時は一時的に0を設定します(ログがSQL文だらけになるので必要がなくなったらすぐ元に戻しますが)。

[TIPS] マイナーバージョンリリースでの変更点を確認するには?

基本はというか原則英語版のリリースノートやニュースを読め、なのですが、マイナーバージョンでどんな変更があったかをこちらのサイトで日本語で知ることが出来ます。

何か障害が発生した時に、自分が使っているバージョン以降のマイナーリリースで不具合修正されているかどうかをざっと確認するのにとても便利です。

https://www.sraoss.co.jp/technology/postgresql/

おわりに

PostgreSQLは基本機能も色々あってそれだけでもお腹いっぱいなのですが、それに加えてcontribやEXTENSIONで追加してあれこれ出来てしまうので範囲が広くて大変ですが視点を変えるとあれこれ出来て楽しいです。オープンソースの世界はまだまだ学ぶことだらけですが、楽しんでやっていきたいと思っています。