pg_dumpall — 将一个PostgreSQL数据库集簇抽取到一个脚本文件中
pg_dumpall
[connection-option
...] [option
...]
pg_dumpall工具可以一个集簇中所有的PostgreSQL数据库写出到(“转储”)一个脚本文件。该脚本文件包含可以用作psql的输入SQL命令来恢复数据库。它会对集簇中的每个数据库调用pg_dump来完成该工作。pg_dumpall还转储对所有数据库公用的全局对象(pg_dump不保存这些对象)。 目前这包括适数据库用户和组、表空间以及适合所有数据库的访问权限等属性。
因为pg_dumpall从所有数据库中读取表,所以你很可能需要以一个数据库超级用户的身份连接以便生成完整的转储。同样,你也需要超级用户特权执行保存下来的脚本,这样才能增加用户和组以及创建数据库。
SQL 脚本将被写出到标准输出。使用 [-f|file] 选项或者 shell 操作符可以把它重定向到一个文件。
pg_dumpall需要多次连接到PostgreSQL服务器(每个数据库一次)。如果你使用口令认证,可能每次都会要求口令。这种情况下使用一个~/.pgpass
会比较方便。详见第 33.15 节。
下列命令行选项用于控制输出的内容和格式。
-a
--data-only
只转储数据,不转储模式(数据定义)。
-c
--clean
包括在重建数据库之前清除(移除)它们的 SQL 命令。角色和表空间的DROP
命令也会被加入进来。
-f filename
--file=filename
将输出发送到指定的文件中。如果省略,将使用标准输出。
-g
--globals-only
只转储全局对象(角色和表空间),而不转储数据库。
-o
--oids
将对象标识符(OID)转储为数据的一部分。如果你的应用以某种方式引用OID列(例如在外键约束中),请使用这个选项。否则不应该使用这个选项。
-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
指定一个超级用户名,或者宁可作为一个超级用户启动结果脚本。
--if-exists
时间条件性命令(即增加一个IF EXISTS
子句)来清除数据库和其他对象。
只有同时指定了--clean
时,这个选项才可用。
--inserts
将数据转储为INSERT
命令(而不是COPY
)。这将使得恢复非常慢,这主要用于使转储能够被载入到非PostgreSQL数据库中。注意如果你已经重新安排了列序,该恢复可能会一起失败。--column-inserts
选项对于列序改变是安全的,但是会更慢。
--lock-wait-timeout=timeout
在转储的开始从不等待共享表锁的获得。而是在指定的timeout
内不能锁定一个表时失败。超时时长可以用SET statement_timeout
接受的任何格式指定(允许的值根据你从其转出的服务器版本变化,但是从 7.3 以来的所有版本都接受一个整数表示的毫秒数。如果从 7.3 以前的服务器转出,这个选项会被忽略。)。
--no-publications
不转储发布。
--no-role-passwords
不要为角色转储密码。恢复时,角色将具有空密码,并且在设置密码之前密码验证将始终失败。
由于指定此选项时不需要密码值,因此将从目录视图pg_roles
中读取角色信息,而不是从pg_authid
中读取角色信息。
因此,如果访问pg_authid
受到某些安全策略的限制,
该选项也会有所帮助。
--no-security-labels
不转储安全标签。
--no-subscriptions
不转储订阅。
--no-sync
默认情况下,pg_dumpall
将等待所有文件安全写入磁盘。
这个选项会导致pg_dumpall
无需等待而返回,这更快,
但意味着后续的操作系统崩溃可能会导致转储损坏。通常,此选项对于测试非常有用,
但在从生产安装中转储数据时不应使用此选项。
--no-tablespaces
不要输出选择表空间的命令。通过这个选项,在恢复期间所有的对象都会被创建在任何作为默认的表空间中。
--no-unlogged-table-data
不转储非日志记录表的内容。这个选项对于表定义(模式)是否被转储没有影响,它只会限制转储表数据。
--quote-all-identifiers
强制引用所有标识符。在从一个与pg_dumpall主版本不同的PostgreSQL服务器转储数据库时或者要将输出载入到一个不同主版本的服务器时,推荐使用这个选项。默认情况下,pg_dumpall只会对为其主版本中保留词的标识符加上引号。在与其他版本的具有不同保留词集合的服务器交互时,这有时会导致兼容性问题。使用--quote-all-identifiers
可以阻止这类问题,但是代价是转储脚本会更加难读。
--use-set-session-authorization
输出 SQL-标准的SET SESSION AUTHORIZATION
命令取代ALTER OWNER
命令来确定对象的所有关系。这让该转储更加兼容标准,但是取决于该转储中对象的历史,该转储可能无法正常恢复。
-?
--help
显示有关pg_dumpall命令行参数的帮助并退出。
下列命令行选项控制数据库连接参数。
-d connstr
--dbname=connstr
以一个连接字符串的形式,指定用来连接到服务器的参数。详见第 33.1.1 节。
这个选项被称为--dbname
是为了和其他客户端应用一致,但是因为pg_dumpall需要连接多个数据库,连接字符串中的数据库名将被忽略。使用-l
选项指定一个数据库,该数据库被用来转储全局对象并且发现需要转储哪些其他数据库。
-h host
--host=host
指定服务器正在运行的机器的主机名。如果该值开始于一个斜线,它被用作一个 Unix 域套接字的目录。默认是从PGHOST
环境变量中取得(如果被设置),否则将尝试一次 Unix 域套接字连接。
-l dbname
--database=dbname
指定要连接到哪个数据库转储全局对象以及发现要转储哪些其他数据库。如果没有指定,将会使用postgres
数据库,如果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_dump在连接到数据库后发出一个SET ROLE
rolename
命令。当已认证用户(由-U
指定)缺少pg_dump所需的特权但是能够切换到一个具有所需权利的角色时,这个选项很有用。一些安装有针对直接作为超级用户登录的策略,使用这个选项可以让转储在不违反该策略的前提下完成。
因为pg_dumpall在内部调用pg_dump,所以, 一些诊断消息可以参考pg_dump。
一旦恢复,建议在每个数据库上运行ANALYZE
,这样优化器就可以得到有用的统计信息。你也可以运行vacuumdb -a -z
来分析所有数据库。
pg_dumpall要求所有需要的表空间目录在进行恢复之前就必须存在;否则,数据库创建就会由于在非默认位置创建数据库而失败。
要转储所有数据库:
$
pg_dumpall > db.out
要从这个文件重新载入数据库,你可以使用:
$
psql -f db.out postgres
(这里你连接哪一个数据库并不重要,因为由pg_dumpall创建的脚本将包含合适的命令来创建和连接到被保存的数据库)。
可能的错误情况请查看pg_dump。