dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Kütüphanesi/PostgreSQL/postgresql-database-being-accessed
PostgreSQL
PG 13 - 17
5 dk okuma
ERROR: database "test_db" is being accessed by other users

PostgreSQL "database is being accessed by other users" — Drop Neden Engelleniyor?

DROP DATABASE öncesi oturumları güvenle sonlandırma, ALLOW_CONNECTIONS, hazırlıklı transaction'lar ve replication slot engeli.

Standart:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: PostgreSQL 13 / 14 / 15 / 16 / 17
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

plaintext
ERROR: database "test_db" is being accessed by other users DETAIL: There are 3 other sessions using the database.

Bu hata DROP DATABASE ve ALTER DATABASE ... RENAME işlemlerinde çıkar. Mesaj kaç oturum olduğunu söyler ama kim olduğunu söylemez — ve asıl sürpriz, o oturumların bazen pg_stat_activity'de hiç görünmemesidir.


▸Adım adım çözüm

1. Yeni bağlantıları kesin (PostgreSQL 13+). Sıralama kritiktir: önce kapıyı kapatın, sonra içeridekileri çıkarın. Aksi halde oturumları sonlandırırken uygulama saniyeler içinde yeni bağlantı açar ve kısır döngüye girersiniz.

sql
ALTER DATABASE test_db WITH ALLOW_CONNECTIONS false;

2. Mevcut oturumları sonlandırın.

sql
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'test_db' AND pid <> pg_backend_pid();

3. İşlemi tekrarlayın. Tek tur genellikle yetmeyebilir; aynı iki komutu art arda çalıştırın.

4. Görünmeyen engelleri kontrol edin. Hata devam ediyorsa neden normal bağlantılar değildir. Üç kritik olasılık:

sql
-- a) Hazırlıklı (prepared) transaction'lar: oturuma bağlı değildir SELECT gid, database, prepared FROM pg_prepared_xacts; -- b) Mantıksal replikasyon slot'ları: veritabanını kilitler SELECT slot_name, database, active FROM pg_replication_slots WHERE database = 'test_db'; -- c) Açık mantıksal replikasyon abonelikleri SELECT subname, subdbid::regdatabase FROM pg_subscription;
[!WARNING] Bir hazırlıklı transaction'ı pg_terminate_backend ile sonlandıramazsınız; açıkça ROLLBACK PREPARED 'gid'; çalıştırmanız gerekir. Replikasyon slot'unu ise SELECT pg_drop_replication_slot('slot_name'); ile düşürmeden veritabanı silinemez.

5. Veritabanını silin (veya erişimi geri açın).

sql
DROP DATABASE test_db;

Silmiyorsanız kapıyı geri açmayı unutmayın:

sql
ALTER DATABASE test_db WITH ALLOW_CONNECTIONS true;

▸Bunu bir daha yaşamamak için

Veritabanı silme ve bakım işlemlerini bir tatbikat runbook'una bağlayın: uygulamayı durdur → bağlantıları kes (ALLOW_CONNECTIONS false) → slot ve prepared transaction kontrolü → drop.

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (20)