環境
バージョン | ||
---|---|---|
Host OS | Windows 10 Home | 21H1(OSビルド:19043.1165) |
Virtual Machine(仮想環境技術) | WSL2 | - |
Remote OS(仮想環境OS) | Ubuntu | 20.04.2 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64) |
Database | PostgreSQL | 12.7 (Ubuntu 12.7-0ubuntu0.20.04.1) |
Database GUI | DBeaver | 21.1.3.202107181810 |
Docker | 無し | - |
エディタ | Visual Studio Code | 1.60.0 |
#1.疑問・結論
【疑問】
DBeaverからUbuntuにリモート接続したい。DBeaverの接続情報はどのように設定すれば良い?
【結論】
接続情報は下記の通り。
ただし、接続情報の設定の前に「PostgreSQLのアクセス設定の変更」をしなくてはならない。
<PostgreSQLのアクセス設定の変更>
↓変更すべきファイルと変更内容↓
① /etc/postgresql/12/main/postgresql.conf
変更前:#listen_addresses = 'localhost'
変更後:listen_addresses = '0.0.0.0'
②/etc/postgresql/12/main/pg_hba.conf
変更前:host all all 127.0.0.1/32
md5
変更後:host all all all
md5
<接続情報>
Server>Host=(UbuntuのIPv4のアドレス)
Server>Port=5432
Server>Database=postgres
認証>ユーザー名=postgres
認証>パスワード=(設定したパスワード)
【手間取ったところ】
・PostgreSQLのアクセス設定の変更。
―― DBeaverの接続情報を設定する際、その設定の前に「PostgreSQLのアクセス設定の変更が必要」だということに気づくことができなかった。指針にあった「アクセス設定を変更」という文言は「DBeaverの接続情報を未入力の状態から入力された状態に変更すること」だと勘違いしてしまった。
→接続情報入力後に「接続が拒絶されました。ホスト名とポート番号が正しいことと、postmasterがTCP/IP接続を受けていることを確認してください。」というエラーが出たため、「postmasterがTCP/IP接続を受けていないからエラーになるのでは?」「postmasterとは?」という疑問を持ちドキュメントを読んだり、ネット上の「DBeaverとホストPCを接続させている記事」の接続情報を見ている内に(それらの記事は"Server>Host"が"localhost"になっているものが多かった。)、「アクセス設定の変更」の意味を勘違いしていたことに気づいた。
―― 「PostgreSQLのアクセス設定の変更が必要」だと気づいた後、設定の変更に必要なディレクトリをすぐに探すことができなかった。「PostgreSQL アクセス設定」等で調べると、「dataディレクトリに設定ファイルが存在する」その情報が多く出てきたのでdataディレクトリを探したが、私が使おうとしている環境だと、それを探し出すことができなかった。
結局「/etc/postgresql/12/main/postgresql.conf」、「/etc/postgresql/12/main/pg_hba.conf」というかたちで存在していた。
―― (これが原因の一つなのか検証しきれていないし、原因だとは思えないのだが一応メモ)設定ファイル「pg_hba.conf」について、「127.0.0.1/32 → all」への変更の際、allの位置が上下段にある「peer/md5」とずれていたのを、直線に並ぶように合わせた。
・DBeaverからWSL2(Ubuntu)のデータベース(postgres)への接続。
―― password認証のエラー(FATAL: password authentication failed for user "postgres")が出て、対処に難儀した。
→postgresのパスワードを
SQL「ALTER ROLE postgres with PASSWORD '任意のパスワード';」で再設定したら解決した!
#2.はじめに
『オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0)Kindle版』を使ってPostgreSQLの操作を学習中です。
この教科書の
4.演習 --4.2演習2:郵便番号データベース
を進めています。
↓この環境で進めていましたが、
【当初の環境】
ホストPC:Windows10
GUI DBツール:DBeaver
仮想化ソフト:VirtualBox
ゲストPC:Vagrant(=CentOS7=仮想マシン)
コンテナ型仮想環境:Docker
CUI DBクライアント:PostgreSQL
↓こんなことでつまずきました。
【つまずいたこと】
DB(DBeaver/PostgreSQL)にCSVファイル(郵便番号データ)をインポートしDB内の「テーブル zip」のレコードデータにしたい。が、エラーになってインポートできない。
↓こんな経緯で試行錯誤していたところ、
【これまでの経緯】
・csvファイルをデータベースに取り込む方法__試行錯誤1(未解決)_『OSS-DB標準教科書』3
・csvファイルをデータベースに取り込む方法__試行錯誤2(未解決)_『OSS-DB標準教科書』4
・csvファイルをデータベースに取り込む方法_試行錯誤3(未解決)WinSCPを使ってcsvファイルをVagrantにアップ『OSS-DB標準教科書』5
アドバイスくださっている黒澤さん(@kurosawa_kuro)より
「WSL2でのpostgresの方が圧倒的に外部ファイルを扱いやすい」
との助言をいただきました。
WSL2を使った環境構築の進め方の指針をいただき、下記の環境を作りました。
【作った環境】=☆
ホストPC:Windows10
仮想環境技術:WSL2
仮想環境OS:Ubuntu
エディタ:VSC
DB GUI:DBeaver
【上記環境(☆)を作るためにやったこと】
(黒澤さん(@kurosawa_kuro)の指針を参考に進めた)
(自分メモ:A~Cの作業の詳細と、Dの試行錯誤の導入部分は非公開記事 『WSL2でPostgreSQLを扱う』 にまとめた)
◆A. エディタをインストール◆
・VSCをインストール
◆B. Win10に仮想環境技術をインストール◆
・WSL2をインストール
・Ubuntuをインストール
◆C. エディタから接続◆
・VSCからUbuntuにリモート接続(VSCとWSL2の連携)
・VSCからファイルをアップロード(VSCを操作してUbuntuに郵便番号csvファイルをアップロード)
・WSL2にpostgres インストール
・linux(Ubuntu) のPostgreSQL user「postgres」を作成
・psqlシェルで PostgreSQL を実行するための準備をする。(コマンドラインが 「postgres=#」 に変わる。正常に psql シェルに入れた!)
・データベース(PostgreSQL)のPostgreSQL user「postgres」を作成
【上記環境(☆)を作るために現在取り組んでいること】
◆D. DB GUIから接続◆
・アクセス設定を変更。DBeaverからUbuntuにリモート接続。
・postgres再起動
【現状】
Cまでは完了したのですが、Dの「DBeaverからUbuntuにリモート接続」がうまくいかず苦戦しています。
この記事にまとめながら、クリアしていきたいと思います。
###【メモ:postgresの立ち上げ方】
1.ホストWin10のUbuntuのアイコンをクリックしUbuntu起動
2.「code .」+Enter でVSCのUbuntuをを起動
3.(以下太字=VSC Ubuntuのターミナルに記述するコマンド)
umesan@MyComputer:/mnt/c/WINDOWS/system32$ sudo service postgresql start
[sudo] password for umesan:(パスワードを入力)
Starting PostgreSQL 12 database server
(↑Postgre 12 だと確認できた!)
umesan@MyComputer:/mnt/c/WINDOWS/system32$ sudo -u postgres psql
psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1))
Type "help" for help.
postgres=#
(psqlに入れた!)
(postgres=#を終了 → 「\q」or「Ctrl+D」)
#3.これまで試したこと
##1.DBを作成してDBeaver接続情報のDatabase欄に入力しようと試みる→失敗
DBeaverの接続情報で
・サーバー名=WSLのIPアドレスを入力する。
-WSLのIPアドレスは ip a コマンドで確認。
eth0のinetが取得したいWSL2のIPアドレス。上記では「172.29.81.79」。
※注:ここで取得できたIPアドレスは固定ではないため、Ubuntuを起動するたびに変わる可能性がある!
・Port:デフォルトの「5432」
・Database:ここで手が止まった。PostgreSQLのユーザは作成したけれど、まだデータベースは何も作っていない。先にPostgreSQLでデータベース作成しなければならないのではないか!?
→作成する。WSL(Ubuntu)でpostgresqlに移動。
umesan@MyComputer:/mnt/c/WINDOWS/system32$ sudo service postgresql start (postgres サービスを開始)
umesan@MyComputer:/mnt/c/WINDOWS/system32$ sudo -u postgres psql
(postgres サービスに接続し、psql シェルを開く)
(psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1))
Type "help" for help.
postgres=#
と表示された。正常に psql シェルに入れた!)
→データベースを作る
postgres=# createdb 2nd_tutorial_WSL
(2nd_tutorial_WSLという名前のデータベースを作って!)
postgres-# \l
(データベースの一覧を表示して!)
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+---------+-----------------------
postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
(↑データベース「2nd_tutorial_WSL」が作成されていない…。何で???)
もしかして、ユーザの権限に「データベースの作成」が含まれていない状態になっている?
権限を付与してみる。
ALTER ROLE postgres CREATEDB;
(データベース作成権限の付与)
(ALTER ROLE
postgres=#
と表示される)
postgres=# createdb 2nd_tutorial_WSL
(2nd_tutorial_WSLという名前のデータベースを作って!)
postgres-# \l
(データベースの一覧を表示して!)
( List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+---------+-----------------------
postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
と表示された。前回同様データベースは作成されていない…。なぜ???)
(エラー文は表示されていない。原因の調べようが無くて困る。)
postgres=# select rolname, rolcreatedb from pg_roles;
(権限を調べる)
権限について、↓下スクショ↓のとおりに表示された。t(true)となっている。権限はあるようだ。
その後も「postgres-#sudo su postgres 、postgres-# psql -c "create database 2nd_tutorial owner postgres"」「create database "2nd_tutorial_wsl"」「CREATE DATABASE 2nd_tutorial」
と試してみたけれども全滅。
ここはDB作成は諦めて、既存のDB「postgres」を使ってみようと考えた。次へ。
##2.DB「postgres」を使って接続を試みる→失敗
「新しい接続」のアイコンをクリック
↓
「PostgreSQL」を選択
↓
「次へ」
↓
エラー。
「172.29.81.79:5432への接続が拒絶されました。ホスト名とポート番号が正しいことと、postmasterがTCP/IP接続を受けていることを確認してください。」
んーーーー??また接続でつまずいている・・・。
参考:Windows Subsystem for Linux 2におけるネットワークの改良
##3.今の位置関係を確認
今の位置関係は、↓このようだと認識している。DBeaverからデータベースpostgresに接続したい。
・Server>Host=WSLのIPアドレス「172.29.81.79」を入力した。(ip aコマンドで確認した)
・Server>Port=デフォルトのまま「5432」。
・Server>Database=「postgres」
・認証>ユーザー名=postgres(linux userの「postgres」)
・認証>パスワード=「5.linux user「postgres」を作成」で設定したパスワード
###疑問:ポート番号は何でもOKなの?
↑ポート番号は以前vagrant使うときに作ったデータベース「first_turorial」でも5432を使ったし、今回もデフォルトの5432とした。けれど、ポート番号は何でも良いのだろうか?デフォルトだということ以外に、5432を使う理由があるのだろうか?ポートの仕組みがいまいちつかめていない。
インターネットサーバ側のポート番号には大きな意味を持っています。
パソコン側のポート番号は毎回変わりあまり意味はありません。」
(引用元:「用語集 「ポート(PORT)とは?」)
とあった。空いているポート番号を使えば何でもOKなのかな?WSL2のポート番号も、ホストPCと同じく空いていればどれを使ってもOKなんだろうか。
OKなのだとしたら、今回も5432で問題無いはず。
WSLターミナルでpsqlに接続して「postgres#」と表示されているのだから、PostgreSQLは起動している。
コマンド「\l」で確認した「List of databases」の中にデータベース「postgres」は存在している。
なぜそこに接続できないんだろう??
##4.WSL2とDBeaverを再起動し、改めて接続情報を入力→失敗
試しにWSL2とDBeaverを再起動して、もう一度同じ接続情報を入力してみる。
umesan@MyComputer:/mnt/c/WINDOWS/system32$ ip a
(WSL2のIPアドレスを確認)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ba:c3:7a:e9:4c:db brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 82:cc:a0:ef:72:7c brd ff:ff:ff:ff:ff:ff
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:9b:47:a3 brd ff:ff:ff:ff:ff:ff
inet 172.29.81.79/20 brd 172.29.95.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe9b:47a3/64 scope link
valid_lft forever preferred_lft forever
umesan@MyComputer:/mnt/c/WINDOWS/system32$
(→IPは「172.29.81.79」と確認できた!)
umesan@MyComputer:/mnt/c/WINDOWS/system32$ sudo service postgresql start
[sudo] password for umesan:(パスワードを入力)
* Starting PostgreSQL 12 database server
(↑Postgre 12 だと確認できた!)
umesan@MyComputer:/mnt/c/WINDOWS/system32$ sudo -u postgres psql
psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1))
Type "help" for help.
postgres=#
DBeaverに入力した情報は下記のとおり。
データベースpostgresを右クリック
↓
編集 接続
↓
・Server>Host=172.29.81.79
・Server>Port=デフォルトのまま「5432」。
・Server>Database=「postgres」
・認証>ユーザー名=postgres (linux userの「postgres」)
・認証>パスワード=linux user「postgres」作成時に設定したパスワードを入力。
↓
「OK」
↓
エラー。さっきと同じエラー。
「172.29.81.79:5432への接続が拒絶されました。ホスト名とポート番号が正しいことと、postmasterがTCP/IP接続を受けていることを確認してください。」
なぜ接続できない???
PostgreSQLが起動していないとか?
しかしVSCで既に「postgres=#」と表示されているんだよな。
これはPostgreSQLが既に起動されている状態だと私は理解したんだが、違うのか??
postmasterとは?
PostgreSQLのマルチユーザデータベースサーバ。サーバープロセス(親プロセス)。
マルチユーザデータベースサーバとは?
複数の利用者がそれぞれの識別情報や設定などに基づいて利用できるデータベースサーバ。
サーバプロセスとは?
サーバで動いているプログラムのこと。プロセスはタスクと同義。
(以下、参考にした記事。)
#4.DBeaverから、postgresデータベースに接続できないよ。→仮説:postmasterがTCP/IP接続を受けていないのではないか?
公式ドキュメント内に、下記のような文言を発見。
ここ、怪しい・・・。何かヒントが隠れていそうな気がする。
クライアント認証はデータベースクラスタのデータディレクトリ内の、伝統的にpg_hba.confという名前の設定ファイルで管理されています(中略)
レコードは7つの書式のうちの1つの形式を取ります。(中略)
host...database user address auth-method [auth-options] (中略)
host...このレコードは、TCP/IPを使用した接続に対応します。 hostレコードは、SSLもしくは非SSL接続のいずれかに対応します。
注意: サーバのデフォルトの動作は、ローカルループバックアドレスであるlocalhostのみTCP/IP接続を監視しています。 よってサーバにおいてlisten_addressesパラメータが適切な値に設定された状態で起動されていない限り、リモートのTCP/IP接続はできません。
(引用:PostgreSQL 9.3.2文書 > 第19章クライアント認証 > 19.1. pg_hba.confファイル
「サーバにおいてlisten_addressesパラメータが適切な値に設定された状態で起動されていない限り、リモートのTCP/IP接続はできません。」
→ここら辺があやしい。「リモートのTCP/IP接続」。私が今やろうとしていることじゃないのか??解決のヒントがここに書かれている気がする・・・。
「サーバのデフォルトの動作は、ローカルループバックアドレスであるlocalhostのみTCP/IP接続を監視しています。 」「よってサーバにおいてlisten_addressesパラメータが適切な値に設定された状態で起動されていない限り、リモートのTCP/IP接続はできません。」
→私は今、localhostではなく、"WSL2(Ubuntu)中のPostgreSQL"をDBeaverにTCP/IP接続しようとしている。
つまり、PostgreSQLのサーバーにおいてlisten_addressesパラメータが適切な値に設定された状態で起動されていないと、リモートのTCP/IP接続はできないということ。
「PostgreSQLのサーバーにおいてlisten_addressesパラメータが適切な値に設定された状態で起動」するにはどうしたら良いのだろう?
listen_addressesパラメータとは?
listen_addressesパラメータの適切な値とは?
「pg_hba.conf」なるものの中味を見てみます。
こちらを参考にしました→「pg_hba.confファイルの設定方法」
◆pg_hba.confファイルの場所
「デフォルトでは PostgreSQL をインストールしたディレクトリの中の data ディレクトリの中に格納されている」とのこと。Ubuntuのディレクトリを確認すれば良いのかな?
ディレクトリ 確認
・参考 →「ファイル操作」>findコマンド
・Ubuntuのターミナルで
「umesan@MyComputer:~$ find」を実行すると、ずらずら―っと200行ぐらい?の結果が返された。
ドンピシャで「pg_hba.conf」を探そうと
「umesan@MyComputer:~$ find . -name pg_hba.conf」を実行してみたけれど、反応は無し。
「umesan@MyComputer:~$ find pg_hba.cnf」を実行。→返し「find: ‘pg_hba.conf’: No such file or directory」
見つからない。
方法を変えて
VSCのEXPLORERで目視で探そうと試みるも、見つけられず。
見逃している・・・?
「pg_hba.conf は postgresql.conf と同じくデフォルトでは PostgreSQL をインストールしたディレクトリの中の data ディレクトリの中に格納されています。」
とのことだから、「cd data」も実行したけれど、移動できず。
現在、VSCでUbuntuの「postgres=#」に繋がっている状態。つまり、postgres自体はUbuntuの中に存在しているのは間違いない。どうやって、postgresのディレクトリを確認したら良いのだろう?
「postgres=# show data_directory;」等で確認しようとするも、
「Command 'show' not found」と返ってくる。
##listen_addressesパラメータとは?
↓ドキュメント↓
「listen_addressesパラメータ」でGoogle検索。
この記事を見つけた。
さらに同じ人の記事をたどるとこんな記事も。
ここで最初に黒澤さんからいただいた指針「アクセス設定を変更。DBeaverからUbuntuにリモート接続。」の「アクセス設定を変更」の部分にひっかかりを覚えた。
これ、もしかして「PostgreSQLサーバーのTCP/IP接続の設定を変更」することを指しているのでは??
今の今まで、「DBeaverの接続設定」のことを指していると思っていた。「接続情報に何も入力されていない状態から入力されている状態に変更する」ことを指しているのだ、と解釈していた。
##listen_addressesパラメータの適切な値とは?
PostgreSQL構成ファイルに、listenする対象のIPアドレスを指定します。listen_addressesパラメーターを含む行をアンコメントし、適切な値を指定します。例えば、すべてのアドレスを listen するには、listen_addresses を '*' に設定します。
(引用:IBM)
##教科書の「接続と認証」
教科書の中に、listen_addresses を '*'にする旨の記述があった!
長いので折り畳み
以下「」内は、『オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0)Kindle版』の「7.3_ネットワーク経由接続」の項より抜粋。
(宮原徹; 喜田紘一. オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0) (Kindle の位置No.2757-2762). LPI-Japan. Kindle 版. )
1.postgresql.conf に listen_addresses の設定を行なう
ネットワーク経由接続を受け付けるには、postgresql.conf に listen_addresses の設定を行ない、PostgreSQLを再起動する。
デフォルトでは、 listen_addresses = 'localhost' が設定されていて、PostgreSQLが実行されているホストでのローカルループバック接続のみが有効になっている。
値 を「*(アスタリスク)」に設定することで、ホストが用意しているすべてのインターフェースからの接続を受け付けるようになる。
教科書の書き出しには
「[postgres@ localhost ~]$ vi $ PGDATA/postgresql.conf」
と記述され、続いて
「----- #listen_ addresses = 'localhost' # what IP address(es) to listen on;
listen_ addresses = '' # what IP address( es) to listen on; # comma-separated list of addresses; # defaults to 'localhost', '' for all # (change requires restart)
#port = 5432 # (change requires restart)」
と記述されていた。
2.pg_hba.confのhostアクセス制御を設定する
あわせて、接続認証の設定も行なう。
pg_hba.conf のhostアクセス制御を設定する。
pg_hba.conf の設定反映は再読み込みで良いが、今回は listen_addresses も変更しているのでPostgreSQL の再起動で両方の設定を反映させる。
教科書には「ネットワーク経由接続でossdbデータベースにsatoユーザーがアクセスする際にパスワード認証するように設定している」として、 書き出しには
「[postgres@ localhost ~]$ vi $ PGDATA/pg_hba.conf」
と記述され、続いて
「# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all scram-sha-256
# IPv 4 local connections:
host ossdb sato 0.0. 0.0/0 scram-sha-256
host all all 127.0.0.1/ 32 scram-sha-256
# IPv 6 local connections:
host all all ::1/128 scram-sha-256」
と記述されていた。
##postgresql.confとpg_hba.confを探す
やはりこの2ファイルのディレクトリがどこなのかがわからないと次へ進めない。
この記事にこんな一言があった。
UbuntuでPostgreSQLを使ってみよう (3)
(中略)
(2) 設定ファイル
設定ファイルは、/etc/postgresql ディレクトリ配下にあります。いくつかのファイルがありますが、今回変更するのはpostgresql.conf ファイルです。
(引用元:Let's POSTGRES PostgreSQL情報ポータルサイト)
これまで得ていた情報だと「data ディレクトリ」にあるとのことだったけれど、ここには「/etc/postgresql ディレクトリ」とある!
・・・同じ課題(?)を進めている某さんの学習記録を読ませていただいたところ、ディレクトリが書かれていたのでそれを参考に「/etc/postgresql」でググったら出てきたのが上記記事。
【某さんの学習記録からのヒント】
①2つのファイルを変更する
・/etc/postgresql/12/main/pg_hba.conf
・/etc/postgresql/12/main/postgresql.conf
②この作業にはコマンドでの移動やubuntuにデフォルトでインストールされているテキストエディタ「vi」を使った作業が出てくる。
このヒントのおかげで、ディレクトリがわかった。某さん、どうやってこのディレクトリ名に行きついたのだろう?
また、「vi」の存在も、某さんの学習記録を読んで初めて知った。どうやってそこに行きついたのだろう?
答えを見てしまったような後ろめたさがあるが、ありがたく、このままヒントを参考に進める。
→【某さんからの回答】
課題資料の中の リンク先(↓)に記載されていた!
pg_hba.conf・postgresql.conf とは何か?と調べ出したら迷走して、
その間に肝心のリンク先の内容からどんどん離れてしまっていた…。
素直にまずは資料通りに進めてみるべきだった。
→上記リンク先では、「postgresql.conf」中の「listen_addresses ='localhost' 」を「listen_addresses = '0.0.0.0'」に変更せよ、と指示されていた。標準教科書では「'*'」に変更せよ、と指示されていた部分。違いは何?
'0.0.0.0' と '*' の違い | |
---|---|
'0.0.0.0' | 全てのアドレスとマッチする。全てのホスト、任意の宛先を意味する。来る者拒まず去る者追わず、といった動作をする。(引用元:通信用語の基礎知識) |
'*' | ホストが用意しているすべてのインターフェースからの接続を受け付けるようになる。(引用元:標準教科書―7.3_ネットワーク経由接続) |
→はっきりとはわからないけれど、「'0.0.0.0'」の方がカバー範囲が広い??
今回は「'0.0.0.0'」を使おう!
● pg_hba.confのディレクトリを見つけようとして失敗したコマンド
find / -name pg_hba.conf
find / pg_hba.conf
find -type f postgresql.conf
find postgresql.conf -type f
find postgresql.conf -type d
→関係のないファイルもダダ―っとVSCに表示され出して焦ったコマンドもある。「Ctrl + c 」でその表示を強制終了させた。
● 成功したコマンド
umesan@MyComputer:~$ find /etc/postgresql
(以下、返ってきたもの)
/etc/postgresql
/etc/postgresql/12
/etc/postgresql/12/main
/etc/postgresql/12/main/pg_hba.conf
/etc/postgresql/12/main/pg_ctl.conf
/etc/postgresql/12/main/start.conf
/etc/postgresql/12/main/environment
/etc/postgresql/12/main/conf.d
/etc/postgresql/12/main/postgresql.conf
/etc/postgresql/12/main/pg_ident.conf
探していたディレクトリが判明したので次の作業へ。2つのファイル(①②)を書き換える。
(2021/9/4追記:
↓pg_hba.confの探し方についての記事を見つけたのでメモ
https://postgresweb.com/how-to-find-pg_hba-conf)
##設定ファイル2つ(postgresql.conf、pg_hba.conf)書き換え
「postgresql.conf」「pg_hba.conf」を書き換えてDBeaverからUbuntu(WSL2)中PostgreSQLへ接続できるようにする。
↓Linuxにデフォルト搭載されているテキストエディタ「vi」を使うので使用コマンドをメモしておく↓
【viコマンド】
やりたいこと | 方法 | 参考元 |
---|---|---|
viでファイルを開く | vi+ファイル名 | https://language-and-engineering.hatenablog.jp/entry/20121207/p1 |
検索 | コマンドモードで,スラッシュ・文言でEnter | https://language-and-engineering.hatenablog.jp/entry/20121207/p1 |
コマンドモード→編集モードへ切替 | i | https://language-and-engineering.hatenablog.jp/entry/20121207/p1 |
保存しないで終了(書き間違えてしまったときに使う!) | :q! | https://docs.oracle.com/cd/E19253-01/816-3946/editorvi-12/index.html |
保存 | :w | https://language-and-engineering.hatenablog.jp/entry/20121207/p1 |
終了 | :q | https://language-and-engineering.hatenablog.jp/entry/20121207/p1 |
保存&終了 | :wq | https://docs.oracle.com/cd/E19253-01/816-3946/editorvi-11/index.html |
編集モード→コマンドモードへ切替 | Esc | https://language-and-engineering.hatenablog.jp/entry/20121207/p1 |
強制脱出(E45: 'readonly' option is set (add ! to override)が出たら) | :w !sudo tee % | https://qiita.com/maedatakumi/items/220f747307f773bceb02#e45-readonly-option-is-set-add--to-override%E3%81%8C%E5%87%BA%E3%81%9F%E3%82%89 |
① /etc/postgresql/12/main/postgresql.conf
変更前:#listen_addresses = 'localhost'
変更後:listen_addresses = '0.0.0.0'
変更方法:
WSL2のターミナルで
下記を実行
umesan@MyComputer:~$ cd
/etc/postgresql/12/main
↓
下記を実行
umesan@MyComputer:/etc/postgresql/12/main$ vi
postgresql.conf
(viでpostgresql.confファイルを開く、の意)
↓
(WSL2ターミナルにpostgresql.confテキストファイルが展開される)
/listen
+Enerで listen_addressを検索
↓
今見えているのは,コマンドモード。
i
キーを押下し、編集モードに切り替える。
↓
<<ファイル内容が消えてしまうハプニング発生!→ 下記Qiita記事にまとめた>>
↓
#
(コメントアウトのコマンド)を削除し、
'local host' を'0.0.0.0'
に書き換える。
(十字キーでカーソル移動。マウスは使えない。)
普通にDeleteとキーボード入力で書き換える。
↓
Esc
キーを押下し、編集モードからコマンドモードに切り替える。
↓
:w
押下で保存。
↓
<<エラー発生!
「E45: 'readonly' option is set (add ! to override) 」>>
→:w !sudo tee %
で強制脱出。
↓
:q!
で終了。
↓
(一応vi postgresql.conf
で変更が正しく反映されているかを確認。
→正しく反映されていた。
↓
完了!
②/etc/postgresql/12/main/pg_hba.conf
設定ファイル「/etc/postgresql/12/main/pg_hba.conf」をテキストエディタviで開き、下記のように変更する。
変更前: host all all 127.0.0.1/32 md5
変更後: host all all all md5
(変更内容解説(黒澤さんに提示された資料))
変更方法(失敗例):
WSL2のターミナルで
下記を実行
umesan@MyComputer:~$ cd
/etc/postgresql/12/main
↓
下記を実行
umesan@MyComputer:/etc/postgresql/12/main$ vi
pg_hba.conf
(viでpostgresql.confファイルを開く、の意)
↓
(WSL2ターミナルにpostgresql.confテキストファイルが展開される)
↓
<<ファイル内容が消えていたというハプニング発生!→ 下記Qiita記事にまとめた>>
変更方法(成功した方法):
①ホスト(Win10)で「 Ubuntu 20.04.2 LTS」アプリをクリックしてUbuntuを起動。
↓
②Ubuntuターミナルで「umesan@MyComputer:~$ code .
」を実行。
(VSCodeが立ち上がる。)
↓
③VSCodeターミナルで「umesan@MyComputer:~$ SUDO_EDITOR=vi sudoedit -u postgres /etc/postgresql/12/main/pg_hba.conf
」を実行。(=下スクショ)
この1コードで「postgresへのログイン」「pg_hba.confファイルの展開」を実行する。
「[sudo] password for ユーザー名: 」とパスワードを求められるので入力。
↓
④pg_hba.confファイルが開いた!(下スクショ)
(WSL2ターミナルにpostgresql.confテキストファイルが展開された)
↓
⑤今見えているのは,コマンドモード。iキー
を押下し、編集モードに切り替える。
↓
「host all all 127.0.0.1/32 md5」を「host all all all md5」に書き換える。
(十字キーでカーソル移動。マウスは使えない。普通にDeleteとキーボード入力で書き換える。)
(127.0.0.1/32(ローカルホスト) となっている値を all にすることで、全ての IP アドレスからの接続を認証する。
(ちなみに、最終行から2行目に同じく「127.0.0.1/32」が表示されているけれど、「Allow replication connections from localhost, by a user with the replication privilege.
host replication all 127.0.0.1/32 md5」とある通り、レプリケーション()の接続についての部分なので今回は無視。)
↓
Escキー
を押下し、編集モードからコマンドモードに切り替える。
↓
:w
押下で保存。
「"/var/tmp/pg_hbaXX3l5emC.conf" 103L, 4924C written 」という1行が表示された。
↓
:q!
で終了。
↓
(この画面に戻った)
↓
一応SUDO_EDITOR=vi sudoedit -u postgres /etc/postgresql/12/main/pg_hba.confvi pg_hba.conf
で「all」への変更が正しく反映されているかを確認。
→正しく反映されていた。
↓
完了!
※今回行なったpg_hba.confの変更方法とは違うけれど、こちらの記事↓も気になったのでメモ。
【PostgreSQL】外部からデータベースへ接続するためのアクセス制御設定-電算星組
(この記事の変更方法=
デフォルト:trust(各行に存在。?箇所。)
こう変更する:md5(?箇所全て。))
→この記事中には、続けて「次に、外部接続用のアクセス制御設定を行います。
外部から接続を許可するロール、接続先データベース、送信元IPアドレスを指定したパラメータ行をファイルの末尾に追記します。」として「192.168.33.0/24のセグメントに存在するクライアントからsample_userロールでsample_dbデータベースへの接続を許可」する例が記載されていたけれど、今回は必要性がわからず実行せず。
#5.DBeaverに接続情報を入力
DBeaverに接続情報を入力し、DBeaverからUbuntu(WSL2)中のPostgreSQLへリモート接続する。
(Ubuntuでcode .
を実行しVSCodeを起動
→VSCodeでsudo service postgresql start
、sudo -u postgres psql
を実行し
PostgreSQLがUbuntu(WSL2)に立ち上がっている状態)
【チャレンジ1】(失敗)
ホスト(Win10)でDBeaverを起動
↓
UbuntuのIPを確認
↓
DBeaverに接続情報を入力
↓
エラー。接続できず。
以前と同じエラー。
設定ファイルを書き換えてTCP/IP接続を受け付けるように設定したのに、なぜ??
【設定ファイル2つを確認】
念のため、書き換えた設定ファイル2つ(postgresql.conf、pg_hba.conf)がきちんと書き換えられているか確認。(設定後、PCの電源を一度落として日をまたいだので、設定が変わってしまったのかと心配になったので確認)
→書き換えられている。では、なぜ接続できない??
【仮説1】(多分間違い)
ホスト(Win10)のファイヤーウォールがポート5432を開いていないから。
→今回接続したいポートはWSL2中のUbuntuのポート5432なのだから、ホストは関係無いのでは。だからこの仮説は間違いだと思う。
【位置関係を確認】
今一度位置関係を確認してみる。↓こんなかんじだと認識している。
postgresも起動してある。接続できない理由、これ以上仮説も思いつかない・・・。
↓
【黒澤さんよりアドバイス】
「接続方法自体はあってる。pg_hbaの設定が効いてない可能性を疑ってみよう。
設定前に戻して、エラー文言が変わらなければ設定が間違ってたり、効いていない可能性を疑おう。」
「pg_hbaの設定というかvim操作が怪しい気がするので、編集前と後をcatしておこう。」
↓
やってみる。
【①pg_hbaをcat→②設定前の状態に戻す→③cat→④DBeaver接続情報入力時のエラー確認】
①pg_hbaをcat
umesan@MyComputer:/etc/postgresql/12/main$ sudo cat pg_hba.conf
(cat コマンド=ファイルの閲覧)
(→ csvファイルの内容がダダ―っとターミナルに表示された)
(この↑コマンド、最初は
postgres-# cat pg_hba.conf
、
postgres-# cat etc/postgresql/12/main/pg_hba.conf
、
postgres-# cat /etc/postgresql/12/main/pg_hba.conf
、
を試していたが、全て反応無しだった。)
「postgres#」ではなく「umesan@MyComputer:~$」で「cat pg_hba.conf」を実行。スクショ。↓
↓
②pg_hba.confを設定前の状態に戻す(上スクショ赤丸部分の「all」を「127.0.0.1/32」に書き換える)
-1)umesan@MyComputer:~$ SUDO_EDITOR=vi sudoedit -u postgres /etc/postgresql/12/main/pg_hba.conf
(ちなみに「$ su postgres vi /etc/postgresql/12/main/pg_hba.conf」だとPassword:を求められ入力すると「/usr/bin/vi: /usr/bin/vi: cannot execute binary file」と返されエラーになった。)
-2)i
(コマンドモード→編集モードに切り替え)
-3)上スクショ赤丸部分の「all」を「127.0.0.1/32」に書き換え
-4)Esc
(編集モード→コマンドモードに切り替え)
-5):w
(保存)(「"/var/tmp/pg_hbaXXSEnoOB.conf" 103L, 4933C written」という1行が表示される)
-6):q!
(終了)
↓
③cat で書き換わっているかか確認。
OK!
↓
④DBeaverでエラー確認
-1)DBeaverのDB(postgres)の接続情報を入力(HostのIPアドレスは、UbuntuのIPを入力。Ubuntuは起動のたびにIPが変わるので注意!)
-2)エラー。「ユーザーのpsasward認証に失敗しました」
⑤pg_hba.confをもう一度設定変更用に書き換え(「127.0.0.1/32」→「all」)。
↓
⑥cat で書き換わっているかか確認。スクショ。↓
OK!
↓
⑦DBeaverでエラー文確認。
接続情報入力→エラー。「ユーザーのpassword認証に失敗しました」
↓
※エラー文言は「127.0.0.1/32→all」へ設定変更後も、「all→127.0.0.1/32」に設定変更前の状態に戻しても、
変わらなかった。
つまり今の状態は、黒澤さんの言うところの
「設定が間違ってたり、効いていない可能性がある」ということ。
※エラー文が、以前と変わった。
【以前】
Connect to "postgres" 172.〇.〇.〇:5432への接続が拒絶されました。ホスト名とポート番号が正しいことと、postmasterがTCP/IP接続を受けていることを確認してください。
【今回】
接続エラー FATAL: password authentication failed for user "postgres"
→ なぜ変わった?前回との違いで思い当たる事と言えば、設定変更の際の「md5」の位置くらい。
前回は「127.0.0.1/32」を消して「all」に書き換えたときに時数の差分、後ろの「md5」の位置が動いてしまったのをそのままにしていた。
今回は、ずれを無くし、上下の位置に合わせた。
位置が大切だ、ということ??
**【エラーの解消 チャレンジ1(PostgreSQLを再起動)】**→失敗
FATAL: Password authentication failed for user "andym"
この種のメッセージは、サーバと接触し、サーバも通信することを許可したが、pg_hba.confファイルの中で指定された認証方式に合格していないことを表します。 入力したパスワードを確認するか、もしエラーがKerberos、ident認証型のいずれかを指摘している場合は Kerberos あるいは ident ソフトウェアを確認してください。
(引用元:PostgreSQL 7.4.6 文書)
とあった。パスワードは合っているし、後半のKerberos等の文字は、エラー文内には見当たらない。
listen_addressesの設定変更を反映させるためには、PostgreSQLを再起動(リロードではなく)する必要があります。ファイル変更後は、
service postgresql restart
を忘れずに行って下さい。
(引用元:OSS-DB入門)
とあった。これまで\q
でPostgreSQLを終了→('sudo service postgresql start'を先に打った後にor打たずに)'sudo -u postgres psql'で再接続
という方法を取っていたのが間違いだったのではないか?
提示されたコマンドを試してみる。
umesan@MyComputer:~$ sudo -u postgres service postgresql restart
* Restarting PostgreSQL 12 database server
umesan@MyComputer:~$
**【エラーの解消 チャレンジ2(PW再設定してみる)】**→成功!!
postgresのパスワードを再設定してみる。
psqlに入ってから、SQL
「ALTER ROLE postgres with PASSWORD '任意のパスワード'; 」
を実行。
↓
「ALTER ROLE」と次の行に表示された。
再設定できたのかな?DBeaverから接続してみよう。
↓
!!!!!!!!!
接続できた!!!!
#6.「KEN_ALL.CSV」のデータをDBeaverで参照
(以前 CREATE TABLEで作った「zip」テーブルを参照する)
参照できた!!
#7.おわりに
かなりの時間をかけてしまったけれど、何とか接続できました。
エラーにぶつかっては、何にぶつかっているのか、エラーの内容、出てくる用語や機能について調べたり・・・と、手を動かすよりも調べる時間の方が長かったです。
どの情報が自分の状況に沿う情報なのかを、判断するのにも時間がかかってしまいました。
必用な情報を探し、選び、試して、検証して、また情報を探して、試して・・・というサイクルをもっと早くまわしていきたいです。
◆postgresの設定の失敗から得た教訓◆
設定ファイルを変更する際には事前のファイルと変更後のファイルのバックアップを取っておくべきだった。
→Ubuntuのファイルの扱い方がわかっていない。ファイルコピーの方法等、別記事にまとめる。
(2021/9/20追記:まとめた。↓)
<メモ>
◆設定ファイル変更時の慣習◆
「最近は環境構築をDockerで毎回サラッとできるようになったけど、以前は簡単なプログラミング言語で自動化させていた。その際に設定ファイルを変更させる前に「abc.config」を「abc_original.config」とかにコピーする慣習があった」by黒澤さん
◆VSCからPostgressにつなぐという方法◆
こんなのもあるよ、と黒澤さんから紹介された動画↓
「Run MySQL Database Queries From VS Code」
視聴してみると、VSCにツールを足すことで、VSCの機能を使って「DBeaverからではなく、WSL2からDBeaverに繋げるようになる」・・・ということらしい。(この理解で合ってる??)
「学習用に使うのなら良いのでは。上手くいけばDbver廃止しても良い気がしてる。外部からの接続ではないから、設定が不要でラクになるはず。」
「今プログラミングの世界ではドンドンツールがVSCだけに集約されている。バージョンコントロールのGitとかもうVSCに組み込まれてみんなそれ使ってるし」
と紹介してくださった。
↓
次はこの動画の方法で「VSCからPostgressにつなぐ」を試す!(自分メモ:プライベート記事へ)
その次に、標準教科書を進めていく。