PostgreSQL 9.6.1 - Installing on Windows 10

# 概要

Windows 10に開発・検証用にPostgreSQL 9.6.1をインストールし、初歩的な設定を行うまでの作業メモです。
インストーラー版は使わずZIP Archive版で手動インストールします。

**環境**

* Windows 10 Professional
* PostgreSQL 9.6.1 (ZIP Archive)

**参考**

* [PostgreSQL] (https://www.postgresql.org/)
* [PostgreSQL 9.5.4文書] (http://www.postgresql.jp/document/9.5/html/index.html)


# インストール

## ダウンロード

インストールにはzip版を使用しました。
ダウンロードページよりアーカイブファイルをダウンロードし、適当な場所へ展開します。
この記事では`D:\dev\postgresql-9.6.1`へ展開しました。

下記は展開した直後のディレクトリの状態です。

```text
postgresql-9.6.1
  ├─bin
  ├─doc
  ├─include
  ├─lib
  ├─pgAdmin 4
  ├─share
  ├─StackBuilder
  └─symbols
```

## データ、ログ用のディレクトリを作成

展開したディレクトリ内にデータ、ログ用のディレクトリを作成します。

* データ
 * `postgresql-9.6.1\data`

* ログ
 * `postgresql-9.6.1\logs`


## 環境変数の登録

* path
 * `D:\dev\postgresql-9.6.1\bin`

* PGDATA
 * `D:\dev\postgresql-9.6.1\data`


## データベースクラスタの作成

https://www.postgresql.jp/document/9.5/html/app-initdb.html

スーパーユーザーは`postgres`としました。

```bat:initdb
> pg_ctl initdb -o "-A password -W -U postgres -E UTF8"
データベースシステム内のファイルの所有者は"<Username>"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。

データベースクラスタはロケール"Japanese_Japan.932"で初期化されます。
initdb: ロケール"Japanese_Japan.932"用の適切なテキスト検索設定が見つかりません
デフォルトのテキスト検索設定はsimpleに設定されました。

データベージのチェックサムは無効です。

新しいスーパーユーザのパスワードを入力してください: <enter password>
再入力してください: <enter password>

ディレクトリD:/dev/postgresql-9.6.1/dataの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 128MB
selecting dynamic shared memory implementation ... windows
設定ファイルを作成しています ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
データをディスクに同期しています...ok

Success. You can now start the database server using:

    "D:/dev/postgresql-9.6.1/bin\pg_ctl" -D "D:\dev\postgresql-9.6.1\data" -l logfile start
```

## データベースの起動

```bat:start
> pg_ctl start -l D:\dev\postgresql-9.6.1\logs\postgresql.log
サーバは起動中です。
```

## データベースの停止

```bat:stop
> pg_ctl stop
サーバ停止処理の完了を待っています....完了
サーバは停止しました
```

## ステータスの確認

```bat:status
> pg_ctl status
pg_ctl: サーバが動作中です(PID: 9768)
D:/dev/postgresql-9.6.1/bin/postgres.exe
```

## 新しいユーザーの作成

https://www.postgresql.jp/document/9.5/html/app-createuser.html

postgresユーザー（スーパーユーザー）を使って、`rubytomato`というユーザーを作成します。

```bat:createuser
> createuser -U postgres -P rubytomato
新しいロールのためのパスワード:
もう一度入力してください：
パスワード:
```

## 新しいデータベースの作成

https://www.postgresql.jp/document/9.5/html/app-createdb.html

postgresユーザー（スーパーユーザー）を使って、`rubytomato`ユーザーがオーナーの`test_db`データベースを作成します。

```bat:createdb
> createdb -E UTF8 -O rubytomato -U postgres test_db
パスワード:
```

### データベースの削除

```bat:dropdb
> dropdb -U postgres -i -e test_db
```

データベースの一覧

```bat
> psql -U postgres -l
ユーザ postgres のパスワード:
                                              データベース一覧
   名前    |   所有者   | エンコーディング |      照合順序      | Ctype(変換演算子)  |      アクセス権
-----------+------------+------------------+--------------------+--------------------+-----------------------
 postgres  | postgres   | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
 template0 | postgres   | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |            |                  |                    |                    | postgres=CTc/postgres
 template1 | postgres   | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |            |                  |                    |                    | postgres=CTc/postgres
 test_db   | rubytomato | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
(4 行)
```

# psql

https://www.postgresql.jp/document/9.5/html/app-psql.html

psqlというターミナルソフトでPostgreSQLへログインします。

### スーパーユーザー(postgresユーザー)でログイン

スーパーユーザーとはデータベースクラスタ作成時に指定したユーザーです。

```bat
> psql -U postgres
```

### 新しいユーザーでログイン

```bat
> psql -d test_db -U rubytomato
ユーザ rubytomato のパスワード:
psql (9.6.1)
"help" でヘルプを表示します.

test_db=>
```

### メタコマンド

#### データベースの一覧

```sql
=# \l
                                              データベース一覧
   名前    |   所有者   | エンコーディング |      照合順序      | Ctype(変換演算子)  |      アクセス権
-----------+------------+------------------+--------------------+--------------------+-----------------------
 postgres  | postgres   | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
 template0 | postgres   | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |            |                  |                    |                    | postgres=CTc/postgres
 template1 | postgres   | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |            |                  |                    |                    | postgres=CTc/postgres
```

#### テーブル、ビュー、シーケンスの一覧

```sql
test_db=> \z
                            アクセス権
 スキーマ | 名前 | 型 | アクセス権 | Column privileges | Policies
----------+------+----+------------+-------------------+----------
(0 行)
```

#### psqlを終了する

```sql
test_db=> \q
```


### パスワードファイルの作成

https://www.postgresql.jp/document/9.5/html/libpq-pgpass.html

ログインにパスワード認証が必要なユーザーのパスワードを、下記の場所に配置するパスワードファイルに記述しておくとログイン時のパスワード入力を省略することができます。

* パスワードファイル
 * `%APPDATA%\postgresql\pgpass.conf`

```text
#hostname:port:database:username:password
localhost:5432:postgres:postgres:<password>
localhost:5432:test_db:rubytomato:<password>
```

\<password\>には実際のパスワードを記述します。


### ログ設定


# pgAdmin 4

`postgresql-9.6.1\pgAdmin 4`にpgAdmin 4が同梱されているのですぐに使うことができます。
`postgresql-9.6.1\pgAdmin 4\bin\pgAdmin4.exe`をダブルクリックするとpgAdmin 4が起動します。

pgAdmin 4が起動したら、下図の"Add New Server"アイコンをクリックします。

![pgadmin4_1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/bd94a9d4-487d-6550-d403-4fb68527a75c.png)

Nameは"local"としました。

![pgadmin4_2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9096ccaa-4841-2801-3148-8a2efcdbe5a2.png)

下図のように接続設定を入力します。

![pgadmin4_3.png](https://qiita-image-store.s3.amazonaws.com/0/22772/afb0ae7e-7289-8c00-c528-8548e48f6c70.png)

データベースに接続した状態です。

![pgadmin4_4.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ae76e112-2999-e9f5-1642-fc63298071ab.png)


# 補足

## 作成されているテーブルのcreate table文を出力する

例

```sql
CREATE TABLE memo (
  id integer NOT NULL,
  title varchar(255) NOT NULL,
  description text NOT NULL,
  done boolean DEFAULT false NOT NULL,
  updated timestamp without time zone DEFAULT current_timestamp NOT NULL,
  CONSTRAINT memo_pkey PRIMARY KEY(id)
);

CREATE SEQUENCE memo_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

ALTER SEQUENCE memo_id_seq OWNED BY memo.id;

ALTER TABLE ONLY memo ALTER COLUMN id SET DEFAULT nextval('memo_id_seq'::regclass);
```

コマンドプロンプトからpg_dumpコマンドを使ってsql文を出力します。

```bat
> pg_dump -t memo --schema-only -U test_user -d sample_db
```

* -t : テーブル名を指定
* -U : ユーザー名
* -d : データベース名

## ヘルプ

### pg_ctl

https://www.postgresql.jp/document/9.5/html/app-pg-ctl.html

```bat
> pg_ctl --help
pg_ctlはPostgreSQLサーバの初期化、起動、停止、制御を行うユーティリティです。
使用方法:
  pg_ctl init[db]               [-D DATADIR] [-s] [-o "オプション"]
  pg_ctl start   [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o "OPTIONS"]
  pg_ctl stop    [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
  pg_ctl restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
                 [-o "OPTIONS"]
  pg_ctl reload  [-D DATADIR] [-s]
  pg_ctl status  [-D DATADIR]
  pg_ctl promote  [-D DATADIR] [-s]
  pg_ctl kill    SIGNALNAME PID
  pg_ctl register   [-N SERVICENAME] [-U USERNAME] [-P PASSWORD] [-D DATADIR]
                    [-S START-TYPE] [-w] [-t SECS] [-o "OPTIONS"]
  pg_ctl unregister [-N SERVICENAME]

一般的なオプション:
  -D, --pgdata DATADIR   データベース格納領域の場所です
  -e SOURCE              event source for logging when running as a service
  -s, --silent           エラーメッセージのみを表示し、情報メッセージは表示しません
  -t, --timeout=SECS     -wオプションを使用する時に待機する秒数
  -V, --version             バージョン情報を表示し、終了します
  -w                     作業が完了するまで待機します
  -W                     作業の完了まで待機しません
  -?, --help                このヘルプを表示し、終了します
(デフォルトでは、シャットダウン時は待機し、起動と再起動の時は待機し
ません。)

-Dオプションの省略時、PGDATA環境変数が使用されます。

起動、再起動用のオプション
  -c, --core-files       このプラットフォームでは実行できません
  -l, --log FILENAME     サーバログをFILENAMEへ出力(あるいは追加)します
  -o オプション          postgres(PostgreSQLサーバ実行ファイル)または
                         initdb に渡すコマンドラインオプション
  -p PATH-TO-POSTGRES    通常は不要です

Options for stop or restart:
  -m, --mode=MODE    MODEは"smart"、"fast"、"immediate"のいずれかです

シャットダウンモードは以下の通りです:
  smart       全クライアントの接続切断後に停止します
  fast        シャットダウン手続き後に停止します
  immediate   シャットダウン手続きを行わずに停止します。再起動時にリカバリ状態になる可能性があります

killモードで利用できるシグナル名:
  ABRT HUP INT QUIT TERM USR1 USR2

登録、登録解除用のオプション:
  -N SERVICENAME  PostgreSQLサーバを登録するためのサービス名です
  -P PASSWORD     PostgreSQLサーバを登録するアカウントのパスワードです
  -U USERNAME     PostgreSQLサーバを登録するアカウントのユーザ名です
  -S START-TYPE   PostgreSQLサーバを登録するためのサービス起動種類です

起動種類は以下の通りです:
  auto       システムの起動時にサービスを自動的に開始します（デフォルト）
  demand     必要に応じてサービスを開始します

不具合は<pgsql-bugs@postgresql.org>まで報告してください。
```

### psql

```bat
> psql --help
psql は PostgreSQL の会話型ターミナルです。

使用方法:
  psql [オプション]... [データベース名 [ユーザ名]]

一般的なオプション：
  -c, --command=コマンド   (SQLまたは内部の)単一コマンドを一つだけ実行して終了
  -d, --dbname=DB名        接続するデータベース名を指定(デフォルト: "<Username>")
  -f, --file=ファイル名    ファイルからコマンドを読み込んで実行後、終了
  -l(エル), --list         使用可能なデータベース一覧を表示して終了
  -v, --set=, --variable=NAME=VALUE
                           set psql variable NAME to VALUE
                           (e.g., -v ON_ERROR_STOP=1)
  -V, --version             バージョン情報を表示し、終了します
  -X, --no-psqlrc          初期化ファイル (~/.psqlrc) を読みこまない
  -1(数字の１), --single-transaction
                           単一のトランザクションとして実行(対話式でない場合)
  -?, --help[=options]     show this help, then exit
      --help=commands      list backslash commands, then exit
      --help=variables     list special variables, then exit

入出力オプション：
  -a, --echo-all           スクリプトからのすべての入力を表示
  -b, --echo-errors        echo failed commands
  -e, --echo-queries       サーバーへ送信したコマンドを表示
  -E, --echo-hidden        内部コマンドが生成した問い合わせを表示
  -L, --log-file=ファイル名 セッションログをファイルに書き込む
  -n, --no-readline        拡張コマンドライン編集機能(readline)を無効にする
  -o, --output=ファイル名  問い合わせ結果をファイル(または |パイプ)に送る
  -q, --quiet              静かに実行(メッセージなしで、問い合わせの出力のみ)
  -s, --single-step        シングルステップモード(各問い合わせごとに確認)
  -S, --single-line        単一行モード(行末を SQL コマンドの終了とみなす)

出力フォーマットオプション:
  -A, --no-align           桁揃えなしのテーブル出力モード
  -F, --field-separator=文字列
                           桁揃えなしの出力でのフィールド区切り文字(デフォルト: "|")
  -H, --html               HTML テーブル出力モード
  -P, --pset=変数[=値]     表示オプション '変数' を '値' にセット (\pset コマンドを参照)
  -R, --record-separator=文字列
                           桁揃えなしの出力でのレコード区切り文字(デフォルト：改行)
  -t, --tuples-only        行のみを表示
  -T, --table-attr=TEXT    HTMLテーブルのタグ属性をセット(width, border等)
  -x, --expanded           拡張テーブル出力を有効にする
  -z, --field-separator-zero
                           桁揃えなしの出力でのフィールド区切り文字をゼロバイトに設定
  -0, --record-separator-zero
                           桁揃えなしの出力でのレコード区切り文字をゼロバイトに設定

接続オプション:
  -h, --host=ホスト名      データベースサーバーのホストまたはソケットのディレクトリ(デフォルト: "ローカルソケット")
  -p, --port=ポート番号    データベースサーバーのポート番号(デフォルト： "5432")
  -U, --username=ユーザー名  データベースのユーザ名(デフォルト: "<Username>")
  -w, --no-password        パスワード入力を要求しない
  -W, --password           パスワードプロンプトを強制表示する
                           （本来は自動的に表示されるはずです）

詳細は psql の中で "\?" (内部コマンドの場合) または "\help"
(SQL コマンドの場合) をタイプするか、PostgreSQL ドキュメントの psql の
セクションを参照のこと。

不具合は<pgsql-bugs@postgresql.org>まで報告してください。
```