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.


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.


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.


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


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.


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.