三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Ubuntu系统安装配置PostgreSQL 16完整指南:从零到生产环境部署

Ubuntu系统安装配置PostgreSQL 16完整指南:从零到生产环境部署

1. 项目概述:为什么要在Ubuntu上安装PostgreSQL 16?

如果你正在搭建一个需要处理复杂查询、高并发事务或者对数据一致性要求极高的应用,比如一个电商后台、一个内容管理系统,或者一个数据分析平台,那么数据库选型几乎绕不开PostgreSQL。它以其强大的功能、严格的标准遵循和活跃的社区生态,被誉为“世界上最先进的开源关系数据库”。而PostgreSQL 16作为其最新的主要版本,带来了一系列性能提升和新特性,比如逻辑复制的并行应用、更精细的权限管理、以及查询性能的持续优化。对于追求稳定性和前沿特性的开发者或运维人员来说,在Ubuntu这个最流行的Linux发行版之一上部署PG 16,是一个既经典又紧跟技术潮流的组合。

这篇内容,就是为你准备的从零到一的完整指南。无论你是刚接触Linux和数据库的新手,还是想升级现有环境的老手,我都会带你走一遍最清晰、最稳妥的安装与配置流程。我们会从官方仓库安装,确保获得稳定且易于维护的版本,然后进行必要的安全加固和基础配置,最后通过一个简单的测试确保一切就绪。整个过程我会穿插我踩过的坑和总结的经验,让你不仅能“装上”,更能“装好”,理解每一步背后的考量。

2. 安装前的系统准备与规划

在动手安装任何服务之前,充分的准备工作能避免后续很多麻烦。对于数据库这种核心服务,尤其如此。

2.1 系统环境确认与更新

首先,我们需要确认你的Ubuntu版本。PostgreSQL官方为不同的Ubuntu LTS(长期支持)版本提供了对应的仓库。主流的22.04 LTS (Jammy) 和 20.04 LTS (Focal) 都是很好的选择,它们能获得长期的安全更新。你可以通过以下命令查看:

lsb_release -a

输出会显示类似Ubuntu 22.04.3 LTS的信息。接下来,更新系统的软件包列表并升级现有软件到最新版本,这是一个好习惯,可以确保系统基础组件的稳定性。

sudo apt update sudo apt upgrade -y

注意-y参数表示自动确认所有提示。在生产环境中,建议先执行sudo apt upgrade查看将要升级的包列表,确认无误后再进行升级。

2.2 规划数据存储与运行用户

数据库的核心是数据,因此数据存储的位置至关重要。默认情况下,PostgreSQL会将其数据目录(称为PGDATA)放在/var/lib/postgresql/[版本号]/main。你需要确保这个路径所在的磁盘有足够的空间。对于生产环境,我强烈建议使用一块独立的、性能较好的磁盘(如SSD)并挂载到/var/lib/postgresql或一个自定义目录,比如/pgdata。这能避免系统盘空间不足导致数据库崩溃,也便于后续的备份和迁移。

另一个关键点是运行用户。安装包会自动创建一个名为postgres的系统用户和用户组,数据库进程将以这个用户的身份运行。这是出于安全考虑(权限最小化原则)。我们后续的所有管理操作,很多都需要切换到postgres用户下进行。

2.3 安装必要的辅助工具

为了方便后续的调试和管理,我们可以提前安装一些有用的工具:

sudo apt install -y wget curl gnupg lsb-release
  • wget/curl: 用于从网络下载文件,比如添加仓库密钥。
  • gnupg: 用于管理加密密钥,验证软件包的来源。
  • lsb-release: 我们刚才用到的命令,用于获取系统版本信息。

3. 通过官方仓库安装PostgreSQL 16

Ubuntu的默认仓库可能不包含最新版本的PostgreSQL。为了安装PG 16,我们需要添加PostgreSQL官方的APT仓库。这是最推荐的方式,因为它能保证软件包的完整性和后续更新的便利性。

3.1 添加PostgreSQL官方APT仓库

首先,导入仓库的GPG公钥,用于验证软件包的签名:

sudo mkdir -p /etc/apt/keyrings curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg

接下来,创建仓库源文件。这里需要根据你的Ubuntu版本替换代号。例如,对于 Ubuntu 22.04 (Jammy):

echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

对于 Ubuntu 20.04,$(lsb_release -cs)会自动替换为focal

实操心得:使用$(lsb_release -cs)而不是硬编码版本代号,可以使脚本更具通用性。tee命令同时将内容写入文件并显示在终端,方便确认。

3.2 安装PostgreSQL 16服务器与客户端

更新本地APT包列表,使其包含我们新添加的PG仓库:

sudo apt update

现在,可以安装PostgreSQL 16了。我们通常需要安装以下几个包:

