この記事では、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本体のバージョンのズレを経験しています。
その経験により、サーバーとクライアントの区別を学ぶことができました。
それは、各ミドルウェアのバージョン調査をしているときです。
調査のきっかけは、セキュリティ関係でしたね。