文章目录
- [一、什么是 pg_dump?](#一、什么是 pg_dump?)
- [二、SQL 格式备份](#二、SQL 格式备份)
-
- [1. SQL 文件的定义](#1. SQL 文件的定义)
- [2. 如何在 Docker 中生成 SQL 格式备份](#2. 如何在 Docker 中生成 SQL 格式备份)
- [3. 如何恢复 SQL 格式备份](#3. 如何恢复 SQL 格式备份)
- [4. 恢复 SQL 格式备份](#4. 恢复 SQL 格式备份)
- [4. SQL 格式的优缺点](#4. SQL 格式的优缺点)
- [三、pg_dump 自定义格式备份](#三、pg_dump 自定义格式备份)
-
- [1. 如何生成自定义格式备份](#1. 如何生成自定义格式备份)
- [2. 如何恢复自定义格式备份](#2. 如何恢复自定义格式备份)
- [3. 自定义格式的优缺点](#3. 自定义格式的优缺点)
- [四、pg_dump 与 SQL 文件备份的区别](#四、pg_dump 与 SQL 文件备份的区别)
- 五、选择备份格式的建议
-
- [1. 何时使用 SQL 格式备份?](#1. 何时使用 SQL 格式备份?)
- [2. 何时使用自定义格式备份?](#2. 何时使用自定义格式备份?)
- 六、总结
- 七、踩过的坑
在 PostgreSQL 数据库管理中,备份是确保数据安全和防止数据丢失的关键操作。pg_dump 是 PostgreSQL 提供的命令行工具,支持多种备份格式,其中最常用的格式包括 SQL 格式 和 自定义格式。这两种格式在备份方式、恢复速度、灵活性等方面有所不同,了解它们的区别可以帮助我们根据实际需求选择最合适的备份方案。
本文将详细讲解如何在 Docker 环境 中使用 pg_dump 工具进行备份,并比较 SQL 格式与自定义格式的优缺点。
一、什么是 pg_dump?
pg_dump 是 PostgreSQL 提供的一个命令行工具,用于备份数据库。它可以将数据库中的表、视图、索引、数据等内容导出成文件。需要注意的是,pg_dump 本身并不是一种备份格式,而是一个生成备份的工具。
通过 pg_dump 生成的备份文件有多种格式,包括:
- SQL 格式:最常见的文本格式,包含重建数据库的 SQL 语句。
- 自定义格式:二进制格式,提供更高效的备份和恢复操作。
- 压缩格式:通过压缩减少备份文件的体积。
不同的备份格式在备份速度、恢复速度、灵活性等方面存在差异。了解这些差异有助于选择适合自己项目的备份方案。
二、SQL 格式备份
1. SQL 文件的定义
SQL 文件是通过 pg_dump 生成的文本格式备份,包含了创建数据库结构(如表、视图、索引等)和插入数据的 SQL 语句。由于 SQL 文件是纯文本格式,它具有人类可读性,用户可以查看和修改文件内容。
2. 如何在 Docker 中生成 SQL 格式备份
如果你在 Docker 容器中运行 PostgreSQL 并想要生成 SQL 格式的备份,你可以使用以下命令:
bash
docker exec postgres pg_dump -U postgres -d your_database_name -f /path/to/container/backup.sql
docker exec postgres:执行命令的容器名称(此处为postgres),表示在该容器内执行备份操作。pg_dump:PostgreSQL 的备份工具。-U postgres:指定连接 PostgreSQL 数据库的用户名(此处为postgres)。-d your_database_name:指定需要备份的数据库名称(将your_database_name替换为实际的数据库名称)。
将备份文件保存到宿主机
如果你希望将备份文件直接保存到宿主机上,而不是容器内,可以使用重定向来实现:
bash
docker exec postgres pg_dump -U postgres -d your_database_name > /path/to/host/backup.sql
> /path/to/host/backup.sql:将备份文件输出到宿主机的指定路径。确保你指定的路径是宿主机上的有效路径。
3. 如何恢复 SQL 格式备份
确实,恢复 SQL 文件时使用 psql 工具的命令通常是在宿主机上执行的。如果你在 Docker 环境中使用 PostgreSQL,并希望从 SQL 文件恢复数据库,应该使用 Docker 容器内的 psql 工具来恢复。
在 Docker 容器中执行恢复命令的正确方法是通过 docker exec 来进入容器运行 psql。下面是如何在 Docker 环境中恢复 SQL 文件的命令:
4. 恢复 SQL 格式备份
如果备份文件是存储在宿主机上,并且你想要在 Docker 容器中恢复该备份,使用以下命令:
csharp
docker cp /opt/data/backup.custom postgres:/tmp/backup.custom
bash
docker exec -i postgres pg_restore -U postgres -C -d postgres /tmp/backup.custom
解释:
-C:表示创建数据库(CREATE DATABASE)。如果目标数据库不存在,这个选项会让pg_restore先创建数据库。-d postgres:这指定了连接到的数据库(通常是postgres数据库,创建新数据库时必须连接到这个数据库)。
这样,pg_restore 会从备份文件中解析出 CREATE DATABASE 命令,并自动创建目标数据库,然后恢复内容。
4. SQL 格式的优缺点
优点:
- 易于理解与修改:SQL 文件是纯文本,易于查看和编辑,可以直接调整数据库结构或修改数据。
- 兼容性强:SQL 格式备份适用于不同的 PostgreSQL 版本,且可以在不同的操作系统之间迁移数据库。
- 简单恢复 :恢复过程简单,只需要使用
psql工具执行 SQL 文件即可。
缺点:
- 恢复速度慢 :特别是数据量较大的时候,恢复过程会非常慢,因为每个
INSERT语句都需要逐条执行。 - 不支持增量备份:SQL 文件是全量备份,无法进行增量备份,只能恢复整个数据库。
三、pg_dump 自定义格式备份
与 SQL 文件备份不同,pg_dump 还支持自定义格式的备份。自定义格式是 PostgreSQL 提供的一种二进制格式,它提供了比 SQL 格式更高效的备份与恢复速度。
1. 如何生成自定义格式备份
生成自定义格式的备份时,可以使用以下命令:
bash
docker exec postgres pg_dump -U postgres -d your_database_name -F c -f /path/to/container/backup.custom
-F c:指定输出格式为自定义格式。-f /path/to/container/backup.custom:指定容器内的备份文件路径(backup.custom)。
将备份文件保存到宿主机
你也可以将备份文件直接输出到宿主机:
bash
docker exec postgres pg_dump -U postgres -d your_database_name -F c > /path/to/host/backup.custom
2. 如何恢复自定义格式备份
恢复时,需要使用 pg_restore 工具:
bash
docker exec -i postgres pg_restore -U postgres -d your_database_name /opt/data/backup.custom
pg_restore 这个命令中指定的备份文件路径必须是容器内的路径
3. 自定义格式的优缺点
优点:
- 恢复速度快:自定义格式备份通常恢复速度非常快,特别适合大规模数据恢复。
- 选择性恢复:支持选择性恢复,可以恢复数据库中的某个表或部分数据,而无需恢复整个数据库。
- 压缩支持:自定义格式支持压缩备份,减小备份文件的体积。
- 增量备份支持 :通过结合
WAL日志,可以实现增量备份和恢复。
缺点:
- 不可读:自定义格式是二进制格式,无法直接查看或编辑备份内容。
- 恢复工具要求 :恢复时必须使用
pg_restore,不能直接通过psql恢复。
四、pg_dump 与 SQL 文件备份的区别
| 特性 | SQL 文件 | 自定义格式 |
|---|---|---|
| 格式 | 纯文本格式,包含 SQL 语句 | 二进制格式,包含结构与数据 |
| 可读性 | 人类可读,易于查看和编辑 | 不可直接读取,二进制格式 |
| 恢复工具 | 使用 psql 工具恢复 |
使用 pg_restore 工具恢复 |
| 恢复速度 | 较慢,特别是在数据量较大的时候 | 较快,适合大规模恢复 |
| 备份灵活性 | 不支持选择性备份 | 支持选择性备份(如恢复特定表) |
| 压缩支持 | 不支持压缩 | 支持压缩,减小备份文件大小 |
| 增量备份支持 | 不支持增量备份 | 支持增量备份(结合 WAL 日志) |
| 跨版本兼容性 | 较高,适合跨版本迁移 | 需要相同或兼容的 PostgreSQL 版本 |
五、选择备份格式的建议
1. 何时使用 SQL 格式备份?
- 数据库规模较小,备份和恢复操作比较简单时。
- 需要跨 PostgreSQL 版本进行迁移时,SQL 格式备份通常具有较好的兼容性。
- 需要查看、修改备份文件内容,且不介意较慢的恢复速度时。
2. 何时使用自定义格式备份?
- 数据库较大,恢复速度是关键时。
- 需要支持选择性恢复或增量恢复时。
- 需要减小备份文件大小,或在备份时进行压缩时。
- 对恢复的灵活性要求较高时,尤其是在大数据量的场景下。
六、总结
pg_dump 是 PostgreSQL 提供的备份工具,支持多种备份格式,其中 SQL 格式 适合小型数据库和简单恢复需求,而 自定义格式 更适合大型数据库,提供更高效的备份和恢复操作。在选择备份格式时,应该根据数据库规模、恢复速度要求以及存储空间等因素做出最佳选择。
七、踩过的坑
我们使用 pg_dumpall 进行全量备份,并通过 psql 恢复数据。然而,直接进行全量恢复时,可能会遇到一些问题,特别是恢复过程中会覆盖 用户表 ,导致 账号密码错误。
遇到的问题
导出数据:
bash
docker exec postgres pg_dumpall -U postgres > pg_backup_$(date +%F_%H-%M).sql
这条命令用于导出所有数据库,包括角色信息,生成一个完整的 SQL 备份文件。

导入数据:
bash
docker exec -i postgres psql -U postgres < pg_backup_2025-06-29_12-01.sql
用 psql 工具从备份文件中恢复数据库。

解决方案
避免全量导入整个数据库 ,建议 逐个导入数据库 。否则,恢复过程中会覆盖现有的用户表,导致 账号密码错误。