贝博恩创新科技网

Linux PostgreSQL教程,从入门到精通怎么学?

Linux PostgreSQL 完整教程

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

Linux PostgreSQL教程,从入门到精通怎么学?-图1
(图片来源网络,侵删)

第一部分:安装与初始化

选择安装方式

主要有两种方式:

  • 使用包管理器安装(推荐初学者):简单、快速,由发行版官方维护,会自动处理依赖关系,但版本可能不是最新的。
  • 从源码编译安装(推荐高级用户):可以获得最新版本,并可以自定义编译选项(如开启特定功能),但过程复杂。

我们首先介绍最简单的方式:使用包管理器。

使用 APT 安装 (Ubuntu/Debian)

步骤 1:更新软件包列表

sudo apt update

步骤 2:安装 PostgreSQL 这个命令会安装 postgresql 包、核心库以及客户端工具 psql

Linux PostgreSQL教程,从入门到精通怎么学?-图2
(图片来源网络,侵删)
sudo apt install postgresql postgresql-contrib

安装完成后,PostgreSQL 服务通常会自动启动。

步骤 3:检查服务状态

sudo systemctl status postgresql

如果看到 active (running),说明服务正在运行。

使用 YUM/DNF 安装 (CentOS/RHEL/Fedora)

步骤 1:安装 PostgreSQL 官方仓库 CentOS/RHEL 的默认仓库中版本可能很旧,强烈建议使用 PostgreSQL 官方仓库。

Linux PostgreSQL教程,从入门到精通怎么学?-图3
(图片来源网络,侵删)

安装 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

恢复 (psqlpg_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

第五部分:故障排查

  1. 连接问题:最常见的错误是 could not connect to server

    • 检查服务状态sudo systemctl status postgresql
    • 检查端口sudo netstat -tuln | grep 5432sudo ss -tuln | grep 5432
    • 检查日志:日志文件通常在 /var/log/postgresql/ 目录下,查看日志是定位问题的第一步。
    • 检查 pg_hba.conf:确认你的 IP 和用户认证方式是否正确配置。
  2. 权限问题ERROR: permission denied for table ...

    • 确认你使用的用户是否有足够的权限,使用 \du (在 psql 中) 查看所有用户/角色。
  3. 磁盘空间不足ERROR: could not extend file ...

    • 使用 df -h 检查磁盘空间,特别是数据目录所在的分区。

总结与学习路径

  1. 基础:熟练掌握安装、连接、基本的 CRUD 操作。
  2. 进阶:深入理解用户权限、角色管理、表结构设计(索引、约束)、pg_hba.confpostgresql.conf 的配置。
  3. 高级:学习事务、视图、存储过程、触发器、性能调优(EXPLAIN ANALYZE)、复制、高可用方案(如 Patroni)。
  4. 生态:了解 ORM(如 SQLAlchemy, Django ORM)、ETL 工具(如 pg_dump, COPY 命令)、监控工具(如 Prometheus + Grafana)。

PostgreSQL 是一个功能极其强大的开源数据库,希望这份教程能帮助你顺利入门。最好的学习方式就是动手实践!

分享:
扫描分享到社交APP
上一篇
下一篇