PostgreSQL 19 Betaで切り拓く次世代データベース:非同期I/O・OAuth認証・JIT無効化が変えるデータ基盤の未来

はじめに — データベース世界で起きている「静かな革命」

2026年7月16日、PostgreSQL Global Development GroupはPostgreSQL 19 Beta 2をリリースした。オープンソースのリレーショナルデータベースとして「世界で最も先進的」と称されるPostgreSQLにとって、バージョン19は単なる年次アップデートではない。

非同期I/Oの本格整備、OAuth 2.0認証のネイティブサポート、JITのデフォルト無効化、SQL/PGQ(プロパティグラフクエリ)の導入――これらは単なる機能追加ではなく、データベースのあり方そのものを問い直す変化だ。

同時に、PostgreSQL 14が2026年11月12日にサポート終了(EOL)を迎える。多くの企業が抱えるPostgreSQL 14環境の移行も、現実的な課題として迫っている。

本記事では、PostgreSQL 19 Betaで判明している全主要変更を、性能・セキュリティ・開発体験・移行の4つの軸で整理する。データベース管理者(DBA)、バックエンドエンジニア、AIインフラエンジニアの方々にとって、PostgreSQL 19がもたらす変化と、今から始めるべき準備を明確にする。


対象読者

  • DBA / インフラエンジニア: PostgreSQL 14 EOLに向けた移行計画、新機能の評価
  • バックエンドエンジニア: SQL/PGQ、REPACK、COPY JSONなど開発体験の変化
  • AIインフラエンジニア: 非同期I/Oとストレージ性能、ベクトル型拡張の可能性
  • セキュリティエンジニア: OAuth 2.0、MD5終焉、RADIUS削除への対応

PostgreSQL 19の全体像 — 年次リリースサイクルで進化する開発プロセス

PostgreSQLは每年9〜10月頃にメジャーバージョンをリリースする年次サイクルを採用している。2026年5月14日には現行安定版のPostgreSQL 18.4がリリースされており、PostgreSQL 19はその次世代として、2026年秋の正式リリースに向けてベータテストが進められている。

主要テーマの整理

PostgreSQL 19の変更内容を分析すると、4つの明確なテーマが浮かび上がる。

graph TD
    PG19[PostgreSQL 19]
    PG19 --> Perf[⚡ パフォーマンス]
    PG19 --> Sec[🔒 セキュリティ]
    PG19 --> Dev[🛠️ 開発体験]
    PG19 --> HA[🔄 高可用性]
    
    Perf --> AIO[非同期I/O整備]
    Perf --> Opt[オプティマイザ進化]
    Perf --> Copy[COPY SIMD高速化]
    Perf --> Toast[TOAST lz4デフォルト化]
    
    Sec --> OAuth[OAuth 2.0認証]
    Sec --> MD5[MD5終焉]
    Sec --> RADIUS[RADIUS削除]
    Sec --> Chk[チェックサム online切替]
    
    Dev --> PGQ[SQL/PGQ]
    Dev --> REPACK[REPACKコマンド]
    Dev --> Part[パーティション操作]
    Dev --> CopyJSON[COPY TO JSON]
    
    HA --> Wait[WAIT FOR LSN]
    HA --> Seq[シーケンス同期]
    HA --> Views[新システムビュー]

バージョン別サポート状況

バージョン リリース日 サポート終了 状態
PostgreSQL 19 2026年秋(予定) 2031年11月(予定) Beta中
PostgreSQL 18 2025年9月 2030年11月 安定版(現行)
PostgreSQL 17 2024年9月 2029年11月 サポート中
PostgreSQL 16 2023年9月 2028年11月 サポート中
PostgreSQL 15 2022年10月 2027年11月 サポート中
PostgreSQL 14 2021年9月 2026年11月12日 ⚠️ EOL接近

PostgreSQLのコミュニティは、各メジャーバージョンを5年間サポートする。PostgreSQL 14のEOLが半年後に迫っているため、移行計画の策定は急務だ。

参考: PostgreSQL Versioning Policy

非同期I/O革命 — NVMe時代のストレージ性能を解放する

