Stolen from TablePlus Blog, Cool product check it out here!
First, lets check to see if the database has active connections..
SELECT pid,usename,client_addr,wait_event_type,wait_event,state,query,backend_type
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'source_database_name'
AND pid <> pg_backend_pid();
pid | usename | client_addr | wait_event_type | wait_event | state | query | backend_type
------+---------+--------------+-----------------+------------+-------+--------+----------------
7623 | username | 10.49.60.187 | Client | ClientRead | idle | COMMIT | client backend
7883 | username | 10.49.60.187 | Client | ClientRead | idle | COMMIT | client backend
8388 | username | 10.49.60.187 | Client | ClientRead | idle | COMMIT | client backend
8209 | username | 10.49.60.187 | Client | ClientRead | idle | COMMIT | client backend
8568 | username | 10.49.60.187 | Client | ClientRead | idle | COMMIT | client backend
(5 rows)
At, this point we need to terminate those connections, either you can stop your application and re-run the query and wait. Or you can forcefully disconnect them (don't blame me if this breaks your db).
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'source_database_name'
AND pid <> pg_backend_pid();
Now we can copy the database...
CREATE DATABASE new_database_copy WITH TEMPLATE source_database_name;
Dr. Ogg