在Ubuntu 22.04上安装和配置PostgreSQL 16是一项常见的数据库管理任务。由于Ubuntu 22.04的默认软件源中通常包含的是较旧版本的PostgreSQL(如14或15),因此安装PostgreSQL 16通常需要添加官方的APT仓库。

以下是关于在Ubuntu 22.04上安装、部署及基础使用PostgreSQL 16的详细知识点指南,包含具体的步骤、案例代码及详细注释。


知识点一:环境准备与官方源配置

核心概念
Linux软件包管理器(APT)默认源可能不包含最新的大版本数据库。为了安装特定版本(如PostgreSQL 16),必须添加PostgreSQL官方提供的APT仓库签名密钥和源列表。

操作步骤

  1. 更新本地包索引。
  2. 安装必要的依赖工具(curl, gnupg, lsb-release)。
  3. 导入PostgreSQL官方GPG密钥。
  4. 添加PostgreSQL 16的仓库地址。
  5. 再次更新包索引以识别新仓库中的包。

案例代码

# 1. 更新现有的软件包列表,确保获取最新的元数据
# sudo: 以超级用户权限执行
# apt update: 更新本地包索引
sudo apt update

# 2. 安装必要的依赖工具
# curl: 用于传输数据,这里用来下载GPG密钥
# gnupg: GNU隐私守卫,用于处理密钥
# lsb-release: 用于确定Ubuntu的版本代号(如jammy)
sudo apt install -y curl gnupg lsb-release

# 3. 导入PostgreSQL官方仓库的GPG签名密钥
# 这一步是为了确保后续下载的软件包未被篡改,来源可信
# 将密钥写入到 /etc/apt/trusted.gpg.d/ 目录下
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
  sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg

# 4. 添加PostgreSQL 16的APT源
# 动态获取当前Ubuntu版本的代号(Ubuntu 22.04的代号是 jammy)
# 将源地址写入 /etc/apt/sources.list.d/ 目录下的新文件
echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | \
  sudo tee /etc/apt/sources.list.d/pgdg.list

# 5. 再次更新包索引,让系统识别新添加的PostgreSQL 16仓库
sudo apt update

知识点二:安装PostgreSQL 16与服务管理

核心概念
通过APT安装指定版本的软件包。PostgreSQL安装后会自动创建一个名为postgres的系统用户,并启动数据库服务。我们需要掌握如何指定版本安装以及如何管理服务状态(启动、停止、开机自启)。

操作步骤

  1. 安装postgresql-16postgresql-contrib-16(包含额外实用工具)。
  2. 验证安装版本。
  3. 检查服务状态并设置开机自启。

案例代码

# 1. 安装PostgreSQL 16及其贡献模块
# postgresql-16: 数据库核心服务端
# postgresql-contrib-16: 包含一些额外的插件和工具(如pg_stat_statements等)
# -y: 自动确认安装,无需手动输入yes
sudo apt install -y postgresql-16 postgresql-contrib-16

# 2. 验证安装版本
# psql --version: 显示客户端版本,确认是否为16
psql --version
# 预期输出示例: psql (PostgreSQL) 16.x

# 3. 检查PostgreSQL服务状态
# systemctl status: 查看服务是否正在运行 (active (running))
sudo systemctl status postgresql@16-main
# 注意:在某些配置下,服务名可能是 postgresql 或 postgresql-16

# 4. 设置PostgreSQL服务开机自启
# enable: 启用开机自启
# --now: 同时立即启动服务(如果尚未启动)
sudo systemctl enable --now postgresql@16-main

# 5. 如果服务未运行,手动启动它
sudo systemctl start postgresql@16-main

知识点三:用户管理与身份验证配置 (pg_hba.conf)

核心概念
PostgreSQL默认安装后,超级用户postgres只能通过本地操作系统用户postgres进行免密登录(peer认证)。若要允许密码登录或远程连接,必须修改配置文件pg_hba.conf(Host-Based Authentication)。

关键文件

  • /etc/postgresql/16/main/pg_hba.conf: 控制客户端认证规则。
  • /etc/postgresql/16/main/postgresql.conf: 主配置文件(监听地址等)。