PostgreSQLの長年の課題のひとつが、同期I/Oモデルによる性能限界だった。大規模なシーケンシャルスキャン、VACUUM処理、バックアップ操作において、ディスクI/Oの完了を待つ同期モデルは、現代のNVMe SSDや高速ストレージの能力を活かしきれなかった。

PostgreSQL 19は、この壁に本格的に取り組んでいる。

従来の同期I/Oの限界

従来のPostgreSQLでは、ストレージからのデータ読み込み要求を発行した後、その完了を同期的に待機する。つまり、1つの読み込み要求が完了するまで次の読み込み要求を発行できない。

[同期I/Oの処理フロー]
時刻 →
CPU:  [要求1発行]----待機----[要求2発行]----待機----[要求3発行]----待機
Disk:              [読込1]               [読込2]               [読込3]

このモデルでは、ストレージのレイテンシがそのままクエリのレイテンシになる。テラバイト級のテーブルをスキャンする分析クエリでは、CPUがディスクを待つ時間が大半を占める。

PostgreSQL 19の非同期I/O改善

PostgreSQL 19では、Andres FreundとThomas Munro主導で以下の改善が行われた。

1. 読み込み先行スケジューリング(read-ahead scheduling)の改善

ストレージから大量のデータを読み込む際、事前に次の読み込み要求をスケジューリングすることで、I/O待ち時間を隠蔽する。

[非同期I/Oの処理フロー]
時刻 →
CPU:  [要求1][要求2][要求3]----(全完了待ち)----
Disk: [読込1][読込2][読込3]

複数の読み込み要求を一気に発行することで、ストレージの並列処理能力(NVMe SSDのキュー深度など)を活用できる。

2. 自動ワーカー制御

新しいサーバー変数により、I/Oワーカー数を動的に制御する。

サーバー変数 役割
io_method 非同期I/O方式の選択(worker/io_uring等)
io_min_workers 最小I/Oワーカー数
io_max_workers 最大I/Oワーカー数
io_worker_idle_timeout ワーカーのアイドルタイムアウト
io_worker_launch_interval ワーカー起動間隔

従来は固定のio_method設定しかなかったが、PostgreSQL 19では負荷に応じてワーカーが自動的に増減する。

3. EXPLAIN ANALYZEでのI/O可視化

EXPLAIN ANALYZEに新しいIOオプションが追加され、非同期I/Oアクティビティを確認できるようになった。

EXPLAIN (ANALYZE, IO) SELECT * FROM large_table WHERE condition;

これにより、「クエリがどれだけI/O待ちしているか」「非同期I/Oが効果的に動いているか」を実運用で把握できる。

実運用への影響

非同期I/Oの改善は、以下のワークロードで特に大きな効果をもたらす。

  • 大規模分析クエリ: テラバイト級テーブルのフルスキャン
  • VACUUM / autovacuum: 大規模テーブルのバキューム処理
  • バックアップ・リカバリ: pg_basebackup、PITR時のWAL読み込み
  • 論理レプリケーション: 初期テーブル同期の高速化

特に、NVMe SSD環境では、io_method = worker(またはLinux環境でio_uring)を適切に設定することで、従来比で数倍のスループット向上が期待できる。

参考: PostgreSQL 19 Release Notes - Performance

オプティマイザの進化 — NOT INからANTI JOINまで、クエリ計画の根本的改善

PostgreSQL 19のオプティマイザは、ここ数年で最も大幅な改善が行われている。多くはRichard Guoを中心とするコントリビューターによるものだ。

NOT IN → ANTI JOIN変換

NOT INはSQLで頻繁に使われるパターンだが、従来は効率的でない実行プランになりがちだった。

Before(PostgreSQL 18以前):

SELECT * FROM orders WHERE customer_id NOT IN (SELECT id FROM blacklisted_customers);

→ サブクエリを1行ずつスキャンする非効率なプランになりがち

After(PostgreSQL 19): NULLsが存在しないことが保証される場合、自動的にANTI JOINに変換される。これにより、ハッシュ結合やマージ結合の高速なアルゴリズムが適用できる。

その他の主要なオプティマイザ改善

