linux - 在 Linux 上运行程序化 Postgres 数据库迁移的最佳实践

标签 linux postgresql

在许多 Linux 上,PostgreSQL 在单独的用户帐户下运行,因此您必须:

sudo su - postgres

完成任何工作。如果您只想手动输入 SQL,这一切都很好,但是如果您有一个用编程语言(在我的例子中是 Node/Knex)编写的迁移怎么办?

通常的做法是以某种方式让代码了解用户情况(即,在我的代码中编写等同于 sudo su - postgres 的内容)吗?

或者,是否以数据库用户身份运行我的所有代码(即使这意味着向我的数据库用户授予对我的非数据库用户的主文件夹的权限)?

或者,是为了让我的普通用户拥有 Postgres 访问权限(在这种情况下,为什么 Linux 还要为单独的用户设置 Postgres)?

或者,我还缺少其他方法吗?

附言我意识到这在某种程度上是一个系统管理问题,但我在这里而不是 super 用户发布,因为它专门关于运行程序员编写的代码(恰好会更改数据库)。

最佳答案

您正在合并三个独立的用户帐户。

首先是运行 postgresql 守护进程的操作系统帐户。正如您在大多数 Linux 发行版中所说,这将是一个仅用于此目的的单独用户,通常名为 postgres。这是为了防止系统上的其他用户访问 postgresql 数据文件和其他资源,同时也是为了限制侵入数据库的人可能造成的损害。

然后是客户端程序(例如 psql)或您的迁移工具可能运行的用户帐户。

最后是 postgresql 用户帐户。 Postgresql 有自己的用户帐户系统来管理其管理的数据库中用户的权限,与操作系统用户帐户系统无关。

操作系统帐户和 postgresql 数据库帐户之间的一个重叠是 psql 命令行工具将使用与运行该工具的操作系统用户相同的用户名连接到数据库,如果您没有在命令行上指定用户。例如,如果我与此联系:

psql mydatabase

然后它将尝试连接用户 harmic,我的 Linux 用户帐户,但是如果我使用这个:

psql -U postgres mydatabase

然后它将连接到用户 postgres,这是默认的管理员帐户。

另一个相关方面是身份验证方法。最有可能的是,如果您在您的机器上尝试上述命令,您会得到一个错误。这是由于允许的身份验证方法,这些方法在文件 pg_hba.conf 中配置。此文件配置特定用户在从特定主机连接到特定数据库时可以使用的允许的身份验证方法。 postgres 用户通常只允许从同一主机内连接,使用 ident 作为身份验证方法,这意味着根据运行命令的 OS 用户识别用户。

这解释了为什么您一直在使用 sudo su - postgres 切换到 postgres 用户:很可能在您当前的配置中这是访问此帐户的唯一方法.

好吧,这听起来可能相当复杂。为了简化事情,这里是我在这方面的最佳实践建议:

  1. 不要弄乱用于运行数据库后端的操作系统帐户。它不是必需的,会削弱安全性。

  2. 创建一个单独的数据库帐户来管理应用程序的数据库。使用此帐户而不是 postgres 帐户用于迁移脚本等。这样做的原因是 postgres 帐户对服务器上的所有数据库具有完全权限,而您可以只授予您的管理员用户它需要的权限,并且只授予应用程序控制的数据库(而不是任何其他数据库可能在那里)。请参阅:CREATE USER SQL命令。

  3. 更新 pg_hba.conf 文件以指定将用于验证此用户的验证模式。参见 Client Authentication在手册中。 md5 和适当的强密码可能是一个不错的选择。

  4. 更新您的迁移工具以使用这个新用户。用户(和密码,如果使用密码)将通过连接到数据库时提供的连接字符串或连接参数提供。同样,当使用 psql 连接时,使用 -U 选项指定用户名。

    请注意,无需使用 sudo su -,甚至无需拥有与管理员用户同名的操作系统帐户。

关于linux - 在 Linux 上运行程序化 Postgres 数据库迁移的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41419008/

相关文章:

linux - 显示已用磁盘空间,包括 bash 中的保留磁盘空间

json - 在 NodeJS 中如何使用 node-postgres 模块将 JSON 对象保存为文本?

sql - Postgres 通过多个连接创建表

sql基于group by删除

python - 如何将linux的find命令的 `maxdepth`选项模拟到python

php - 不同ftp的子域之间的Ajax请求

linux - "sort < output"和 "sort output"之间的区别

c - 在linux中如何知道从C中设置IP地址是成功还是失败

sql - 如何从postgres中的group by获取多个结果

regex - PostgreSQL - 正则表达式问题