On this page
pg_dumpall
pg_dumpall —将 PostgreSQL 数据库集群提取到脚本文件中
Synopsis
pg_dumpall
[ connection-option
...] [ option
...]
Description
pg_dumpall 是一个 Util,用于将集群的所有 PostgreSQL 数据库写出(“转储”)到一个脚本文件中。该脚本文件包含可以用作psql的 Importing 以还原数据库的 SQL 命令。它通过为集群中的每个数据库调用pg_dump来实现。 pg_dumpall 还转储所有数据库通用的全局对象。 (pg_dump 不会保存这些对象.)当前包括有关数据库用户和组,表空间以及属性(例如,应用于整个数据库的访问权限)的信息。
由于 pg_dumpall 从所有数据库读取表,因此您很可能必须以数据库超级用户身份连接才能产生完整的转储。同样,您将需要超级用户特权才能执行保存的脚本,以便被允许添加用户和组以及创建数据库。
SQL 脚本将被写入标准输出。使用-f
/--file
选项或 Shell 运算符将其重定向到文件中。
pg_dumpall 需要多次连接到 PostgreSQL 服务器(每个数据库一次)。如果您使用密码验证,则每次都会要求 Importing 密码。在这种情况下,拥有~/.pgpass
文件很方便。有关更多信息,请参见Section 33.15。
Options
以下命令行选项控制输出的内容和格式。
-a
--data-only
- 仅转储数据,而不转储模式(数据定义)。
-c
--clean
- 包括 SQL 命令以在重新创建数据库之前清理(删除)数据库。还将添加用于角色和表空间的
DROP
命令。
- 包括 SQL 命令以在重新创建数据库之前清理(删除)数据库。还将添加用于角色和表空间的
-f filename
--file=filename
- 将输出发送到指定文件。如果省略,则使用标准输出。
-g
--globals-only
- 仅转储全局对象(角色和表空间),而不转储数据库。
-o
--oids
- 转储对象标识符(OID)作为每个表的数据的一部分。如果您的应用程序以某种方式(例如,以外键约束)引用 OID 列,请使用此选项。否则,不应使用此选项。
-O
--no-owner
- 不要输出命令来设置对象的所有权以匹配原始数据库。默认情况下,pg_dumpall 发出
ALTER OWNER
或SET SESSION AUTHORIZATION
语句以设置所创建模式元素的所有权。除非由超级用户(或拥有脚本中所有对象的同一用户)启动脚本,否则运行脚本时这些语句将失败。要使脚本可以被任何用户还原,但将赋予该用户所有对象的所有权,请指定-O
。
- 不要输出命令来设置对象的所有权以匹配原始数据库。默认情况下,pg_dumpall 发出
-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
- 此选项供就地升级 Util 使用。不建议或不支持将其用于其他目的。该选项的行为在将来的版本中可能会更改,恕不另行通知。
--column-inserts
--attribute-inserts
- 将数据作为具有明确列名(
INSERT INTO table (column, ...) VALUES ...
)的INSERT
命令转储。这会使恢复非常缓慢。它主要用于制作可以装入非 PostgreSQL 数据库的转储。
- 将数据作为具有明确列名(
--disable-dollar-quoting
- 此选项禁止对函数体使用美元引号,并强制使用 SQL 标准字符串语法对其进行引号。
--disable-triggers
- 仅当创建仅数据转储时,此选项才相关。它指示 pg_dumpall 包含一些命令,以在重新加载数据时临时禁用目标表上的触发器。如果对数据重新加载期间不想调用的表具有参照完整性检查或其他触发器,请使用此选项。
当前,必须以超级用户身份执行为--disable-triggers
发出的命令。因此,您还应该使用-S
指定超级用户名,或者最好小心地以超级用户身份启动生成的脚本。
--if-exists
- 使用条件命令(即添加
IF EXISTS
子句)来清理数据库和其他对象。除非也指定了--clean
,否则此选项无效。
- 使用条件命令(即添加
--inserts
- 将数据转储为
INSERT
个命令(而不是COPY
)。这会使恢复非常缓慢。它主要用于制作可以装入非 PostgreSQL 数据库的转储。请注意,如果您重新排列了列 Sequences,则还原可能会完全失败。--column-inserts
选项更安全,但更慢。
- 将数据转储为
--lock-wait-timeout=timeout
- 不要在转储开始时永远 await 获取共享表锁。相反,如果无法锁定指定*
timeout
*中的表,则失败。可以以SET statement_timeout
接受的任何格式指定超时。允许的值根据要从其转储的服务器版本而有所不同,但是从 7.3 开始,所有版本都接受整数毫秒。从 7.3 之前的服务器中转储时,将忽略此选项。
- 不要在转储开始时永远 await 获取共享表锁。相反,如果无法锁定指定*
--no-publications
- 不要转储出版物。
--no-role-passwords
- 不要转储角色的密码。还原后,角色将具有空密码,并且密码验证将始终失败,直到设置了密码。由于指定此选项时不需要密码值,因此将从目录视图
pg_roles
而不是pg_authid
中读取角色信息。因此,如果通过某些安全策略限制对pg_authid
的访问,此选项也将有所帮助。
- 不要转储角色的密码。还原后,角色将具有空密码,并且密码验证将始终失败,直到设置了密码。由于指定此选项时不需要密码值,因此将从目录视图
--no-security-labels
- 不要丢弃安全标签。
--no-subscriptions
- 不要转储订阅。
--no-sync
- 默认情况下,
pg_dumpall
将 await 所有文件安全地写入磁盘。此选项使pg_dumpall
不 await 就返回,这更快,但是这意味着随后的 os 崩溃可能会使转储损坏。通常,此选项对于测试很有用,但在从生产安装中转储数据时不应使用。
- 默认情况下,
--no-tablespaces
- 不要输出用于创建表空间的命令,也不要为对象选择表空间。使用此选项,将在还原期间的默认表空间中创建所有对象。
--no-unlogged-table-data
- 不要转储未记录表的内容。此选项对是否转储表定义(模式)没有影响。它仅禁止转储表数据。
--quote-all-identifiers
- 强制引用所有标识符。当从 PostgreSQL 主版本不同于 pg_dumpall 的服务器中转储数据库时,或者打算将输出加载到不同主版本的服务器中时,建议使用此选项。默认情况下,pg_dumpall 仅引用在其主版本中为保留字的标识符。在处理其他版本的保留字可能略有不同的服务器时,有时会导致兼容性问题。使用
--quote-all-identifiers
可以防止此类问题,但代价是难以阅读的转储脚本。
- 强制引用所有标识符。当从 PostgreSQL 主版本不同于 pg_dumpall 的服务器中转储数据库时,或者打算将输出加载到不同主版本的服务器中时,建议使用此选项。默认情况下,pg_dumpall 仅引用在其主版本中为保留字的标识符。在处理其他版本的保留字可能略有不同的服务器时,有时会导致兼容性问题。使用
--use-set-session-authorization
- 输出 SQL 标准的
SET SESSION AUTHORIZATION
命令而不是ALTER OWNER
命令来确定对象所有权。这使转储与更多标准兼容,但是根据转储中对象的历史记录,可能无法正确还原。
- 输出 SQL 标准的
-?
--help
- 显示有关 pg_dumpall 命令行参数的帮助,然后退出。
以下命令行选项控制数据库连接参数。
-d connstr
--dbname=connstr
- 指定用于连接到服务器的参数,作为连接字符串。有关更多信息,请参见Section 33.1.1。
为了与其他 Client 端应用程序保持一致,该选项称为--dbname
,但是由于 pg_dumpall 需要连接到许多数据库,因此连接字符串中的数据库名称将被忽略。使用-l
选项可指定用于转储全局对象并发现应转储其他数据库的数据库的名称。
-h host
--host=host
- 指定运行数据库服务器的计算机的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值来自
PGHOST
环境变量(如果已设置),否则尝试 Unix 域套接字连接。
- 指定运行数据库服务器的计算机的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值来自
-l dbname
--database=dbname
- 指定用于转储全局对象并发现应转储其他数据库的数据库的名称。如果未指定,将使用
postgres
数据库,如果不存在,将使用template1
。
- 指定用于转储全局对象并发现应转储其他数据库的数据库的名称。如果未指定,将使用
-p port
--port=port
- 指定服务器正在侦听连接的 TCP 端口或本地 Unix 域套接字文件 extensions。默认值是
PGPORT
环境变量(如果已设置)或已编译的默认值。
- 指定服务器正在侦听连接的 TCP 端口或本地 Unix 域套接字文件 extensions。默认值是
-U username
--username=username
- 连接的用户名。
-w
--no-password
- 切勿发出密码提示。如果服务器要求密码验证,而其他方式(例如
.pgpass
文件)无法使用密码,则连接尝试将失败。该选项在没有用户 Importing 密码的批处理作业和脚本中很有用。
- 切勿发出密码提示。如果服务器要求密码验证,而其他方式(例如
-W
--password
- 强制 pg_dumpall 在连接数据库之前提示 Importing 密码。
这个选项从来都不是必须的,因为如果服务器要求密码认证,pg_dumpall 将自动提示 Importing 密码。但是,pg_dumpall 将浪费连接尝试,以发现服务器需要密码。在某些情况下,值得 Importing-W
以避免额外的连接尝试。
请注意,对于每个要转储的数据库,都会再次出现密码提示。通常,设置~/.pgpass
文件比依靠手动密码 Importing 更好。
--role=rolename
- 指定用于创建转储的角色名称。此选项使 pg_dumpall 在连接到数据库后发出
SET ROLE
*rolename
*命令。当经过身份验证的用户(由-U
指定)缺少 pg_dumpall 所需的特权但可以切换到具有所需权限的角色时,此功能很有用。某些安装具有禁止直接以超级用户身份登录的策略,并且使用此选项可以在不违反策略的情况下进行转储。
- 指定用于创建转储的角色名称。此选项使 pg_dumpall 在连接到数据库后发出
Environment
PGHOST
PGOPTIONS
PGPORT
PGUSER
- 默认连接参数
与大多数其他 PostgreSQLUtil 一样,该 Util 也使用 libpq 支持的环境变量(请参见Section 33.14)。
Notes
由于 pg_dumpall 内部调用 pg_dump,因此某些诊断消息将引用 pg_dump。
恢复后,明智的做法是在每个数据库上运行ANALYZE
,以便优化器具有有用的统计信息。您也可以运行vacuumdb -a -z
分析所有数据库。
pg_dumpall 要求所有需要的表空间目录在还原之前都存在。否则,对于非默认位置的数据库,数据库创建将失败。
Examples
要转储所有数据库:
$ pg_dumpall > db.out
要从此文件重新加载数据库,可以使用:
$ psql -f db.out postgres
(在这里连接哪个数据库并不重要,因为 pg_dumpall 创建的脚本文件将包含创建和连接到保存的数据库的适当命令.)
See Also
检查pg_dump以获取有关可能的错误情况的详细信息。