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;

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

bmdhacks
источник
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.

gsiems
источник
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, поскольку они также создают сеансы

smoore4
источник
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.

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

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

rovyko
источник