PostgreSQL - переименовать базу данных


127

Мне нужно переименовать базу данных, но когда я это сделал, PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"мне сказали, что это невозможно.

Как мне это сделать?

( Версия 8.3 для WindowsXP )

Обновить

  • Первое сообщение об ошибке: Невозможно, потому что я подключился к нему. Поэтому я выбрал другую базу данных и выполнил запросы.

  • Я получаю второе сообщение об ошибке, в котором говорится, что пользователь подключился. Я вижу на PGAdminэкране, что их много, PIDно они неактивны ... Не вижу, как их убить.


1
Вы могли бы уточнить, почему это невозможно. Я просто сделал это (хотя и на другой платформе), и это сработало
— Винко Врсалович

1
Каково точное сообщение об ошибке, и искали ли вы эту ошибку в документации postgres? Может быть, для такого поведения есть веская причина. Обычно переименование должно работать.
— существует,

Обновлено см. Вопрос
— Патрик Дежарден

Почему бы просто не перезапустить базу данных?
— существует,

Каково точное сообщение об ошибке, и искали ли вы эту ошибку в документации postgres? Может быть, для такого поведения есть веская причина. Обычно переименование должно работать. Если у вас есть проблемы с ожидающими или неработающими соединениями, просто перезапустите базу данных, чтобы избавиться от них.
— существует,

Ответы:


190

Старайтесь не цитировать имя базы данных:

ALTER DATABASE people RENAME TO customers;

Также убедитесь, что к базе данных не подключены другие клиенты. Наконец, попробуйте опубликовать сообщение об ошибке, которое он возвращает, чтобы мы могли получить немного больше информации.


18
цитирование требуется, если в названии есть заглавная буква.
— Патрик Дежарден,

7
Это не так, но кавычки также необходимы, когда в имени есть .или @.
— omar

6
Цитирование также требуется, если имя содержит-
— GreenTurtle

Приведенные выше предложения заставляют меня думать, что лучше ограничить имена таблиц только строчными буквами и, если возможно, подчеркиванием !
— Асвин Санакан

Цитирование также требуется, если имя содержит пустое место
— Loaderon

86

Для справки в будущем вы должны уметь:

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

Обратите внимание, что pg_stat_activityстолбец таблицы pidбыл назван так, как procpidв версиях до 9.2. Поэтому, если ваша версия PostgreSQL ниже 9.2, используйте procpidвместо pid.


3
у меня это сработало, спасибо! но имя столбца в pg_stat_activity - pid, а не 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

Я только что столкнулся с этим, и вот что сработало:

1) pgAdmin- одна из сессий. psqlВместо этого используйте .
2) Остановите pgBouncerслужбы и / или службы планировщика в Windows, поскольку они также создают сеансы


3

Unexist сказал мне в комментарии перезапустить базу данных, и она работает! Перезапуск базы данных уничтожает все существующие соединения, а затем я подключаюсь к другой базе данных и смог переименовать ее с помощью моего первоначального запроса.

Спасибо всем.


3

Вместо развертывания ядерной бомбы (перезапуска сервера) вы должны попытаться закрыть те соединения, которые вас беспокоят, либо обнаружив, откуда они и завершив клиентские процессы, либо с помощью этой pg_cancel_backend()функции.


0

Для тех, кто сталкивается с этой проблемой при использовании DBeaver и получает такое сообщение об ошибке:

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

Отключите текущее соединение и повторно подключитесь к тому же серверу с подключением, которое не нацелено на базу данных, которую вы переименовываете.

Менять активную базу данных недостаточно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.