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 の詳細化:
EXPLAINにMEMORYとSERIALIZEオプションが追加され、クエリ実行時のメモリ使用量やデータ変換にかかった時間を確認できるようになりました。
インデックスとデータ型
並列インデックス作成の拡大: 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_databaseのdaticulocaleがdatlocaleにリネームされるなど、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の設定確認と、リカバリ手順の事前リハーサルが不可欠です。