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()
.