【问题标题】:Starting a postgres database server from a data file从数据文件启动 postgres 数据库服务器
【发布时间】:2015-06-16 21:46:14
【问题描述】:

我已经为此工作了大约一天,但我无法弄清楚,我真的不知道还能去哪里找。我有一个目录,/psql/data/,我正在尝试运行postgres -D /pgsql/data 来启动数据库服务器。但是,我得到了

postgres cannot access the server configuration file "/psql/data/postgresql.conf": Permission denied 

这里有一些背景。在我工作的地方,我们有一个使用 Flask 框架的应用程序,该框架使用 Postgres 数据库。我们在亚马逊服务器上运行这个应用程序。此应用程序有效!我知道,因为我以前用过它。但是,写它的人离开了公司,现在我负责。我的另一位同事无意中停止了服务器,所以在重新启动时我不得不重新设置它。

这是我尝试过的: postgres -D /psql/data 我读到过 here 从那个链接它还说你必须登录到 postgresql 用户帐户。 (我大约一个月前才开始使用 ubuntu,对它不是很熟悉,所以如果我发表愚蠢的言论,请原谅我)。所以我环顾四周,发现我可以使用sudo su postgres 登录到 postgres 帐户。哪个有效!我可以看到以前没有权限查看的文件。因此,当我再次尝试运行 postgres -D /psql/data 时,我得到:

The program 'postgres' is currently not installed. To run 'postgres' please ask your administrator to install the package 'postgres-xc'

首先我尝试安装 postgres-xc,但它缺少依赖项,然后当我去搜索时,我读到如果我收到此消息,这可能是一个更大的错误,我应该不必安装 postgres-xc。所以我停止了尝试。

最终,我正在尝试再次运行该应用程序。但在它可以运行之前,它需要运行数据库,因为当我尝试使用python [myapp].py 启动烧瓶应用程序时没有运行数据库,我得到:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

我发现那是因为数据库没有运行。而且我无法启动数据库服务器。我已经尽力提供尽可能多的相关信息,任何关于我下一步应该看哪里的建议将不胜感激。如果需要,我还可以提供更多信息。

更新: 错误发生在这里

engine = sqlalchemy.create_engine(conf['db'])
insp = reflection.Inspector.from_engine(engine)

引擎是根据配置文件中的值创建的,即,

db: postgresql://work:app@localhost:5432/work

但是一旦第二行尝试执行它就会出错。

更新:

胜利!感谢所有帮助过我的人,您的所有回答都为我指明了正确的方向(但不幸的是,只有一个人可以获得赏金)。

首先,每当我尝试sudo -u postgres pg_ctl -D /psql/data 时,它都会出错并告诉我没有这样的命令。所以我必须找到 pg_ctl 命令的确切位置。它位于 /usr/lib/postgres/9.3/bin/pg_ctl 中。于是我打电话给sudo -u postgres /usr/lib/postgresql/9.3/bin/pg_ctl start -D /psql/data。这给了我一个错误,我的配置文件有错误。这很奇怪,因为我从来没有碰过它,但我评论了那个错误,然后我得到了真正的错误。

数据库是使用 postgres 9.4 创建的,但我使用的是 postgres 9.3。

所以我不得不安装 9.4。可以在here找到说明。一旦我这样做了,我必须用sudo service postgresql stop 停止以前启动的postgres 服务器。

最后,我能够从带有sudo -u postgres /usr/lib/postgresql/9.4/bin/pg_ctl start -D /psql/data 的文件中的数据库启动服务器。

现在我可以使用sudo -su postgres 然后psql 访问数据库。

谢谢大家!

【问题讨论】:

  • 您可能想以此为例:pypi.python.org/pypi/testing.postgresql
  • 检查in /etc/init.d是否有名为postgres、pgsql或类似名称的文件。
  • 启动后应该说“PostgreSQL 9.3 启动成功”或“无法启动...”它说了什么?
  • 所以,服务器正在运行。下一步是检查身份验证参数。它们位于 postgres 数据目录中的 pg_hba.conf 中。
  • 这里恐怕帮不了你。你必须在文档中阅读它。

标签: python database postgresql flask


【解决方案1】:

postgres 服务器很可能在不同的用户帐户下运行,可能是通过一个初始化脚本。

要快速入门,您可能需要:

sudo -u postgres pg_ctl -D /psql/data -w start

