【DBeaver】PostgreSQLへの再接続でエラーが出たので対処。「接続試行がタイムアウトしました」→Vagrant(CentOS7)とDockerを起動し忘れていたので起動


はじめに

前回、DBeaverからPostgreSQLに接続すべく、DBeaverで接続情報の設定を行いました。
今回、また同じデータベースに接続して作業したいと思い、接続を試みたのですが、「接続試行がタイムアウトしました」というエラーが出て接続できませんでした。

Qiitaに書き出しながら解決していきたいと思います。

結論

先に結論を書いておきます。

「PowerShellで操作して 仮想マシン&Dockerを起動 し、さらにDockerからPostgreSQLを操作できる状態にしてから、DBeaverからPostgreSQLデータベース(今回は「first_tutorial」)に接続する」です。

記事の該当箇所は
2-3.Dockerを起動」(ここのコードブロック内のコードを実行すればOK)
と、「2-4.DBeaverでPostgreSQLに接続」です。

「VirtualBox > Vagrant(CentOS7) > Docker > PostgreSQL」という状況を前提にデータベースを作ったのだから、その状況を作った(起動させた)うえでそのPostgreSQLに接続しないと、接続できるはずが無いですよね。気づけませんでした...。
以下に解決までの道のりを晒します。

環境

ホストPC:Windows10
GUI DBツール:DBeaver
仮想化ソフト:VirtualBox
ゲストPC:Vagrant(=CentOS7=仮想マシン)
コンテナ型仮想環境:Docker
CUI DBクライアント:PostgreSQL

目的

以前使った接続情報で、DBeaverからPostgreSQLに接続したい。

1.エラーになる過程

1-1.DBeaverの起動

ホストPCにインストール済みのDBeaverを起動します。

1-2.PostgreSQLに接続

1.DBナビゲータタグ中の該当DBを右クリック→「接続する」をクリック

2.エラー発生。「接続試行がタイムアウトしました。」

尚、接続内容は下記の通り。試しにここで「テスト接続」をクリックしてみましたが、同じく「接続試行がタイムアウトしました」というエラーが出ました。

PostgreSQLロゴの象マークに赤いバツマークが付いている=接続不可っていうことなのでしょうか?
その下のDBには緑のチェックマークが付いていて、こちらは接続可能な状態です。

2.試行錯誤

2-1.Hostの確認

緑チェックマークのDBと今回接続したいDBの違いって何だろう?と、まず考えました。
A:【今回接続したいDBの接続情報】

B:【緑チェックマークDBの接続情報】

Hostについて、
AはIP番号で、
BはURL(クラウド上のElephantSQL)
というのが、大きく違う点です。

この「192.168.33.10」というIP番号、実態はどこにあるのでしょうか?

このIPは、CentOSのデフォルトのIP番号です。
VagrantでCentOS7仮想マシンを作ったときに自動的に作られたIP番号ということ。

PostgreSQLは「 ホストPC > VirtualBox > Vagrant(CentOS7) > Docker > PostgreSQL 」というように「CentOS7の中のDockerの中」に入っています。そのPostgreSQLに接続するには、CentOS7に接続する必要があります。だから、このDBeaverの接続情報にはHostとして「192.168.33.10」と入力しました。

ここでふと気づきました。
CentOS7を起動していないから、接続できないんじゃないか…?

2-2.CentOS7を立ち上げる

2-2-1.仮想マシン起動→中断

ホストPC中の「Oracle VM Virtualbox」をクリックし、該当仮想マシンを選択し「起動」をクリック。
しかし、起動画面が、下記のように途中でフリーズしてしまいました。

「link is not ready」とあります。どうしたんでしょう?

2-2-2.試しにDBeaverでPostgreSQLに接続→できない

仮想マシン起動は中断されていますが、試しにDBeaverでPostgreSQLに接続を試みました。すると、「接続試行がタイムアウトしました」とは別のエラーが出ました。

「192.168.33.10:5432 への接続が拒絶されました。ホスト名とポート番号が正しいことと、postmasterがTCP/IP接続を受け付けていることを確認してください。Connection refused:connect」

おお。エラーは出ましたが一歩前進です。やはり接続先の仮想マシンが起動していないことが最初のエラーの原因だったようです。
そして新たなエラーが発生しました。ホスト名(192.168.33.10)とポート番号(5432)は正しいので、「postmasterがTCP/IP接続を受け付けていることを確認」します。

2-2-3.postmasterがTCP/IP接続を受け付けていることを確認する

postmaster?TCP/IP接続?
これ、以前も出てきたエラーです。

postmasterとは?:PostgreSQLのマルチユーザデータベースサーバ(引用:PostgreSQL 7.2.3 リファレンスマニュアル)
TCP/IP接続とは?:いまいち実態がつかめないけれど、端末と接続するということかな?

