PGError:错误:其他用户正在访问源数据库“template1”

时间:2011-02-12 08:41:31

标签: ruby-on-rails unit-testing ruby-on-rails-3 testing postgresql

我在使用Postgresql和Rails 3进行测试时遇到了问题。

开发和生产数据库我都可以正常工作,但是当我运行rakedb:test:prepare等时,测试数据库会抛出以下错误。

  

PGError:错误:其他用户正在访问源数据库“template1”

更新

在使用createdb在Postgres中创建新数据库时,似乎应该使用template0而不是template1。在典型的“所以我将删除原因。但不是症状“时尚,我发现vendor/rails/railities/lib/task/databases.rake并改变了第109行:

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

但我真的不想这样做,因为我使用Rails作为创业板,任何人都知道另一种解决方法或修复?

的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'

7 个答案:

答案 0 :(得分:15)

短篇小说CREATE DATABASE通过复制现有数据库来工作。如果另一个会话连接到它,PostgreSQL将不允许您复制数据库。如果其他用户正在访问template1,CREATE DATABASE将失败。

您需要回答的问题:为什么其他会话连接到template1?

template0和template1之间的区别

在初始化数据库集群时,template0和template1是相同的。您希望使用CREATE DATABASE创建的每个数据库可以使用的任何特定于位置的内容都应该进入template1。因此,例如,如果将程序语言PL / python添加到template1,则稍后创建的每个数据库都将包含PL / python。

数据库template0旨在成为“原始”模板。它应该只包含标准数据库对象 - 通过初始化集群创建的对象。作为“处女”模板,它永远不应该被改变。从不。

如果需要指定编码和区域设置(排序规则),则可以通过复制template0来实现。你不能通过复制template1来做到这一点。

答案 1 :(得分:2)

只需重新启动数据库服务。

答案 2 :(得分:1)

当您在template1和template0数据库中记录( psql template1 psql template0 )并使用以下命令退出时,会出现此问题。

Ctrl + z

从postgres命令下面的db使用更好的方法然后问题不会创建:

\ q +输入

有两个解决方案,如果有问题。

解决方案 - 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

现在尝试再次创建数据库。

希望这对你有所帮助。

Ankit H Gandhi。

答案 3 :(得分:0)

当我在运行默认的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 关闭服务器后,我能够毫无问题地重新运行数据库重置命令。< /强>

这也很有道理。如果其他人当前与其连接,则您无法删除数据库,如Mike Sherrill also points out

答案 4 :(得分:0)

我重启了系统,错误仍在显示。但是,我按照以下步骤对其进行了整理。

  1. 通过在命令提示符(Admin)中执行此操作,使用postgres端口5432停止所有进程:在命令提示符下键入<Style TargetType="Image" x:Key="Blank"> <Setter Property="Source" Value="/images/blank.png"/> <Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="HorizontalAlignment" Value="Center"/> </Style> <Style TargetType="Image" x:Key="BlockArrowLeft"> <Setter Property="Source" Value="/images/block_arrow_left.png"/> <Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="HorizontalAlignment" Value="Center"/> </Style> 。找到本地地址为netstat -ano的pid。然后使用0.0.0.0:5432来终止任务。

  2. 在Windows服务中启动postgres服务。

答案 5 :(得分:0)

对我来说,解决方案是从Postgresql管理Web界面中删除旧服务器并创建一个新服务器。现在可以创建新数据库而不会出现此错误。

答案 6 :(得分:0)

我也被困在 ruby​​ on rails 项目上设置 postgres,确保您已经在本地安装了 pg 并使用其密码创建了一个用户,然后在您的 database.yml 上应该有:-主机:localhost,密码:(设置密码)然后运行:

$ rails db:create
$ rails db:migrate