Heroku
DB
postgres

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

DB URL の確認

管理画面の Settings > Config Variables にURLが記載されている。
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

注意点など

  • 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

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

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

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

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

解決法

http://postgresapp.com/documentation/cli-tools.html

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