PostgreSQL 入门学习教程,从入门到精通,在Ubuntu22.04上安装PostgreSQL16数据库(3)
摘要:本文详细介绍了在Ubuntu 22.04系统上安装和配置PostgreSQL 16数据库的完整流程。主要内容包括:1) 添加PostgreSQL官方APT仓库;2) 安装PostgreSQL 16核心组件;3) 服务管理及用户认证配置;4) 基础SQL操作指南。文中提供了详细的命令行操作步骤和代码示例,涵盖从环境准备到数据库基本操作的全过程,特别说明了如何修改pg_hba.conf文件实现密
在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仓库签名密钥和源列表。
操作步骤:
- 更新本地包索引。
- 安装必要的依赖工具(
curl,gnupg,lsb-release)。 - 导入PostgreSQL官方GPG密钥。
- 添加PostgreSQL 16的仓库地址。
- 再次更新包索引以识别新仓库中的包。
案例代码:
# 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的系统用户,并启动数据库服务。我们需要掌握如何指定版本安装以及如何管理服务状态(启动、停止、开机自启)。
操作步骤:
- 安装
postgresql-16和postgresql-contrib-16(包含额外实用工具)。 - 验证安装版本。
- 检查服务状态并设置开机自启。
案例代码:
# 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: 主配置文件(监听地址等)。
操作步骤:
- 切换到
postgres用户。 - 进入数据库命令行。
- 创建新的数据库用户并设置密码。
- 修改
pg_hba.conf允许密码认证。 - 重载配置使生效。
案例代码:
# 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端口。
操作步骤:
- 修改
postgresql.conf监听所有IP。 - 确保
pg_hba.conf允许远程IP段连接。 - 配置Ubuntu防火墙(UFW)。
- 重启服务。
案例代码:
# 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上完成了:
- 环境搭建:正确配置了官方源并安装了PostgreSQL 16。
- 服务管理:掌握了服务的启动、停止和自启。
- 安全配置:理解了
pg_hba.conf的作用并配置了密码认证。 - SQL实战:熟练运用了建表、约束、CRUD(增删改查)及聚合查询。
- 网络扩展:学会了如何开启远程访问能力。
这套流程是生产环境部署PostgreSQL的基础,建议在实际操作中根据具体的网络安全策略调整pg_hba.conf中的IP白名单。
更多推荐

所有评论(0)