PostgreSQL の最初の最初の設定をする(MySQL と比較しつつ)

結論だけを最初に

  • Linux のユーザ名と同じ名前のロール*1が作られてなければいけない
  • Linux のロールと同じ名前のデータベースが作られてなければいけない
  • ロールやデータベースを作成するためには postgres という特別なユーザでログインする必要がある
  • postgres ユーザでログインするためにはシェルで操作するユーザを postgres にしなければいけない
  • 上記にはもちろん例外ありです

MySQL から PostgreSQL へ

両方の RDBMS とも RDB としては大半の機能が同じですが、ユーザ*2周りなどで自分がハマったことをずらずらと書いていきます。

まず用語として押さえておかないとドキュメント類を読むときに問題となる語として「ロール」という語があります。これは「ユーザ」とほぼ同義です。これだけは押さえておきましょう。

なお、以下の説明は Ubuntu 16.04 LTS 上でのものです。

一番最初の最初のログイン

一般ユーザ(以下、foobar とします)で sudo apt-get install postgresql したあとにまずは psql コマンドを実行することになるでしょう。が、ここでいきなりつまずくはずです。ログインできません。

$ psql
psql: FATAL:  role "foobar" does not exist

「ロール」が登録されていないと怒られます。前述のとおりこれは「foobar というユーザが登録されていない」ということです。どうやってロールを登録したらいいでしょうか。

まずは PostgreSQL の中にログインする

PostgreSQL の中に入れなければロールは作ることができません。一番初めに PostgreSQL に入れるのは postgres という特別なユーザです。

postgres というユーザでログインするためにはどうしたらいいのか? foobar というユーザをシェルで操作している限りはログインできず、自分がシェルで操作するユーザを postgres にする必要があります。

$ sudo su postgres
[sudo] postgres のパスワード:

ユーザ変更ができれば psql コマンドを実行するだけで PostgreSQL の中に入ることができます。

$ psql
psql (9.5.14)
Type "help" for help.

postgres=#

ロールを作る

ログインできたならロールを作ります。ロールには細かく権限を与えることができます

ここではログインができるだけの権限を与えてロールを作成します。なおパスワードを付与していませんが、これは Peer認証という方式で認証を行っているためです。認証の方式には様々なものがあり必要に応じて変更ができます

また、特別に権限を指定していない場合、テーブルやスキーマへのアクセス権限は全開放です。

postgres=# CREATE ROLE foobar WITH LOGIN;

ロールの一覧は psql のプロンプトで \du コマンドを実行すればよいです。必要に応じて確認してみてください。

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 foobar | Superuser                                                  | {}
(以下省略)

改めて PostgreSQL にログインする

psql のプロンプトで \q を実行すると psql から抜けられます。その後、シェルで操作するユーザも foobar に戻しておきましょう*3

そうしたら改めて psql してログインを試みます。

$ psql
psql: FATAL:  database "foobar" does not exist

……また怒られました。エラーメッセージのとおり「foobar という名前(=ロールと同じ名前)のデータベースが存在しない」とのことです。となると。foobar というデータベースを作らなければいけません*4

どうやってデータベースを作るのか?

postgres というルートユーザでログインする

ロールを作る場合と同様、データベースを作るためには postgres という特別なユーザでログインする必要があります。postgres というユーザでログインするためにはどうしたらいいのか? foobar というユーザからはログインできないため、自分がシェルで操作するユーザを postgres にする必要があります*5

$ sudo su postgres
[sudo] postgres のパスワード:

ユーザ変更ができれば psql コマンドを実行するだけで PostgreSQL の中に入ることができます。

$ psql
psql (9.5.14)
Type "help" for help.

postgres=#

データベースを作る(実はここは任意です)

PostgreSQL にログインできたのでデータベースを作成しましょう。ユーザ名と同じ foobar という名前のデータベースを作ります。データベースの作成コマンドは MySQL と同じ感じです。

postgres=# CREATE DATABASE foobar;
CREATE DATABASE

現在作られているデータベースを確認するには \l コマンドを用います。必要であれば確認してみてください。なお、シェルから psql -l というコマンドでも確認できます。

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 foobar    | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
(以下省略)

改めてログインする

ここまでできたら psql から抜け、シェルの操作ユーザを foobar に戻します。そして PostgreSQL にログインしてみます。

$ psql
psql (9.5.14)
Type "help" for help.

foobar=>

無事にログインできました!

この先へ

ここまでできたらだいたい勘どころがつかめたかと思います。ロールとその権限や、ロールの認証方式、データベースとスキーマの概念などが MySQL からやってきた場合に戸惑うと思いますが*6、ここまで来られたなら大丈夫だと思います*7

なお、外部から接続する場合はこちらの記事も参考にしてみてください。

*1:いわゆるユーザのこと

*2:ロール

*3:exit する

*4:実は 'postgres' というデータベースははじめから存在しているので、コマンドラインオプションとして '-d postgres' を指定すればログインの確認はできます

*5:ロールを作る場合と同じです

*6:私も今でも戸惑います

*7:私もそんなに詳しいわけではありません

Powered by はてなブログ