PostgreSQL - Перейменування бази даних


126

Мені потрібно перейменувати базу даних, але коли я це роблю, PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"мені сказали, що вона не може.

Як я можу це зробити?

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

Оновлення

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

  • Я отримую друге повідомлення про помилку, яке повідомляє мені, що він прийшов підключитися до користувача. Я бачу на PGAdminекрані, що його багато, PIDале вони неактивні ... Я не бачу, як їх вбити.


1
Ви можете детальніше пояснити, чому це не може. Я щойно це зробив (на іншій платформі), і це спрацювало
— Вінко Врсалович,

1
Яке точне повідомлення про помилку і чи шукали ви цю помилку в документах postgres? Можливо, для такої поведінки є ідеальна причина. Зазвичай перейменування має спрацювати.
— неіснуючий

Оновлено дивіться питання
— Патрік Дежардінс,

Чому б просто не перезапустити базу даних?
— неіснуючий

Яке точне повідомлення про помилку і чи шукали ви цю помилку в документах postgres? Можливо, для такої поведінки є ідеальна причина. Зазвичай перейменування має спрацювати. Якщо у вас проблеми з відкладеними або мертвими з’єднаннями, просто перезавантажте базу даних, щоб позбутися від них.
— неіснуючий

Відповіді:


189

Спробуйте не цитувати ім'я бази даних:

ALTER DATABASE people RENAME TO customers;

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


18
цитування потрібно, коли в ім'я є велика літера.
— Патрік Дежардінс

7
Це не так, але цитування також потрібно, коли ім'я має .або @.
— омар

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 та не прописом. ( 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)
— бодман

7

Я щойно наткнувся на це і нижче - це те, що спрацювало:

1) pgAdminє одним із сеансів. Використовуйте psqlзамість цього.
2) Зупиніть pgBouncerта / або послуги планувальника в Windows, оскільки вони також створюють сеанси


3

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

Thx всі.


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.