Menu Close

4.5. 备份 PostgreSQL 数据

要备份 PostgreSQL 数据,请使用以下方法之一:

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

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

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

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

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

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

4.5.1.1. SQL 转储的优点和缺陷

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

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

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

4.5.1.2. 使用 pg_dump 执行 SQL 转储

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

先决条件

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

流程

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

    $ pg_dump dbname > dumpfile

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

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

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

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

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

4.5.1.3. 使用 pg_dumpall 执行 SQL 转储

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

先决条件

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

流程

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

    $ pg_dumpall > dumpfile

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

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

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

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

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

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

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

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

要从使用 pg_dump 工具转储的 SQL 转储恢复数据库,请按照以下流程。

先决条件

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

流程

  1. 创建新数据库:

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

    $ psql dbname < dumpfile

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

    $ pg_restore non-plain-text-file

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

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

先决条件

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

流程

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

    $ psql < dumpfile

    其中 dumpfilepg_dumpall 命令的输出。

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

将数据库从一台服务器直接转储到另一台服务器是可能的,因为 pg_dumppsql 可以写入管道并从管道读取。

流程

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

    $ pg_dump -h host1 dbname | psql -h host2 dbname

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

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

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

先决条件

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

流程

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

    $ psql --set ON_ERROR_STOP=on dbname < dumpfile
  • 指定整个转储作为一个事务来恢复,以便要么全部完成,要么全部取消。

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

      $ psql -1
    • 使用 pg_restore 工具恢复非文本文件转储时:

      $ pg_restore -e

      请注意,在使用这个方法时,即使一个小的错误也可以取消已经运行了很长时间的恢复操作。