2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

pg_dumpall

pg_dumpall — 将 PostgreSQL 数据库集群提取到脚本文件

概要

pg_dumpall [连接选项...] [选项...]

描述

pg_dumpall 是一种将 (转储) 集群中的所有 PostgreSQL 数据库写入一个脚本文件的实用程序。脚本文件包含SQL可以作为 psql 的输入来恢复数据库的命令。它通过对集群中的每个数据库调用 pg_dump 来实现此目的。pg_dumpall 还会转储所有数据库共有的全局对象,即数据库角色、表空间和配置参数的权限授予。 (pg_dump 不会保存这些对象。)

由于 pg_dumpall 从所有数据库读取表,因此您很可能需要以数据库超级用户的身份连接才能生成完整的转储。此外,您还需要超级用户权限才能执行保存的脚本,以便能够添加角色和创建数据库。

SQL 脚本将写入标准输出。使用 -f/--file 选项或 shell 运算符将其重定向到文件。

pg_dumpall 需要多次连接到 PostgreSQL 服务器(每个数据库一次)。如果使用密码身份验证,它将在每次连接时询问密码。在这种情况下,拥有一个 ~/.pgpass 文件很方便。有关更多信息,请参阅 第 32.16 节

选项

以下命令行选项控制输出的内容和格式。

-a
--data-only

仅转储数据,不转储模式(数据定义)。

-c
--clean

发出 SQL 命令以在重新创建之前 DROP 所有转储的数据库、角色和表空间。此选项在恢复将覆盖现有集群时很有用。如果目标集群中不存在任何对象,则在恢复期间将报告可忽略的错误消息,除非还指定了 --if-exists

-E 编码
--encoding=编码

以指定的字符集编码创建转储。默认情况下,转储以数据库编码创建。(另一种获得相同结果的方法是将 PGCLIENTENCODING 环境变量设置为所需的转储编码。)

-f 文件名
--file=文件名

将输出发送到指定的文件。如果省略此选项,则使用标准输出。

--filter=文件名

指定一个文件名,从中读取要从转储中排除的数据库的模式。这些模式根据与 --exclude-database 相同的规则进行解释。要从 STDIN 读取,请使用 - 作为文件名。--filter 选项可以与 --exclude-database 一起使用来排除数据库,并且可以多次指定以使用多个筛选器文件。

该文件每行列出一个数据库模式,格式如下

exclude database PATTERN

# 开头的行被视为注释并被忽略。注释也可以放在对象模式行的后面。空行也会被忽略。有关如何在模式中执行引用的说明,请参阅 模式

-g
--globals-only

仅转储全局对象(角色和表空间),不转储数据库。

-O
--no-owner

不输出设置对象所有权以匹配原始数据库的命令。默认情况下,pg_dumpall 会发出 ALTER OWNERSET SESSION AUTHORIZATION 语句来设置创建的模式元素的所有权。除非以超级用户身份启动脚本(或与脚本中所有对象的所有者相同的用户),否则这些语句将在运行脚本时失败。要创建一个可以由任何用户恢复但将授予该用户所有对象所有权的脚本,请指定 -O

-r
--roles-only

仅转储角色,不转储数据库或表空间。

-s
--schema-only

仅转储对象定义(模式),不转储数据。

-S 用户名
--superuser=用户名

指定在禁用触发器时要使用的超级用户用户名。这仅在使用 --disable-triggers 时才相关。(通常,最好将其省略,而是以超级用户身份启动生成的脚本。)

-t
--tablespaces-only

仅转储表空间,不转储数据库或角色。

-v
--verbose

指定详细模式。这将导致 pg_dumpall 将开始/停止时间输出到转储文件,并将进度消息输出到标准错误。重复此选项会导致标准错误上出现额外的调试级别消息。此选项还会传递给 pg_dump

-V
--version

打印 pg_dumpall 版本并退出。

-x
--no-privileges
--no-acl

防止转储访问权限(授予/撤销命令)。

--binary-upgrade

此选项用于就地升级实用程序。不建议或不支持将其用于其他目的。此选项的行为可能会在将来的版本中发生变化,恕不另行通知。

--column-inserts
--attribute-inserts

将数据转储为具有显式列名的 INSERT 命令 (INSERT INTO (, ...) VALUES ...)。这将使恢复非常缓慢;它主要用于创建可以加载到非 PostgreSQL 数据库中的转储。

--disable-dollar-quoting

此选项禁用对函数主体使用美元引用,并强制它们使用 SQL 标准字符串语法进行引用。

--disable-triggers

