21
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ディップAdvent Calendar 2023

Day 1

エラーで理解するPostgreSQL

Last updated at Posted at 2023-11-30

はじめに

この記事はディップ株式会社 Advent Calendar 2023のの初日投稿です!

この記事ついて

エラーってよくわからないですよね?
PostgreSQLってよくわからないですよね?

そんなわからないを理解できるようにまとめたのがこの記事。
エラーについてわかるようになります。
PostgreSQLについても理解が深まります。

記事を読むことで得られること

以下を知ることでPostgreSQLについて理解が深まります。

  • PostgreSQLに関わるエラー
  • PostgreSQL内の処理について

エラーで理解するPostgreSQL

早速本題に入りましょう

PostgreSQLの処理について

初めに理解を深めるのはPostgreSQLの処理について
PostgreSQLがあるサーバーへのリクエストを送った後、返ってくるまで(問い合わせ)の間の理解がないとエラーの原因を突き止めるのに苦労します。具体的にはSQLの構文エラーなのにネットワーク周りを調査したりなど。エラーを読んで理解しないと的外れな行動をとってしまうので、PostgreSQLのどこでどんなエラーが出たのかがわかるようにするために処理について理解を深めていきます。

ものすごく簡略な処理の流れを図にまとめました1

問い合わせ処理の流れ.drawio.png

図の内容は以下の通り
① クライアントから接続を要求します。
② 問題なければ接続を確立します。
③ クライアントからSQLを発行します。
④ 内部処理を終えて結果をクライアントへ返します。

簡単に処理の流れを把握したところで次はエラーと合わせてPostgreSQLの理解を深めて行きましょう

エラーとPostgreSQLの処理

ここからエラーについて共有していきます。
エラーがPostgreSQLの処理のどこでどのように起きているのかも合わせてまとめていきます。

FATAL: remaining connection slots are reserved for non-replication superuser connections

翻訳すると「残りの接続スロットはレプリケーションユーザではないスーパーユーザ用に予約されています」
以下のように①の接続を要求した際に出るエラーです。
エラーは以下のように出ます。

-bash-4.2$ psql -U test
ユーザ test のパスワード:
psql: FATAL: remaining connection slots are reserved for non-replication superuser connections

接続に対して個別のプロセスを立ち上げますが、このプロセスの最大数を指定するのが
max_connectionsパラメータで指定できます。
max_connectionsパラメータで指定した値によって空きがありましたが、superuser_reserved_connectionsパラメータでスーパーユーザーの接続のために予約されているため非スーパーユーザーは接続ができなかったために出るエラーです。

fatal_connections.drawio.png

ERROR: syntax error at or near "serect"

誤ったSQL文を実行すると起きます。例えば以下のようなエラー

postgres=# serect * from table;
ERROR:  syntax error at or near "serect"
LINE 1: serect * from table;
      ^

構文解析過程でエラーとなる。
詳細にいうと初期解析(パース)の段階で構文が正しいかどうかをチェックしたタイミングでエラーとなる。

error_syntax.drawio.png

ERROR: relation "xxx" does not exist

存在しないテーブルなどを指定した際にでるエラー

postgres=# select * from aaa;
ERROR:  relation "aaa" does not exist
LINE 1: select * from aaa;
                      ^

このエラーはプランナ/オプティマイザの段階で出るエラー
プランナ/オプティマイザでは問い合わせの中で使用される個々のリレーション(テーブル)をスキャンするための計画を生成することから始めます。その際にテーブルなどの存在確認をしているためなければエラーとなります。

error_relation.drawio.png

実行時エラー (Runtime Errors)

対象のオブジェクトに対して権限を持っていないのに実行しようとした際に出るエラー

postgres=# select * from aaa;
ERROR:  permission denied for table aaa
                      ^

このエラーはプランナ/オプティマイザの段階で出るエラー
実行計画が作成された後、クエリの実行前に権限チャックが行われます。
その際に必要な権限を持っていなければエラーとなります。

error_relation.drawio.png

まとめ

今回まとめた内容にはまだまだ足りない部分があるようです。
例えばパーサーと書き換えプロセスの間にはアナライザーという段階があるようなのですが、信憑性の高い記事がうまく見つけられなかったので、今後も問い合わせの処理については理解を深めていきたいと思います。
それでも簡単に処理を理解することで対応できる範囲が広がると思うので是非ともこの記事をきっかけにより理解を深めてみてください。

参考

内部構造から学ぶPostgreSQL―設計・運用計画の鉄則
PostgreSQLインサイド概要
Oracle技術者のための PostgreSQL自習書
PostgreSQL入門 ∼クエリ処理編∼
PostgreSQL: Query Processing

  1. 接続に関しては詳細を省いています。

21
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?