改善項目 効果
LEFT JOIN → ANTI JOIN変換の拡張 より多くのクエリで高速な結合アルゴリズムが適用可能
ANTI JOINでのMemoize利用 繰り返しアクセスのキャッシュ化で性能向上
結合前の集計処理 処理行数を削減して後段の結合コストを低減
ハッシュ結合のNULL改善 NULL結合キーの処理効率化
セミジョインのプランニング改善 EXISTSサブクエリの最適化
IS DISTINCT FROM → IS NULL変換 定数畳み込みによる早期最適化
結合選択率計算の高速化 大規模統計情報でのプランニング時間短縮
Append/MergeAppendのインクリメンタルソート パーティションテーブルでのソート効率化

実運用への影響

これらの改善は、アプリケーションコードの変更なしにクエリ性能が向上する点で重要だ。特に以下のパターンで効果が期待できる。

  • NOT IN / NOT EXISTSを使うクエリ
  • 大規模なLEFT JOIN + WHERE IS NULLパターン
  • パーティションテーブルに対する集計クエリ
  • 複雑な結合を含む分析クエリ

アップグレード後にEXPLAINで実行プランを比較し、ANTI JOINやMemoizeが選択されるようになったクエリを確認することを推奨する。

参考: PostgreSQL 19 Release Notes - Optimizer

パフォーマンスの全面向上 — COPY高速化からTOAST圧縮まで

オプティマイザ以外にも、PostgreSQL 19は実行エンジン全体で大幅な性能改善を行っている。

COPY FROM のSIMD加速

COPY FROMは大量データロードの標準手法だが、PostgreSQL 19ではtext/CSV入力の解析にSIMD CPU命令(SSE/AVX等)を使用するようになった(Nazir Bilal Yavuz, Shinya Kato)。

これにより、数百万行のCSVインポート、ETLパイプラインの初期ロード、データウェアハウスのバッチロードなどで、CPU処理時間が大幅に短縮される。

NOTIFYのターゲット絞り込み

PostgreSQLのNOTIFY/LISTENは、プロセス間通知メカニズムだが、従来はほぼ全バックエンドプロセスを起床させていた。PostgreSQL 19では、指定された通知をリッスンしているバックエンドのみを起床するよう改善された(Joel Jacobson)。

多数の接続がある環境(コネクションプール、マイクロサービスアーキテクチャ)で、通知のオーバーヘッドが劇的に削減される。

デフォルトTOAST圧縮がpglz → lz4へ

PostgreSQLは大きなデータをTOAST(The Oversized-Attribute Storage Technique)で自動圧縮する。PostgreSQL 19では、デフォルトの圧縮方式がpglzからlz4に変更された(Euler Taveira)。

圧縮方式 圧縮率 速度 特徴
pglz(従来) PostgreSQL独自実装
lz4(新デフォルト) 高速な圧縮・展開
zstd 高圧縮率(PostgreSQL 14〜利用可能)

lz4は圧縮率を維持しながら展開速度が圧倒的に速いため、TEXT/JSON/BYTEA列の読み込み性能が向上する。default_toast_compressionサーバー変数で変更可能。

並列autovacuumワーカー

待望の並列autovacuumがついに実装された(Daniil Davydov)。従来、autovacuumは1テーブルにつき1ワーカーしか割り当てられなかったが、PostgreSQL 19では1テーブルに対して複数の並列ワーカーが動作可能。

新しいサーバー変数:

  • autovacuum_max_parallel_workers: 全体の最大並列ワーカー数
  • テーブル単位: autovacuum_parallel_workersストレージパラメータ

その他の性能改善

  • visibility map更新のテーブルスキャン中対応: VACUUMだけがvisibility mapを更新できていたが、通常のテーブルスキャンでも可能に(Melanie Plageman)
  • 外部キー制約チェックの高速化(Junwang Zhao等)
  • radix sortによるソート高速化(John Naylor)
  • 内部的なrow変形の性能改善(David Rowley)
  • UTF-8ケースフォールディングの高速化(Andreas Karlsson)
  • TID Range Scansの並列化(Cary Huang, David Rowley)
  • ハッシュインデックス・GINインデックスのVACUUM性能改善(Xuneng Zhou)

