如何使用 pg_dump 和 pg_restore 备份与恢复数据库

通过这份关于 `pg_dump` 和 `pg_restore` 的综合指南,精通 PostgreSQL 数据保护。学习如何使用各种格式创建可靠的数据库备份,包括纯文本、自定义和目录格式。了解高效转储的关键选项,并探索恢复数据的分步说明。本教程涵盖了调度、测试和安全管理 PostgreSQL 备份的最佳实践,以确保数据完整性和恢复能力。

62 浏览量

如何使用 pg_dump 和 pg_restore 备份和恢复数据库

在数据库管理的领域中,健壮的备份和恢复策略不仅仅是建议,它们是绝对关键的。数据丢失可能源于多种因素,包括硬件故障、人为错误或恶意攻击。PostgreSQL,作为一个强大的开源关系型数据库,提供了必要的命令行实用程序 pg_dumppg_restore,以确保数据的完整性和可恢复性。本教程将指导您如何利用这些工具的最佳实践,创建可靠的备份并安全地恢复您的 PostgreSQL 数据库。

理解这些实用程序对于任何负责数据保护的 PostgreSQL 管理员或开发人员来说都是至关重要的。pg_dump 用于将 PostgreSQL 数据库提取到脚本文件或其他归档文件中,而 pg_restore 可以解释这些文件来重建数据库。掌握它们使您能够保护您的宝贵信息并维持业务连续性。

了解 pg_dump

pg_dump 是一个用于创建 PostgreSQL 数据库备份的实用程序。它生成一个包含 SQL 命令的文件,这些命令可用于重新创建数据库对象(表、函数、索引等)并用数据填充它们。pg_dump 通过连接到数据库然后生成输出来工作。它可以输出多种格式,每种格式都有各自的优点。

输出格式

pg_dump 支持多种输出格式:

  • 纯文本 SQL 脚本 (-Fp 或默认格式): 这是最简单的格式。它输出一个包含一系列 SQL 命令的文件。这种格式可供人阅读且易于编写脚本,但对于非常大的数据库来说,文件可能很大,恢复速度较慢。
  • 自定义归档格式 (-Fc): 这种格式创建一个压缩的自定义归档文件。它通常是推荐的备份格式,因为它默认是压缩的,支持并行恢复 (pg_restore),并且通常更灵活。
  • 目录格式 (-Fd): 这会创建一个目录,其中包含多个文件,每个文件对应一个表和其他对象。它也支持并行恢复,适用于非常大的数据库。
  • Tar 格式 (-Ft): 这会创建一个 tar 归档文件。它类似于目录格式,但只是单个文件。它适用于与其他处理 tar 归档的工具兼容。

常用 pg_dump 选项

以下是 pg_dump 最常用的一些选项:

  • -h <hostname>: 指定运行服务器的主机名。
  • -p <port>: 指定服务器监听连接的 TCP 端口。
  • -U <username>: 以指定用户身份连接。
  • -W: 强制 pg_dump 在连接前提示输入密码。
  • -f <filename>: 指定输出文件名。如果省略,pg_dump 将写入标准输出。
  • -F <format>: 指定输出文件格式 (p, c, d, t)。
  • -Z <0-9>: 指定压缩格式的压缩级别(例如,Fc)。
  • --exclude-table=<table_name>: 从转储中排除指定的表。
  • --jobs=<number>: 转储时使用的并行作业数(仅适用于目录格式)。
  • --clean: 包含在创建数据库对象之前删除它们的命令。这对于完整恢复以确保干净状态非常有用。
  • --create: 包含创建数据库本身的命令。在新服务器上恢复时非常有用。

示例:基本的纯文本备份

要创建名为 mydatabase、用户 myuser 拥有的数据库的纯文本备份,并将其保存到 mydatabase_backup.sql

pg_dump -U myuser -f mydatabase_backup.sql mydatabase

如果您需要指定主机和端口:

pg_dump -h localhost -p 5432 -U myuser -f mydatabase_backup.sql mydatabase

此命令将提示输入 myuser 的密码。

示例:自定义格式备份(推荐)

使用自定义归档格式通常更受青睐,因为它具有灵活性和压缩性。要创建 mydatabase 的压缩自定义备份:

pg_dump -U myuser -Fc -f mydatabase_backup.dump mydatabase

这将创建一个名为 mydatabase_backup.dump 的文件,该文件已压缩并适合 pg_restore 使用。

示例:使用并行作业的目录格式备份

