Edited at

Heroku Postgres を利用してみよう

More than 1 year has passed since last update.


アジェンダ


  • 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 としたらいけた。