これらの改善は累積的に、OLTPから分析、データロードまで幅広いワークロードで体感できる向上をもたらす。

参考: PostgreSQL 19 Release Notes - General Performance

JITデフォルト無効化 — 「信頼できないコストモデル」からの脱却

PostgreSQL 19で最も議論を呼んだ変更のひとつが、JIT(Just-In-Timeコンパイル)のデフォルト無効化だ(Jelte Fennema-Nio)。

JITとは何だったのか

PostgreSQL 12(2019年)以降、LLVMベースのJITコンパイルがデフォルト有効だった。JITは実行時にクエリの機械語を生成し、特に大規模な分析クエリで性能向上をもたらすことを期待されていた。

なぜデフォルト無効化されたのか

JITの発動はオプティマイザのコスト推定に基づいていた。「このクエリは十分重いからJITかける価値がある」と判断された場合のみJITが発動する。

しかし、このコスト推定が信頼性に欠けることが実運用で判明した。具体的には:

  • JITの起動オーバーヘッド(コンパイル時間)が予想より大きいケースが多い
  • コスト推定が「JITすべき」と判断しても、実際にはJITなしが速いことが頻発
  • 特に短〜中規模クエリでJITが発動してしまうと逆効果

実運用への影響と対応

環境 推奨設定 理由
OLTP中心 デフォルト(無効)のままでOK JITは元々発動しにくかった
混合ワークロード デフォルト(無効)を推奨 コスト見積もり不確実性の排除
大規模分析クエリ中心 手動で有効化 手動判断ならJITは有用

JITを手動で有効化するには:

-- セッションレベル
SET jit = on;
SET jit_above_cost = 100000;

-- またはpostgresql.conf
-- jit = on
-- jit_above_cost = 100000

「コストモデルを信頼せず、人間が判断する」という方針転換は、PostgreSQLコミュニティの実運用重視の姿勢を示している。

参考: PostgreSQL 19 Release Notes - Migration

OAuth 2.0認証 — パスワードレス時代のデータベース接続

PostgreSQL 19は、データベース認証のパラダイムシフトを本格化させるOAuth 2.0ネイティブサポートを強化した。

従来のパスワード認証の限界

データベースのパスワード認証には、運用上の大きな負担がある。

  • パスワードローテーション: 定期的な変更の運用コスト
  • ハードコーディングリスク: 設定ファイルやコードに埋め込まれたパスワード
  • 監査の困難さ: 誰がいつどのパスワードを使ったかの追跡
  • 脱退時の対応: 退職者のパスワード無効化の漏れ

エンタープライズ環境では、これらを解決するためにIdP(Identity Provider)と統合したSSO(Single Sign-On)が標準になりつつある。

PostgreSQL 19のOAuth 2.0サポート

PostgreSQL 19では、Jacob Champion主導で以下の機能が追加・強化された。

1. PQAUTHDATA_OAUTH_BEARER_TOKEN_V2フローフック

新しい改良版OAUTHフローフックで、発行者識別子(issuer identifier)とエラーメッセージ仕様を追加。従来のPQAUTHDATA_OAUTH_BEARER_TOKENを置き換える。

2. カスタムOAUTHバリデーター

pg_hba.confでカスタム認証オプションを登録可能になり、組織固有の認証フローを組み込める。

3. 新しい接続パラメータと環境変数

パラメータ 環境変数 役割
oauth_ca_file PGOAUTHCAFILE OAUTH証明機関ファイル
- PGOAUTHDEBUG デバッグオプション(UNSAFEで全出力)

4. バリデーターの失敗詳細

ValidatorModuleResult構造体のerror_detailメンバーにより、認証失敗時の詳細情報を供給可能。

OAuth認証フロー

graph LR
    App[アプリケーション] -->|1. 接続要求| PG[PostgreSQL]
    PG -->|2. OAuth要求| App
    App -->|3. トークン要求| IdP[Identity Provider]
    IdP -->|4. アクセストークン| App
    App -->|5. Bearer Token| PG
    PG -->|6. 検証| Validator[OAUTH Validator]
    Validator -->|7. 検証要求| IdP
    IdP -->|8. 検証結果| Validator
    Validator -->|9. 認証成功/失敗| PG
    PG -->|10. 接続確立/拒否| App