sudo apt install -y postgresql-16 postgresql-client-16
  • postgresql-16: 这是数据库服务器软件本身。
  • postgresql-client-16: 包含连接和管理数据库的命令行工具,如psql

安装过程会自动完成以下工作:

  1. 创建postgres系统用户和用户组。
  2. 初始化一个默认的数据库集群(cluster)。
  3. 创建默认的postgres数据库、template1数据库。
  4. 启动PostgreSQL服务,并设置为开机自启。

安装完成后,可以检查服务状态来确认是否正常运行:

sudo systemctl status postgresql@16-main

你应该看到状态显示为active (running)@16-main中的main是默认集群的名称。

4. 初始安全配置与基础调优

安装完成只是第一步,默认配置是为了通用性,并不安全。接下来我们进行一些关键的初始配置。

4.1 修改PostgreSQL管理员密码

安装后,数据库有一个默认的超级用户postgres,它通过本地peer认证方式(即使用同名的操作系统用户)登录,初始时没有密码。这仅适用于本地管理。为了安全和使用密码连接,我们需要为其设置一个密码。

首先,切换到postgres系统用户,并进入其交互式命令行工具psql

sudo -u postgres psql

psql提示符 (postgres=#) 下,执行以下SQL命令修改密码:

ALTER USER postgres WITH PASSWORD '你的强密码';

请务必将你的强密码替换为一个高强度的密码,包含大小写字母、数字和特殊字符。完成后,输入\q退出psql

4.2 配置客户端认证(pg_hba.conf)

pg_hba.conf(Host-Based Authentication) 文件是PostgreSQL的“防火墙”,它控制哪些主机、哪些用户、通过哪种方式可以连接到哪个数据库。这是安全配置的重中之重。

文件位于/etc/postgresql/16/main/pg_hba.conf。我们使用nanovim编辑它:

sudo nano /etc/postgresql/16/main/pg_hba.conf

你会看到文件末尾有一些规则。默认配置通常只允许本地通过 Unix socket 以peermd5方式连接。我们需要根据需求调整。例如:

  1. 允许本地密码连接(推荐):找到针对本地IPv4 local connectionsIPv6 local connections的行,将peerident方法改为md5scram-sha-256(更安全)。这允许你在本机使用psql -U postgres -h localhost并通过密码登录。

    # 原行可能类似 # local all all peer # 修改为 local all all scram-sha-256
  2. 允许远程连接(谨慎操作):如果你需要从其他服务器连接,需要添加规则。在生产环境中,务必限制IP范围,并考虑使用SSL

    # 允许特定IP段(例如 192.168.1.0/24)的所有用户通过MD5密码连接所有数据库 host all all 192.168.1.0/24 scram-sha-256 # 或者只允许特定IP host all all 10.0.0.100/32 scram-sha-256

重要警告:切勿为了方便而添加host all all 0.0.0.0/0 trust这样的规则(允许所有IP免密连接),这等同于将数据库完全暴露在公网,极其危险。

修改后保存文件。

4.3 配置监听地址与端口(postgresql.conf)

默认情况下,PostgreSQL只监听本地回环地址127.0.0.1,这意味着它不接受来自网络的连接。如果你需要远程连接(在配置了pg_hba.conf的前提下),需要修改监听地址。

编辑主配置文件:

sudo nano /etc/postgresql/16/main/postgresql.conf

找到listen_addresses参数:

# 默认是 # listen_addresses = 'localhost' # 修改为 '*' 监听所有IP,或指定IP,如 'localhost,192.168.1.100' listen_addresses = '*'

同时,确认端口port = 5432是你期望的。修改后保存。

4.4 应用配置并重启服务

任何对pg_hba.confpostgresql.conf的修改,都需要重启PostgreSQL服务才能生效。

sudo systemctl restart postgresql@16-main

重启后,再次检查服务状态,确保重启成功。

sudo systemctl status postgresql@16-main

5. 基础操作与连接测试

现在,PostgreSQL 16应该已经安装并配置完成。我们来测试一下基本的连接和操作。

5.1 使用psql命令行工具连接

有多种方式可以连接:

  1. 以postgres系统用户直接登录(无需密码)

    sudo -u postgres psql

    这种方式利用了peer认证(如果未修改默认的local规则)。

  2. 使用密码通过TCP/IP连接(本地)

    psql -h localhost -U postgres -d postgres

    系统会提示你输入之前为postgres用户设置的密码。

  3. 使用密码通过TCP/IP连接(远程,如果已配置)

    psql -h <服务器IP地址> -U postgres -d postgres

成功连接后,你会进入psql提示符:postgres=#

5.2 执行基本SQL操作

psql中,你可以执行所有SQL命令。我们来创建一个测试数据库、用户和表:

-- 创建一个新数据库 CREATE DATABASE testdb; -- 连接到这个新数据库 \c testdb -- 创建一个新用户,并设置密码 CREATE USER testuser WITH ENCRYPTED PASSWORD 'UserPassword123!'; -- 授予该用户在新数据库上的所有权限 GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser; -- 创建一张简单的表 CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 插入一些测试数据 INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com'), ('bob', 'bob@example.com'); -- 查询数据 SELECT * FROM users;

这些操作验证了数据库的基本读写功能是正常的。

5.3 常用psql元命令

psql提供了一些以反斜杠\开头的元命令,用于管理:

  • \l:列出所有数据库。
  • \du\du+:列出所有用户(角色)及其权限。
  • \c [database_name]:切换到另一个数据库。
  • \dt:列出当前数据库中的所有表。
  • \d [table_name]:描述某张表的结构。
  • \q:退出psql
  • \?:查看所有元命令帮助。
  • \h [sql_command]:查看SQL命令的帮助,如\h CREATE TABLE

6. 常见问题排查与性能初调

即使按照步骤操作,你也可能会遇到一些问题。这里记录了一些常见情况及其解决方法。

6.1 连接被拒绝问题排查表

问题现象可能原因排查步骤与解决方案
psql: error: connection to server at "localhost" (::1), port 5432 failed: Connection refused1. PostgreSQL服务未运行。
2. 服务监听地址/端口错误。
1. 运行sudo systemctl status postgresql@16-main检查服务状态。如果未运行,尝试sudo systemctl start postgresql@16-main
2. 检查postgresql.conf中的listen_addressesport。确保不是只监听localhost而客户端用了IP。重启服务。
psql: error: connection to server at "x.x.x.x", port 5432 failed: Connection timed out1. 服务器防火墙(如UFW)阻止了5432端口。
2. 云服务商安全组未放行。
1. 检查UFW:sudo ufw status。如需放行:sudo ufw allow 5432/tcp
2. 登录云服务器控制台,检查安全组/防火墙规则,添加入站规则允许TCP 5432端口。
psql: error: connection to server at "x.x.x.x", port 5432 failed: FATAL: no pg_hba.conf entry for host ...pg_hba.conf中没有允许该主机/IP的连接规则。1. 编辑pg_hba.conf,为客户端IP添加一条host规则(使用md5scram-sha-256)。
2. 重启PostgreSQL服务。
psql: error: connection to server at "localhost", port 5432 failed: FATAL: password authentication failed for user "postgres"密码错误。1. 确认密码是否正确。如果忘记,可以临时修改pg_hba.conf,将对应的localhost行方法改为trust,重启服务后无需密码登录,再用ALTER USER修改密码,最后改回md5并重启。切记操作后改回!

6.2 基础性能与监控点

安装完成后,了解几个简单的性能观察点很有帮助:

  1. 查看活动连接

    SELECT * FROM pg_stat_activity WHERE state = 'active';

    这可以查看当前正在执行的查询。

  2. 查看数据库大小

    SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;
  3. 简单配置调优(对于开发或小型生产环境): 编辑postgresql.conf,以下几个参数可以根据你的服务器内存进行调整(假设服务器内存为4GB):

    shared_buffers = 1GB # 通常设为内存的25%,用于缓存数据 work_mem = 16MB # 每个排序/哈希操作的内存,复杂查询多可适当增加 maintenance_work_mem = 256MB # 维护操作(如VACUUM, CREATE INDEX)的内存 effective_cache_size = 3GB # 操作系统和PostgreSQL可用于缓存数据的估计内存

    修改任何配置后都需要重启服务

6.3 日常维护命令

  • 备份单个数据库

    sudo -u postgres pg_dump dbname > backup.sql
  • 备份所有数据库(全局对象)

    sudo -u postgres pg_dumpall > alldb_backup.sql
  • 恢复数据库

    sudo -u postgres psql dbname < backup.sql
  • 查看日志:PostgreSQL日志通常在/var/log/postgresql/postgresql-16-main.log。遇到问题时,这里是第一个需要查看的地方。

    sudo tail -f /var/log/postgresql/postgresql-16-main.log

整个安装和初步配置过程到这里就完成了。从添加官方仓库、安装软件、进行关键的安全配置,到测试连接和基础操作,我们覆盖了一个生产就绪的PostgreSQL 16实例部署的核心步骤。记住,数据库安全无小事,尤其是pg_hba.conf的配置,一定要遵循最小权限原则。对于更深入的性能调优、高可用架构(如流复制、Patroni集群)、备份策略等,每个话题都值得展开详谈,但有了这个稳定运行的基础,你已经有了一块坚实的跳板,可以在此基础上构建你的数据驱动型应用了。如果在后续使用中遇到特定的性能问题或想实现更高级的功能,不妨从官方文档和活跃的社区开始你的探索。

← 返回列表