数据库皆文件!Postgres也不例外


SQLite 和 DuckDB 在数据世界中广受欢迎,这并非偶然。我非常喜欢它们。它们的吸引力很简单:它们只是文件。你可以像查看其他文件一样查看、复制和移动它们。

当然,所有数据库最终都只是“文件”。但你无法像复制 SQLite 文件那样复制粘贴 PostgreSQL 集群。也就是说,只要稍加努力,你就可以简化流程,让 PostgreSQL 更加易于使用。

我的核心信念是:如果你花时间去理解数据库系统的各个组件是如何组合的,不仅仅是内部结构,而是外部组件,你就能更快地行动,更有效地调试,并构建更自信的工作流程。你只需要在前期投入少量资金学习基础知识,并相信随着时间的推移,你能够在此基础上不断进步。

无知之幕
大多数人通过包管理器安装 PostgreSQL sudo apt install postgresql-17,然后很快就忘了它的存在。它变成了一种黑匣子:你通过 来交互psql,但很少配置、检查或移动的服务。当出现问题时——比如权限问题——他们只是输入一些代码sudo —u postgres,然后希望问题会自动解决。

另一种常见的方法是在 Docker 容器中启动 PostgreSQL。这当然可行,但根据我的经验,对于日常开发来说,该工具可能比较笨重且冗长。

但正是这种随意性sudo造成了最大的伤害,不仅因为它具有破坏性,还因为它强化了你和系统之间的一层分离。

我的经验是,如果你愿意剥离这一层并开始手动做一些事情,你的数据工作流程就会变得更加顺畅。

揭开面纱
以下是整体情况:

当您通过包管理器安装 PostgreSQL 时,它会设置一些默认设置:

  • 名为的系统用户postgres
  • 数据目录如下/var/lib/postgresql/17/main
  • 数据库二进制文件位于/usr/lib/postgresql/17/bin/postgres
  • 默认数据库也命名为postgres

Postgres 名称(用户、二进制文件、数据库)的过度使用很容易让人混淆。初学者经常混淆它们也就不足为奇了。我们先忘掉这些,假设我们只是一个普通的日常用户。

其核心postgres其实就是一个将 SQL 查询转换为文件系统操作的程序。ACREATE TABLE变成了 mkdir 命令。AnUPDATE最终变成了:打开文件、写入文件、关闭文件。它是一个复杂而强大的系统——但从根本上来说,它只是一个操作文件的可执行文件。

这些文件位于所谓的 目录中data_directory,通常由环境变量引用PGDATA。要从头创建该目录,您可以运行:

initdb /tmp/db0

现在您可以使用以下命令启动 PostgreSQL 服务器:

PGPORT=1991 postgres -D /tmp/db0 -c shared_buffers="10GB"

这将在该目录上启动数据库服务器。我们还会覆盖shared_buffers此处的默认设置。诸如psql通过指定端口连接到服务器之类的工具,因此PGPORT很重要。

软件包管理器通常将整个过程包装在后台运行的系统服务中。但在底层,它基本上只是运行相同的命令,外加一些其他选项。

其中一个选项是config_file,它允许您指向自定义的 postgresql.conf。以下是您可以另存为 的示例db0.pgconf:

shared_buffers = 16GB
work_mem = 64MB
max_worker_processes = 24

然后你可以像这样启动服务器:

PGPORT=1991 postgres -D ./tmp/db0 -c config_file=./db0.pgconf

连接方式:

PGPORT=1991 psql postgres

完成后,只需rm -rf /tmp/db0。

陷阱
需要明确的是,这主要是一个开发工作流程。 您不会通过手动处理文件夹和环境变量来管理生产环境的 Postgres。 但对于本地设置、原型设计、测试,甚至分享演示,它都非常强大。您可以使用 git 对整个数据库集群进行版本控制,将配置文件与代码一起存储,并使用简单的脚本重现环境。

但是,如果决定遵循这一点,就必须绝对清楚当前正在运行的可执行文件是什么、使用了哪些配置参数以及这些参数的来源。我还建议将所有内容都作为前台进程运行,尤其是在开发过程中。否则,如果你以为只是在调整文件中的某个配置参数,而实际运行的进程却考虑了其他参数,那么你很容易陷入疯狂。

为什么这很重要
了解 PostgreSQL 的实际工作原理——它是如何启动的、文件位于何处、关键二进制文件的作用是什么——将赋予您真正的力量。它揭开了神秘面纱。这意味着您不再只是在出现问题时做出反应;您可以进行诊断、调整甚至优化。

您无需深入研究内部原理或成为一名数据库工程师。 您只需要将系统理解为一组文件、一个进程和一个配置。 一旦揭开这层无知的面纱,一切都会变得简单:调试、配置、版本控制、备份,甚至只是尝试一些设置。

这就是 SQLite 和 DuckDB 如此受人喜爱的原因:它们默认赋予了你这种能力。PostgreSQL 也能赋予你同样的能力——只要你知道如何运用它。

如果您正在构建系统、编写数据管道,或者只是想更好地掌控您的开发环境,那么前期的一点学习就能带来立竿见影的效果。 您将更加自信地行动,构建更清晰的工作流程,并且不再将数据库视为黑匣子。

而且,谁知道呢?你可能会爱上 PostgreSQL,并开始深入研究它。