PostgreSQL - Đổi tên cơ sở dữ liệu


126

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

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

( Phiên bản 8.3 trên WindowsXP )

Cập nhật

  • Thông báo lỗi đầu tiên: Không thể vì tôi đã 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 một thông báo lỗi thứ hai cho tôi biết rằng nó đã kết nối người dùng. Tôi thấy trên PGAdminmàn hình có rất nhiều PIDnhưng chúng không hoạt động ... Tôi không thấy cách giết chúng.


1
Bạn có thể giải thích tại sao nó không thể. Tôi mới làm điều đó (trên một nền tảng khác) và nó đã hoạt động
Vinko Vrsalovic

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ó lẽ có một lý do hoàn hảo cho hành vi đó. Thông thường đổi tên nên hoạt động.
unexist

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

Tại sao không chỉ khởi động lại cơ sở dữ liệu?
unexist

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ó lẽ có một lý do hoàn hảo cho hành vi đó. Thông thường đổi tên nên hoạt động. Nếu bạn gặp vấn đề với các kết nối đang chờ xử lý hoặc đã chết, chỉ cần khởi động lại cơ sở dữ liệu để loại bỏ chúng.
unexist

Câu trả lời:


189

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 được kết nối với cơ sở dữ liệu tại 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ể biết thêm một chút thông tin.


18
trích dẫn là cần thiết khi tên có chữ in hoa trong đó.
Patrick Desjardins

7
Đâ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

6
Việc trích dẫn cũng được yêu cầu khi tên chứa một-
GreenTurtle

Các đề xuất ở trên khiến tôi nghĩ rằng tốt hơn là giữ các tên bảng bị hạn chế chỉ viết chữ thườnggạch dưới nếu có thể!
Aswin Sanakan

Việc trích dẫn cũng được yêu cầu khi tên chứa không gian trống
Loaderon

86

Để 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 pg_stat_activitycột bảng pidđược đặt tên như procpidtrong 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 procpidthay 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 phải là 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

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

1) pgAdminlà một trong những phiên. Sử dụng psqlthay thế.
2) Dừng các pgBouncerdịch vụ và / hoặc lên lịch trên Windows vì chúng cũng tạo các phiên


3

Unexist nói với tôi trong bình luận để 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ả cá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ó bằng truy vấn ban đầu của tôi.

Thx tất cả.


3

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 xem chúng đến từ đâu và tắt các tiến trình máy khách hoặc bằng cách sử dụng pg_cancel_backend()chức năng.


0

Đối với bất kỳ ai gặp phải vấn đề này khi sử dụng DBeaver và nhận được thông báo lỗi như thế này:

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

Ngắt kết nối kết nối hiện tại của bạn và kết nối lại với cùng một máy chủ với kết nối không nhắm mục tiêu cơ sở dữ liệu mà bạn đang đổi tên.

Thay đổi cơ sở dữ liệu hoạt động là không đủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.