如何使用 pg_dump 和 pg_restore 备份和恢复数据库
在数据库管理的领域中,健壮的备份和恢复策略不仅仅是建议,它们是绝对关键的。数据丢失可能源于多种因素,包括硬件故障、人为错误或恶意攻击。PostgreSQL,作为一个强大的开源关系型数据库,提供了必要的命令行实用程序 pg_dump 和 pg_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的压缩选项或通过外部压缩工具(gzip、zstd)管道输出。 - 明智地使用
--clean和--create: 在对现有环境执行完整恢复时,--clean非常有用。在迁移到新环境或确保完全全新的状态时,--create是必不可少的。在生产系统上使用这些选项时要谨慎。 - 备份版本控制: 实施备份保留策略,包括备份的保留时长以及如何清除旧备份。
结论
pg_dump 和 pg_restore 是保护您的 PostgreSQL 数据不可或缺的工具。通过了解它们的各种选项、输出格式,并实施一致的备份和恢复策略以及定期测试,您可以显著降低数据丢失的风险,并确保数据库系统的弹性。将这些实用程序作为您数据库管理实践的基石。