操作步骤

  1. 切换到postgres用户。
  2. 进入数据库命令行。
  3. 创建新的数据库用户并设置密码。
  4. 修改pg_hba.conf允许密码认证。
  5. 重载配置使生效。

案例代码

# 1. 切换到系统自带的postgres用户
# 只有该用户默认可以免密登录数据库
sudo -i -u postgres

# 2. 进入PostgreSQL交互式终端
psql

# --- 以下命令在 psql 提示符 (#) 下执行 ---

-- 3. 创建一个新的数据库用户 'app_user' 并设置密码
-- CREATE USER: 创建用户语法
-- WITH PASSWORD: 指定加密密码
-- LOGIN: 允许该用户登录
CREATE USER app_user WITH PASSWORD 'StrongPassword123!' LOGIN;

-- 4. 创建一个测试数据库 'my_database' 并授权给新用户
-- CREATE DATABASE: 创建数据库
CREATE DATABASE my_database OWNER app_user;

-- 5. 退出psql终端
\q

# --- 回到 bash 终端 (仍为 postgres 用户) ---

# 6. 修改 pg_hba.conf 以允许本地密码登录 (md5 或 scram-sha-256)
# 使用 nano 或 vim 编辑器
# 路径通常为: /etc/postgresql/16/main/pg_hba.conf
sudo nano /etc/postgresql/16/main/pg_hba.conf

# [编辑操作指南]
# 找到类似下面的一行 (IPv4本地连接):
# host    all             all             127.0.0.1/32            scram-sha-256
# 或者 (本地socket连接):
# local   all             all                                     peer
#
# 为了演示密码登录,可以将 'peer' 改为 'scram-sha-256' (推荐) 或 'md5'
# 修改后示例:
# local   all             all                                     scram-sha-256
# 保存并退出编辑器 (Ctrl+O, Enter, Ctrl+X)

# 7. 重载PostgreSQL配置,使更改生效而无需重启服务
# systemctl reload: 重新加载配置文件
sudo systemctl reload postgresql@16-main

# 8. 退出postgres系统用户,回到普通用户
exit

知识点四:SQL基础语法与实战案例

核心概念
安装完成后,需要通过SQL语言操作数据。本部分涵盖DDL(数据定义语言)和DML(数据操作语言)。重点包括建表、约束、插入、查询、更新和删除。

场景
my_database数据库中创建一个employees表,并进行增删改查操作。

案例代码

# 使用新用户 app_user 登录数据库
# -U: 指定用户名
# -d: 指定数据库名
# -h: 指定主机 (localhost 强制使用TCP/IP连接从而触发密码验证,若配置了local password也可省略)
psql -U app_user -d my_database -h localhost
# 输入之前设置的密码: StrongPassword123!

SQL 操作脚本 (在 psql 终端内执行)

-- ==========================================
-- 1. DDL: 数据定义 (创建表结构)
-- ==========================================

-- 创建员工表 employees
-- CREATE TABLE: 创建新表
-- IF NOT EXISTS: 如果表不存在才创建,防止报错
CREATE TABLE IF NOT EXISTS employees (
    emp_id SERIAL PRIMARY KEY,          -- SERIAL: 自增整数,PRIMARY KEY: 主键约束
    first_name VARCHAR(50) NOT NULL,    -- VARCHAR(50): 可变长度字符串,NOT NULL: 非空约束
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL, -- UNIQUE: 唯一约束,确保邮箱不重复
    hire_date DATE DEFAULT CURRENT_DATE,-- DATE: 日期类型,DEFAULT: 默认值为当前日期
    salary NUMERIC(10, 2),              -- NUMERIC(10, 2): 精确数值,总共10位,小数2位
    department VARCHAR(50),
    is_active BOOLEAN DEFAULT TRUE      -- BOOLEAN: 布尔类型
);

-- 查看表结构描述
-- \d: psql元命令,describe table
\d employees;

-- ==========================================
-- 2. DML: 数据操作 (插入数据)
-- ==========================================

-- 插入单条记录
-- INSERT INTO: 插入数据语法
-- VALUES: 指定对应的值
INSERT INTO employees (first_name, last_name, email, salary, department)
VALUES ('San', 'Zhang', 'san.zhang@example.com', 8500.00, 'Engineering');

