pg_dump
pg_dump — extract a PostgreSQL database into a script file or other archive file
大纲
pg_dump [options...] [dbname]
描述
pg_dump 是一个把 PostgreSQL 数据库保存为脚本或归档文件的工具。脚本文件是纯文本格式,包含把数据库重建为保存时状态所需的 SQL 命令。要恢复这些脚本,可以使用psql。稍加修改后,它们甚至可以用于在其他机器和其他架构上重建数据库,甚至用于其他 SQL 数据库产品。
此外,还有另外几种归档文件格式,用于配合pg_restore重建数据库,它们还允许 pg_restore 有选择地恢复部分内容,甚至在恢复之前对条目重新排序。归档文件的设计也使其可以跨架构移植。
pg_dump 会保存重新生成所有用户定义类型、函数、表、索引、聚合和操作符所需的信息。此外,所有数据都以文本格式复制出来,因此既可以方便地重新复制进去,也可以导入编辑工具。
与某种归档文件格式结合并配合
pg_restore 使用时,pg_dump
提供了一种灵活的归档和传输机制。可以用
pg_dump 备份整个数据库,然后用
pg_restore
检查归档和/或选择要恢复数据库的哪些部分。最灵活的输出文件格式是“custom”格式(-Fc)。它允许选择和重新排序所有归档条目,并且默认进行压缩。tar 格式(-Ft)不压缩,而且在装载时无法重新排序数据,但除此之外相当灵活;此外,它可以用其他工具(如
tar)来处理。
在运行 pg_dump
时,应当检查输出中是否有任何警告(打印在标准错误上),尤其是考虑到下面列出的限制。
即使数据库正在被并发使用,pg_dump 也能做出一致的备份。pg_dump 不会阻塞其他用户访问数据库(读或写)。
选项
下面的命令行选项用于控制输出格式。
dbname指定要转储的数据库名称。如果未指定,则使用环境变量
PGDATABASE。如果未设置该变量,则使用为连接指定的用户名。-a--data-only只转储数据,不转储模式(数据定义)。
此选项只对纯文本格式有意义。对于其他格式,可以在调用
pg_restore时指定该选项。-b--blobs在转储中包含大对象。
-c--clean输出在创建数据库对象(的命令)之前先清除(删除)它们的命令。
此选项只对纯文本格式有意义。对于其他格式,可以在调用
pg_restore时指定该选项。-C--create让输出以创建数据库本身并重新连接到新建数据库的命令开始。(使用这种形式的脚本时,在运行脚本之前连接到哪个数据库无关紧要。)
此选项只对纯文本格式有意义。对于其他格式,可以在调用
pg_restore时指定该选项。-d--inserts将数据转储为
INSERT命令(而不是COPY)。这会使恢复变得非常缓慢,但它使归档更容易移植到其他 SQL 数据库软件包。-D--column-inserts--attribute-inserts将数据转储为带有显式列名的
INSERT命令(INSERT INTO)。这会使恢复变得非常缓慢,但如果你想要重新排列列顺序,它是必需的。table(column, ...) VALUES ...-ffile--file=file把输出发送到指定的文件。如果省略,则使用标准输出。
-Fformat--format=format选择输出的格式。
format可以是下列之一:- p
输出纯文本 SQL 脚本文件(默认)
- t
输出一个适合输入到 pg_restore 的
tar归档。使用这种归档格式,允许在恢复数据库时重新排序和/或排除模式元素,还可以限制恢复时重新装载哪些数据。- c
输出一个适合输入到 pg_restore 的自定义归档。这是最灵活的格式,因为它既允许重新排序模式元素,也允许重新排序数据装载。这种格式默认还会压缩。
-i--ignore-version忽略 pg_dump 与数据库服务器之间的版本不匹配。
pg_dump 可以处理以前版本的 PostgreSQL 的数据库,但非常旧的版本不再受支持(目前是 7.0 之前)。如果你需要忽略版本检查,可以使用此选项(如果 pg_dump 因此而失败,可别怪没警告过你)。
-o--oids为每个表转储对象标识符(OID)。如果你的应用程序以某种方式引用 OID 列(例如在外键约束中),请使用此选项。否则不应使用此选项。
-O--no-owner不输出用于把对象所有权设置成与原始数据库一致的命令。通常,pg_dump 会发出(psql 特有的)
\connect语句来设置模式元素的所有权。另见-R和-X use-set-session-authorization下的说明。注意-O并不能阻止所有到数据库的重新连接,只能阻止那些专门用于调整所有权的重连。此选项只对纯文本格式有意义。对于其他格式,可以在调用
pg_restore时指定该选项。-R--no-reconnect禁止 pg_dump 输出在恢复期间需要重新连接数据库的脚本。通常的恢复脚本往往要以不同的用户身份重新连接若干次,以设置对象的原始所有权。这个选项是个相当生硬的工具,因为它会使 pg_dump 丢失这些所有权信息,除非你使用
-X use-set-session-authorization选项。恢复期间不希望重新连接的一个可能原因是:访问数据库需要人工交互(例如密码)。
此选项只对纯文本格式有意义。对于其他格式,可以在调用
pg_restore时指定该选项。-s--schema-only只转储模式(数据定义),不转储数据。
-Susername--superuser=username指定在禁用触发器时要使用的超级用户名。这只在使用
--disable-triggers时相关。(通常最好指定--use-set-session-authorization,然后以超级用户身份运行生成的脚本。)-ttable--table=table只转储
table的数据。-v--verbose指定详细模式。这会使 pg_dump 把进度消息打印到标准错误。
-x--no-privileges--no-acl不转储访问权限(grant/revoke 命令)。
-X use-set-session-authorization--use-set-session-authorization通常,如果 pg_dump 生成的(纯文本模式)脚本必须更改当前数据库用户(例如为了设置正确的对象所有权),它会使用 psql 的
\connect命令。这条命令实际上会打开一个新的连接,这可能需要人工交互(例如密码)。如果使用-X use-set-session-authorization选项,pg_dump 将改为输出SET SESSION AUTHORIZATION命令。这效果相同,但它要求从生成的脚本恢复数据库的用户是数据库超级用户。此选项实际上会覆盖-R选项。由于SET SESSION AUTHORIZATION是标准的 SQL 命令,而
\connect只在 psql 中有效,此选项还能提高输出脚本理论上的可移植性。此选项只对纯文本格式有意义。对于其他格式,可以在调用
pg_restore时指定该选项。-X disable-triggers--disable-triggers此选项只在创建只包含数据的转储时才相关。它指示 pg_dump 在输出中包含一些命令,以便在重新装载数据时临时禁用目标表上的触发器。如果这些表上存在不希望在数据重新装载期间触发的引用完整性检查或其他触发器,请使用此选项。
目前,为
--disable-triggers输出的这些命令必须由超级用户执行。因此,还应通过-S指定一个超级用户名,或者更好的做法是指定--use-set-session-authorization然后谨慎地以超级用户身份运行生成的脚本。如果这两个选项都不给,整个脚本都必须以超级用户身份运行。此选项只对纯文本格式有意义。对于其他格式,可以在调用
pg_restore时指定该选项。-Z0..9--compress=0..9指定在支持压缩的归档格式中所用的压缩级别(目前只有自定义归档格式支持压缩)。
下面的命令行选项控制数据库连接参数。
-hhost--host=host指定运行服务器的机器的主机名。如果 host 以斜杠开头,则将其用作 Unix 域套接字的目录。
-pport--port=port指定服务器正在监听连接的 Internet TCP/IP 端口,或本地 Unix 域套接字文件扩展名。端口号默认为 5432,或
PGPORT环境变量的值(如果已设置)。-Uusername以给定用户身份连接。
-W强制提示输入密码。如果服务器要求密码认证,这一步本应自动发生。
长选项形式只在某些平台上可用。
环境
PGDATABASEPGHOSTPGPORTPGUSER默认连接参数
诊断
Connection to database 'template1' failed.
connectDBStart() -- connect() failed: No such file or directory
Is the postmaster running locally
and accepting connections on Unix socket '/tmp/.s.PGSQL.5432'?pg_dump 无法连接到指定主机和端口上的 PostgreSQL 服务器。如果你看到这条消息,请确保服务器运行在正确的主机上,并且你指定了正确的端口。
注意
pg_dump 内部执行
SELECT 语句。如果在运行
pg_dump 时遇到问题,请确保你能够使用例如psql从数据库中选择信息。
注意
如果你的安装对 template1 数据库有任何本地新增内容,请务必把 pg_dump 的输出恢复到一个真正空的数据库中;否则可能会因为新增对象的重复定义而出错。要创建一个没有任何本地新增内容的空数据库,应从 template0 而不是 template1 复制,例如:
CREATE DATABASE foo WITH TEMPLATE template0;
pg_dump 有一些限制:
在转储单个表或以纯文本转储时,pg_dump 不处理大对象。必须使用某种二进制归档格式对大对象进行完整转储。
在进行只转储数据的转储时,pg_dump 会在插入数据之前发出禁用用户表上触发器的查询,并在数据插入完成后发出重新启用它们的查询。如果恢复在中途中止,系统目录可能会处于错误状态。
tar 归档的成员大小限制为小于 8 GB。(这是 tar 文件格式的固有限制。)因此,如果某个表的文本表示超过该大小,就不能使用这种格式。tar 归档和其他任何输出格式的总大小不受限制(操作系统可能除外)。
例子
要转储一个数据库:
$pg_dump mydb > db.out
要重新装载这个数据库:
$psql -d database -f db.out
要把一个包含大对象的名为 mydb 的数据库转储到一个
tar 文件:
$pg_dump -Ft -b mydb > db.tar
要把这个数据库(连同大对象)重新装载到一个已存在的名为
newdb 的数据库:
$pg_restore -d newdb db.tar
历史
pg_dump 工具最早出现在
Postgres95 发行版 0.02
中。非纯文本输出格式是在
PostgreSQL 发行版 7.1 中引入的。