yoran

yoran

Drop database with Elixir releases

Hi,

My Phoenix application is deployed on Gigalixir but using a database hosted on Google Cloud Platform. I use Elixir releases for deployment.

I am still in the pre-production phase of development so all I have running is a staging environment that my teammates can access and use for testing as the application is being developed. And I’m having issues dropping the database on the staging environment. I followed the method outlined in Deploying with Releases and came up with the following Backend.Release module:

defmodule Backend.Release do
  @app :backend

  def ecto_drop do
    load_app()

    for repo <- repos() do
      drop_database(repo)
    end
  end

  defp drop_database(repo) do
    case repo.__adapter__.storage_down(repo.config) do
      :ok ->
        IO.puts "The database for #{inspect repo} has been dropped"
      {:error, :already_down} ->
        IO.puts "The database for #{inspect repo} has already been dropped"
      {:error, term} when is_binary(term) ->
        raise "The database for #{inspect repo} couldn't be dropped: #{term}"
      {:error, term} ->
        raise "The database for #{inspect repo} couldn't be dropped: #{inspect term}"
    end
  end

  defp repos do
    Application.fetch_env!(@app, :ecto_repos)
  end

  defp load_app do
    Application.load(@app)
  end
end

The code for drop_database came straight from the code for ecto.drop, with the removal of references to Mix.

I run this with Gigalixir:

$ gigalixir ps:remote_console

iex > Backend.Release.ecto_drop()

** (RuntimeError) The database for Backend.Repo couldn't be dropped: ERROR 55006 (object_in_use) database "master" is being accessed by other users

There are 2 other sessions using the database.
    (backend) lib/backend/release.ex:19: Backend.Release.drop_database/1
    (backend) lib/backend/release.ex:8: anonymous fn/2 in Backend.Release.ecto_drop/0
    (elixir) lib/enum.ex:1948: Enum."-reduce/3-lists^foldl/2-0-"/3
    (backend) lib/backend/release.ex:7: Backend.Release.ecto_drop/0

I imagine the 2 sessions are:

  • the “regular” web server
  • the iex console that I just started to run the command

It seems like it’s a chicken and egg problem. To drop the database, the database can’t be accessed by others. But to be able to drop the database, I need to run an iex console, which starts a connection to the database. Or am I wrong about this?

Any thoughts on how I can drop the remote database using Elixir releases?

Thank you in advance.

Yoran

Marked As Solved

yoran

yoran

Thanks for the proposal! But unfortunately that didn’t work either. It looks like I can’t enter a remote console on Gigalixir without having at least one replica running, thereby making it impossible to drop the database. I ended up recreating the database on GCP.

Also Liked

samba6

samba6

Try the following:

Enter remote console:

gigalixir ps:remote_console

Then run your command:

_build/prod/rel/release_name/bin/release_name eval "Backend.Release.ecto_drop"

This way you never need to invoke iex.

See Ecto migrations and custom commands section in phoenix documentation Deploying with Releases

Where Next?

Popular in Questions Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 54996 245
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New

We're in Beta

About us Mission Statement