PostgreSQL - Ubah nama database

127

Saya perlu mengganti nama database tetapi ketika saya melakukannya di PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"dalamnya memberi tahu saya bahwa itu tidak bisa.

Bagaimana saya bisa melakukannya?

( Versi 8.3 di WindowsXP )

Memperbarui

  • Pesan kesalahan pertama: Tidak bisa karena saya terhubung dengannya. Jadi saya memilih database lain dan melakukan kueri.

  • Saya mendapatkan pesan kesalahan kedua yang memberi tahu saya bahwa pengguna telah terhubung. Saya melihat di PGAdminlayar bahwa ia memiliki banyak PIDtetapi mereka tidak aktif ... Saya tidak melihat bagaimana cara membunuh mereka.

Patrick Desjardins
sumber
1
Anda bisa menjelaskan mengapa tidak bisa. Saya baru saja melakukannya (pada platform yang berbeda) dan berhasil
Vinko Vrsalovic
1
Apa pesan kesalahan yang tepat dan apakah Anda mencari kesalahan ini di dokumen postgres? Mungkin ada alasan sempurna untuk perilaku itu. Biasanya mengganti nama seharusnya berfungsi.
ada
Diperbarui lihat pertanyaannya
Patrick Desjardins
Mengapa tidak memulai ulang database?
ada
Apa pesan kesalahan yang tepat dan apakah Anda mencari kesalahan ini di dokumen postgres? Mungkin ada alasan sempurna untuk perilaku itu. Biasanya mengganti nama seharusnya berfungsi. Jika Anda memiliki masalah dengan koneksi yang tertunda atau mati, cukup restart database untuk menyingkirkannya.
ada

Jawaban:

190

Cobalah untuk tidak mengutip nama database:

ALTER DATABASE people RENAME TO customers;

Pastikan juga bahwa tidak ada klien lain yang terhubung ke database pada saat itu. Terakhir, coba posting pesan kesalahan itu kembali sehingga kami bisa mendapatkan lebih banyak informasi.

bmdhacks
sumber
18
kutipan diperlukan jika nama memiliki huruf kapital di dalamnya.
Patrick Desjardins
7
Ini tidak terjadi, tetapi kutipan juga diperlukan jika nama memiliki .atau @.
omar
6
Kutipan juga diperlukan jika nama tersebut berisi-
GreenTurtle
Saran di atas membuat saya berpikir lebih baik untuk membatasi nama tabel hanya dengan huruf kecil dan garis bawah jika memungkinkan!
Aswin Sanakan
Kutipan juga diperlukan saat nama berisi ruang kosong
Loader
86

Untuk referensi di masa mendatang, Anda harus bisa:

-- 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";

Perhatikan bahwa pg_stat_activitykolom tabel piddinamai seperti procpidpada versi sebelum 9.2. Jadi jika versi PostgreSQL Anda lebih rendah dari 9.2, gunakan procpidsaja pid.

gsiems
sumber
3
itu berhasil untuk saya, thanx! tetapi nama kolom dalam pg_stat_activity adalah pid dan bukan procpid. ( 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

Saya baru saja mengalami ini dan di bawah ini yang berhasil:

1) pgAdminadalah salah satu sesi. Gunakan psqlsebagai gantinya.
2) Hentikan pgBouncerdan / atau layanan penjadwal pada Windows karena ini juga membuat sesi

smoore4
sumber
3

Unexist memberi tahu saya dalam komentar untuk memulai ulang database dan berhasil! Memulai ulang database akan mematikan semua koneksi yang ada dan kemudian saya terhubung ke database lain dan dapat mengganti namanya dengan kueri awal saya.

Thx all.

Patrick Desjardins
sumber
3

Alih-alih menerapkan nuke (memulai ulang server), Anda harus mencoba menutup koneksi yang mengganggu Anda baik dengan menemukan dari mana asalnya dan mematikan proses klien atau dengan menggunakan pg_cancel_backend()fungsi tersebut.

Milen A. Radev
sumber
0

Untuk siapa pun yang mengalami masalah ini menggunakan DBeaver dan mendapatkan pesan kesalahan seperti ini:

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

Putuskan koneksi Anda saat ini, dan sambungkan kembali ke server yang sama dengan koneksi yang tidak menargetkan database yang Anda ganti namanya.

Mengubah database aktif saja tidak cukup.

rovyko
sumber