安装 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
本文编写前的经历
一. 安装
由于此部分介绍的时fedora41,又因为经过往经历,所以此部分采用官方fedora文档提供的安装方式.
注意 : 官方明确说明了,此安装方式有别于其他linux发行版
$ sudo dnf install postgresql-server postgresql-contrib
然后,使用 postgresql-setup 初始化数据库, 他将配置 postgresql.conf 和 pg_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
这里稍微美化一下配置文件,这个配置文件默认允许的连接方式如下表格
| 连接类型 | 连接数据库 | 用户 | 客户端地址 | 认证方式 |
|---|---|---|---|---|
| local | all | all | peer | |
| host | all | all | 127.0.0.1/32 | ident |
| host | all | all | ::1/128 | ident |
| local | replication | all | peer | |
| host | replication | all | 127.0.0.1/32 | ident |
| host | replication | all | ::1/128 | ident |
以上表格中各列的详细描述,我这里暂时不做介绍,如果需要请自行查看.
这里我仅介绍如何允许一般情况下,允许远程访问方式为数据库用户账号和数据库用户账号密码登录,则按照如下配置调整
# 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 列出,这里不再做搬运