DEV Community

Cover image for Ecto drop Postgres database on AWS RDS
Tathagata
Tathagata

Posted on

3

Ecto drop Postgres database on AWS RDS

Lets say during your development cycles, you have screwed your postgres database and the easiest way to get out of the mess is to drop the database and restart fresh. In this example we will look at a Phoenix project that uses a Postgres database.

Warning

To make it clear, dropping the database is a bad idea if you haven't taken snapshots. Dropping deletes all data; so do it only in non-prod.

Problem: Dropping a database fails due to immortal rdsadmin

mix do ecto.drop, ecto.create, ecto.migrate

This nicely works on your local postgres instance.
However, if the database is on AWS RDS, you'll be greeted by this interesting message.

$ mix ecto.drop
** (Mix) The database for SuperPetStore.Repo couldn't be dropped, reason given: ERROR:  55006: database "petdb" is being accessed by other users
DETAIL:  There is 1 other session using the database.
LOCATION:  dropdb, dbcommands.c:840

If you look at the number of connections

> select * from pg_stat_activity;

Sure enough, there will be one persistent connection from rdsadmin. It is AWS RDS user that takes care of backup, updates and maintenance. This connection gets in the way of dropping the db and starting afresh.

> use postgres;
You are now connected to database "postgres" as user "petuser"
Time: 0.078s
postgres> drop database petdb;
You're about to run a destructive command.
Do you want to proceed? (y/n): y
Your call!
database "petdb" is being accessed by other users
DETAIL:  There is 1 other session using the database.

Time: 5.031s (5 seconds), executed in: 5.030s (5 seconds)
postgres>

pg_terminate_backend

select pg_terminate_backend(pid) from pg_stat_activity where datname='petdb';drop database pipeops;
You're about to run a destructive command.
Do you want to proceed? (y/n): y
Your call!
+------------------------+
| pg_terminate_backend   |
|------------------------|
| True                   |
+------------------------+
SELECT 1
DROP DATABASE
Time: 0.118s

First pg_terminate_backend allows you to terminate the rdsadmin account and shoving in the drop statement in the same line gets the job done before rdsadmin spawns up and connects to petdb.

With the database gone, you can now run ecto to create the db afresh!

Wait. What does the picture above have to do with this post?

Not a single thing. This is a picture I took at Siena. ❤️ Italy, can't wait to go back!

AWS Q Developer image

Your AI Code Assistant

Generate and update README files, create data-flow diagrams, and keep your project fully documented. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post