自宅にDBを整備するためにPostgreSQLをインストールしてみた話

DBの導入や使い方については勉強したことあったが、実際に使ったことはなかった。
というか、動かしたことがなかった。
なので、勉強がてら使ってみるために、インストールした。

#準備
##SourceのDownload
(公式)[https://www.postgresql.org/ftp/source/]からダウンロードする。
今回はv9.6.1のSourceをダウンロードした。

##DocumentのDownload
必要なことはすべて[Document](https://www.postgresql.jp/document/)に書いてある。
さすがに文章量が多いので、読むには少し骨が折れるかも。
今回はDocumentを読みながら、必要な部分だけ実行した。

#インストール
よくある一般的なインストール。今回、pythonから呼びたかったので、一応オプションを付けた。

```text
$ ./configure --prefix=/path/to/install/dir --enable-python 2>&1 | tee configure.log
$ make world 2>61 | tee make.log
$ make install-world 2>&1 | tee install.log
```

makeにworldのオプションをつけると、構築可能なものをすべて構築してくれる。
インストールするときも、`make install`で十分だが、`make install-world`だと、Document（HTMLやman）一式もインストールしてくれるらしい。

#使う
データベースとして稼働させる場合、データベースにアクセスする専用のアカウントを作成して運用する方が良いらしい。
ただし、今回は個人のローカル環境でしか使わないため、一切気にしないこととする。

##PATHを通す
とりあえず、.bashrcに書いた。

```bash
export POSTGRE_SQL_DIR=/path/to/install/dir
export PATH=$POSTGRE_SQL_DIR/bin:$PATH
export LD_LIBRARY_PATH=$POSTGRE_SQL_DIR/lib:$LD_LIBRARY_PATH
export MANPATH=$POSTGRE_SQL_DIR/share/man:$MANPATH
```

読み込む。

```text
$ source ~/.bashrc
```

##DBの準備
Document上だといきなりDBを作るところになるが、先にDBを動かさないといけない。
最初に、データベースの格納スペースを定義する。
今回は、インストール先の直下にデータディレクトリをおいた。

```text
$ initdb -D /path/to/install/dir/data
```

次に起動をする。

```text
$ postgres -D /path/to/install/dir/data >logfile 2>&1 &
```

バックグラウンドで、サーバーの標準出力と標準エラー出力を保管しておくことがおすすめ。
このあたりのコマンドを短くかけるらしい。

```text
$ pg_ctl -D /path/to/install/dir/data initdb
$ pg_ctl start -l logfile
```

PC自体が起動直後にサーバーを起動させる方法もあるが、これは環境によって異なるようなので割愛。
シャットダウン自体は、プロセスにシグナルを送ってシャットダウンすることになるとのこと。

- SIGTERM
スマートシャットダウンモード。新しいサーバ接続を禁止するが、現在のセッションは継続する。
現在のセッションが全て切れたら、終了する。
- SIGINT
高速シャットダウンモード。新しいサーバ接続を禁止し、現在存在するサーパプロセスにSIGTERMを送信後、現在のトランザクションをアボート、即座に終了する。
- SIGQUIT
即時シャットダウンモード。サーバーはすべての子プロセスにSIGQUITを送信し、子プロセスが終了するのを待つ。
5秒以内に終了しない場合、SIGKILLを送る。すべてのプロセス終了後、サーバーが終了する。

高速シャットダウンは次で実行できた。

```text
$ kill -INT `head -1 /path/to/install/dir/data/postmaster.pid`
```

どのシャットダウンが一番いいのかわかっていないが、公式に例が乗っていたこともあってSIGINTでいいのかなと。

##Databaseを作る
以下のコマンドを実行する。mydbという名前のデータベースができる。

```text
$ createdb mydb
```

下のようなメッセージが出たら、サーバーが起動できていない。

```text
$ createdb mydb
createdb: could not connect to database template1: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

`$ createdb`だけだと、ユーザー名と同じデータベースを作るらしい。

##Databaseにアクセスする
```text
$ psql mydb
psql (9.6.1)
Type "help" for help.

mydb=#
```

アクセスできた。なお、次のような場合もあるらしい。

```text
$ psql mydb
psql (9.6.1)
Type "help" for help.

mydb=>
```

これはスーパーユーザ（=#,PostgreSQLをインストールしたユーザー）か否か（=>）の違いだそうだ。
とにかく、これで一通りコマンドを実行できる。

```text
$ psql mydb
psql (9.6.1)
Type "help" for help.

mydb=# SELECT version();
                                                   version                                                    
--------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.6.1 on x86_64-apple-darwin16.6.0, compiled by Apple LLVM version 8.1.0 (clang-802.0.42), 64-bit
(1 row)

mydb=# SELECT current_data;
ERROR:  column "current_data" does not exist
LINE 1: SELECT current_data;
               ^
mydb=# SELECT current_date;
    date    
------------
 2017-06-10
(1 row)

mydb=# SELECT 2+2;
 ?column? 
----------
        4
(1 row)

mydb=# \h
Available help:
  ABORT                            DEALLOCATE
  ALTER AGGREGATE                  DECLARE
  ALTER COLLATION                  DELETE
  ALTER CONVERSION                 DISCARD
  ALTER DATABASE                   DO
  ALTER DEFAULT PRIVILEGES         DROP ACCESS METHOD
  ALTER DOMAIN                     DROP AGGREGATE
  ALTER EVENT TRIGGER              DROP CAST
  ALTER EXTENSION                  DROP COLLATION
  ALTER FOREIGN DATA WRAPPER       DROP CONVERSION
  ALTER FOREIGN TABLE              DROP DATABASE
  ALTER FUNCTION                   DROP DOMAIN
  ALTER GROUP                      DROP EVENT TRIGGER
  ALTER INDEX                      DROP EXTENSION
  ALTER LANGUAGE                   DROP FOREIGN DATA WRAPPER
  ALTER LARGE OBJECT               DROP FOREIGN TABLE
  ALTER MATERIALIZED VIEW          DROP FUNCTION
  ALTER OPERATOR                   DROP GROUP
  ALTER OPERATOR CLASS             DROP INDEX
  ALTER OPERATOR FAMILY            DROP LANGUAGE
  ALTER POLICY                     DROP MATERIALIZED VIEW
  ALTER ROLE                       DROP OPERATOR
（中略、ヘルプがでる）
mydb=# \q
$
```
##Databaseの一覧を表示する
```bash
$ psql -l
```

ポート番号やホスト名も指定できる。

```bash
$ psql -l -p <port> -h <host>
```

##Databaseを消す
```text
$ dropdb mydb
```

環境ができたので、色々操作していく。