勉強日記

チラ裏

内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 Appendix PostgreSQLのバージョンアップ

gihyo.jp


バージョンアップポリシー

  Version  Current minor  Supported  First Release  Final Release    
  12  12.2  Yes  October 3, 2019  November 14, 2024    
  11  11.7  Yes  October 18, 2018  November 9, 2023    
  10  10.12  Yes  October 5, 2017  November 10, 2022    
...
* May 14th, 2020
* August 13th, 2020
* November 12th, 2020
* February 11th, 2021
  • 3ヶ月ごとにマイナーアップデート

バージョンアップの種類

マイナーバージョンアップ

  • 不具合修正やセキュリティ対応
  • 深刻な場合はマイナーアップデートロードマップ外でマイナーを刻むこともある
  • どのメジャーを使っていようが、最新のマイナーを使おうね

We always recommend that all users run the latest available minor release for whatever major version is in use.

  • 同一メジャーバージョンにおいて、データベースクラスタには互換性あり
  • 不具合依存の実装以外は影響をうけない

メジャーバージョンアップ

  • 新機能追加含む
  • データベースクラスタに互換性なし
  • 「常に最新を使うべき」とは限らない、要件次第
    • 5年以上使わないシステムなら上げない
    • 5年以上使うなら上げる
      • 開発コミュニティのサポートを受けられないリスクがあるため

マイナーバージョンアップの手順

  • 基本の手順
    1. PostgreSQLサーバー停止
    2. PostgreSQL実行ファイル差し替え
    3. PostgreSQLサーバー再起動
  • 不具合修正の内容いかんにより、追加の作業があることも
    • リリースノート参照

ローリングアップデート

  • 同期レプリケーションを組んでいる場合、プライマリ/スタンバイ両方上げる
  • 停止時間最小化のためにローリングアップデートを検討する
  • 流れ
    1. スタンバイを停止、非同期レプリケーションに切り替える
    2. スタンバイをアップデート
    3. スタンバイを起動、同期レプリケーションに切り替える
    4. データの同期を確認
    5. プライマリを停止、スタンバイを新プライマリに昇格
      • IPの変更を伴うこともある
    6. 旧プライマリをアップデート
    7. 旧プライマリを新スタンバイとして起動、同期レプリケーションに戻す

メジャーバージョンアップの手順

  • 公式
  • 実行ファイルを入れ替えるだけでは駄目
    • データベースクラスタに互換性がない
      • しかるべき方法で移行する
        • ダンプ/リストア
        • pg_upgradeコマンド
    • 機能互換性がない
      • recovery.confが無くなってたり
    • 運用方法に変更が生じることがある
      • 監視対象のシステムカタログに変更が加わっているかも
    • パラメータの追加・削除、デフォルト値の変更などがある
      • standby_modeが無くなったり
      • recovery.conftrigger_filepostgresql.confpromote_trigger_fileになってたり

ダンプ/リストアによるデータ移行方式

  • 古い方法
    • めちゃ時間かかる
  • pg_dump でダンプ書き出し
  • psql (-Fp)、pg_restore (-Fc, -Ft)

pg_upgradeコマンドによるデータ移行方式

  • 公式
  • 大規模データベースクラスタにはこれ
    • ツールが「内部表現が変わっていない」データベースオブジェクトを知っているので速い

拡張機能を使った場合の注意点

  • contrib等の拡張機能のモジュールもバージョンアップする
    • PostgreSQLのバージョン依存なので適切なものに
  • 拡張機能専用のテーブルが存在する場合、こちらも適切に移行する必要がある
    • テーブル自体はpg_upgradeコマンドでそっくり移行される
    • が、テーブルを利用する拡張機能もアップデートしているので、同じ形式でよいとは限らない
    • 拡張機能のリリースノートにしたがって適切に移行しましょう