エンタープライズSSO統合の可能性

OAuth 2.0サポートにより、以下の統合パターンが可能になる。

  • Keycloak / Okta / Azure ADとの直接統合
  • Kubernetes Service Account Tokenを使ったPodレベルのDB認証
  • 短期トークンによるパスワードローテーション問題の根本的解決
  • 監査ログの統合(IdP側で全認証記録を一元管理)

参考: PostgreSQL 19 Release Notes - Server Configuration

セキュリティの強化 — MD5終焉とRADIUS削除

PostgreSQL 19は、セキュリティ面で複数の重要な変更を含んでいる。

MD5パスワードの完全非推奨化

PostgreSQL 18で非推奨マークされたMD5パスワード認証は、PostgreSQL 19で認証成功後に警告が発行されるようになった。

-- PostgreSQL 19でのMD5認証成功時の警告例
WARNING:  MD5 password authentication is deprecated and will be removed in a future release

この警告はmd5_password_warningsサーバー変数で制御可能だが、SCRAM-SHA-256への移行はもはや必須と言える。

SCRAM-SHA-256への移行手順:

-- ユーザーのパスワード方式をSCRAMに変更
ALTER ROLE myuser PASSWORD 'newpassword';

-- pg_hba.confを確認(scram-sha-256を使用)
# host  all  all  0.0.0.0/0  scram-sha-256

-- password_encryption設定の確認
SHOW password_encryption;
-- scram-sha-256 であることを確認

RADIUSサポートの完全削除

PostgreSQL 19でRADIUS認証サポートが完全に削除された(Thomas Munro)。理由は「PostgreSQLのRADIUS実装はUDPのみで、UDPは修正不可能なセキュリティ欠陥がある」ため。

RADIUSを使用していた環境は、LDAP、SSPI、または前述のOAuth 2.0への移行が必要。

その他のセキュリティ強化

1. standard_conforming_strings の強制ON

バックスラッシュエスケープの文字列リテラル解釈を常に標準準拠に強制。SQLインジェクション対策の観点から重要。

⚠️注意: PostgreSQL 19より前のpg_dumpでstandard_conforming_strings = offのまま作成したダンプは、PostgreSQL 19にロードできない。

2. データベース/ロール/テーブルスペース名でのCR/LF禁止

セキュリティ上の理由から、改行文字を含む名前が禁止された。pg_upgradeでも拒否される。

3. パスワード有効期限警告

password_expiration_warning_thresholdサーバー変数(デフォルト7日)で、期限切れ前に警告を発する。

4. データチェックサムのオンライン切替

データチェックサムの有効化/無効化が、クラスタ停止なしで可能になった(Daniel Gustafsson, Magnus Haglander, Tomas Vondra)。以前はpg_checksumsコマンドをオフラインで実行する必要があった。

5. SNI(Server Name Indication)のサーバーサイドサポート

TLS接続でのSNIをサーバー側でサポート。PGDATA/pg_hosts.confでホスト名/キーペアを指定する。単一IPで複数のTLS証明書を運用する環境で有用。

参考: PostgreSQL 19 Release Notes - Migration

SQL/PGQとREPACK — 開発体験を変える新コマンド群

PostgreSQL 19は、SQL標準への準拠と運用性の向上において重要な新機能を複数追加している。

SQL Property Graph Queries (SQL/PGQ)

SQL/PGQは、SQL標準のプロパティグラフクエリサポートだ(Peter Eisentraut, Ashutosh Bapat)。グラフ構造のデータに対して、標準SQL構文でクエリを実行できる。

従来はNeo4j等のグラフデータベースに頼る必要があった、ソーシャルネットワーク分析、レコメンデーション、経路探索などのユースケースが、PostgreSQL単体で実現可能になる。

内部的にはビューとして処理されるため、標準的なリレーショナルクエリとして最適化・実行される。

