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. Теперь можно создать новую базу данных без этой ошибки.