-- 插入多条记录
INSERT INTO employees (first_name, last_name, email, salary, department)
VALUES 
    ('Li', 'Wang', 'li.wang@example.com', 9200.50, 'Marketing'),
    ('Wei', 'Zhao', 'wei.zhao@example.com', 7800.00, 'Engineering'),
    ('Fang', 'Li', 'fang.li@example.com', 11000.00, 'Management');

-- ==========================================
-- 3. DQL: 数据查询 (SELECT)
-- ==========================================

-- 查询所有员工
-- SELECT *: 选择所有列
SELECT * FROM employees;

-- 条件查询:查找薪资大于8000的员工
-- WHERE: 过滤条件
-- ORDER BY: 排序,DESC表示降序
SELECT first_name, last_name, salary 
FROM employees 
WHERE salary > 8000 
ORDER BY salary DESC;

-- 聚合查询:统计各部门的平均薪资
-- GROUP BY: 分组
-- AVG(): 聚合函数,计算平均值
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department;

-- 模糊查询:查找姓氏以 'Z' 开头的员工
-- LIKE: 模式匹配,% 代表任意字符
SELECT * FROM employees WHERE last_name LIKE 'Z%';

-- ==========================================
-- 4. DML: 更新与删除 (UPDATE & DELETE)
-- ==========================================

-- 更新数据:给Engineering部门的员工加薪10%
-- UPDATE: 更新表
-- SET: 设置新值
-- 注意:务必加 WHERE 条件,否则会更新全表!
UPDATE employees 
SET salary = salary * 1.10 
WHERE department = 'Engineering';

-- 验证更新结果
SELECT first_name, department, salary FROM employees WHERE department = 'Engineering';

-- 删除数据:删除离职员工 (假设 is_active 为 false)
-- 先模拟更新一个状态
UPDATE employees SET is_active = FALSE WHERE email = 'wei.zhao@example.com';

-- 执行删除
-- DELETE FROM: 删除行
DELETE FROM employees WHERE is_active = FALSE;

-- ==========================================
-- 5. 清理环境 (可选)
-- ==========================================
-- 删除表
DROP TABLE IF EXISTS employees;

-- 退出 psql
\q

知识点五:远程访问配置 (进阶)

核心概念
默认情况下,PostgreSQL只监听本地回环地址(localhost / 127.0.0.1)。若需从其他服务器连接,需修改postgresql.conf中的listen_addresses,并确保防火墙放行5432端口。

操作步骤

  1. 修改postgresql.conf监听所有IP。
  2. 确保pg_hba.conf允许远程IP段连接。
  3. 配置Ubuntu防火墙(UFW)。
  4. 重启服务。

案例代码

# 1. 修改监听地址配置
# 将 listen_addresses 设置为 '*' 表示监听所有网络接口
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/16/main/postgresql.conf

# 2. 配置 pg_hba.conf 允许特定网段 (例如 192.168.1.0/24) 使用密码登录
# 追加一行到文件末尾
echo "host    all             all             192.168.1.0/24            scram-sha-256" | \
  sudo tee -a /etc/postgresql/16/main/pg_hba.conf

# 3. 配置防火墙 (如果使用 UFW)
# 允许 PostgreSQL 默认端口 5432
sudo ufw allow 5432/tcp

# 4. 重启 PostgreSQL 服务使监听地址更改生效
# restart: 完全重启服务
sudo systemctl restart postgresql@16-main

# 5. 验证监听状态
# ss -tlnp: 查看TCP监听端口
# grep 5432: 过滤postgres相关行
sudo ss -tlnp | grep 5432
# 预期输出应包含 0.0.0.0:5432 或 :::5432,而不仅仅是 127.0.0.1:5432

总结

通过以上五个知识点的学习与实践,您已经在Ubuntu 22.04上完成了:

  1. 环境搭建:正确配置了官方源并安装了PostgreSQL 16。
  2. 服务管理:掌握了服务的启动、停止和自启。
  3. 安全配置:理解了pg_hba.conf的作用并配置了密码认证。
  4. SQL实战:熟练运用了建表、约束、CRUD(增删改查)及聚合查询。
  5. 网络扩展:学会了如何开启远程访问能力。

这套流程是生产环境部署PostgreSQL的基础,建议在实际操作中根据具体的网络安全策略调整pg_hba.conf中的IP白名单。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