REPACKコマンド — VACUUM FULLとCLUSTERの統合・進化

PostgreSQL 19でREPACKコマンドが追加された(Antonin Houska)。これは従来のVACUUM FULLCLUSTERを統合した新しいコマンドだ。

最大の特徴はCONCURRENTLYオプションで、ACCESS EXCLUSIVEロックなしでテーブルを再構築できる点だ。

-- 従来の方法(ACCESS EXCLUSIVEロックが必要)
VACUUM FULL my_table;
CLUSTER my_table USING my_index;

-- PostgreSQL 19の新方法(ロック不要)
REPACK TABLE my_table CONCURRENTLY;

新しいサーバー変数max_repack_replication_slotsで、REPACK用のレプリケーションスロット数を制御する。

REPACKのメリット:

  • 本番環境でテーブル再構築中も読み書き可能
  • 論理レプリケーションを利用した再構築
  • VACUUM FULLとCLUSTERの機能統合による運用の簡素化

その他の新コマンド・新機能

ALTER TABLE MERGE/SPLIT PARTITIONS パーティションのマージ・分割が1コマンドで可能に。

COPY TO JSONフォーマット COPY TOでJSON出力が可能に。FORCE_ARRAYオプションで単一JSON配列として出力も可能。

COPY FROM ON_ERROR SET_NULL 無効な入力値をNULLに変換してロード継続。

COPY FROM 複数ヘッダー行スキップ 複数行のヘッダーをスキップ可能に。

INSERT ON CONFLICT DO SELECT RETURNING 競合行を返し、FOR UPDATE/SHAREでロック可能。

ウィンドウ関数のIGNORE NULLS lead(), lag(), first_value(), last_value(), nth_value()でNULLを無視可能に。

FOR PORTION OF句 UPDATE/DELETEで時間的範囲に対する操作が可能に。

GRANTED BY句 GRANT/REVOKEで権限調整を実行する実効ロールを指定可能に。

参考: PostgreSQL 19 Release Notes - Query Commands / Utility Commands

レプリケーションと高可用性の新機能

PostgreSQL 19は、レプリケーションと高可用性(HA)分野でも大幅な機能強化を行っている。

WAIT FORコマンド — LSN同期待機

新しいWAIT FORコマンドにより、スタンバイサーバーが特定のLSN(Log Sequence Number)値の書き込み・フラッシュ・リプレイを待機できるようになった(Kartyshov Ivan, Alexander Korotkov, Xuneng Zhou)。

-- 特定LSNまでリプレイが進むまで待機
WAIT FOR LSN '0/16000080' REPLAY;

-- タイムアウト付きで待機
WAIT FOR LSN '0/16000080' FLUSH TIMEOUT 5000;

これは「読み取り一貫性」を保証する仕組みとして重要だ。アプリケーションが「書き込み後に確実にそのデータが読める」ことを保証する、いわゆる「read-after-write consistency」を実現できる。

シーケンス値のサブスクライバ同期

従来、論理レプリケーションではシーケンス値(AUTO_INCREMENT的な値)が同期されなかった。PostgreSQL 19では以下が可能になった:

  • CREATE SUBSCRIPTION ... REFRESH SEQUENCESでシーケンス値を同期
  • CREATE/ALTER PUBLICATION ... ALL SEQUENCESで全シーケンスを公開
  • 新しい関数pg_get_sequence_data()でシーケンス同期状態を確認

これにより、フェイルオーバー時の「シーケンス値の不整合による主キー重複」問題が解消される。

パブリケーションの柔軟な制御

  • EXCEPT句: ALL TABLESパブリケーションから特定テーブルを除外
  • retain_dead_tuples: コンフリクト解決用のデッドタプル保持
  • max_retention_duration: 保持期間の制限

その他のHA改善

機能 説明
wal_receiver_timeoutの個別設定 サブスクリプション/ユーザー単位で設定可能
wal_sender_shutdown_timeout シャットダウン時のレプリカ同期待ち時間制限
pg_sync_replication_slots()改善 同期失敗の確実な報告
postgres_fdw経由のサブスクリプション 外部データラッパーの接続パラメータ利用
effective_wal_level 自動的な論理レプリケーション有効化の報告

