このすみ技術ろぐ

とあるWebエンジニアが、技術や趣味について書くブログです。

PostgreSQLのXID周回問について学んだ

PostgreSQLの勉強をしているのですが、XID周回問題について知りました。 どのような問題か気になり調査したので、その際の技術メモです。

ちなみに、『詳解PostgreSQL[10/11対応]―現場で役立つ新機能と実践知識』というgihyo.jpの特集記事が、わかりやすかったです。

gihyo.jp

XIDとは

XIDとは、トランザクションごとに自動で割り振られるトランザクション識別子です。 PostgreSQLはテーブルやレコードなどをオブジェクトとして扱い、それぞれにXIDを内部的に割り振ります。

詳解 PostgreSQL[10/11対応]―現場で役立つ新機能と実践知識
〜中略〜
XIDの回収についてですが,PostgreSQLはテーブルやレコードなどをそれぞれ一つ一つのオブジェクトとして扱っており,それぞれにIDを割り振っています。これがXIDです。
https://gihyo.jp/dev/feature/01/dex_postgresql/0002?page=3 より引用

XID周回問題とは

XID周回問題とは、PostgreSQLがXIDを使い切ってしまいIDが周回すると、存在するはずのデータが消失するといった問題が発生する現象をいいます。

XIDには32ビットの符号なし整数の制約があり,約42億(232-1)でXIDは周回します。実際には約42億の半分の値である20億を再利用しており,それ超えるようなトランザクションが発生した場合,XIDを使い切り,XID周回問題が発生します。
XID周回問題は,残り1,000万トランザクションで警告され,残り100万トランザクションから新しいトランザクションはエラーになるため,基本的には発生しません。ですが,発生した場合は古いXIDが割り当てられていたレコードが突然参照できなくなるなどの問題が発生します。
https://gihyo.jp/dev/feature/01/dex_postgresql/0002?page=3 より引用

XID周回問題の回避

XID周回問題が発生しそうな状況になると、PostgreSQLが警告を発するようになります。 問題を検知した場合は、利用していないXIDをVACUUMで回収し、不要となったXIDを再利用することで問題を回避します。

なお、AUTOVACUUMがONになっていれば、XIDの回収は自動で実行されます。 PostgreSQL11では、デフォルトでAUTOVACUUMがON状態です。

古いバージョンのPostgreSQLを使っていたり、設定でAUTOVACUUMを無効にしている場合は、メンテンス作業としてVACUUMを実行する必要があります。

まとめ:長期間に渡って運用しているデータベースでは、注意が必要

XID周回問題は、XIDを使い切ってしまうことで発生します。

PostgreSQLを長期間に渡って運用しているサービスでは、意外とXIDが消費されているかもしれません。 また長年に渡って稼働しているデータベースサーバーは、PostgreSQLのバージョンが古いことも多く、AUTOVACUUMがONでない可能性もあります。 その場合は、とくに注意が必要です。

今回はPostgreSQLのXIDについての話でしたが、IDの不足問題はPostgreSQLに限らず、さまざまなケースで起きそうな気がします。 身近な例で言えば、IPv4アドレスの枯渇問題の行く末が、とても気になっている今日このごろ。