安装 PostgreSQL

在 Linux 上安装和配置 PostgreSQL 数据库,包括 Fedora 发行版的安装步骤和配置说明


安装postgresql

我最开始比较认可postgresql是因为它比mysql更符合ANSI SQL,仅此而已.不过因为其强大和灵活的配置和插件系统,导致其配置文件相当复杂.且默认配置一点也不合理,兴许他们就是要这样强制使用者去了解他们呢?

前言

理解本文的必要条件

  • 您已获得了sudo/root权限
  • 具备linux系统使用经验

本文一定会编辑的配置文件:

  • /var/lib/pgsql/data/postgresql.conf
  • /var/lib/pgsql/data/pg_hba.conf

参考资料

您已可能需要了解的概念

  • postgresql是什么
  • fedora的包管理器(dnf)
  • systemd

在fedora41上安装postgresql17

本文编写前的经历

  • 通过postgresql官方提供的安装方式遇到错误
  • 通过google查找到fedora论坛的建议:通过fedora官方文档提供的方式安装
  • 根据需要,自定义配置postgresql

一. 安装

由于此部分介绍的时fedora41,又因为经过往经历,所以此部分采用官方fedora文档提供的安装方式.

注意 : 官方明确说明了,此安装方式有别于其他linux发行版

$ sudo dnf install postgresql-server postgresql-contrib

然后,使用 postgresql-setup 初始化数据库, 他将配置 postgresql.confpg_hba.conf

$ sudo postgresql-setup --initdb --unit postgresql

安装完成后,默认postgresql服务是未运行且禁用的,可以通过systemctl命令来管理

以下命令表示启用postgresql服务并要求立即启动, --now 选项就是表示立即启动

$ sudo systemctl enable --now postgresql

二. 创建用户和数据库

在通过dnf安装时,默认创建了postgres用户,且postgres就是用来运行 postgresql 服务器和客户端应用的

$ sudo -u postgres psql

以下命令操作,可以创建自己的用户和数据库.

tips:

此处作为文档说明,是在假象你有一个 linux 账号 lenny的前提下.如果你想用自己的账户,请将命令行行中的lenny替换为你的账户名

创建 postgresql 数据库登录用户 lenny,并设置密码: leonard

postgres=# CREATE USER lenny WITH PASSWORD 'leonard';

创建一个数据库 my_pj_db,并设置所有者为数据库登录用户 lenny

postgres=# CREATE DATABASE my_pj_db OWNER lenny;

最好在此时修改postgresql的数据库账户postgres的连接密码

postgres=# \password postgres

现在,你可以在命令行中输入\q或者通过ctrl + d退出用户postgres用户的psql会话.

然后你就可以开始使用lenny用户登录postgresql数据库会话shell了.此处仍然假设你当前的linux shell会话是lenny用户

$ psql -d my_pj_db

tips:

如果是使用的其他linux用户,你可以通过sudo -u lenny psql -d my_pj_db来登录数据库会话

这样,你就可以使用lenny用户登录postgresql

三. 配置

postgresql数据库有两个主要的配置文件

  • /var/lib/pgsql/data/postgresql.conf
  • /var/lib/pgsql/data/pg_hba.conf

其中postgresql.conf是主要的服务配置文件,pg_hba.conf是客户端连接认证方式的配置文件

3.1 允许远程连接

其中编辑postgresql.conf设置允许wan访问数据库服务:

$ sudo vim /var/lib/pgsql/data/postgresql.conf

找到listen_addresses = 'localhost'配置项,将这行内容修改为listen_addresses = '*'表示允许所有ip访问

3.2 客户端连接认证方式

接下来,如果你需要允许远程访问,则一定要编辑pg_hba.conf文件,设置客户端连接认证方式.

$ sudo vim /var/lib/pgsql/data/pg_hba.conf

在默认情况下,主要的内容如下


# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

这里稍微美化一下配置文件,这个配置文件默认允许的连接方式如下表格

连接类型连接数据库用户客户端地址认证方式
localallallpeer
hostallall127.0.0.1/32ident
hostallall::1/128ident
localreplicationallpeer
hostreplicationall127.0.0.1/32ident
hostreplicationall::1/128ident

以上表格中各列的详细描述,我这里暂时不做介绍,如果需要请自行查看.

这里我仅介绍如何允许一般情况下,允许远程访问方式为数据库用户账号和数据库用户账号密码登录,则按照如下配置调整

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0               md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
host    all             all             ::/0                    md5 
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

3.3 通过systemd改变postgresql的运行状态

一些配置参数通过命令行传递给守护进程选项。此行为可能会覆盖 postgresql.conf 中的设置。例如,如果要将服务器的端口号更改为 5433,请在 /etc/systemd/system/postgresql.service 文件中修改下内容(部分)

.include /lib/systemd/system/postgresql.service
[Service]
Environment=PGPORT=5433

注意:更改 PGPORT 或 PGDATA 通常需要调整 SELinux 配置;参见 selinux 部分。

有关更多详细信息,请按照 systemd 文档 进行操作。

四. 防火墙

postgresql服务默认使用5432端口,所以需要打开5432端口

$ sudo firewall-cmd --add-port=5432/tcp --permanent
$ sudo firewall-cmd --reload

除命令行的方式, cockpit 服务提供了图形化界面,可以方便的管理防火墙,你只需要在指定的安全域中选择开启postgresql服务即可,防火墙会自动重载并永久应用

tips:

你可能不需要向全世界开放数据库的访问

五. seLinux*

默认情况下,在安装时,selinux策略已经配置好了.但是在您修改了数据库的配置后,且selinux开启了强制模式,您需要重新配置selinux策略

如果您修改了的数据库的安装位置时,则需要重新配置selinux策略,例如:

semanage fcontext -a -t postgresql_db_t "/my/new/location(/.*)?"

然后,您需要重新加载selinux策略

$ sudo restorecon -R -v /my/new/location

如果您调整了postgresql的默认端口,您可能需要将postgresql的端口类型映射到您想要的端口:

semanage port -a -t postgresql_port_t -p tcp 5433

如果您安装的 Web 应用程序希望通过 TCP/IP,您得告诉 SELinux 在 web 服务器上允许这样做 主机:

setsebool -P httpd_can_network_connect_db on

六. 优化*

postgres 的默认配置严重调优不足。它可以处理简单的应用程序,而无需一致的数据库访问,但如果您需要更高的性能,则应重新配置您的实例。所有的魔法都在 /var/lib/pgsql/data/postgresql.conf 中发生。此外,日志记录机制的配置不是很直观。

有些小建议在 fedora doc 列出,这里不再做搬运