postgres 用户 (sudo -u postgres) 的身份运行 pg_ctl 命令,其中包含从 /psql/data 启动 PostgreSQL 并等待它启动的指令。

然后您应该查看 PostgreSQL 是否设置为由您的操作系统初始化脚本管理。通常,您应该能够执行以下操作:

sudo service postgresql start

sudo service postgresql-9.4 start

sudo service postgresql94

sudo systemctl start postgresql-9.4

取决于您的操作系统/版本以及 PostgreSQL 的安装方式。如果它是手工编译的,那么在您设置服务之前,这些都不会起作用,您应该立即进行。阅读您的操作系统文档以了解如何操作。

【讨论】:

  • 感谢您的回复。所以我运行该命令并得到错误“sudo:pg_ctl:找不到命令”。然后我尝试在没有 sudo -u postgres 的情况下运行它,然后我回到了权限被拒绝错误。我明白,因为我不是 postgres 用户。然后我运行 sudo su postgres,切换到 postgres 用户并尝试运行“pg_ctl -D /psql/data -w start”,它说程序当前没有安装,我需要安装 postgres_xc。
  • 关于你上一条关于设置服务的评论,设置服务和启动数据库服务器有什么区别?
  • @Gabriel 一个操作系统服务管理数据库服务器的启动和关闭——例如sysv 初始化脚本、systemd 服务等
【解决方案2】:

加布里埃尔,首先。 “/psql/data/postgresql.conf”的文件权限是什么?

ls -l /psql/data/*.conf

用超级用户试试:

chmod 744 /psql/data/postgresql.conf

它可以让你阅读这个文件,但根据你的问题描述,我相信只有这一步不能解决它。

那么,哪个操作系统你在用吗?

当我在 Linux Ubuntu (11 LTS) 环境中从带有 PostGIS 的 PostgreSQL 8 迁移到 PostgreSQL 9 时,我遇到了类似的问题。最后我放弃了直接打开文件(pg_start),而是使用 pg_dump 从旧数据库中转储文件,然后将数据库导入到 PG9。

如果你不能这样做。请问您是否在服务器上具有管理权限并且这是您在 PostgreSQL 中使用的唯一数据库?

如果是您的情况,我会卸载服务器(如果您使用的是 apt,则使用 apt-get remove、purge 等)并重新安装。由于您甚至没有 pg_ctl 可执行文件工作,因此缺少某些东西(lib、bin 等???),有时需要很长时间才能找到它,最好的解决方案是卸载/安装。

如果您无法在您的服务器中执行此操作,请在任何其他服务器中安装 postgresql 服务器并按照您的方式执行 pg_start -D。它应该打开数据库。然后您可以转储数据库并将其导入生产服务器。

【讨论】:

  • 感谢您的回复。更改权限让我遇到了一个新错误:致命:数据目录“/psql/data”的所有权错误提示:服务器必须由拥有数据目录的用户启动。我现在将调查此错误。要回答您的其他问题,该应用程序位于运行 Ubuntu 14.04 的亚马逊服务器上。我也有完全的权利对服务器做任何我想做的事情。至于 pg_dump,我数据库的数据在 /psql/data 中。我没有看到任何可以转储文件中数据库的选项。这就是你要我做的意思吗?
  • @Gabriel,是的。对我来说,从原始数据库中转储文件将是最好的解决方案,如果您可以访问它的话。如果您没有,那么我们应该尝试在原始数据库的完全相同的版本中打开数据库。你知道文件来自哪个版本吗? (有一天,我设法按照您的方式从旧版本打开了一个数据库,但我什至需要更改 C 中的 postgreSQL 原始源代码并再次编译它,我不希望您走这么远(如果你很好奇解决方案在这里指出:postgresql.nabble.com/Recuperacao-postgreSQL-8-0-td2044539.html
  • do: ls -l /psql 检查数据目录的所有者。 If Then do: chown -R your_postgre_user /psql/data
  • 数据库应该从文件中生成。 /psql/data 包含所有信息。所以现在数据库没有运行,因为我无法使用该文件启动它。 postgres 版本是 9.4
  • 所有者是postgres。我从未创建过 postgres 用户。我认为所有者是 postgres 就足够了,似乎我需要将数据库作为 postgres 启动,但是当我什至无法弄清楚如何做到这一点时。
猜你喜欢
  • 2011-01-13
  • 2016-07-15
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多