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 节。
恢复转储会导致目标执行源超级用户选择的任意代码。部分转储和部分恢复不能限制这一点。如果源超级用户不受信任,则在恢复之前必须检查转储的 SQL 语句。请注意,运行转储和恢复的客户端不需要信任源或目标超级用户。
以下命令行选项控制输出的内容和格式。
-a
--data-only
仅转储数据,不转储模式(数据定义)或统计信息。
-c
--clean
发出 SQL 命令以在重新创建所有转储的数据库、角色和表空间之前 DROP
它们。当恢复将覆盖现有集群时,此选项很有用。如果目标集群中不存在任何对象,则在恢复期间将报告可忽略的错误消息,除非还指定了 --if-exists
。
-E 编码
--encoding=编码
以指定的字符集编码创建转储。默认情况下,转储以数据库编码创建。(另一种获得相同结果的方法是将 PGCLIENTENCODING
环境变量设置为所需的转储编码。)
-f filename
--file=filename
将输出发送到指定的文件。如果省略,则使用标准输出。
-g
--globals-only
仅转储全局对象(角色和表空间),不转储数据库。
-O
--no-owner
不输出命令来设置对象的属主以匹配原始数据库。默认情况下,pg_dumpall 会发出 ALTER OWNER
或 SET SESSION AUTHORIZATION
语句来设置创建的模式元素的所有权。除非脚本由超级用户(或脚本中所有对象的同一用户)启动,否则在运行时运行这些语句将失败。要创建任何用户都可以恢复但会赋予该用户所有对象所有权的脚本,请指定 -O
。
-r
--roles-only
仅转储角色,不转储数据库或表空间。
-s
--schema-only
仅转储对象定义(模式),不转储数据。
-S username
--superuser=username
指定在禁用触发器时要使用的超级用户名。仅当使用 --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 数据库中的转储。table
(column
, ...) VALUES ...
--disable-dollar-quoting
此选项禁用函数体使用美元引用,并强制使用 SQL 标准字符串语法进行引用。
--disable-triggers
此选项仅在创建包含数据但不包含模式的转储时相关。它指示 pg_dumpall 在恢复数据时包含暂时禁用目标表上的触发器的命令。如果您有引用完整性检查或其他触发器,并且不希望在数据恢复期间触发它们,请使用此选项。
目前,为 --disable-triggers
发出的命令必须以超级用户身份执行。因此,您还应该使用 -S
指定超级用户名,或者最好注意将生成的脚本以超级用户身份启动。
--exclude-database=模式
不转储名称与 模式
匹配的数据库。可以通过编写多个 --exclude-database
开关来排除多个模式。 模式
参数根据 psql 的 \d
命令使用的相同规则(请参阅 模式)进行解释,因此通过在模式中使用通配符字符也可以排除多个数据库。使用通配符时,请务必根据需要引用该模式,以防止 shell 通配符展开。
--extra-float-digits=数字
在转储浮点数据时使用指定的 extra_float_digits 值,而不是可用的最大精度。用于备份目的的常规转储不应使用此选项。
--filter=filename
指定一个文件名,从中读取要从转储中排除的数据库的模式。模式的解释与 --exclude-database
的规则相同。要从 STDIN
读取,请使用 -
作为文件名。 --filter
选项可以与 --exclude-database
结合使用以排除数据库,也可以指定多次以使用多个筛选器文件。
该文件每行列出一个数据库模式,格式如下:
exclude database PATTERN
以 #
开头的行被视为注释并被忽略。注释也可以放在对象模式行之后。空行也被忽略。有关如何在模式中进行引用的信息,请参见 模式。
--if-exists
使用 DROP ... IF EXISTS
命令来删除 --clean
模式中的对象。这会抑制可能报告的“不存在”错误。此选项仅在也指定了 --clean
时才有效。
--inserts
将数据转储为 INSERT
命令(而不是 COPY
)。这将导致恢复非常缓慢;它主要用于生成可以加载到非 PostgreSQL 数据库中的转储。请注意,如果您重新排列了列顺序,恢复可能会完全失败。--column-inserts
选项更安全,但速度更慢。
--load-via-partition-root
在转储表分区的时,将 COPY
或 INSERT
语句的目标设为包含该分区的分层结构的根,而不是分区本身。这将导致在加载数据时为每一行重新确定适当的分区。当在行不一定能落入与原始服务器相同的分区中的服务器上恢复数据时,这可能很有用。例如,如果分区列是 text 类型,并且两个系统对用于排序分区列的排序规则有不同的定义,则可能会发生这种情况。
--lock-wait-timeout=超时
在转储开始时不要永远等待获取共享表锁。相反,如果无法在指定的 超时
内锁定表,则失败。超时可以以 SET statement_timeout
接受的任何格式指定。
--no-comments
不转储 COMMENT
命令。
--no-data
不转储数据。
--no-policies
不转储行安全策略。
--no-publications
不转储出版物。
--no-role-passwords
不转储角色的密码。恢复时,角色将具有 null 密码,并且密码认证将始终失败,直到设置密码为止。由于在指定此选项时不需要密码值,因此从 catalog 视图 pg_roles
而不是 pg_authid
读取角色信息。因此,如果 pg_authid
的访问受到某些安全策略的限制,此选项也有助于解决此问题。
--no-schema
不转储模式(数据定义)。
--no-security-labels
不转储安全标签。
--no-statistics
不转储统计信息。这是默认行为。
--no-subscriptions
不转储订阅。
--no-sync
默认情况下,pg_dumpall
将等待所有文件安全写入磁盘。此选项会导致 pg_dumpall
在不等待的情况下返回,这样速度更快,但这意味着后续的操作系统崩溃可能会导致转储损坏。通常,此选项对于测试很有用,但不应用于从生产环境转储数据。
--no-table-access-method
不输出用于选择表访问方法的命令。使用此选项,所有对象都将使用恢复期间的默认表访问方法创建。
--no-tablespaces
不输出创建表空间的命令,也不为对象选择表空间。使用此选项,所有对象将在恢复期间的默认表空间中创建。
--no-toast-compression
不输出设置TOAST压缩方法的命令。使用此选项,所有列将以默认压缩设置进行恢复。
--no-unlogged-table-data
不转储未记录表的(unlogged tables)内容。此选项对是否转储表定义(模式)没有影响;它仅阻止转储表数据。
--on-conflict-do-nothing
向 INSERT
命令添加 ON CONFLICT DO NOTHING
。除非还指定了 --inserts
或 --column-inserts
,否则此选项无效。
--quote-all-identifiers
强制引用所有标识符。当从主 PostgreSQL 版本与 pg_dumpall 不同的服务器转储数据库,或当输出旨在加载到不同主版本的服务器中时,推荐使用此选项。默认情况下,pg_dumpall 仅引用其自身主版本中是保留字(reserved words)的标识符。这有时会导致与其他版本(可能具有略微不同的保留字集合)的服务器交互时出现兼容性问题。使用 --quote-all-identifiers
可以避免此类问题,但代价是转储脚本更难读。
--restrict-key=restrict_key
使用提供的字符串作为转储输出中的 psql \restrict
键。如果未指定 restrict 键,pg_dumpall 将在需要时生成一个随机键。键只能包含字母数字字符。
此选项主要用于测试目的和其他需要可重复输出(例如,比较转储文件)的场景。不建议常规使用,因为带有密钥预知能力的恶意服务器可能能够注入任意代码,这些代码将在运行 psql 并使用转储输出的机器上执行。
--rows-per-insert=行数
将数据转储为 INSERT
命令(而不是 COPY
)。控制每个 INSERT
命令的最大行数。指定的值必须是大于零的数字。恢复期间的任何错误只会导致属于有问题 INSERT
的行丢失,而不是整个表内容丢失。
--statistics
转储统计信息。
--statistics-only
仅转储统计信息,不转储模式(数据定义)或数据。转储表、物化视图、外部表和索引的统计信息。
--sequence-data
在转储中包含序列数据。这是默认行为,除非指定了 --no-data
、--schema-only
或 --statistics-only
。
--use-set-session-authorization
输出 SQL 标准 SET SESSION AUTHORIZATION
命令而不是 ALTER OWNER
命令来确定对象所有权。这使得转储更符合标准,但根据转储中对象的历史,可能无法正确恢复。
-?
--help
显示有关 pg_dumpall 命令行参数的帮助,然后退出。
以下命令行选项控制数据库连接参数。
-d connstr
--dbname=connstr
指定用于连接服务器的参数,作为连接字符串;这些将覆盖任何冲突的命令行选项。
为了与其他客户端应用程序保持一致,该选项名为 --dbname
,但由于 pg_dumpall 需要连接到多个数据库,因此连接字符串中的数据库名称将被忽略。使用 -l
选项指定用于初始连接的数据库的名称,该连接将转储全局对象并发现应该转储的其他数据库。
-h 主机
--host=主机
指定数据库服务器运行所在计算机的主机名。如果值以斜杠开头,则用作 Unix 域套接字目录。默认值取自 PGHOST
环境变量(如果已设置),否则尝试进行 Unix 域套接字连接。
-l dbname
--database=dbname
指定用于连接以转储全局对象并发现应转储的其他数据库的数据库名称。如果未指定,将使用 postgres
数据库,如果该数据库不存在,则使用 template1
。
-p 端口
--port=端口
指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认值为 PGPORT
环境变量(如果已设置),或者编译时默认值。
-U 用户名
--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
数据库,从而确保这些数据库保留与源集群相同的属性(例如,区域设置和编码)。如果不使用该选项,这些数据库将保留其现有的数据库级别属性以及任何预先存在的对象。
如果指定了 --statistics
,pg_dumpall
将在生成的转储文件中包含大多数优化器统计信息。但是,某些统计信息可能不会包含,例如使用 CREATE STATISTICS 显式创建的统计信息或扩展添加的自定义统计信息。因此,在从转储文件恢复后,对每个数据库运行 ANALYZE
以确保最佳性能可能很有用。您还可以运行 vacuumdb -a -z
来分析所有数据库。
转储脚本不应期望完全无错误地运行。特别是,由于脚本将为源集群中存在的每个角色发出 CREATE ROLE
,因此除非目标集群使用不同的引导超级用户名称进行了初始化,否则它一定会遇到“角色已存在”错误。此错误无害,应忽略。使用 --clean
选项可能会产生有关不存在对象的其他无害错误消息,尽管您可以通过添加 --if-exists
来尽量减少这些消息。
pg_dumpall 在恢复之前需要所有必需的表空间目录都存在;否则,非默认位置的数据库创建将失败。
在从 pg_dumpall 脚本恢复数据库时,通常建议使用 -X
(--no-psqlrc
)选项,以确保干净的恢复过程并防止与非默认 psql 配置发生潜在冲突。此外,由于 pg_dumpall 脚本可能包含 psql 元命令,因此它可能与 psql 以外的客户端不兼容。
转储所有数据库
$
pg_dumpall > db.out
要从该文件恢复数据库,您可以使用
$
psql -X -f db.out -d postgres
连接到哪个数据库在此处并不重要,因为 pg_dumpall 创建的脚本文件将包含创建和连接到已保存数据库的适当命令。一个例外是,如果您指定了 --clean
,您必须最初连接到 postgres
数据库;脚本将立即尝试删除其他数据库,而这对于您正在连接的数据库将失败。
有关可能的错误条件,请参阅 pg_dump。
如果您在文档中看到任何不正确、与您对特定功能的使用经验不符或需要进一步阐明的内容,请使用 此表单 报告文档问题。