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=filename
指定一个从中读取要从转储中排除的数据库模式的文件名。模式的解释根据与 --exclude-database
相同的规则进行。要从 STDIN
中读取,请使用 -
作为文件名。可将 --filter
选项与 --exclude-database
结合使用以排除数据库,还可以指定多次以使用多个筛选器文件。
该文件每行列出一个数据库模式,如下所示
exclude database PATTERN
以 #
开头的行被视为注释并被忽略。注释也可以置于对象模式行之后。空行也被忽略。有关如何在模式中执行引用的信息,请参见 模式。
-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
阻止转储访问权限(授予/撤销命令)。
--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=pattern
不转储名称与 pattern
匹配的数据库。可以通过编写多个 --exclude-database
开关来排除多个模式。pattern
参数会被解释为一个模式,规则与 psql 的 \d
命令所用的规则相同(参见 Patterns),因此也可以通过在模式中编写通配符来排除多个数据库。在使用通配符时,注意对模式进行引号处理(如果需要),以防止 shell 通配符扩展。
--extra-float-digits=ndigits
转储浮点数据时,使用指定的 extra_float_digits 值,而不是最大可用精度。出于备份目的进行的常规转储不应使用此项。
--if-exists
使用 DROP ... IF EXISTS
命令丢弃 --clean
模式中的对象。这将禁止可能被报告的 “does not exist” 错误。此选项仅在同时指定 --clean
时有效。
--inserts
将数据转储为 INSERT
命令(而不是 COPY
)。这将使恢复变得非常缓慢;它主要用于制作可加载到非-PostgreSQL 数据库中的转储。请注意,如果您重新排列了列的顺序,恢复可能会完全失败。 --column-inserts
选项更安全,但速度更慢。
--load-via-partition-root
为表分区转储数据时,使 COPY
或 INSERT
语句将包含它的分区层次结构的根设为目标,而不是分区本身。当数据加载时,这会导致为每行重新确定适当的分区。当在行不总是属于与在原始服务器上相同的分区时服务器上恢复数据时,这可能有用。例如,如果分区列为 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
将 ON CONFLICT DO NOTHING
添加到 INSERT
命令。除非还指定了 --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=role名称
指定要用于创建转储的角色名称。此选项会使 pg_dumpall 在连接到数据库后发出 SET ROLE
role名称
命令。当经过验证的用户(由 -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
,如果目标集群未使用不同的 bootstrap 超级用户名称初始化,则肯定会收到 “角色已存在” 错误。此错误无害,可以忽略。使用 --clean
选项可能会产生其他关于不存在对象的无害错误消息,尽管您可以通过添加 --if-exists
来尽可能减少这些错误消息。
pg_dumpall 要求所有需要的表空间目录在还原之前已存在;否则,默认位置中以外的数据库创建将会失败。
要转储所有数据库
$
pg_dumpall > db.out
要从此文件中还原数据库,可以使用
$
psql -f db.out postgres
在此连接到哪个数据库并不重要,因为 pg_dumpall 创建的脚本文件将包含创建和连接到已保存数据库的适当命令。例外情况是如果您指定了 --clean
,则必须最初连接到 postgres
数据库;该脚本会尝试立即删除其他数据库,而这对于您连接到的数据库将会失败。
查看 pg_dump 以了解有关可能的错误条件的详细信息。