Posted by Kyle Hankinson March 20, 2025
Trying to drop a database while other sessions are connected to it will fail. Here is how to terminate those connections and drop the database safely in each database system.
ERROR: database "mydb" is being accessed by other users
DETAIL: There are 3 other sessions using the database.
-- Step 1: Prevent new connections
REVOKE CONNECT ON DATABASE mydb FROM PUBLIC;
-- Step 2: Terminate existing connections
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydb' AND pid <> pg_backend_pid();
-- Step 3: Drop the database
DROP DATABASE mydb;
PostgreSQL 13 added a FORCE option that terminates connections automatically:
DROP DATABASE mydb WITH (FORCE);
This is the simplest approach if you are on PostgreSQL 13 or later.
SELECT pid, usename, application_name, state, query_start
FROM pg_stat_activity
WHERE datname = 'mydb';
Cannot drop database "mydb" because it is currently in use.
-- Terminate all connections and switch to single-user mode
ALTER DATABASE mydb SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- Drop the database
DROP DATABASE mydb;
WITH ROLLBACK IMMEDIATE rolls back any in-progress transactions and disconnects all users immediately.
-- Find active sessions
SELECT session_id, login_name, status, last_request_start_time
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID('mydb');
-- Kill each one
KILL 52;
KILL 53;
-- Then drop
DROP DATABASE mydb;
MySQL is more lenient — DROP DATABASE does not require exclusive access. However, active queries will continue running against the dropped tables until they finish or error out.
To cleanly terminate connections first:
-- Find connections to the database
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE DB = 'mydb';
-- Kill each connection
KILL 42;
KILL 43;
-- Drop the database
DROP DATABASE mydb;
Or in MySQL 8.0+:
SELECT CONCAT('KILL ', ID, ';')
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE DB = 'mydb';
Run the output to kill all connections at once.
| Database | Command |
|---|---|
| PostgreSQL 13+ | DROP DATABASE mydb WITH (FORCE) |
| PostgreSQL < 13 | pg_terminate_backend() then DROP DATABASE |
| SQL Server | ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE then DROP |
| MySQL | KILL connections then DROP DATABASE |
pg_dump, mysqldump, or SQL Server backup.WITH (FORCE) option is ideal for tearing down test databases.About the author — Kyle Hankinson is the founder and sole developer of SQLPro Studio and the Hankinsoft Development suite of database tools. He has been building native macOS and iOS applications since 2010.
Try SQLPro Studio — A powerful database manager for MySQL, PostgreSQL, Microsoft SQL Server, SQLite, Oracle, and Snowflake. Available on macOS, iOS, and Windows.
Download Free Trial View Pricing Compare