PostgreSQL Docker 数据库备份:pg_dump 与 SQL 格式备份的区别

文章目录

  • [一、什么是 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 工具从备份文件中恢复数据库。

解决方案

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

相关推荐
写后端的胖头鱼3 小时前
Redis 的 RDB 和 AOF
java·数据库·redis
杨云龙UP3 小时前
Oracle 19c ADG 实时同步故障排查与修复:Standby Redo Log(SRL)文件缺失导致备库仅在主库归档后同步
数据库·oracle·adg·data guard·srl·ora-00313·ora-27037
步行cgn4 小时前
MySQL 报错:Access denied for user ‘root‘@‘localhost‘ 详解
java·数据库·spring
灯澜忆梦4 小时前
【docker】#1 | Docker 初识
运维·docker·容器
for_ever_love__5 小时前
Redis 数据类型全景:五种基础类型怎么用、什么时候用
数据库·redis·数据类型·hash·使用场景·zset·排行榜
SmartSoftHelp开发辅助优化5 小时前
SmartSoftHelp DeepCore XSuite Pro Global Eco AIAgent 2026.V29 专业国际版
数据库·oracle
骑着蜗牛撵大象3275 小时前
穿越 Docker 内核迷雾:镜像分层的叠加态与卷挂载的空间穿梭
运维·docker·容器·联合文件系统·卷挂载·镜像分层·存储驱动
honsor5 小时前
以太网温湿度传感器:RJ45直连机房的环境监控新方案
运维·网络·数据库·物联网·安全·云计算·github
西索斯coding5 小时前
Kimi k2.7-code-highspeed 接入 Cline 教程:baseURL 路由变更 + model_id 正确写法
java·服务器·数据库·ai