Linux PostgreSQL 完整教程
本教程将以 Ubuntu/Debian 和 CentOS/RHEL/Fedora 两大主流 Linux 发行版为例,因为它们的包管理器不同。

第一部分:安装与初始化
选择安装方式
主要有两种方式:
- 使用包管理器安装(推荐初学者):简单、快速,由发行版官方维护,会自动处理依赖关系,但版本可能不是最新的。
- 从源码编译安装(推荐高级用户):可以获得最新版本,并可以自定义编译选项(如开启特定功能),但过程复杂。
我们首先介绍最简单的方式:使用包管理器。
使用 APT 安装 (Ubuntu/Debian)
步骤 1:更新软件包列表
sudo apt update
步骤 2:安装 PostgreSQL
这个命令会安装 postgresql 包、核心库以及客户端工具 psql。

sudo apt install postgresql postgresql-contrib
安装完成后,PostgreSQL 服务通常会自动启动。
步骤 3:检查服务状态
sudo systemctl status postgresql
如果看到 active (running),说明服务正在运行。
使用 YUM/DNF 安装 (CentOS/RHEL/Fedora)
步骤 1:安装 PostgreSQL 官方仓库 CentOS/RHEL 的默认仓库中版本可能很旧,强烈建议使用 PostgreSQL 官方仓库。

