Heroku Postgres を利用してみよう


# アジェンダ

- Herokuに使えるDB
- Heroku Postgresについて
	- 導入方法
	- ドキュメント
- Postgres のログを取る
- Dataclips
- エクスポートとインポート
- `pg_restore` 古い問題

# Herokuに使えるDB
- 公式にサポートしているデータベースは Postgres
- その他も使えるが、third-party による提供


https://devcenter.heroku.com/categories/data-management

# Heroku Postgresについて
- Heroku上で使える無料のDB
- Add-ons（アドオン）と呼ばれる追加機能で利用できる

## 導入方法

### Add-ons の追加
管理画面の Resources > Add-ons で検索してインストール。
Heroku の Add-ons は無料のものでもクレジットカードの登録が必要となることに注意。

![Screen Shot 2018-03-02 at 12.59.26.png](https://qiita-image-store.s3.amazonaws.com/0/109241/4aa3e1fe-ac9e-7586-b6bb-42e07e40e2e7.png "Screen Shot 2018-03-02 at 12.59.26.png")

### DB URL の確認
管理画面の Settings > Config Variables にURLが記載されている。
![Screen Shot 2018-03-02 at 14.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/109241/082be0bb-76e8-4f22-5c1d-676500f4cb64.png "Screen Shot 2018-03-02 at 14.07.11.png")

#### URLの構成
```
postgres:// USER:PASS @host:port/database
```

## ドキュメント
https://devcenter.heroku.com/categories/heroku-postgres

- `Postgres Basics` 基本的なこと
- `Postgres Performance` パフォーマンスについて
- `Postgres Data Transfer & Preservation` データの転送と保存
- `Postgres Availability` Heroku Postgres ができること
- `Postgres Special Topics` スペシャルトピックス

# Postgres のログを取る
https://devcenter.heroku.com/articles/heroku-postgresql#performance-analytics

Herokuは `heroku logs -t` を使ってログを取ることができ、さらに `-p postgres` オプションをつけるとポスグレのログだけをとることができる。
発行されたクエリをチェックしたりするのに便利。

```
heroku logs -p postgres -t
```

# Dataclips
https://devcenter.heroku.com/articles/dataclips

更新されていくDBをちょくちょくデータ抽出してチェックしたいときなどに使える（「一ヶ月間に注文された本のデータ」など）。
データを取得するクエリと出力するファイル等を保存できるので、一回設定すれば次からは出力するファイルを直接見るだけでよい。

![Screen Shot 2018-03-02 at 16.38.04.png](https://qiita-image-store.s3.amazonaws.com/0/109241/4f031b2f-f9e1-4716-9004-e818bdd3f983.png "Screen Shot 2018-03-02 at 16.38.04.png")

### 注意点など

- Googleスプレッドシート、ファイル（CSV、JSON、XLS）対応
- 最後の結果から1分以上経つと新たにクエリが走る
- 10分以上かかるクエリは自動的にキャンセルされる


### おすすめ記事
http://engineer.crowdworks.jp/entry/2016/10/17/174520


# エクスポートとインポート
https://devcenter.heroku.com/articles/heroku-postgres-import-export

## エクスポート

Heroku の Postgres をエクスポートし、ローカルにリストアすることができる。

### バックアップをダウンロードする

新しくバックアップを作成してから、dumpファイルとしてダウンロードする。

#### バックアップ作成

```
heroku pg:backups:capture
```

#### dumpファイルのダウンロード

```
heroku pg:backups:download
```

#### ※Git連携しているフォルダ外から実行するとき

`--app(-a)` オプションをつける必要があるので注意。

```
heroku pg:backups:capture --app hoge-project
heroku pg:backups:download --app hoge-project
```

### ローカルにリストアする

下記コマンドの `localhost` `myuser` `mydb` をリストアしたいローカルDBの情報に置き換える。
`latest.dump` はダウンロードしたdumpファイル名。

```
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump
```

## インポート

逆にローカルのDBをインポートすることもできる。

### dumpファイルの作成

「ローカルにリストア」と同様、ローカルDBの情報に置き換えて以下コマンドを実行。

```
PGPASSWORD=mypassword pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb mydb.dump
```

### Heroku にインポートする

#### Amazon S3などにdumpファイルをあげる

HTTPアクセス可能な場所（Amazon S3など）に作成したdumpファイルをあげる。
セキュリティの観点から、インポート時のみ一時的に公開アクセス可能にし、ファイル名は無名にしてインポート後に削除すること。

#### Herokuにインポート（リストア）する

下記コマンドで Heroku にインポートする。
`DATABASE_URL` はインポートしたいDBのURL（前述の「Heroku Postgresについて > DB URLの確認」参照）にする。

```
heroku pg:backups:restore 'https://s3.amazonaws.com/me/items/3H0q/mydb.dump' DATABASE_URL
```

# `pg_restore` 古い問題

## エクスポート時に「`pg_restore` コマンドが古い」と言われる

「エクスポート > ローカルにリストアする」のコマンドを実行すると、

```
[archiver] unsupported version (1.13) in file header
```

とエラーが出てリストアできない。
これはドキュメントにも記載されていて、`pg_restore` のバージョンが古いことが原因らしい。

![Screen Shot 2018-03-02 at 15.21.35.png](https://qiita-image-store.s3.amazonaws.com/0/109241/e83aa689-94a5-01f4-1d97-a4d51786831f.png "Screen Shot 2018-03-02 at 15.21.35.png")

バージョンを確認したところ `9.3.5` だったので、Postgres.app が更新されると治るかなーと思い、Postgres.appをアップデートした。

#### Postgres.app のアップデート方法

![Screen Shot 2018-03-02 at 15.25.38.png](https://qiita-image-store.s3.amazonaws.com/0/109241/6509ee36-da3b-6861-449d-8015583e92e9.png "Screen Shot 2018-03-02 at 15.25.38.png")

### Postgres.app と `pg_restore` は関係なかった

Postgres.app をアップデートしたところで状況は変わらず。
`type pg_restore` で確認したところ、

![Screen Shot 2018-03-02 at 15.27.25.png](https://qiita-image-store.s3.amazonaws.com/0/109241/4ffb11dd-7aaa-de57-325f-499677188860.png "Screen Shot 2018-03-02 at 15.27.25.png")

どうやら `pg_restore` 自体をアップデートする必要がありそう。
アップデート方法がわかればまた記載します。

## 解決法
http://postgresapp.com/documentation/cli-tools.html

`pg_restore` を `/Applications/Postgres.app/Contents/Versions/latest/bin/pg_restore` としたらいけた。