新しいシステムビュー

ビュー 役割
pg_stat_lock ロックタイプ別の統計
pg_stat_recovery リカバリステータスの監視
pg_stat_autovacuum_scores テーブル別autovacuum優先度詳細
pg_dsm_registry_allocations 動的共有メモリ割り当て詳細

これらのビューにより、本番環境でのトラブルシューティングとパフォーマンス監視が格段にやりやすくなる。

参考: PostgreSQL 19 Release Notes - Server Configuration

移行ガイド — PostgreSQL 14 EOLと互換性のない変更

PostgreSQL 14のサポート終了が迫る

PostgreSQL 14は2026年11月12日にサポート終了(EOL)となる。セキュリティパッチも含め、いかなる修正も提供されなくなる。

PostgreSQL 14を本番環境で使用している場合は、直ちにアップグレード計画を策定する必要がある。

互換性のない変更の完全リスト

PostgreSQL 19への移行時に注意すべき主な非互換変更を整理する。

項目 従来 PostgreSQL 19 影響度 対応
max_locks_per_transaction デフォルト64 デフォルト128 実質容量を維持するには2倍に設定
JIT デフォルト有効 デフォルト無効 大規模分析は手動有効化
standard_conforming_strings 設定可能 常にON 古いpg_dumpダンプは要再作成
RADIUS認証 サポート 削除 LDAP等への移行が必要
MD5パスワード サポート 警告表示 SCRAM-SHA-256へ移行
MULE_INTERNAL encoding サポート 削除 別encodingでダンプ・リストア
inet/cidrインデックス btree_gist GiST pg_upgradeでブロック
BUFFERPIN待機イベント BUFFERPIN BUFFER 監視ツールの更新
sync_error_countカラム sync_error_count sync_table_error_count 監視クエリの更新

アップグレード前チェックリスト

PostgreSQL 19への移行を検討する際、以下を確認すること。

1. pg_upgrade前の確認事項

# btree_gist inet/cidrインデックスの確認
psql -c "SELECT indexrelid::regclass FROM pg_index JOIN pg_opclass ON indclass = ARRAY[opcname::regclass] WHERE indrelid::regclass::text IN (SELECT relname FROM pg_class WHERE reltype IN ('inet'::regtype, 'cidr'::regtype));"

# MULE_INTERNALエンコーディングの確認
psql -c "SELECT datname, pg_encoding_to_char(encoding) FROM pg_database WHERE encoding = pg_char_to_encoding('MULE_INTERNAL');"

# CR/LFを含むデータベース/ロール名の確認
psql -c "SELECT datname FROM pg_database WHERE datname ~ '[\r\n]';"

2. アプリケーション側の確認

  • MD5パスワードを使用していないか
  • standard_conforming_strings = offに依存したSQLがないか
  • RADIUS認証を使用していないか
  • JITに暗黙的に依存していないか(大規模クエリの性能検証)

3. 移行パスの選択

graph TD
    PG14[PostgreSQL 14] -->|直接アップグレード| PG19[PostgreSQL 19]
    PG14 -->|段階的| PG16[PostgreSQL 16]
    PG16 -->|段階的| PG17[PostgreSQL 17]
    PG17 -->|段階的| PG18[PostgreSQL 18]
    PG18 -->|最終| PG19
    
    PG14 -->|EOL 2026-11-12| Warning[⚠️ 緊急度: 高]
    PG16 -->|EOL 2028-11| OK1[猶予あり]
    PG18 -->|現行安定版| OK2[推奨ステップ]

段階的アップグレード(14→16→18→19)は検証コストが高いが、各段階での非互換変更を段階的に吸収できる。直接アップグレード(14→19)は一気に移行できるが、非互換変更の影響を一度に処理する必要がある。

参考: PostgreSQL Versioning Policy

よくある質問(FAQ)

Q: PostgreSQL 19の正式リリースはいつですか?

PostgreSQL 19は年次リリースサイクルに従い、2026年9〜10月頃の正式リリースが予定されています。現在はBeta 2が公開されており、コミュニティのテストフィードバックを受けて品質を改善している段階です。

