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.