安装 PostgreSQL
安装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_dbtips:
如果是使用的其他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 onlylocal 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 peerhost replication all 127.0.0.1/32 identhost 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 onlylocal all all peer# IPv4 local connections:host all all 127.0.0.1/32 md5host all all 0.0.0.0/0 md5# IPv6 local connections:host all all ::1/128 md5host all all ::/0 md5# Allow replication connections from localhost, by a user with the# replication privilege.local replication all peerhost replication all 127.0.0.1/32 identhost replication all ::1/128 ident3.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 列出,这里不再做搬运