というのがその際に調べた内容。
つまり、
PostgreSQL DB「first_tutorial」が、仮想マシン「192.168.33.10:5432」からの接続を受け付けているか?
ということかな。
受け付けていないからエラーになっているんだよなあ。
なぜ受け付けていないのか?
「Vagrant(CentOS7) > Docker > PostgreSQL 」という関係だから、Dockerが怪しい…。

公式ドキュメントに、こんな文言があったのでメモ。↓

もし,本当にpostmasterがそこで動いていないので あれば,いま説明したようにカーネルエラーメッセージは "Connection refused(接続が拒否されました)" か, "No such file or directory(そのようなファイル,あるいはディレクトリは ありません)" のどちらかとなるのが典型的です. (特に理解しておいてください:この状況で出る "Connection refused" は, postmasterが一旦接続要求を受け取り,そして拒否したのでは ないということです.--このようなケースでは後に 挙げる,別のメッセージが出力されます) 他の "Connection timed out(接続の待ち時間切れ)" のようなエラー メッセージは,ネットワーク接続ができていない,といったような,もっと 根本的な問題を指しているかもしれません.
引用:PostgreSQL アドミニストレーターズガイド

2-3.Dockerを起動

仮説を立ててみる。
VagrantとPostgreSQLの間にあるはずのDockerがもし起動していなければ、PostgreSQLも起動せず、DBeaverから接続できない状況になるのではないか?
「Dockerが起動していないからPostgreSQLに接続できない」と仮定する。

Dockerを起動させます。

PowerShellを立ち上げ、下記の通り入力。

【メモ:バックスラッシュ「\」について】
半角バックスラッシュを入力したくて該当キーを押すと、PowerShell上では半角の¥マークが表示される。これで良いのか??
→「日本語でWindowsを利用している場合、コマンドプロンプトでは、バックススラッシュ(\)のかわりに、円マーク(¥)が表示されます。バックスラッシュと円マークは同様の機能を持ちます。」(引用元:富士通Q&A

PowerShell 
<PowerShellを立ち上げて>

(ディレクトリ移動)
cd C:\Users\***\dev\Vagrant-Docker-PostgreSQL-DBeaver-main

(カレントディレクトリ(現在の位置のディレクトリ)にあるファイルとサブディレクトリの一覧を表示)
dir

(Vagrant起動)
vagrant up

(Vagrantにssh接続)
vagrant ssh
<Vagrantを利用してCentOS7に入れた>

<次はDocker。Dockerディレクトリに入る>
(dockerに移動)
cd docker
(現在の作業ディレクトリを表示)
pwd
(ls=「list segments」の略でディレクトリやファイルの情報を表示。la=???)
ls -la

(Dockerコンテナを起動)
docker-compose up -d

(Dockerコンテナに入ってPostgreSQLを操作する)
docker exec -it postgres_container /bin/bash

<psql(CUI DB クライアント)に入る>
(psqlにログインする)
psql -U user first_tutorial
(↑ psql -U <ユーザー名> <データベース名> )

(↑コード引用元:
限定公開YouTube動画「環境構築データベース PostgreSQL」(作成者=黒澤さん @kurosawa_kuro))

するとPowerShellの#のディレクトリが「first_tutorial=#」という表示になりました。
Dockerを通してPostgreSQLを操作する状態になりました!

2-4.DBeaverでPostgreSQLに接続

このタイミングでDBeaverのfirst_tutorialを右クリックし「接続」をクリックすると・・・

接続成功です!!

3.解決方法

ということで、解決方法は「仮想マシンとDockerを起動し、さらにDockerからPostgreSQLを操作できる状態にしておく」でした。
(該当箇所=「2-3.Dockerを起動」、「2-4.DBeaverでPostgreSQLに接続」)

VirtualBoxのGUI上で仮想マシンを起動するのではなくて、PowerShell(CUI)でDockerの起動もしながら仮想マシンを起動しなくてはいけないのですね。ここらへん、やはり各種ツールの関係を把握しきれていないから、混乱したのだと思います。

おわりに

今回のDBeaverといい、pgAdminやVagrantといい、いつも「接続」でつまずきます。ホストとゲスト、クラウド上のツールの関係性を整理しながら、ひとつひとつ理解していくことが大切なのかな、と思います。
それにしても今回のは、アホ過ぎました...。本来であればサクッと再接続して、『オープンソースデータベース標準教科書-PostgreSQL-』の学習に入る予定だったのに、再接続で3時間半を使ってしまいました。教科書の学習は明日です!

情けなくなりますが、今はこうしてひとつひとつ書き出しながら確認しないと気づけないのだからしょうがありません。書き出すことで気づく現在の状態から、すぐに気づける(=ホスト/ゲスト/ツールの関係性を理解している)状態になれるよう、それまでは都度書き出して理解していこうと思います。