此选项仅在创建仅数据转储时才相关。它指示 pg_dumpall 包含在恢复数据时暂时禁用目标表上的触发器的命令。如果您在不想在数据恢复期间调用的表上具有引用完整性检查或其他触发器,请使用此选项。

目前,为 --disable-triggers 发出的命令必须以超级用户身份执行。因此,您还应该使用 -S 指定超级用户名,或者最好注意以超级用户身份启动生成的脚本。

--exclude-database=模式

不转储其名称与 模式 匹配的数据库。可以通过编写多个 --exclude-database 开关来排除多个模式。模式 参数根据与 psql\d 命令相同的规则进行解释(请参阅 模式),因此也可以通过在模式中编写通配符来排除多个数据库。使用通配符时,请注意在必要时引用模式以防止 shell 通配符扩展。

--extra-float-digits=ndigits

在转储浮点数数据时,使用指定的 extra_float_digits 值,而不是最大可用精度。为备份目的而进行的常规转储不应使用此选项。

--if-exists

使用 DROP ... IF EXISTS 命令在 --clean 模式下删除对象。这会抑制可能报告的 不存在 错误。此选项仅在也指定了 --clean 时才有效。

--inserts

将数据转储为 INSERT 命令(而不是 COPY)。这将使恢复速度非常慢;它主要用于创建可以加载到非 PostgreSQL 数据库中的转储。请注意,如果您重新排列了列顺序,则恢复可能会完全失败。 --column-inserts 选项更安全,尽管更慢。

--load-via-partition-root

在转储表分区的数据时,使 COPYINSERT 语句的目标是包含它的分区层次结构的根,而不是分区本身。这会导致在加载数据时为每一行重新确定适当的分区。这在将数据还原到服务器时可能很有用,因为行并不总是像在原始服务器上那样落入相同的分区。例如,如果分区列的类型为 text,并且两个系统对用于排序分区列的排序规则的定义不同,就会发生这种情况。

--lock-wait-timeout=timeout

不要无限期地等待在转储开始时获取共享表锁。相反,如果在指定的时间内无法锁定表 timeout,则失败。超时可以使用 SET statement_timeout 接受的任何格式指定。

--no-comments

不转储注释。

--no-publications

不转储发布。

--no-role-passwords

不转储角色的密码。恢复后,角色将具有空密码,并且密码身份验证将始终失败,直到设置密码。由于在指定此选项时不需要密码值,因此角色信息将从目录视图 pg_roles 中读取,而不是 pg_authid。因此,此选项也有助于如果访问 pg_authid 被某些安全策略限制。

--no-security-labels

不转储安全标签。

--no-subscriptions

不转储订阅。

--no-sync

默认情况下, pg_dumpall 将等待所有文件安全写入磁盘。此选项会导致 pg_dumpall 不等待就返回,这更快,但意味着后续的操作系统崩溃会使转储损坏。通常,此选项对于测试很有用,但不应在从生产安装转储数据时使用。

--no-table-access-method

不输出选择表访问方法的命令。使用此选项,所有对象将在还原期间创建的任何默认表访问方法下创建。

--no-tablespaces

不输出创建表空间的命令,也不选择对象的表空间。使用此选项,所有对象将在还原期间的默认表空间中创建。

--no-toast-compression

不输出命令来设置TOAST压缩方法。使用此选项,所有列将使用默认压缩设置恢复。

--no-unlogged-table-data

不转储未日志记录表的內容。此选项对是否转储表定义(模式)没有影响;它只抑制转储表数据。

--on-conflict-do-nothing

INSERT 命令添加 ON CONFLICT DO NOTHING。除非还指定了 --inserts--column-inserts,否则此选项无效。

--quote-all-identifiers

强制所有标识符加引号。当从服务器转储数据库时,建议使用此选项 PostgreSQL 主要版本不同于 pg_dumpall 的主要版本,或者当输出旨在加载到不同主要版本的服务器时。默认情况下, pg_dumpall 仅对在其自身主要版本中是保留字的标识符加引号。当处理其他版本的服务器时,这有时会导致兼容性问题,因为这些服务器可能具有略微不同的保留字集。使用 --quote-all-identifiers 可以防止此类问题,但代价是转储脚本更难阅读。

--rows-per-insert=nrows

将数据转储为 INSERT 命令(而不是 COPY)。控制每个 INSERT 命令的最大行数。指定的值必须是大于零的数字。还原期间的任何错误只会导致有问题的 INSERT 部分的行丢失,而不是整个表的内容。

--use-set-session-authorization

