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 工具从备份文件中恢复数据库。

解决方案

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

相关推荐
摇滚侠9 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
川石课堂软件测试10 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
2501_9377671610 小时前
自建 SQL 数据库定时备份踩坑复盘与落地思路
数据库·sql
岁月宁静11 小时前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
silvamux_12 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
I Am a robert girl13 小时前
从 GameHorizon 拆解多时间尺度游戏评测:数据管线、离线基准与在线回放的三层设计
数据库·游戏·多时间尺度·数据管线·游戏评测·离线基准·在线回放
躺柒14 小时前
读数据安全架构设计与实践17安全架构案例(下)
数据库·安全·零信任·安全架构·防火墙·无边界
SelectDB14 小时前
实时更新排错现场:导入了却查到旧数据,和 FINAL 越加越慢的两条路
大数据·数据库·数据分析
SelectDB15 小时前
拿 Planet 的账单一行行对下来,我总结出三个可自查的校验点
大数据·数据库·数据分析
SelectDB15 小时前
Apache Doris + Vane:让多模态数据进入业务分析
大数据·数据库·数据分析