it-swarm-eu.dev

Jak zrušit všechna připojení k určité databázi bez zastavení serveru?

Chci zrušit všechna připojení (relace), které jsou aktuálně otevřeny pro konkrétní databázi PostgreSQL, ale bez restartování serveru nebo odpojení připojení k jiným databázím.

Jak to mohu udělat?

60
sorin

Zde je moje odpověď na velmi podobná otázka na StackOverflow.

V závislosti na vaší verzi postgresql můžete narazit na chybu, což způsobí pg_stat_activity pro vynechání aktivních připojení od uživatelů, kterým byla zrušena registrace. Tato připojení se také nezobrazují uvnitř pgAdminIII.

Pokud provádíte automatické testování (ve kterém také vytváříte uživatele), může to být pravděpodobný scénář.

V tomto případě se musíte vrátit k dotazům jako:

 SELECT pg_terminate_backend(pg_stat_activity.procpid) 
 FROM pg_stat_get_activity(NULL::integer) 
 WHERE datid=(SELECT oid from pg_database where datname = 'your_database');
27
jb.

Takový dotaz by měl pomoci (za předpokladu, že databáze je pojmenována 'db'):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';

pid bývalo nazýváno procpid, takže pokud používáte verzi postgresu starší než 9,2, můžete zkusit následující:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';

Musíte však být superuživatelem, abyste odpojili ostatní uživatele.

Může být také užitečné REVOKE CONNECT ON DATABASE FROM PUBLIC nebo něco podobného, ​​a poté GRANT poté.

101
Szymon Guz

To lze použít k „uvolnění“ databáze z připojení klientů, takže ji můžete například přejmenovat:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;

Uvědomte si, že by to mohlo způsobit problémové chování vašich klientských aplikací. Skutečné údaje by neměly být přepočítávány kvůli transakcím.

3
cysk