【问题标题】:PGError: ERROR: source database "template1" is being accessed by other usersPGError:错误:其他用户正在访问源数据库“template1”
【发布时间】:2011-02-12 08:41:30
【问题描述】:

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

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

PGError: ERROR: source database "template1" 正被其他用户访问

更新

谷歌搜索,在 Postgres 中使用 createdb 创建新数据库时,似乎应该使用 template0 而不是 template1。在典型的“所以我会删除原因。但不是症状”时尚,我找到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 个其他会话正在使用该数据库。
: 创建数据库 "test1234_test" ENCODING = 'unicode'

【问题讨论】:

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


    【解决方案1】:

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

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

    template0和template1的区别

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

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

    如果您需要指定编码和区域设置(排序规则),那么您可以通过复制 template0.你不能通过复制模板1来做到这一点。

    【讨论】:

    • 啊...我在尝试运行测试时打开了navicat。关闭它使数据库创建成功。谢谢
    • 是的,我打开了 pgAdmin 并且在运行 Django 单元测试时遇到了这个错误。我想也许在网络浏览器上打开了一个会话。我关闭了服务器的所有浏览器选项卡,并停止了 Apache2 服务。它仍然在产生错误。我关闭了 pgAdmin,它运行良好!哈哈。谢谢。
    【解决方案2】:

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

    Ctrl + z

    在 postgres 命令下使用 db 存在更好的方法,那么问题就不会产生:

    \q + 回车

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

    解决方案 - 1

    重启 posgres 服务就好了。

    sudo service postgresql 重启

    解决方案 - 2

    sudo ps aux | grep 模板1

    确保不要删除此进程

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

    应使用以下命令杀死其余进程。

    sudo kill -9

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

    希望对您有所帮助。

    安基特 H 甘地。

    【讨论】:

      【解决方案3】:

      重启数据库服务即可。

      【讨论】:

        【解决方案4】:

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

        1. 通过在命令提示符(管理员)中执行此操作来停止使用 postgres 端口 5432 的所有进程:在命令提示符中键入 netstat -ano。查找本地地址为0.0.0.0:5432 的pid。然后使用taskkill /pid {pid} /f 杀死任务。

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

        【讨论】:

          【解决方案5】:

          我在运行默认的 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

          【讨论】:

            【解决方案6】:

            我的解决方案是删除旧服务器并从 Postgresql 管理 Web 界面创建一个新服务器。现在可以创建没有此错误的新数据库。

            【讨论】:

              【解决方案7】:

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

              $ rails db:create
              
              $ rails db:migrate
              

              【讨论】:

                猜你喜欢
                • 2012-12-31
                • 2012-10-07
                • 2011-01-23
                • 2022-06-16
                • 2018-08-20
                • 2017-12-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多