输出 SQL 标准 SET SESSION AUTHORIZATION 命令,而不是 ALTER OWNER 命令来确定对象的所有权。这使得转储更符合标准,但是根据转储中对象的历史,可能无法正确恢复。

-?
--help

显示关于 pg_dumpall 命令行参数的帮助,然后退出。

以下命令行选项控制数据库连接参数。

-d connstr
--dbname=connstr

指定用于连接到服务器的参数,作为 连接字符串;这些将覆盖任何冲突的命令行选项。

该选项被称为 --dbname,以与其他客户端应用程序保持一致,但由于 pg_dumpall 需要连接到多个数据库,因此连接字符串中的数据库名称将被忽略。使用 -l 选项指定用于初始连接的数据库的名称,该连接将转储全局对象并发现应转储哪些其他数据库。

-h host
--host=host

指定运行数据库服务器的机器的主机名。如果值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值取自 PGHOST 环境变量(如果设置),否则尝试建立 Unix 域套接字连接。

-l dbname
--database=dbname

指定要连接到的数据库的名称,以转储全局对象并发现应转储哪些其他数据库。如果未指定,将使用 postgres 数据库,如果该数据库不存在,则使用 template1

-p port
--port=port

指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认为 PGPORT 环境变量(如果设置),或编译后的默认值。

-U username
--username=username

要连接的用户名称。

-w
--no-password

从不发出密码提示。如果服务器需要密码身份验证并且密码无法通过其他方式(例如 .pgpass 文件)获得,则连接尝试将失败。此选项在批处理作业和脚本中可能很有用,因为这些作业和脚本中没有用户可以输入密码。

-W
--password

强制 pg_dumpall 在连接到数据库之前提示输入密码。

此选项从不必要,因为 pg_dumpall 如果服务器要求密码身份验证,它会自动提示输入密码。但是, pg_dumpall 将浪费一次连接尝试来找出服务器需要密码。在某些情况下,值得输入 -W 以避免额外的连接尝试。

请注意,将为要转储的每个数据库再次出现密码提示。通常,设置 ~/.pgpass 文件比依赖手动密码输入更好。

--role=rolename

指定用于创建转储的角色名称。此选项会导致 pg_dumpall 在连接到数据库后发出 SET ROLE rolename 命令。当经过身份验证的用户(由 -U 指定)缺少 pg_dumpall 所需的权限,但可以切换到具有所需权限的角色时,此选项很有用。一些安装不允许直接以超级用户身份登录,使用此选项允许在不违反策略的情况下进行转储。

环境

PGHOST
PGOPTIONS
PGPORT
PGUSER

默认连接参数

PG_COLOR

指定是否在诊断消息中使用颜色。可能的值是 alwaysautonever

此实用程序(与大多数其他 PostgreSQL 实用程序一样)还使用 libpq 支持的环境变量(参见 第 32.15 节)。

注意

由于 pg_dumpall 在内部调用 pg_dump,因此某些诊断消息将引用 pg_dump

--clean 选项即使在您的目的是将转储脚本还原到新的集群时也可能很有用。使用 --clean 授权脚本删除和重新创建内置的 postgrestemplate1 数据库,确保这些数据库将保留与它们在源集群中相同的属性(例如,区域设置和编码)。如果没有该选项,这些数据库将保留其现有的数据库级属性,以及任何预先存在的內容。

恢复后,最好对每个数据库运行 ANALYZE,以便优化器拥有有用的统计信息。您也可以运行 vacuumdb -a -z 来分析所有数据库。

不应该期望转储脚本完全无错误地运行。特别是,因为脚本将为源集群中存在的每个角色发出 CREATE ROLE,所以它肯定会收到关于引导超级用户的 角色已存在 错误,除非目标集群使用不同的引导超级用户名称初始化。此错误无害,应该忽略。使用 --clean 选项可能会产生关于不存在对象的更多无害错误消息,尽管您可以通过添加 --if-exists 来最大程度地减少这些错误消息。

pg_dumpall 要求所有必要的表空间目录在还原之前存在;否则,数据库创建将因非默认位置的数据库而失败。

示例

转储所有数据库

$ pg_dumpall > db.out

要从该文件还原数据库,可以使用

$ psql -f db.out postgres

您连接到哪个数据库并不重要,因为由 pg_dumpall 创建的脚本文件将包含创建和连接到保存的数据库的适当命令。一个例外是,如果您指定了 --clean,则必须最初连接到 postgres 数据库;脚本将尝试立即删除其他数据库,这将对您连接到的数据库失败。

另请参见

检查 pg_dump 以了解可能的错误条件的详细信息。

提交更正

如果您在文档中发现任何错误,与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。