对于非常大的数据库,并行转储可以显著加快备份过程。这需要使用目录格式。

pg_dump -U myuser -Fd -j 4 -f mydatabase_backup_dir mydatabase

此命令将创建一个名为 mydatabase_backup_dir 的目录,其中包含多个文件,并利用 4 个并行作业。

了解 pg_restore

pg_restore 是一个实用程序,用于从 pg_dump 创建的自定义、目录或 tar 格式的归档中恢复 PostgreSQL 数据库。它不用于纯文本 SQL 转储(纯文本转储使用 psql 命令恢复)。

常用 pg_restore 选项

  • -h <hostname>: 指定运行服务器的主机名。
  • -p <port>: 指定服务器监听连接的 TCP 端口。
  • -U <username>: 以指定用户身份连接。
  • -W: 强制 pg_restore 在连接前提示输入密码。
  • -d <database>: 指定要恢复到的数据库名称。这是必需的。
  • -v: 详细模式。
  • -c--clean: 在重新创建数据库对象之前清除(删除)它们。
  • --create: 在恢复数据之前创建数据库。这需要首先连接到另一个数据库(例如 postgres)。
  • -j <number>: 用于恢复的并行作业数。这可以显著加快恢复速度,尤其是对于自定义和目录格式。
  • -F <format>: 指定归档格式 (c, d, t)。通常,pg_restore 可以自动检测。

从纯文本 SQL 备份中恢复

如果您使用 pg_dump 创建了纯文本 SQL 备份(例如 mydatabase_backup.sql),则使用 psql 进行恢复:

psql -U myuser -d mydatabase -f mydatabase_backup.sql

如果备份文件包含 CREATE DATABASE\connect 命令,您可能需要连接到不同的数据库(例如 postgres)并省略 -d mydatabase 参数:

psql -U myuser -f mydatabase_backup.sql postgres

示例:从自定义格式备份中恢复

要将自定义格式备份 mydatabase_backup.dump 恢复到名为 restored_db 的数据库中:

pg_restore -U myuser -d restored_db mydatabase_backup.dump

如果目标数据库 restored_db 不存在,您可以使用 --create 选项。在这种情况下,您需要连接到不同的数据库(例如 postgres),因为目标数据库将被创建。

pg_restore -U myuser --create -d restored_db mydatabase_backup.dump

此命令将创建 restored_db 数据库,然后将数据恢复到其中。

示例:并行恢复

为了加快恢复速度,特别是对于大型数据集,请使用 -j 选项:

pg_restore -U myuser -d restored_db -j 4 mydatabase_backup.dump

这将尝试使用 4 个并行作业恢复数据库。

示例:从目录格式备份中恢复

要恢复以目录格式创建的备份(例如 mydatabase_backup_dir):

pg_restore -U myuser -d restored_db -j 4 mydatabase_backup_dir

请注意,最后一个参数是目录路径。

备份的最佳实践

  • 定期安排: 使用 cron (Linux/macOS) 或任务计划程序 (Windows) 自动执行备份,使其按固定间隔运行(例如,每天、每小时)。
  • 选择正确的格式: 对于大多数用例,推荐使用自定义格式 (-Fc),因为它具有压缩性并与 pg_restore 的并行特性兼容。对于并行转储/恢复至关重要的超大型数据库,请使用目录格式 (-Fd)。
  • 测试您的备份: 只有能够恢复的备份才有价值。定期通过恢复到暂存或开发环境来测试您的恢复过程,以确保数据完整性和备份文件的有效性。
  • 异地存储备份: 将备份副本保存在与主数据库服务器不同的物理位置,以防范站点范围的灾难。
  • 监控备份作业: 实施监控,确保您计划的备份作业成功运行,并在失败时发出警报。
  • 考虑压缩: 如果不使用自动压缩的格式,请使用 pg_dump 的压缩选项或通过外部压缩工具(gzipzstd)管道输出。
  • 明智地使用 --clean--create 在对现有环境执行完整恢复时,--clean 非常有用。在迁移到新环境或确保完全全新的状态时,--create 是必不可少的。在生产系统上使用这些选项时要谨慎。
  • 备份版本控制: 实施备份保留策略,包括备份的保留时长以及如何清除旧备份。

结论

pg_dumppg_restore 是保护您的 PostgreSQL 数据不可或缺的工具。通过了解它们的各种选项、输出格式,并实施一致的备份和恢复策略以及定期测试,您可以显著降低数据丢失的风险,并确保数据库系统的弹性。将这些实用程序作为您数据库管理实践的基石。