PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

pg_dumpall

pg_dumpall — 把一个 PostgreSQL 数据库集群抽取为一个脚本文件

Synopsis

pg_dumpall [connection-option...] [option...]

描述

pg_dumpall 是一个用于写出(“转储”)一个集群中所有 PostgreSQL 数据库、并把它们写入同一个脚本文件的工具。该脚本文件包含 SQL 命令,这些命令可以作为 psql 的输入来恢复这些数据库。它通过对集群中的每一个数据库调用 pg_dump 来做到这一点。pg_dumpall 还会转储所有数据库共有的全局对象,即数据库角色、表空间以及针对配置参数的特权授权。(pg_dump 并不保存这些对象。)

由于 pg_dumpall 会从所有数据库中读取表,你很可能必须以一个数据库超级用户的身份进行连接,才能产生一个完整的转储。另外,你还需要超级用户特权来执行保存下来的脚本,这样才能被允许添加角色和创建数据库。

SQL 脚本将被写到标准输出。可以使用 -f/--file 选项或者 shell 操作符把它重定向到一个文件中。

pg_dumpall 需要多次连接到 PostgreSQL 服务器(每个数据库一次)。如果你使用密码认证,它每次都会要求输入密码。在这种情况下,拥有一个 ~/.pgpass 文件会很方便。详见 Section 32.16。

Warning

恢复一个转储会导致目标端执行由源端超级用户选择的任意代码。部分转储和部分恢复并不能限制这一点。如果源端超级用户不可信,则必须在恢复之前检查被转储的 SQL 语句。注意,运行转储和恢复的客户端不必信任源端或目标端的超级用户。

选项

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

-a
--data-only

只转储数据,不转储模式(数据定义)或统计信息。

-c
--clean

发出 SQL 命令先 DROP 所有被转储的数据库、角色和表空间,然后再重建它们。当恢复操作要覆盖一个现有的集群时,这个选项很有用。如果某些对象在目标集群中不存在,那么在恢复期间将会报告可忽略的错误消息,除非同时指定了 --if-exists。

-E encoding
--encoding=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 table (column, ...) VALUES ...)的形式转储数据。这会让恢复变得非常慢;它主要用于制作能够被载入到非 PostgreSQL 数据库的转储。

--disable-dollar-quoting

这个选项禁用对函数体使用美元符引用,并强制它们使用 SQL 标准字符串语法来引用。

--disable-triggers

只有在创建带有数据但没有模式的转储时,这个选项才相关。它指示 pg_dumpall 包含在数据被恢复期间临时禁用目标表上触发器的命令。如果你不希望在数据恢复期间调用表上的引用完整性检查或其他触发器,就使用这个选项。

目前,为 --disable-triggers 发出的命令必须以超级用户身份完成。因此,你还应该用 -S 指定一个超级用户名,或者最好小心地以超级用户身份启动产生的脚本。

--exclude-database=pattern

不转储名称匹配 pattern 的数据库。可以通过编写多个 --exclude-database 开关来排除多个模式。pattern 参数会按照 psql 的 \d 命令所使用的相同规则被解释为一个模式(参见 Patterns),因此也可以通过在模式中编写通配符来排除多个数据库。使用通配符时,如需防止 shell 展开通配符,请小心地对模式加上引号。

--extra-float-digits=ndigits

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

--filter=filename

指定一个文件名,从该文件中读取用于把数据库排除在转储之外的模式。这些模式按照与 --exclude-database 相同的规则进行解释。要从 STDIN 读取,可以使用 - 作为文件名。--filter 选项可以与 --exclude-database 一起指定用于排除数据库,并且可以为多个过滤文件多次指定该选项。

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

exclude database PATTERN

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

--if-exists

使用 DROP ... IF EXISTS 命令在 --clean 模式中删除对象。这会抑制可能会被报告的“不存在”错误。除非同时指定了 --clean,否则这个选项无效。

--inserts

以 INSERT 命令(而不是 COPY)的形式转储数据。这会让恢复变得非常慢;它主要用于制作能够被载入到非 PostgreSQL 数据库的转储。注意,如果你重新排列过列的顺序,恢复可能会完全失败。--column-inserts 选项更安全,不过也更慢。

--load-via-partition-root

在为一个表分区转储数据时,让 COPY 或 INSERT 语句以包含该分区的分区层次的根为目标,而不是以该分区本身为目标。这会导致在数据被载入时为每一行重新确定合适的分区。当在一个行并不总是落入与原服务器相同分区的服务器上恢复数据时,这可能有用。例如,如果分区列是 text 类型,并且两个系统对用于排序分区列的排序规则有不同的定义,就可能会发生这种情况。

--lock-wait-timeout=timeout

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

--no-comments

不转储 COMMENT 命令。

--no-data

不转储数据。

--no-policies

不转储行安全策略。

--no-publications

不转储发布。

--no-role-passwords

不转储角色的密码。恢复之后,角色将拥有一个空密码,并且在密码被设置之前,密码认证总是会失败。由于指定这个选项时不需要密码值,角色信息会从目录视图 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

不转储非日志表的内容。这个选项对是否转储表定义(模式)没有影响;它只抑制对表数据的转储。

--on-conflict-do-nothing

把 ON CONFLICT DO NOTHING 加到 INSERT 命令中。除非同时指定了 --inserts 或 --column-inserts,否则这个选项无效。

--quote-all-identifiers

强制给所有标识符加上引号。当从一个 PostgreSQL 大版本与 pg_dumpall 不同的服务器转储数据库时,或者当输出打算被载入到一个不同大版本的服务器时,推荐使用这个选项。默认情况下,pg_dumpall 只对在它自己大版本中属于保留字的标识符加引号。在处理可能具有略微不同保留字集合的其他版本的服务器时,这有时会导致兼容性问题。使用 --quote-all-identifiers 可以避免这类问题,但代价是转储脚本更难阅读。

--restrict-key=restrict_key

把提供的字符串用作转储输出中 psql 的 \restrict 键。如果没有指定 restrict 键,pg_dumpall 会根据需要生成一个随机的键。键只能包含字母数字字符。

这个选项主要用于测试目的以及其他需要可重复输出的场景(例如比较转储文件)。不建议一般性使用,因为预先知道该键的恶意服务器可能能够注入任意代码,这些代码将在运行 psql 处理转储输出的机器上被执行。

--rows-per-insert=nrows

以 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

指定用于连接到服务器的参数,形式是一个 connection string;这些参数将覆盖任何与之冲突的命令行选项。

为了与其他客户端应用保持一致,这个选项被命名为 --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 支持的环境变量(参见 Section 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 要求所有所需的表空间目录在恢复之前就已存在;否则,位于非默认位置中的数据库的创建将会失败。

一般建议在使用 -X(--no-psqlrc)选项的情况下从一个 pg_dumpall 脚本恢复数据库,以确保干净的恢复过程并避免与非默认 psql 配置的潜在冲突。此外,由于 pg_dumpall 脚本可能包含 psql 元命令,它可能与 psql 之外的其他客户端不兼容。

示例

转储所有数据库:

$ pg_dumpall > db.out

要从这个文件恢复数据库,可以使用:

$ psql -X -f db.out -d postgres

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

另请参阅

有关可能的错误情况的详情,请查看 pg_dump。