LoginSignup
3
0

Elixir Phoenix Gigalixirのデータベースを削除する

Last updated at Posted at 2024-01-30

何ヶ月か前にあるちょっとしたPhoenixアプリのコードを更新した時にうっかり本番データベースの状態を考慮せずに
スキーマとマイグレーションを変更してしまいました。その結果、本番データベースとスキーマとマイグレーションの間に不整合が発生し、マイグレーションやロールバックができなくなりました。

練習用プロジェクトなのでデータベースを一旦削除して最初から作り直すのが一番早いと思い、そうすることにしました。

Gigalixirのデータベースを削除した際に気がついた点をメモします。

環境

  • macOS 14.2.1 23C71 arm64
  • MacBookPro 18,1
  • gigalixir 1.9.3
  • elixir 1.15.4
  • erlang 26.0.2
  • phoenix 1.7.10
  • postgrex 0.17.4
  • phoenix_ecto 4.4.3

gigalixir

本記事はGigalixirにデプロイしたことがある人を対象にしていますが、まだの方もわかりやすい公式ドキュメントやQiita記事が多数ありますので是非とも挑戦してみてください!

Gigalixir is a fully-featured, production-stable platform-as-a-service built just for Elixir that saves you money and unlocks the full power of Elixir and Phoenix without forcing you to build production infrastructure or deal with maintenance and operations. For more information, see https://www.gigalixir.com.

Gigalixir は、Elixir 専用に構築された、フル機能で安定した運用が可能なサービスとしてのプラットフォームであり、運用インフラストラクチャの構築やメンテナンスや運用の負担を強いることなく、コストを節約し、Elixir と Phoenix の能力を最大限に活用できます。 詳細については、https://www.gigalixir.com を参照してください。

データベースを削除する方法

ふた通りのやり方があるようです。どちらともやり方は簡単です。

  1. ターミナルから (CUI; 文字ユーザーインターフェイス)
  2. Gigalixirのウエブアプリから (GUI; 画像/図形ユーザーインターフェイス)

データベースを削除するため、保存されているデータなどはすべて削除されます。

ターミナルから

ターミナル
cd path/to/my_phoenix_app

# データベースの情報を印字し、IDを取得
gigalixir pg

# データベースを削除
gigalixir pg:destroy -a <アプリ名> -d <データベースのID>

# 再度データベースの情報を印字し、データベースが削除されたことを確認
gigalixir pg

Gigalixirのウエブアプリから

  1. [Database]タブをクリック
  2. [DESTROY]ボタンをクリック
  3. 確認のためにデータベース ID を入力
  4. [DELETE]ボタンをクリック

gigalixir-destroy-database 2024-01-29 at 16.08.14--1.png

データベースを再度生成

ターミナル
cd path/to/my_phoenix_app

# 無料プランのデータベースを生成
gigalixir pg:create --free

# データベースが生成されたか確認
gigalixir pg

これであとはいつも通り普通にマイグレーションしたらいいのかなと思ったら、エラーが出ました。

マイグレーションがうまくいかない

ターミナル
cd path/to/my_phoenix_app

# マイグレーションを実行
gigalixir ps:migrate

gigalixir-database-failed-to-connect 2024-01-29 at 19.29.15--1.png

でっかいエラーなので見た目が怖いですが、よくみてみると親切に色んな手がかりを残してくれています。

** (DBConnection.ConnectionError) connection not available and request was dropped from queue after 2928ms.
This means requests are coming in and your connection pool cannot serve them fast enough. You can address this by:

  1. Ensuring your database is available and that you can connect to it
  2. Tracking down slow queries and making sure they are running fast enough
  3. Increasing the pool_size (although this increases resource consumption)
  4. Allowing requests to wait longer by increasing :queue_target and :queue_interval

特にコードも設定も変えていないので、一つ目の「データベースの存在、接続」である可能性が高いと思われます。

DATABASE_URLを確認

データベースの設定よくみたらDATABASE_URLが正しく設定されていませんでした。

ターミナル
cd path/to/my_phoenix_app

# 現在の設定を確認
gigalixir config

# データベースの情報を取得
gigalixir pg

gigalixir-database-url 2024-01-29 at 20.35.40--1.png

DATABASE_URLの値を正しいものに変更します。

ターミナル
# DATABASE_URLの値を変更
my_database_url="postgresql://xxxx-user:pw-xxxx@postgres-free-tier-v2020.gigalixir.com:5432/xxxx"
gigalixir config:set DATABASE_URL="$my_database_url"

# データベースの情報が変更されたか確認
gigalixir pg

おまけ:DATABASE_URLの値だけを取り出す

ついでにDATABASE_URLの値だけを取り出すスクリプトを考えてみました。

jqがあれば一発です。

ターミナル
gigalixir config | jq '.DATABASE_URL'
# "postgresql://89296796-ad8c-..."

grepの-o, --only-matchingオプションを活用してこう言うやり方ができるそうです。

ターミナル
gigalixir config | grep -o '"DATABASE_URL": "[^"]*' | grep -o '[^"]*$'
# postgresql://89296796-ad8c-...

URLの形式が決まっている感じなので、固定のところは正規表現の中で明示してもいいのかもしれません。

ターミナル
gigalixir config |
  grep -o 'postgresql://[a-z0-9-]*:[a-z0-9-]*@[a-z0-9-]*.gigalixir.com:5432/[a-z0-9-]*'
# postgresql://89296796-ad8c-...

こんなことに時間をかけるより切取・貼付をした方が早いですが、勉強になります。きっとどこかで役に立つと信じています。

最後に一言

本記事は 闘魂 Elixir #66 の成果です。ありがとうございます。

toukon-qiita-macbook_20230912_091808.jpg

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0