macのlocalにPostgreSQLを導入する

##はじめに
PostgreSQL利用歴１週間の初心者です。
これまで勉強した内容を記事として整理することで、
知識を定着させることを目的としています。
内容については資料を読んで書いておりますが、
間違いがあればご指摘いただけると助かります。


##目次
環境
概要（一刻も早くインストールしたい方は飛ばしてOK！）
インストール手順
運用上の注意
参考資料


##環境
MacOS:　BigSur 11.4
PostgresSQL:　13.3


##概要
仕組みを知っておくと、エラーが出た時に役立つと思います。
PostgreSQLとはオブジェクト指向のRDBMSの１つです。
> *RDBMS* \[IT用語辞典]\(https://e-words.jp/w/RDBMS.html)

オープンソースであり、無償で使用・配布できます。
例えば、ECサイトの場合は登録ユーザ情報や購買履歴などをテーブルとして管理しているでしょう。

| テーブル: 登録ユーザ情報|　テーブル: 購買履歴|
|:---------------|:---------------|
|![スクリーンショット 2021-05-31 3.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159798/94805d54-01ce-0f74-8ffa-620bfa1702d1.png)|![スクリーンショット 2021-05-31 3.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159798/e4e7aa62-1a1e-a6fe-df5a-c506eb4b9c4b.png)|



構成は下図のようになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159798/e5eb41f6-a1f0-81a1-5bf1-dfaf8199c511.png)

>postgreSQL postmaster
>
>postmaster は、PostgreSQL のマルチユーザデータベースサーバです。
>クライアントアプリケーションがデータベースに接続するためには、稼働している postmaster に (ネットワークを介して、またはローカルで) 接続する必要があります。
>その後、postmaster は接続を操作するために別のサーバプロセス ("postgres") を開始します。
>また、postmaster は、サーバプロセス間の管理も行います。
>(中略)
>1つのデータベースクラスタのデータは、必ず1つの postmaster によって管理されています。
>データベースクラスタとは、同じファイルシステムの場所に格納されているデータベースの集まりのことです。


:flushed: ***postmaster(PostgreSQLのマルチユーザDBサーバー)はpostgresの廃止予定の別名*** :flushed:

| version|postmaster説明| postgres説明|
|:---------------|:---------------|:---------------|
|12.4|https://www.postgresql.jp/document/12/html/app-postmaster.html|https://www.postgresql.jp/document/12/html/app-postgres.html|
|7.3.4|https://www.postgresql.jp/document/7.3/reference/app-postmaster.html|https://www.postgresql.jp/document/7.3/reference/app-postgres.html|

ちょっとよくわからなかった　:sweat_drops:　
マルチユーザDBがシングルユーザDBになっただけ？どんなプロセス動いてるの？
ソースを追いかけないといけないのかな...

##インストール手順

1.Homebrewを使用してインストール

```
（Homebrewを使用してpostgresSQLをインストール）
% brew install postgresql

(とりあえずインストールできたか確認)
% postgres --version
```

2.DBの設定

```
（DBの符号化方式をUTF-8として作成）
% initdb /usr/local/var/postgres -E utf8
```
initdbコマンドはPostgreSQLサーバーアプリケーションのコマンドで、DBクラスタを新しく作成します。
ここで発生しそうなエラーは２つあります。
①すでにDBクラスタが存在している→既存のDBクラスタを削除して、再度initdbを実行
②そのユーザに作成権限がない（chownコマンドで確認）→rootで作成し、ユーザに権限を付与


3.PostgreSQLサーバーの起動

```
% postgres -D /usr/local/var/postgres

または
(PostgreSQLサーバーアプリケーションを使用；　DBサーバーが稼働しているホスト上で実行)
$ pg_ctl -D /usr/local/pgsql/data

または
（Homebrewを使ってサービスを開始）
% brew services start postgresql
```

毎回データ領域（今回の場合は/usr/local/var/postgres）　と入力するのが面倒な場合は、
以下のように環境変数PGDATAに登録すれば良い。



4.あとは自由にDBを操作してください
例えば...

```
(DB一覧を取得)
% psql -l

（新しいDBの作成）
% createdb 新しいDBの名前

（DBに接続）
% psql 接続したいDBの名前

(DBに接続したあと、ユーザの一覧を表示)
=# select * from pg_user;
```
ちなみに、ユーザ一覧のところに書いてある" =# "は管理ユーザでDBに接続、
”　=> ”は一般ユーザでDBに接続していることを表現しています。


5.最後はプロセスを終了して終わりましょう
プロセスを終了しておかないと、次回使うときに「そのプロセスは使用されているから無理」というエラーが出ます。

```
(PostgreSQLサーバーアプリケーションを使用；　DBサーバーが稼働しているホスト上で実行)
$ pg_ctl -D /usr/local/pgsql/data　stop

または
（Homebrewを使ってサービスを停止）
% brew services stop postgresql
```


##運用上の注意
自分の環境で遊ぶだけだと意識しないのが”セキュリティ”関連の項目になります。
DBには必要なデータや顧客情報が保存されているので、不正に改ざん・削除されては業務どころか、顧客にも被害が発生します。

DBを扱うユーザが複数いる場合は特に、”最小権限の原則”を守る必要があります。
いかなる権限も与えない、閲覧権限だけ、閲覧・編集権限など細かく設定し、誤操作や内部不正の機会を与えないことが大切です。適切なアクセス制御をしましょう。（自戒）
（後の記事で書いた方がいい　→　未来の自分よろしく :sunglasses:　タスク　ﾎﾟｲｰ）


##参考資料
> *PostgreSQL12.4文書* \[第２章SQL言語 2.2.概念]\(https://www.postgresql.jp/document/12/html/tutorial-concepts.html)

> *PostgreSQL7.2.3リファレンスマニュアル* \[postmaster]\(https://www.postgresql.jp/document/7.2/reference/app-postmaster.html)

> *PostgreSQL/PostgreSQLのユーザ一覧情報を参照する方法* (https://db.just4fun.biz/?PostgreSQL/PostgreSQL%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E4%B8%80%E8%A6%A7%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

> Trademark Policy(https://www.postgresql.org/about/policies/trademarks/)