Q: PostgreSQL 18から19へのアップグレードで注意すべき点は?

最大の注意点は以下の3つです:

  1. JITがデフォルト無効化: 大規模分析クエリを実行している場合は手動で有効化が必要
  2. standard_conforming_stringsの強制ON: バックスラッシュエスケープに依存した古いSQLは要修正
  3. max_locks_per_transactionのデフォルト変更: 64→128に変更されたが、ロック容量の計算方式も変わったため実質2倍の設定が必要

Q: JITは有効にすべきですか?

ワークロードによります:

  • OLTP中心: 無効(デフォルト)のままで問題ありません
  • 大規模分析クエリ中心: jit = onjit_above_costを適切に設定して手動有効化を推奨します
  • 混合ワークロード: まず無効で運用し、個別の重いクエリで必要に応じてSET jit = onをセッションレベルで適用するのが安全です

Q: OAuth認証を既存システムに導入するには?

PostgreSQL 19のOAuth 2.0サポートを利用するには:

  1. Identity Provider(Keycloak、Okta、Azure AD等)を用意
  2. pg_hba.confでOAUTH認証方式を設定
  3. oauth_ca_fileでCA証明書ファイルを指定
  4. アプリケーション側でOAuthフローを実装(PQAUTHDATA_OAUTH_BEARER_TOKEN_V2フックを利用)

段階的導入を推奨します。まずテスト環境で検証し、パスワード認証と並行運用した上で切り替えてください。

Q: PostgreSQL 14を使っていますが、どうすればよいですか?

2026年11月12日にPostgreSQL 14のサポートが終了します。緊急度が高い対応です:

  1. 直ちにアップグレード計画を立てる(PostgreSQL 18または19へ)
  2. 非互換変更の確認(standard_conforming_strings、MD5パスワード等)
  3. ステージング環境での検証
  4. 本番切り替えスケジュールの策定

サポート終了後はセキュリティパッチも提供されなくなるため、最低でもPostgreSQL 16以上への移行を完了することを推奨します。

まとめ — 次のアクション

PostgreSQL 19は、オープンソースRDBの最高峰として、性能・セキュリティ・開発体験の三方向で確かな進化を遂げているリリースだ。

この記事の主要ポイント

  1. 非同期I/Oの本格整備が、NVMe SSD環境でのストレージ性能を解放する
  2. オプティマイザの大幅改善が、コード変更なしにクエリ性能を向上させる
  3. OAuth 2.0ネイティブサポートが、パスワードレス認証時代の扉を開く
  4. JITのデフォルト無効化が、実運用での予測可能性を高める
  5. SQL/PGQ、REPACKなどの新コマンドが、開発体験を一変させる
  6. PostgreSQL 14のEOLが半年後に迫っており、移行が急務

今から始める3つのステップ

Step 1: Beta 2をテスト環境で試す

# Docker ComposeでPostgreSQL 19 Beta 2を試す
docker run -d --name pg19beta \
  -e POSTGRES_PASSWORD=secret \
  -p 5432:5432 \
  postgres:19-beta2

または公式サイトからパッケージをダウンロード: https://www.postgresql.org/download/

Step 2: アップグレード影響範囲の確認

  • 非互換変更(標準準拠文字列、MD5、RADIUS等)が自社に影響するか確認
  • pg_upgrade --checkで事前チェックを実行
  • 重要クエリの実行プラン(EXPLAIN)をPostgreSQL 18と比較

Step 3: コミュニティへのフィードバック Beta期間中はバグ報告が品質向上に直結する。特に以下を発見した場合は報告を:

  • 回帰バグ(従来版で動いていたクエリが失敗する・遅くなる)
  • 新機能(非同期I/O、OAuth、REPACK)の不具合
  • ドキュメントの誤り

バグ報告先: https://www.postgresql.org/account/login/?next=/submitbug/


PostgreSQL 19の正式リリースまで、あと数ヶ月。今から準備を始めることで、リリース直後のスムーズな移行が可能になる。データベースはシステムの心臓部だ――その進化を見据えた準備を始めよう。

関連記事