# 26.1.SQL转储

26.1.1. 恢复垃圾场

26.1.2. 使用pg_dumpall

26.1.3. 处理大型数据库

这种转储方法背后的想法是使用SQL命令生成一个文件,当这些命令反馈给服务器时,将以转储时的状态重新创建数据库。PostgreSQL提供了实用程序pg_倾倒为此目的。此命令的基本用法是:

pg_dump dbname > dumpfile

如你所见,pg_dump将其结果写入标准输出。我们将在下面看到这是如何有用的。当上面的命令创建一个文本文件时,pg_dump可以创建其他格式的文件,允许并行性和更细粒度的对象恢复控制。

pg_dump是一个常规的PostgreSQL客户端应用程序(尽管它特别聪明)。这意味着您可以从任何可以访问数据库的远程主机执行此备份过程。但记住pg_转储不使用特殊权限进行操作。特别是,它必须具有对所有要备份的表的读取权限,因此为了备份整个数据库,几乎总是必须以数据库超级用户的身份运行它。(如果您没有足够的权限备份整个数据库,您仍然可以使用以下选项备份您确实有权访问的部分数据库:-n*模式*-t*桌子*.)

指定哪个数据库服务器_dump应联系,使用命令行选项-h*主办*-p*港口城市*.默认主机是本地主机或您的任何主机PGHOST环境变量指定。同样,默认端口由PGPORT环境变量,否则,默认情况下由编译。(为了方便起见,服务器通常会在默认情况下编译相同的文件。)

与其他PostgreSQL客户端应用程序一样,pg_默认情况下,dump将使用与当前操作系统用户名相同的数据库用户名进行连接。要覆盖此选项,请指定-U选项或设置环境变量PGUSER.记得那个pg吗_转储连接受正常客户端身份验证机制的约束(如中所述)第21章).

pg的一个重要优势_与后面介绍的其他备份方法相比,转储是_dump的输出通常可以重新加载到较新版本的PostgreSQL中,而文件级备份和连续存档都是非常特定于服务器版本的。pg_转储也是将数据库传输到不同机器体系结构(例如从32位服务器传输到64位服务器)时唯一有效的方法。

pg创建的转储_dump在内部是一致的,这意味着dump代表的是当时数据库的快照_垃圾场开始运转。pg_dump不会在数据库工作时阻止其他操作。(例外情况是那些需要使用独占锁进行操作的操作,例如大多数形式的改变桌子.)

# 26.1.1.恢复垃圾场

由pg创建的文本文件_转储将由psql程序读入。恢复转储的常规命令窗体为

psql dbname < dumpfile

哪里*转储文件是pg输出的文件_转储命令。数据库库名*将不会由该命令创建,因此您必须自己创建它模板0在执行psql之前(例如createdb-T template0*库名*).psql支持类似于pg的选项_转储,用于指定要连接的数据库服务器和要使用的用户名。看到了吗psql更多信息请参见参考页。非文本文件转储将使用pg_恢复公用事业

在还原SQL转储之前,拥有对象或被授予对转储数据库中对象的权限的所有用户必须已经存在。否则,还原将无法以原始所有权和/或权限重新创建对象。(有时这是你想要的,但通常不是。)

默认情况下,遇到SQL错误后,psql脚本将继续执行。您可能希望使用错误停止变量设置为改变该行为,并在发生SQL错误时使psql exit的退出状态为3:

psql --set ON_ERROR_STOP=on dbname < dumpfile

无论哪种方式,您都将只有一个部分恢复的数据库。或者,您可以指定整个转储应作为单个事务进行还原,以便完全完成或完全回滚还原。可以通过传递-1--单笔交易psql的命令行选项。使用此模式时,请注意,即使是一个小错误也可以回滚已运行数小时的还原。然而,这可能仍然比在部分恢复的转储之后手动清理复杂数据库更好。

pg的能力_dump和psql写入或读取管道,可以将数据库直接从一台服务器转储到另一台服务器,例如:

pg_dump -h host1 dbname | psql -h host2 dbname

# 重要的

pg产生的垃圾_垃圾场是相对于模板0。这意味着通过模板1也会被pg抛弃_倾倒因此,在恢复时,如果您使用的是自定义的模板1,必须从中创建空数据库模板0,如上例所示。

恢复备份后,明智的做法是运行分析这样查询优化器就有了有用的统计信息;看见第25.1.3节第25.1.6节了解更多信息。有关如何将大量数据高效加载到PostgreSQL的更多建议,请参阅第14.4节.

# 26.1.2.使用pg_dumpall

pg_dump一次只转储一个数据库,它不会转储有关角色或表空间的信息(因为这些是集群范围的,而不是每个数据库)。为了支持方便地转储数据库集群的全部内容pg_dumpall提供程序。pg_dumpall备份给定集群中的每个数据库,还保留集群范围内的数据,如角色和表空间定义。此命令的基本用法是:

pg_dumpall > dumpfile

可以使用psql恢复生成的转储:

psql -f dumpfile postgres

(实际上,您可以指定任何现有的数据库名称作为起始名称,但如果要加载到空集群中,则博士后通常应使用。)还原pg时,始终需要有数据库超级用户访问权限_dumpall dump,因为这是恢复角色和表空间信息所必需的。如果使用表空间,请确保转储中的表空间路径适合新安装。

pg_dumpall的工作原理是发出重新创建角色、表空间和空数据库的命令,然后调用pg_为每个数据库转储。这意味着,虽然每个数据库在内部是一致的,但不同数据库的快照并不同步。

集群范围内的数据可以使用pg单独转储_dumpall --仅限全球选项如果运行pg,这是完全备份集群所必需的_在单个数据库上转储命令。

# 26.1.3.处理大型数据库

一些操作系统有最大文件大小限制,在创建大文件时会出现问题_转储输出文件。幸运的是,pg_dump可以写入标准输出,因此可以使用标准Unix工具来解决这个潜在问题。有几种可能的方法:

**使用压缩转储。**您可以使用自己喜欢的压缩程序,例如gzip:

pg_dump dbname | gzip > filename.gz

重新加载:

gunzip -c filename.gz | psql dbname

或者:

cat filename.gz | gunzip | psql dbname

**使用分裂.**那个分裂命令允许您将输出拆分为较小的文件,这些文件的大小是基础文件系统可以接受的。例如,要生成2G字节的块:

pg_dump dbname | split -b 2G - filename

重新加载:

cat filename* | psql dbname

如果使用GNU split,则可以将其与gzip一起使用:

pg_dump dbname | split -b 2G --filter='gzip > $FILE.gz'

可以使用zcat.

**使用pg_dump的自定义转储格式。**如果PostgreSQL是在安装了zlib压缩库的系统上构建的,则自定义转储格式会在将数据写入输出文件时压缩数据。这将产生与使用类似的转储文件大小gzip,但它还有一个额外的优点,即可以有选择地恢复表。以下命令使用自定义转储格式转储数据库:

pg_dump -Fc dbname > filename

自定义格式转储不是psql的脚本,而是必须使用pg恢复_恢复,例如:

pg_restore -d dbname filename

看到了吗pg_倾倒pg_恢复详情请参阅参考页。

对于非常大的数据库,可能需要合并分裂用另外两种方法中的一种。

**使用pg_dump的并行转储功能。**要加快大型数据库的转储速度,可以使用pg_dump的并行模式。这将同时转储多个表。您可以使用-j参数并行转储仅支持“目录”归档格式。

pg_dump -j num -F d -f out.dir dbname

你可以用pg_restore-j并行恢复转储。这将适用于任何“自定义”或“目录”归档模式的归档,无论是否使用pg_dump-j.