はじめに
先日、何年かぶりに自身のLinux検証環境にPostgreSQLをインストールしました。かなりご無沙汰だったため、ほとんど使い方を忘れてしまっていたので、下記リンク先のマニュアルを参考にチュートリアルを実施しました。ちなみにインストールしたPostgreSQLのバージョンは16.3です。
チュートリアルを実施するなかで、いの一番に実施した方が後々便利になると感じたのは、LinuxのログオンユーザーIDから直接PostgreSQLにアクセスできるようにすることです。本記事では、その設定方法をご紹介します。
データベースの設定
最初にデータベース・サーバーが稼働していることを確認します。
$ sudo systemctl status postgresql-16
[sudo] testuser のパスワード:
● postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
Active: active (running) since Sun 2024-05-26 17:23:52 JST; 26min ago
Docs: https://www.postgresql.org/docs/16/static/
Process: 1318 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 1337 (postgres)
Tasks: 7 (limit: 22820)
Memory: 66.3M
CPU: 1.647s
CGroup: /system.slice/postgresql-16.service
tq1337 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
tq1389 "postgres: logger "
tq1393 "postgres: checkpointer "
tq1395 "postgres: background writer "
tq1403 "postgres: walwriter "
tq1404 "postgres: autovacuum launcher "
mq1407 "postgres: logical replication launcher "
5月 26 17:23:52 localhost.localdomain systemd[1]: Starting PostgreSQL 16 database server...
5月 26 17:23:52 localhost.localdomain postgres[1337]: 2024-05-26 17:23:52.746 JST [1337] LOG: ログ出力をログ収集プロセスにリダイレクトしています
5月 26 17:23:52 localhost.localdomain postgres[1337]: 2024-05-26 17:23:52.746 JST [1337] ヒント: ここからのログ出力はディレクトリ"log"に現れます。
5月 26 17:23:52 localhost.localdomain systemd[1]: Started PostgreSQL 16 database server.
データベースの作成
createdbコマンドでデータベースを作成します。
$ createdb mydb
PostgreSQLインストール直後の状態だと、下記のエラーが出力されて、データベースの作成に失敗します。
createdb: エラー: ソケット"/run/postgresql/.s.PGSQL.5432"のサーバーへの接続に失敗しました: FATAL: ロール"testuser"は存在しません
これは、下記リンク先のドキュメントにも記載されていますが、PostgreSQLに接続可能なユーザーとして、現状Linuxにログオンしているtestuserという名前のユーザー(ロールとも言います)が定義されていないために発生します。
PostgreSQLインストール直後は、「postgres」という名前のユーザーがデフォルトの接続可能なユーザーとして定義されているため、PostgreSQLへのアクセスにはこのユーザーを使用する必要があります。
# su postgres
bash-5.1$
ログオン中のtestuserから直接postgresユーザーにスイッチしようとすると、postgresユーザーのパスワードを聞かれてしまいます。その為、一旦rootにスイッチした後に、postgresユーザーに切り替えることにしています。
postgresユーザーへスイッチ後、再度「createdb」コマンドでデータベースを作成します。(データベース名は「mydb」としています。)
bash-5.1$ createdb mydb
bash-5.1$
今度はエラーとならずに正常にデータベースを作成することができました。
LinuxログオンユーザーIDをROLE登録
「psql」というユーティリティーを使用して、上記で作成したデータベースに接続します。
bash-5.1$ psql mydb
psql (16.3)
"help"でヘルプを表示します。
mydb=#
「mydb=#」の所にSQL文を入力していきます。ここでは、Linuxログオンユーザー名(testuser)をROLE名として設定するSQL文としています。ROLE名の後に「LOGIN」を付与することがポイントです。
mydb=# CREATE ROLE testuser LOGIN;
CREATE ROLE
CREATE ROLEという文言のみが返ってきたら、ROLE作成は完了です。ROLEの作成方法については、下記リンク先のドキュメントを参照ください。
pg_rolesという名前のシステム・カタログに対してSELECT文を発行し、「testuser」という名前のROLEが出力されることを確認します。
mydb=# SELECT * FROM pg_roles;
rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig |
oid
-----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+--
-----
postgres | t | t | t | t | t | t | -1 | ******** | | t | |
10
:
:
(略)
:
:
testuser | f | t | f | f | t | f | -1 | ******** | | f | | 1
6389
上記のSELECT文の出力結果から、問題なく「testuser」という名前のROLEが作成されていることが確認できます。これで作業は終了なので、データベース、及び、postgresユーザーからログオフします。
mydb=# exit
bash-5.1$ exit
LinuxログオンユーザーIDでの接続確認
ログオンユーザーIDのシェルに戻ったことを確認後、「psql mydb」コマンドを実行します。
$ psql mydb
psql (16.3)
"help"でヘルプを表示します。
mydb=>
無事、ログオンユーザーIDでPostgreSQLのデータベースに接続できるようになりました。
さいごに
本記事では、Linuxログオンユーザーから直接PostgreSQLのデータベースに接続できるようにするための方法をご紹介しました。必須の作業というわけではありませんが、毎度毎度「postgres」ユーザーに切り替えるのは手間ですし、時間が経ったら「postgres」ユーザーの存在自体忘却の彼方となっているかもしれません。。。
ですので、今後LinuxにPostgreSQLをインストールして使ってみようと思われた方は、本記事に記載の内容を参考にLinuxログオンユーザーから直接PostgreSQLにアクセスできる設定をされることをお奨めします。