3.6. 使用 SQL 转储备份 PostgreSQL 数据


SQL 转储方法基于使用 SQL 命令生成转储文件。当转储上传回数据库服务器时,它会按与转储时相同的状态重新创建数据库。

以下 PostgreSQL 客户端应用程序为 SQL 转储提供了保证:

  • pg_dump 转储单个数据库,而没有集群范围的有关角色或表空间的信息
  • pg_dumpall 转储给定集群中的每个数据库,并保留集群范围的数据,如角色和表空间定义。

默认情况下,pg_dumppg_dumpall 命令将它的们结果写入标准输出。要将转储保存到文件中,请将输出重定向到 SQL 文件。生成的 SQL 文件可以是文本格式,也可以是允许并行且可以更详细地控制对象恢复的其他格式。

您可以在任何可访问数据库的远程主机中执行 SQL 转储。

3.6.1. SQL 转储的优点和缺陷

与其他 PostgreSQL 备份方法相比,SQL 转储具有以下优点:

  • SQL 转储是唯一一个不是特定于服务器版本的 PostgreSQL 备份方法。pg_dump 工具的输出可以重新加载到 PostgreSQL 的后续版本中,这不适用于文件系统级备份或持续归档。
  • SQL 转储是将数据库传输到不同计算机架构(比如从 32 位服务器传输到 64 位服务器)的唯一方法。
  • SQL 转储提供内部一致的转储。转储表示 pg_dump 开始运行时的数据库的快照。
  • pg_dump 工具在运行时不会阻止对数据库的其他操作。

SQL 转储的一个缺点是,与文件系统级备份相比,它需要更长的时间。

3.6.2. 使用 pg_dump 执行 SQL 转储

要转储没有集群范围信息的单个数据库,请使用 pg_dump 工具。

先决条件

  • 您必须对要转储的所有表具有读的权限。若要转储整个数据库,您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  • 转储没有集群范围信息的数据库:

    $ pg_dump <db_name> > <dump_file>
    Copy to Clipboard Toggle word wrap

    要指定 pg_dump 将联系哪个数据库服务器,请使用以下命令行选项:

    • -h 选项用来定义主机的。

      默认主机要么是本地主机,要么是 PGHOST 环境变量所指定的主机。

    • -p 选项用来定义端口 。

      默认端口是由 PGPORT 环境变量或编译后的默认值指明的。

3.6.3. 使用 pg_dumpall 执行 SQL 转储

要转储给定数据库集群中的每个数据库,并保留集群范围的数据,请使用 pg_dumpall 工具。

先决条件

  • 您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  • 转储数据库集群中的所有数据库,并保留集群范围的数据:

    $ pg_dumpall > <dump_file>
    Copy to Clipboard Toggle word wrap

    要指定 pg_dumpall 将联系哪个数据库服务器,请使用以下命令行选项:

    • -h 选项用来定义主机的。

      默认主机要么是本地主机,要么是 PGHOST 环境变量所指定的主机。

    • -p 选项用来定义端口 。

      默认端口是由 PGPORT 环境变量或编译后的默认值指明的。

    • -l 选项用来定义默认数据库。

      这个选项使您能够选择一个与初始化过程中自动创建的 postgres 数据库不同的默认数据库。

3.6.4. 使用 pg_dump 恢复转储的数据库

要从使用 pg_dump 工具转储的 SQL 转储中恢复数据库,请按照以下步骤操作。

先决条件

  • 您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  1. 创建新数据库:

    $ createdb <db_name>
    Copy to Clipboard Toggle word wrap
  2. 验证在转储数据库中拥有对象或被赋予了对象权限的所有用户是否已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
  3. 运行 psql 工具来恢复 pg_dump 工具创建的文本文件转储:

    $ psql <db_name> < <dump_file>
    Copy to Clipboard Toggle word wrap

    其中 <dump_file>pg_dump 命令的输出。要恢复非文本文件转储,请使用 pg_restore 工具:

    $ pg_restore <non-plain_text_file>
    Copy to Clipboard Toggle word wrap

3.6.5. 使用 pg_dumpall 恢复转储的数据库

要从使用 pg_dumpall 工具转储的数据库集群中恢复数据,请按照以下步骤操作。

先决条件

  • 您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  1. 确保在转储数据库中拥有对象或已被赋予了对象权限的所有用户已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
  2. 运行 psql 工具来恢复 pg_dumpall 工具创建的文本文件转储:

    $ psql < <dump_file>
    Copy to Clipboard Toggle word wrap

    其中 <dump_file>pg_dumpall 命令的输出。

3.6.6. 在另一服务器上执行数据库的 SQL 转储

可以直接从一台服务器转储到另一台服务器,因为 pg_dumppsql 可以写入管道并从管道读取。

流程

  • 要从一个服务器到另一个服务器转储数据库,请运行:

    $ pg_dump -h <host_1> <db_name> | psql -h <host_2> <db_name>
    Copy to Clipboard Toggle word wrap

3.6.7. 在恢复过程中处理 SQL 错误

默认情况下,如果出现 SQL 错误,psql 会继续执行,从而导致数据库只部分恢复。

要修改默认行为,在恢复转储时使用以下任一方法:

先决条件

  • 您必须以 postgres 超级用户或具有数据库管理员特权的用户身份运行命令。

流程

  • 设置 ON_ERROR_STOP 变量,使 psql 在发生 SQL 错误时退出,且退出状态为 3:

    $ psql --set ON_ERROR_STOP=on <db_name> < <dump_file>
    Copy to Clipboard Toggle word wrap
  • 指定整个转储作为一个事务来恢复,以便要么全部完成,要么全部取消。

    • 当使用 psql 工具恢复文本文件转储时:

      $ psql -1
      Copy to Clipboard Toggle word wrap
    • 当使用 pg_restore 工具恢复非文本文件转储时:

      $ pg_restore -e
      Copy to Clipboard Toggle word wrap

    请注意,当您使用此方法时,即使是小的错误也可能会取消已运行了数小时的恢复操作。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat