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

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

Как я могу это сделать?

(Версия 8.3 на WindowsXP)

Обновление

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

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

Ответ 1

Попробуйте не указывать имя базы данных:

ALTER DATABASE people RENAME TO customers;

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

Ответ 2

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

-- 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 column pid была названа как procpid в версиях до 9.2. Поэтому, если ваша версия PostgreSQL ниже 9.2, используйте procpid вместо pid.

Ответ 3

Я просто столкнулся с этим и ниже, что сработало:

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

Ответ 4

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

спасибо all.

Ответ 5

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