PostgreSQLのバージョン確認におけるウソ【騙されないで!!】

PostgreSQLのバージョン確認におけるウソ【騙されないで!!】 サーバー

この記事では、PostgreSQLのバージョン確認におけるウソを解説しています。
「PostgreSQL バージョン確認」とGoogleで検索すれば、ウソを書いた記事が多くヒットします。
それも検索上位に出てくるから、結構面倒です。

もちろん、記事を書いた人はウソをつくつもりなんてないでしょう。
でも、それが結果的に多くの人を騙してしまうのです。

本記事の内容

  • PostgreSQLのバージョン確認におけるウソとは?
  • 誤解・勘違いしてしまう原因
  • 「psql –version」がウソの証拠
  • 「psql」だけインストールするケース

それでは、上記に沿って解説していきます。

PostgreSQLのバージョン確認におけるウソとは?

代表的なウソは、「psql –version」です。
このコマンドにより、PostgreSQLのバージョン確認ができると書かれています。

「psql –version」は、決してみなさんが求める結果を表示してくれません。
みなさんが求めているのは、PostgreSQLのサーバーとしてのバージョンのはずです。

通常、サーバーとしてのバージョン確認が必要となります。
OSや他のプログラム言語、ソフトウェアとの関連上。
また、セキュリティ上もですね。

では、「psql –version」で表示されるバージョンは何のバージョンなのでしょうか?

# psql --version
psql (PostgreSQL) 10.15 (Ubuntu 10.15-0ubuntu0.18.04.1)

実は、これは「psql」というクライアントアプリケーションのバージョンなのです。
だから、「psql –version」でPostgreSQL(サーバー)のバージョンを確認することはできません。

ちなみに、PostgreSQLに用意されているクライアントアプリケーション一覧は以下。

  • clusterdb — PostgreSQLデータベースをクラスタ化する
  • createdb — 新しいPostgreSQLデータベースを作成する
  • createuser — 新しいPostgreSQLのユーザアカウントを定義する
  • dropdb — PostgreSQLデータベースを削除する
  • dropuser — PostgreSQLのユーザアカウントを削除する
  • ecpg — 埋め込みSQL用Cプリプロセッサ
  • pg_basebackup — PostgreSQLクラスタのベースバックアップを取得する
  • pgbench — PostgreSQLに対してベンチマーク試験を行う
  • pg_config — インストールしたバージョンのPostgreSQLに関する情報を提供する
  • pg_dump — PostgreSQLデータベースをスクリプトファイルまたは他のアーカイブファイルへ抽出する
  • pg_dumpall — PostgreSQLのデータベースクラスタをスクリプトファイルへ抽出する
  • pg_isready — PostgreSQLサーバの接続状態を検査する
  • pg_receivewal — PostgreSQLサーバから先行書き込みログをストリームする
  • pg_recvlogical — PostgreSQLのストリームの論理デコードを制御する
  • pg_restore — pg_dumpによって作成されたアーカイブファイルからPostgreSQLデータベースをリストアする
  • psql — PostgreSQLの対話的ターミナル
  • reindexdb — PostgreSQLデータベースのインデックスを再作成する
  • vacuumdb — PostgreSQLデータベースの不要領域の回収と解析を行う

上記にあるように、psqlはクライアントの一部でしかないのです。

以上より、PostgreSQLのバージョン確認におけるウソが明確になりました。
次に、このウソ(誤解・勘違い)が起こりえる原因について説明します。

誤解・勘違いしてしまう原因

Googleで検索した記事に書かれていたから、というのもあるでしょう。
でも、これは根本的な原因ではありません。

一言で原因を言うと、以下となります。
「データベースにおいてサーバーとクライアントの概念があることを理解できていない」

もっと言うと、「サーバーとクライアントの区別がない」のです。
サーバーとクライアントに関しては、次の記事内で詳しく説明しています。
「サーバーとクライアントの定義」という部分においてです。

サーバーとクライアントの区別がないから、誤解・勘違いをしてしまうのでしょう。
しかし、これは誰でもやってしまうことです。

インフラ部分に詳しいプログラマーでないと普通にあることだと思います。
実際、勘違いしているプログラマーを多く見てきました。

ベテラン・プログラミング初心者に限らずです。

もちろん、私自身も過去に勘違いしていました。
その勘違いから、学んだけです。

以上が、誤解・勘違いしてしまう原因でした。
次は、「psql –version」のウソを検証します。

「psql –version」がウソの証拠

まず、PostgreSQL関連(サーバーもクライアントも)が一切インストールされていない状況を用意します。
今回は、以下のUbuntuで検証しています。
あと、作業は「sudo su -」でrootになって実施しています。

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"

インストール状況の確認結果は以下。

# apt list --installed | grep 'postgresql'

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

何もインストールされていませんね。
とりあえず、この時点で「psql –version」を実施します。

# psql --version

Command 'psql' not found, but can be installed with:

apt install postgresql-client-common

当たり前の結果です。
そりゃ、PostgreSQL関連は何もインストールされていませんから。

では、「psql」をインストールしていきます。
エラーにある「apt install postgresql-client-common」ではなく、次のコマンドを使います。

# apt install postgresql-client

完了したら、確認しましょう。

# apt list --installed | grep 'postgresql'

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

postgresql-client/bionic-updates,bionic-security,now 10+190ubuntu0.1 all [インストール済み]
postgresql-client-10/bionic-updates,bionic-security,now 10.15-0ubuntu0.18.04.1 amd64 [インストール済み、自
postgresql-client-common/bionic-updates,bionic-security,now 190ubuntu0.1 all [インストール済み、自動]

postgresql-client関連が入っていますね。
この段階で、「psql –version」を実施します。

# psql --version
psql (PostgreSQL) 10.15 (Ubuntu 10.15-0ubuntu0.18.04.1)

クライアントアプリケーションであるpsqlのバージョンが、表示されました。
PostgreSQLの本体はインストールしていませんからね。

最後に、上記のように「psql」だけインストールするケースについて説明しておきます。

「psql」だけインストールするケース

WebサーバーとDBサーバーが分かれている場合を想定してください。

Webサーバーには、PostgreSQL本体(サーバー)はインストールしません。
もちろん、DBサーバーにPostgreSQL本体(サーバー)をインストールします。

そして、この場合Webサーバーだけに「psql」インストールすることがあります。
DBサーバーには、「psql」をインストールしないことがあるのです。
セキュリティ上の理由から、DBサーバー本体にはSSHでアクセスさせないために。

この状況であれば、psqlのバージョンとPostgreSQL本体のバージョンが異なることはありえます。
psqlだけメンテ忘れというケースがあるでしょうね。

実際、psqlのバージョンとPostgreSQL本体のバージョンのズレを経験しています。
その経験により、サーバーとクライアントの区別を学ぶことができました。

それは、各ミドルウェアのバージョン調査をしているときです。
調査のきっかけは、セキュリティ関係でしたね。

タイトルとURLをコピーしました