PostgreSQL 备份恢复与流式复制(完整版)

---

课程目标

---

第一部分:备份与恢复

---

一、备份方案概述

PostgreSQL 提供两种备份方案:

备份类型说明工具特点
逻辑备份导出 SQL 语句或自定义格式文件pg_dump、pg_dumpall可跨版本恢复、可选择性恢复、速度较慢
物理备份直接复制数据目录文件pg_basebackup速度快、恢复快、不能跨版本、必须整库恢复

选择建议:

二、逻辑备份与恢复

2.1 逻辑备份工具

工具说明
pg_dump备份单个数据库(可选单表、多表)
pg_dumpall备份全部数据库(含全局对象:角色、表空间)

2.2 数据准备

在开始备份之前,先准备测试数据:

-- 1. 创建 itheima 数据库
CREATE DATABASE itheima;

-- 2. 切换到 itheima
\c itheima

-- 3. 创建 projects 表
CREATE TABLE projects (
    proj_id SERIAL PRIMARY KEY,
    proj_name VARCHAR(100) NOT NULL,
    start_date DATE
);
INSERT INTO projects (proj_name, start_date) VALUES
('研发A项目', '2026-03-01'),
('市场B项目', '2026-03-01'),
('财务系统升级', '2026-03-15');

-- 4. 创建 users 表
create table users(
    id SERIAL PRIMARY KEY,
    name varchar(20)
);
insert into users (name) values ('张三'),('李四');

-- 5. 创建 db1 数据库
CREATE DATABASE db1;

-- 6. 切换到 db1
\c db1;

-- 7. 创建 students 表
create table students (
    id SERIAL PRIMARY KEY,
    name varchar(20)
);
insert into students (name) values ('张三'),('李四');
-- 验证 itheima 库数据
itheima=# SELECT * FROM projects;
 proj_id |  proj_name   | start_date
---------+--------------+------------
       1 | 研发A项目    | 2026-03-01
       2 | 市场B项目    | 2026-03-01
       3 | 财务系统升级 | 2026-03-15
(3 行记录)

itheima=# SELECT * FROM users;
 id | name
----+------
  1 | 张三
  2 | 李四
(2 行记录)

-- 验证 db1 库数据
db1=# SELECT * FROM students;
 id | name
----+------
  1 | 张三
  2 | 李四
(2 行记录)

2.3 pg_dump 语法与常用选项

# 基本语法
pg_dump [选项] 库名 > db.sql

常用选项:

选项说明
-h host指定数据库主机名或 IP
-p port指定端口号
-U user指定连接使用的用户名
-W按提示输入密码
-F, --format=c|d|t|p输出格式:c=自定义(二进制压缩)、d=目录、t=tar包、p=纯文本SQL
-f, --file输出到指定文件
-j, --jobs=num指定并行导出的并行度
--inserts使用 INSERT 命令导出(比默认 COPY 慢,但兼容非PG数据库)
-t指定备份的表名

格式对比:

格式参数说明恢复工具
纯文本 SQL-Fp大库不推荐,不可并行恢复psql
自定义格式-Fc二进制压缩,推荐pg_restore
tar 包-Ft可用 tar 工具查看pg_restore
目录格式-Fd每个表一个文件,支持并行pg_restore

2.4 备份操作

2.4.1 备份单表

# 切换到 postgres 用户
su - postgres

# 默认使用 pgsql 的 COPY 组织 SQL 语句,效率更高(推荐)
pg_dump itheima -t users > /tmp/users.sql

# 导出标准 SQL 语句(INSERT 形式,兼容性更好)
pg_dump itheima -t users --inserts > /tmp/users.sql
# 查看导出文件
cat /tmp/users.sql

命令作用:

执行结果:

关键参数:

注意事项:

-- --

... 1 张三 2 李四 \. ...



| 分类 | 说明 |
|---|---|
| **优点** | 能转储全局对象(角色、表空间),pg_dump 无法做到;单个命令获取整个集群 |
| **缺点** | 未压缩,文件大;单线程,速度慢;仅支持文本格式;部分恢复困难;内部调用 pg_dump |



关键参数:

注意事项:


**注意事项:**

注意事项:

---------+--------------+------------
       1 | 研发A项目    | 2026-03-01
       2 | 市场B项目    | 2026-03-01
       3 | 财务系统升级 | 2026-03-15
操作工具适用格式
备份单库/单表pg_dump所有格式
备份全局对象pg_dumpall仅纯文本
恢复二进制格式pg_restore.dump / .tar / 目录格式

---

核心特点:

注意事项:

数据库列表 名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 -----------+----------+----------+-------------+-------------+----------------------- | | | | | postgres=CTc/postgres | | | | | postgres=CTc/postgres


数据恢复成功!

---

注意事项:



**数据准备:**



);
---------+--------------+------------
       1 | 研发A项目    | 2026-03-01
       2 | 市场B项目    | 2026-03-01
       3 | 财务系统升级 | 2026-03-15

执行增量备份:



**数据准备:**



);
----+------
  1 | 张三
  2 | 李四
  3 | 王五

执行增量备份:

空间对比:

备份大小说明

/data/pg_incr2


**参数说明:**

**注意事项:**

注意事项:


**注意事项:**





注意事项:

注意:在主库执行写操作,在从库执行查询操作!

);


**主库执行结果:**

---------+--------------+------------ 1 | 研发A项目 | 2026-03-01 2 | 市场B项目 | 2026-03-01 3 | 财务系统升级 | 2026-03-15

                                数据库列表
   名称    |  拥有者  | 字元编码 |  校对规则   |    Ctype    |       存取权限
-----------+----------+----------+-------------+-------------+-----------------------

---------+--------------+------------ 1 | 研发A项目 | 2026-03-01 2 | 市场B项目 | 2026-03-01 3 | 财务系统升级 | 2026-03-15

------+----------------+------------------+------------+-----------+------------+----------
73515 | 192.168.50.214 | walreceiver      | streaming  | 0/3000148 | 0/3000148  |

---------+----------------+------------+-----------

注意事项:

------+----------+--------------------------------------------------------------+----------------+------------------------- 73515 | streaming| host=192.168.50.213 port=5432 user=slave ... | 0/3000148 | 2026-06-03 17:05:30+08

----------+----------------+-----------------

**注意事项:**



| 角色 | 关键字段 | 正常值 | 说明 |
|---|---|---|---|
| **主库** | `state` | `streaming` | 主库正在向从库发送 WAL |
| **从库** | `status` | `streaming` | 从库正在接收主库的 WAL |


---