2026/02/01

PostgreSQL 17の新機能、仕様変更、不具合修正。開発者、運用管理管理者向け

 

1. PostgreSQL 17 基本情報

  • リリース日: 2024年 9月 26日

  • バージョン位置付け: メジャーアップデート

  • 主な焦点: バキュームのメモリ消費削減、増分バックアップの導入、JSON_TABLEの追加、論理レプリケーションのフェイルオーバー対応。


2. 開発者向け:新機能と仕様変更

SQL/JSON の大幅な拡張

  • JSON_TABLE の導入: JSONデータを一時的なリレーショナルテーブルとして扱えるようになりました。これにより、複雑なJSON構造を標準的なSQL(JOINなど)で容易に操作可能です。

  • SQL標準準拠のJSON関数: JSON_EXISTS()JSON_QUERY()JSON_VALUE() が追加され、JSONBデータの検証や抽出がより直感的になりました。

クエリ性能とCOPYコマンド

  • COPYコマンドの改善: COPY でデータを取り込む際、エラーが発生した行をスキップして続行できる ON_ERROR オプションが追加されました。また、エクスポートのパフォーマンスが最大2倍向上しています。

  • クエリプランナーの最適化: NOT NULL 制約がある列に対する IS NOT NULL チェックの省略や、CTE(共通テーブル式)のインライン化の改善により、複雑なクエリの実行速度が向上しました。

  • EXPLAIN の詳細化: EXPLAINMEMORYSERIALIZE オプションが追加され、クエリ実行時のメモリ使用量やデータ変換にかかった時間を確認できるようになりました。

インデックスとデータ型

  • 並列インデックス作成の拡大: BRINインデックスの並列作成がサポートされました。

  • 無限大のサポート: interval データ型で infinity(無限大)の値を扱えるようになりました。


3. 運用管理担当者向け:新機能と仕様変更

ストレージ管理とメンテナンス

  • バキューム(VACUUM)の革新: 内部データ構造に Adaptive Radix Tree を採用。これにより、デッドタプルの管理に使用するメモリ量が最大で20分の1に削減されました。メモリ制限(maintenance_work_mem)によるバキューム性能の低下が起きにくくなっています。

  • ネイティブ増分バックアップ: pg_combinebackup ツールが導入され、前回のバックアップからの差分のみを取得する「増分バックアップ」が標準機能として利用可能になりました。

論理レプリケーションの可用性向上

  • フェイルオーバーの同期: プライマリがダウンした際、スタンバイ側へレプリケーションスロットの状態を同期できるようになりました。これにより、フェイルオーバー後も論理レプリケーションをスムーズに継続できます。

監視とセキュリティ

  • pg_stat_checkpointer: チェックポイントの統計情報を確認するための新しいビューが追加されました。

  • pg_wait_events: セッションが何を待機しているかをリアルタイムで把握しやすくなりました。

  • 新しい管理ロール: pg_maintain ロールが追加され、スーパーユーザー権限を与えずに、特定のユーザーにバキュームやアナライズなどのメンテナンス権限を委譲できるようになりました。


4. V17で修正された不具合

メジャーリリースおよび初期のマイナーアップデート(17.1~17.2)で以下の重要な修正が行われています。

  • プランニング時のセキュリティ修正(CVE-2025-8713など): ビュー経由でテーブルにアクセスする際、プラン作成段階で統計情報が不適切に露出する可能性があった問題を修正。

  • JITコンパイル時のクラッシュ: 特定の複雑な数式や関数を含むクエリを実行した際に、JIT(実行時コンパイル)が原因でプロセスがクラッシュする稀なケースが解消されました。

  • 論理レプリケーションのメモリ管理: 大規模なサブスクリプション環境で発生していたメモリリークが修正されました。


5. 重要な仕様変更と互換性(注意点)

  • old_snapshot_threshold の廃止: 長い間非推奨だったこのパラメータが完全に削除されました。設定ファイルに残っているとエラーになります。

  • システムビューの列変更: * pg_stat_bgwriter から buffers_backend 関連の列が削除され、pg_stat_io へ移行されました。

    • pg_stat_statements の列名が一部変更(読み取り/書き込みのタイミング統計など)されています。

  • 暗黙的な変換の制限: interval 型のリテラル解析において ago の位置が末尾に限定されるなど、一部のパース規則が厳格化されました。

  • システムカタログの変更: pg_databasedaticulocaledatlocale にリネームされるなど、ICUロケールに関連する内部名称が整理されました。


6. V16からV17へのアップグレード失敗談

コミュニティや初期導入者から報告されている「痛い目」を見た事例です。

① 「ADMIN OPTION 権限に起因するアップグレード失敗」

  • 現象: pg_upgrade を実行すると、ロールの権限移行(GRANT)部分でエラーが発生し、アップグレードが中断される。

  • 原因: V16で導入された厳格な権限チェックが、V17への移行プロセス(特に WITH ADMIN OPTION を持つロール)で不整合を起こすケースがあります。

  • 対策: ソースとなるV16を最新のマイナーバージョン(16.10以降など)に更新してからアップグレードするか、問題となる権限を一時的に剥奪して移行後に再設定する必要があります。

② 「監視ツールのグラフが真っ白に」

  • 現象: 自作の監視ダッシュボードや一部の古い監視ツールで、データベースのメトリクスが取得できなくなった。

  • 原因: pg_stat_bgwriter から列が削除されたことや、pg_stat_statements の列名変更が原因です。

  • 対策: V17のビュー定義に合わせて、監視クエリを修正する必要があります。

③ 「pg_combinebackup の期待値ミス」

  • 現象: 増分バックアップを導入したが、リカバリテストを行った際に古いフルバックアップとの整合性が取れず、復旧に失敗した。

  • 原因: 増分バックアップの管理に必要な WAL summarizer を有効にしていなかった、あるいはバックアップチェーン(フル→増分1→増分2)の依存関係を正しく管理できていなかった。

  • 対策: summarize_wal = on の設定確認と、リカバリ手順の事前リハーサルが不可欠です。