PostgreSQL - Veritabanını yeniden adlandır


127

Veritabanını yeniden adlandırmam gerekiyor, ancak bunu yaptığımda PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"bana yapamayacağını söyledi.

Nasıl yapabilirim?

( WindowsXP'de Sürüm 8.3 )

Güncelleme

  • İlk hata mesajı: Bağlandığım için yapamıyorum. Bu yüzden başka bir veritabanı seçtim ve sorguları yaptım.

  • Kullanıcı bağlantısının geldiğini söyleyen ikinci bir hata mesajı alıyorum. PGAdminEkranda çok sayıda olduğunu görüyorum PIDama aktif değiller ... Onları nasıl öldüreceğimi bilmiyorum.


1
Neden olamayacağını ayrıntılarıyla anlatabilirsiniz. Sadece yaptım (yine de farklı bir platformda) ve işe yaradı
Vinko Vrsalovic

1
Tam hata mesajı nedir ve bu hatayı postgres belgelerinde aradınız mı? Belki bu davranışın mükemmel bir nedeni vardır. Normalde yeniden adlandırma çalışmalıdır.
unexist

Soru güncellendi
Patrick Desjardins

Neden veritabanını yeniden başlatmıyorsunuz?
unexist

Tam hata mesajı nedir ve bu hatayı postgres belgelerinde aradınız mı? Belki bu davranışın mükemmel bir nedeni vardır. Normalde yeniden adlandırma çalışmalıdır. Bekleyen veya çalışmayan bağlantılarla ilgili sorunlarınız varsa, bunlardan kurtulmak için veritabanını yeniden başlatın.
unexist

Yanıtlar:


190

Veritabanı adını alıntı yapmamaya çalışın:

ALTER DATABASE people RENAME TO customers;

Ayrıca o sırada veritabanına bağlı başka istemci olmadığından emin olun. Son olarak, biraz daha fazla bilgi alabilmemiz için döndürdüğü hata mesajını göndermeyi deneyin.


18
Adın içinde büyük harf olduğunda alıntı yapılması gerekir.
Patrick Desjardins

7
Durum böyle değildir, ancak adda bir .veya varsa alıntı yapılması da gereklidir @.
omar

6
Adı bir-
GreenTurtle

Yukarıdaki öneriler, mümkünse tablo adlarını sadece küçük harflerle ve alt çizgi ile sınırlandırmanın daha iyi olacağını düşünmemi sağlıyor !
Aswin Sanakan

Alıntı, isim boş alan içerdiğinde de gereklidir
Loaderon

86

İleride başvurmak için şunları yapabilmelisiniz:

-- disconnect from the database to be renamed
\c postgres

-- force disconnect all other clients from the database to be renamed
SELECT pg_terminate_backend( pid )
FROM pg_stat_activity
WHERE pid <> pg_backend_pid( )
    AND datname = 'name of database';

-- rename the database (it should now have zero clients)
ALTER DATABASE "name of database" RENAME TO "new name of database";

Tablo pg_stat_activitysütununun 9.2'den önceki sürümlerde pidolduğu gibi adlandırıldığını unutmayın procpid. Dolayısıyla, PostgreSQL sürümünüz 9.2'den düşükse, procpidyerine pid.


3
benim için çalıştı, thanx! ancak pg_stat_activity'deki sütun adı pid'dir ve procpid değildir. ( PostgreSQL 9.3.5 on x86_64-apple-darwin, compiled by i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00), 64-bit)
bodman

7

Az önce bununla karşılaştım ve aşağıda işe yarayan şey:

1) pgAdminseanslardan biridir. psqlBunun yerine kullanın .
2) pgBouncerWindows'ta ve / veya zamanlayıcı hizmetlerini, bunlar da oturumlar oluşturduğundan durdurun


3

Unexist bana veritabanını yeniden başlatmamı söyledi ve işe yarıyor! Veritabanını yeniden başlatmak mevcut tüm bağlantıları keser ve ardından başka bir veritabanına bağlanırım ve ilk sorgumla onu yeniden adlandırmayı başardım.

Tüm teşekkürler.


3

Bir nükleer bomba dağıtmak (sunucuyu yeniden başlatmak) yerine, sizi rahatsız eden bağlantıları, nereden olduklarını bularak ve istemci işlemlerini kapatarak veya pg_cancel_backend()işlevi kullanarak kapatmaya çalışmalısınız .


0

DBeaver kullanarak bu sorunla karşılaşan ve bunun gibi bir hata mesajı alan herkes için:

ERROR: database "my_stubborn_db" is being accessed by other users
  Detail: There is 1 other session using the database.

Mevcut bağlantınızı kesin ve yeniden adlandırdığınız veritabanını hedeflemeyen bir bağlantıyla aynı sunucuya yeniden bağlanın.

Aktif veri tabanını değiştirmek yeterli değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.