安装 EPEL 仓库(如果还没有):
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(rpm -E %rhel).noarch.rpm
添加 PostgreSQL 官方仓库,请访问 PostgreSQL 官方 Yum 仓库页面 获取最适合你系统的命令,以 CentOS 7 为例:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
步骤 2:安装 PostgreSQL
使用 dnf (CentOS 8+) 或 yum (CentOS 7)。
# 对于 CentOS 8, 9, Fedora sudo dnf install -y postgresql-server postgresql-contrib # 对于 CentOS 7 sudo yum install -y postgresql-server postgresql-contrib
步骤 3:初始化数据库并启动服务 在 CentOS 7 上,需要手动初始化数据库集群:
sudo postgresql-setup --initdb
步骤 4:启动并启用服务
sudo systemctl start postgresql sudo systemctl enable postgresql # 开机自启
步骤 5:检查服务状态
sudo systemctl status postgresql
初始化后的重要信息
安装完成后,你需要了解几个关键点:
- 数据目录:默认位于
/var/lib/pgsql/data/(CentOS) 或/var/lib/postgresql/<version>/main/(Ubuntu),所有数据库文件、配置文件都在这里。 - 配置文件:主要配置文件是
postgresql.conf(性能、连接设置) 和pg_hba.conf(主机认证/访问控制)。 - 超级用户:系统会自动创建一个名为
postgres的 Linux 用户和一个同名的postgres数据库用户,这个用户拥有超级用户权限,相当于数据库的root。
第二部分:基本操作与连接
连接到 PostgreSQL
使用 psql 命令行工具(最常用)
psql 是一个强大的交互式终端,默认情况下,它会尝试以当前 Linux 用户的身份连接到同名数据库。
-
切换到
postgres用户连接: 这是最直接的方式,可以立即获得超级用户权限。sudo -i -u postgres
然后直接输入
psql进入命令行:psql
-
从你的普通用户账户连接: 假设你的 Linux 用户名是
myuser,并且你已经为该用户创建了数据库角色。psql -U myuser -d mydatabase
psql 常用命令
在 psql 提示符下 (postgres=#):
\l:列出所有数据库。\c <database_name>:连接到指定数据库。\dt:列出当前数据库的所有表。\d <table_name>:查看指定表的详细结构(索引、约束等)。\q:退出psql。
管理数据库和用户
这些操作通常在 psql 内部执行,以超级用户身份连接。
步骤 1:创建新用户
在 psql 中:
-- 创建一个新用户,并设置密码 CREATE USER myuser WITH PASSWORD 'a_strong_password';
安全提示:在生产环境中,密码必须足够复杂。
步骤 2:创建新数据库
-- 创建一个数据库,并指定所有者为 myuser CREATE DATABASE mydatabase OWNER myuser;
步骤 3:赋予用户权限
-- 将 mydatabase 的所有权限授予 myuser GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;
你可以用你的普通用户身份连接到新数据库了:
psql -U myuser -d mydatabase
你会看到 mydatabase=> 的提示符,说明你已成功连接。
第三部分:核心 SQL 操作
我们以 myuser 的身份连接到 mydatabase 进行操作。
创建表
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
SERIAL:自动递增的整数,通常用作主键。VARCHAR(n):可变长度字符串。PRIMARY KEY:主键,确保唯一性。UNIQUE:确保该列的值是唯一的。NOT NULL:该列不能为空。TIMESTAMPTZ:带时区的时间戳。DEFAULT NOW():默认值为当前时间。
插入数据
INSERT INTO customers (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO customers (name, email) VALUES ('Bob', 'bob@example.com');
查询数据
-- 查询所有数据 SELECT * FROM customers; -- 查询特定列 SELECT name, email FROM customers; -- 带条件查询 SELECT * FROM customers WHERE name = 'Alice'; -- 排序 SELECT * FROM customers ORDER BY created_at DESC;
更新数据
UPDATE customers SET email = 'alice.new@example.com' WHERE name = 'Alice';
删除数据
DELETE FROM customers WHERE name = 'Bob';
第四部分:配置与高级主题
修改配置文件
警告:修改配置文件前,最好先备份。
主要配置文件:postgresql.conf
路径:/var/lib/pgsql/data/postgresql.conf (CentOS) 或 /etc/postgresql/<version>/main/postgresql.conf (Ubuntu)。
常用配置项:
listen_addresses = '*':允许哪些 IP 地址连接。 表示所有,'localhost'表示仅本地。*生产环境不要轻易设为 `''**,应结合防火墙和pg_hba.conf` 使用。port = 5432:PostgreSQL 监听的端口。max_connections = 100:最大连接数。shared_buffers = 128MB:数据库缓存大小,对性能至关重要。
修改后需要重启服务使配置生效:
sudo systemctl restart postgresql
访问控制文件:pg_hba.conf
路径:与 postgresql.conf 同目录。
这个文件定义了哪些主机/用户可以以何种方式连接,规则按顺序匹配,从上到下。
常见规则格式:
TYPE DATABASE USER ADDRESS METHOD
TYPE:local(本地Unix socket),host(TCP/IP)DATABASE: 数据库名,all表示所有USER: 用户名,all表示所有ADDRESS: 主机地址METHOD: 认证方式trust: 无需密码(极其危险!)md5: 使用 MD5 加密的密码(推荐)scram-sha-256: 更安全的现代加密方式(新版本默认)
示例:
# 允许本地所有用户通过Unix socket以MD5方式连接所有数据库
local all all md5
# 允许来自 192.168.1.0/24 网络的所有用户通过TCP/IP以MD5方式连接所有数据库
host all all 192.168.1.0/24 md5
# 拒绝其他所有连接
host all all 0.0.0.0/0 reject
修改 pg_hba.conf 后,需要 重新加载 服务,无需重启:
sudo systemctl reload postgresql
用户与权限管理 (进阶)
-
创建角色:角色是用户和组的统称。
-- 创建一个只能登录的角色(即用户) CREATE LOGIN readonly_user WITH PASSWORD 'readonly_pass'; -- 创建一个不能登录的角色,用于授予权限 CREATE ROLE data_viewer;
-
授予表级权限:
-- 将 customers 表的 SELECT 权限授予 readonly_user GRANT SELECT ON customers TO readonly_user; -- 将 customers 表的 INSERT, UPDATE, DELETE 权限授予 data_viewer GRANT INSERT, UPDATE, DELETE ON customers TO data_viewer;
-
授予模式级权限: 如果你的数据库中有多个模式,可以一次性授予整个模式的权限。
-- 将 public 模式中所有表的 SELECT 权限授予 readonly_user GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
备份与恢复
备份 (pg_dump)
pg_dump 是一个逻辑备份工具,可以将一个数据库导出为 SQL 文件。
# 备份整个 mydatabase 到文件 pg_dump mydatabase > mydatabase_backup.sql # 备份并压缩 pg_dump mydatabase | gzip > mydatabase_backup.sql.gz # 自定义格式备份(推荐,支持恢复单个表等) pg_dump -Fc mydatabase > mydatabase_backup.dump
恢复 (psql 或 pg_restore)
# 使用 psql 恢复 SQL 文件(适用于普通格式) psql -U myuser -d mydatabase < mydatabase_backup.sql # 使用 pg_restore 恢复自定义格式文件(更强大) pg_restore -U myuser -d mydatabase mydatabase_backup.dump
全量备份 (pg_dumpall)
用于备份所有数据库和用户信息。
pg_dumpall > all_databases_backup.sql
第五部分:故障排查
-
连接问题:最常见的错误是
could not connect to server。- 检查服务状态:
sudo systemctl status postgresql。 - 检查端口:
sudo netstat -tuln | grep 5432或sudo ss -tuln | grep 5432。 - 检查日志:日志文件通常在
/var/log/postgresql/目录下,查看日志是定位问题的第一步。 - 检查
pg_hba.conf:确认你的 IP 和用户认证方式是否正确配置。
- 检查服务状态:
-
权限问题:
ERROR: permission denied for table ...。- 确认你使用的用户是否有足够的权限,使用
\du(在 psql 中) 查看所有用户/角色。
- 确认你使用的用户是否有足够的权限,使用
-
磁盘空间不足:
ERROR: could not extend file ...。- 使用
df -h检查磁盘空间,特别是数据目录所在的分区。
- 使用
总结与学习路径
- 基础:熟练掌握安装、连接、基本的
CRUD操作。 - 进阶:深入理解用户权限、角色管理、表结构设计(索引、约束)、
pg_hba.conf和postgresql.conf的配置。 - 高级:学习事务、视图、存储过程、触发器、性能调优(
EXPLAIN ANALYZE)、复制、高可用方案(如 Patroni)。 - 生态:了解 ORM(如 SQLAlchemy, Django ORM)、ETL 工具(如 pg_dump, COPY 命令)、监控工具(如 Prometheus + Grafana)。
PostgreSQL 是一个功能极其强大的开源数据库,希望这份教程能帮助你顺利入门。最好的学习方式就是动手实践!
