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
读取,请使用 -
作为文件名。可以结合 --exclude-database
指定 --filter
选项来排除数据库,也可以多次指定多个筛选文件。
该文件每行列出一个数据库模式,格式如下
exclude database PATTERN
以 #
开头的行被视为注释并忽略。注释也可以放置在对象模式行之后。空行也会被忽略。有关如何在模式中执行引号,请参见 模式。
-g
--globals-only
仅转储全局对象(角色和表空间),不转储数据库。
-O
--no-owner
不输出用于设置对象所有权以匹配原始数据库的命令。默认情况下,pg_dumpall 会发出 ALTER OWNER
或 SET 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
阻止转储访问权限(grant/revoke 命令)。
--binary-upgrade
此选项供就地升级实用程序使用。不建议或不支持将其用于其他目的。该选项的行为可能会在未来的版本中更改,恕不另行通知。
--column-inserts
--attribute-inserts
将数据转储为带有显式列名的 INSERT
命令(INSERT INTO
)。这将使还原非常缓慢;它主要用于制作可以加载到非 PostgreSQL 数据库中的转储。表
(列
, ...) VALUES ...
--disable-dollar-quoting
此选项禁用对函数体使用美元引号,并强制使用 SQL 标准字符串语法进行引用。
--disable-triggers
仅当创建仅限数据的转储时,此选项才相关。它指示 pg_dumpall 包括用于在还原数据时暂时禁用目标表上的触发器的命令。如果在您不想在数据还原期间调用的表上具有引用完整性检查或其他触发器,请使用此选项。
目前,为 --disable-triggers
发出的命令必须以超级用户身份执行。因此,您还应该使用 -S
指定一个超级用户名,或者最好小心以超级用户身份启动生成的脚本。
--exclude-database=pattern
不要转储名称与 pattern
匹配的数据库。可以通过编写多个 --exclude-database
开关来排除多个模式。pattern
参数被解释为模式,其规则与 psql 的 \d
命令所使用的规则相同(请参阅模式),因此也可以通过在模式中写入通配符来排除多个数据库。当使用通配符时,如果需要防止 shell 通配符扩展,请注意引用该模式。
--extra-float-digits=ndigits
转储浮点数据时,使用指定的 extra_float_digits 值,而不是最大可用精度。为备份目的进行的常规转储不应使用此选项。
--if-exists
在 --clean
模式下使用 DROP ... IF EXISTS
命令来删除对象。这会抑制可能报告的 “不存在” 错误。除非还指定了 --clean
,否则此选项无效。
--inserts
将数据转储为 INSERT
命令(而不是 COPY
)。这将使还原非常缓慢;它主要用于创建可以加载到非 PostgreSQL 数据库中的转储。请注意,如果您重新排列了列的顺序,则还原可能会完全失败。--column-inserts
选项更安全,但速度更慢。
--load-via-partition-root
当转储表分区的数据时,使 COPY
或 INSERT
语句的目标为包含该分区的分区层次结构的根,而不是分区本身。这会导致在加载数据时为每一行重新确定适当的分区。当在服务器上还原数据时,如果行并不总是落在与原始服务器相同分区中,这可能很有用。例如,如果分区列的类型为文本,并且两个系统对用于排序分区列的排序规则具有不同的定义,则可能会发生这种情况。
--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
指定是否在诊断消息中使用颜色。可能的值为 always
、auto
和 never
。
此实用程序(如大多数其他 PostgreSQL 实用程序一样)还使用 libpq 支持的环境变量(请参阅第 32.15 节)。
由于 pg_dumpall 在内部调用 pg_dump,因此某些诊断消息将引用 pg_dump。
即使您的目的是将转储脚本恢复到一个全新的集群中,--clean
选项也可能很有用。使用 --clean
选项授权脚本删除并重新创建内置的 postgres
和 template1
数据库,以确保这些数据库保留与源集群中相同的属性(例如,区域设置和编码)。如果不使用此选项,这些数据库将保留其现有的数据库级属性以及任何预先存在的内容。
恢复后,明智的做法是在每个数据库上运行 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 以了解有关可能出现的错误条件的详细信息。
如果您在文档中发现任何不正确、与您特定功能体验不符或需要进一步说明的地方,请使用此表格报告文档问题。