2008-09-27 36 views
84

Tôi cần phải đổi tên cơ sở dữ liệu nhưng khi tôi làm trong PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld" nó nói với tôi rằng nó không thể.PostgreSQL - Đổi tên cơ sở dữ liệu

Tôi có thể làm như thế nào?

(Version 8.3 trên WindowsXP)

Cập nhật

  • Các thông báo lỗi đầu tiên: Có thể không phải vì tôi đã được kết nối với nó. Vì vậy, tôi đã chọn một cơ sở dữ liệu khác và đã thực hiện các truy vấn.

  • Tôi nhận được thông báo lỗi thứ hai cho tôi biết rằng ứng dụng này đã kết nối với người dùng. Tôi thấy trong màn hình PGAdmin rằng nó có nhiều PID nhưng chúng không hoạt động ... Tôi không thấy làm thế nào để tiêu diệt chúng.

+1

Bạn có thể giải thích tại sao không thể. Tôi chỉ làm điều đó (trên một nền tảng khác nhau mặc dù) và nó làm việc –

+1

Thông báo lỗi chính xác là gì và bạn đã tìm kiếm lỗi này trong tài liệu postgres? Có thể có lý do hoàn hảo cho hành vi đó. Thông thường đổi tên sẽ hoạt động. – unexist

+0

Cập nhật xem câu hỏi –

Trả lời

133

Cố gắng không trích dẫn tên cơ sở dữ liệu:

ALTER DATABASE people RENAME TO customers; 

Cũng đảm bảo rằng không có khách hàng khác kết nối với cơ sở dữ liệu vào thời điểm đó. Cuối cùng, hãy thử đăng thông báo lỗi mà nó trả về để chúng tôi có thêm thông tin.

+12

trích dẫn khi tên có chữ in hoa trong đó. –

+4

Đây không phải là trường hợp, nhưng trích dẫn cũng được yêu cầu khi tên có một '.' hoặc' @ '. – omar

+1

Trích dẫn cũng được yêu cầu khi tên có chứa một '-' – GreenTurtle

1

Unexist nói với tôi trong nhận xét để khởi động lại cơ sở dữ liệu và nó hoạt động! Khởi động lại cơ sở dữ liệu sẽ giết tất cả kết nối hiện có và sau đó tôi kết nối với một cơ sở dữ liệu khác và có thể đổi tên nó với truy vấn ban đầu của tôi.

Thx tất cả.

1

Thay vì triển khai một nuke (khởi động lại máy chủ), bạn nên cố gắng đóng các kết nối làm phiền bạn bằng cách tìm chúng ở đâu và tắt quy trình máy khách hoặc sử dụng chức năng pg_cancel_backend().

52

Để tham khảo trong tương lai, bạn sẽ có thể:

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

Lưu ý rằng bảng pg_stat_activity cột pid được đặt tên như procpid trong các phiên bản trước 9.2. Vì vậy, nếu phiên bản PostgreSQL của bạn thấp hơn 9.2, hãy sử dụng procpid thay vì pid.

+3

nó làm việc cho tôi, thanx! nhưng tên cột trong pg_stat_activity là pid và không procpid. ('PostgreSQL 9.3.5 trên x86_64-apple-darwin, được biên soạn bởi i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Dựa trên Apple Inc. xây dựng 5658) (LLVM build 2336.9.00), 64 -bit') – bodman

4

Tôi chỉ cần chạy vào điều này và dưới đây là những gì làm việc:

1) pdAdmin là một trong những phiên giao dịch. Sử dụng psql để thay thế.
2) Dừng các dịch vụ pgBouncer và/hoặc lên lịch trên Windows vì chúng cũng tạo các phiên

Các vấn đề liên quan