PGError: ERROR: исходная база данных "template1" обращается к другим пользователям

У меня проблемы с тестированием для работы с Postgresql и Rails 3.

Обе базы данных разработки и производства я могу нормально работать, однако в тестовой базе данных возникают следующие ошибки при запуске rake или db:test:prepare и т.д.

PGError: ERROR: исходная база данных "template1" обращается к другим пользователям

Update

Похоже, что при использовании createb для создания новой базы данных в Postgres следует использовать template0 вместо template1. В типичном "So Ill удалить причину, но не в симптом", я нашел vendor/rails/railities/lib/task/databases.rake и изменил строку 109 следующим образом:

createdb #{enc_option} \
-U "#{abcs["test"]["username"]}" \
-T template0 #{abcs["test"]["database"]}

Но я действительно не хочу этого делать, поскольку я использую Rails как GEM, кто-нибудь знает о другой работе или исправлении?

database.yml

development:
  adapter: postgresql
  encoding: unicode
  database: test1234_development
  pool: 5
  username: holden
  password: postgres

test:
  adapter: postgresql
  encoding: unicode
  database: test1234_test
  pool: 5
  username: holden
  password: postgres

Полная ошибка:

ИЗВЕЩЕНИЕ: база данных "test1234_test" не существует, пропуская PGError: ОШИБКА: исходная база данных "template1" доступна другим пользователям
ПОДРОБНОЕ ОПИСАНИЕ: В базе данных есть еще 1 сеанс (ы).
: CREATE DATABASE "test1234_test" ENCODING = 'unicode'

Ответ 1

Рассказ: CREATE DATABASE работает, копируя существующую базу данных. PostgreSQL не позволит вам копировать базу данных, если к ней подключен другой сеанс. Если к шаблону 1 обращаются другие пользователи, CREATE DATABASE завершится с ошибкой.

Вопрос, на который вы должны ответить: Почему другие сеансы связаны с шаблоном1?

Разница между template0 и template1

В момент, когда вы инициализируете кластер базы данных, template0 и template1 совпадают. Любые данные о местоположении, которые вы хотите сделать доступными для каждой создаваемой вами базы данных с помощью CREATE DATABASE, должны войти в шаблон1. Так, например, если вы добавите процедурный langauge PL/python в template1, каждая база данных, которую вы создадите позже, будет включать PL/python.

Шаблон базы данных0 предназначен как "девственный" шаблон. Он должен содержать только стандартные объекты базы данных - те, которые были созданы при инициализации кластера. Как "девственный" шаблон, он никогда не должен изменяться. Никогда.

Если вам нужно указать настройки кодировки и локали (сопоставление), вы можете сделать это, скопировав template0. Вы не можете сделать это, скопировав template1.

Ответ 2

Просто перезапустите службу базы данных.

Ответ 3

Я также получил эту ошибку при попытке reset базы данных, пока у меня был сервер Ruby on Rails по умолчанию WEBrick:

$ bin/rake db:reset
PG::Error: ERROR:  database "dev" is being accessed by other users
DETAIL:  There is 1 other session using the database.
: DROP DATABASE IF EXISTS "dev"

Другим пользователем здесь было приложение Rails. После закрытия сервера с CTRL + c, мне удалось без проблем перезапустить команду базы данных reset.

Это тоже имеет смысл. Вы не можете отбросить базу данных, если к ней подключен кто-то еще, а также указывает Майк Шеррилл.

Ответ 4

Эта проблема возникает, если вы зарегистрировали (psql template1 или psql template0) в базе данных template1 и template0 и выходите с помощью команды ниже.

Ctrl + z

Лучше всего существует использование db ниже команды postgres, тогда проблема не создаст:

\q + введите

Есть 2 решения, если есть проблема.

Решение - 1

Перезапустите службу posgres, например.

sudo service postgresql restart

Решение - 2

sudo ps aux | grep template1

Убедитесь, что вы не удаляете эти процессы

postgres 8363 0.0 0.0 111760 7832 pts/11 T 09:49 0:00/usr/lib/postgresql/9.5/bin/psql template1 ankit 18119 0.0 0.0 14224 976 pts/14 S + 12:33 0:00 grep --color = auto template1

остальная часть процесса должна быть убита с помощью команды ниже.

sudo kill -9

Теперь попробуйте снова создать db.

Надеюсь, что это поможет вам.

Анкит Х Ганди.

Ответ 5

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

  • Остановите все процессы, используя порт postgres 5432, выполнив это в командной строке (Admin): Введите netstat -ano в командной строке. Найдите pid с локальным адресом 0.0.0.0:5432. Затем используйте taskkill /pid {pid} /f, чтобы убить задачу.

  • Запустите службу postgres в службах Windows.

Ответ 6

Для меня решение было удалить старый сервер и создать новый из веб-интерфейса администрирования Postgresql. Теперь можно создать новую базу данных без этой ошибки.