↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

pg_dump

pg_dump — 把一个 PostgreSQL 数据库抽取到一个脚本文件或其他归档文件中

大纲

pg_dump [option...] [dbname]

描述

pg_dump 是一个用于备份 PostgreSQL 数据库的工具。即使在数据库被并发使用的情况下,它也能做出一致的备份。pg_dump 不会阻塞其他用户访问数据库(读或写)。

转储可以输出为脚本或归档文件格式。脚本文件是纯文本格式,包含把数据库重建为保存时状态所需的 SQL 命令。要恢复这些脚本,可以使用 psql。稍加修改后,它们甚至可以用于在其他机器和其他架构上重建数据库,甚至用于其他 SQL 数据库产品。

另一种归档文件格式用于配合 pg_restore 重建数据库,它们还允许 pg_restore 有选择地恢复部分内容,甚至在恢复之前对条目重新排序。归档文件的设计也使其可以跨架构移植。

与某种归档文件格式结合并配合 pg_restore 使用时,pg_dump 提供了一种灵活的归档和传输机制。可以用 pg_dump 备份整个数据库,然后用 pg_restore 检查归档和/或选择要恢复数据库的哪些部分。最灵活的输出文件格式是“custom”格式(-Fc)。它允许选择和重新排序所有归档条目,并且默认进行压缩。tar 格式(-Ft)不压缩,而且在装载时无法重新排序数据,但除此之外相当灵活;此外,它可以用其他工具(如 tar)来处理。

在运行 pg_dump 时,应当检查输出中是否有任何警告(打印在标准错误上),尤其是考虑到下面列出的限制。

选项

下面的命令行选项用于控制输出格式。

dbname

指定要转储的数据库名称。如果未指定,则使用环境变量 PGDATABASE。如果未设置该变量,则使用为连接指定的用户名。

-a
--data-only

只转储数据,不转储模式(数据定义)。

此选项只对纯文本格式有意义。对于其他格式,可以在调用 pg_restore 时指定该选项。

-b
--blobs

在转储中包含大对象。

-c
--clean

输出在创建数据库对象(的命令)之前先清除(删除)它们的命令。

此选项只对纯文本格式有意义。对于其他格式,可以在调用 pg_restore 时指定该选项。

-C
--create

让输出以创建数据库本身并重新连接到新建数据库的命令开始。(使用这种形式的脚本时,在运行脚本之前连接到哪个数据库无关紧要。)

此选项只对纯文本格式有意义。对于其他格式,可以在调用 pg_restore 时指定该选项。

-d
--inserts

将数据转储为 INSERT 命令(而不是 COPY)。这会使恢复变得非常缓慢;它主要用于生成可装载到非 PostgreSQL 数据库的转储。注意,如果重新排列了列顺序,恢复可能会完全失败。-D 选项更安全,不过也更慢。

-D
--column-inserts
--attribute-inserts

将数据转储为带有显式列名的 INSERT 命令(INSERT INTO table (column, ...) VALUES ...)。这会使恢复变得非常缓慢;它主要用于生成可装载到非 PostgreSQL 数据库的转储。

-f file
--file=file

把输出发送到指定的文件。如果省略,则使用标准输出。

-F format
--format=format

选择输出的格式。format可以是下列之一:

p

输出纯文本 SQL 脚本文件(默认)

t

输出一个适合输入到 pg_restore 的 tar 归档。使用这种归档格式,允许在恢复数据库时重新排序和/或排除模式元素,还可以限制恢复时重新装载哪些数据。

c

输出一个适合输入到 pg_restore 的自定义归档。这是最灵活的格式,因为它既允许重新排序模式元素,也允许重新排序数据装载。这种格式默认还会压缩。

-i
--ignore-version

忽略 pg_dump 与数据库服务器之间的版本不匹配。

pg_dump 可以处理以前版本的 PostgreSQL 的数据库,但非常旧的版本不再受支持(目前是 7.0 之前)。如果你需要忽略版本检查,可以使用此选项(如果 pg_dump 因此而失败,可别怪没警告过你)。

-n namespace
--schema=schema

只转储 schema 的内容。如果未指定此选项,将转储目标数据库中的所有非系统模式。

注意

在此模式下,pg_dump 不会尝试转储所选模式中的对象可能依赖的任何其他数据库对象。因此,不能保证单模式转储的结果能够单独成功地恢复到一个干净的数据库中。

-o
--oids

为每个表转储对象标识符(OID)。如果你的应用程序以某种方式引用 OID 列(例如在外键约束中),请使用此选项。否则不应使用此选项。

-O
--no-owner

不输出用于把对象所有权设置成与原始数据库一致的命令。默认情况下,pg_dump 会发出 SET SESSION AUTHORIZATION 语句来设置所创建模式元素的所有权。除非脚本由超级用户(或拥有脚本中所有对象的同一用户)启动,否则这些语句会在运行脚本时报错。若要创建一个可由任何用户恢复、但让该用户拥有所有对象的脚本,可以指定 -O。

此选项只对纯文本格式有意义。对于其他格式,可以在调用 pg_restore 时指定该选项。

-R
--no-reconnect

这个选项已经过时,但仍然被接受以保持向后兼容性。

-s
--schema-only

只转储模式(数据定义),不转储数据。

-S username
--superuser=username

指定在禁用触发器时要使用的超级用户名。这只在使用 --disable-triggers 时相关。(通常最好省略它,而是以超级用户身份运行生成的脚本。)

-t table
--table=table

只转储 table 的数据。在不同模式中可能存在多个同名的表;这种情况下,所有匹配的表都会被转储。要只选中一个表,需要同时指定 --schema 和 --table。

注意

在此模式下,pg_dump 不会尝试转储所选表可能依赖的任何其他数据库对象。因此,不能保证单表转储的结果能够单独成功地恢复到一个干净的数据库中。

-v
--verbose

指定详细模式。这会使 pg_dump 把进度消息打印到标准错误。

-x
--no-privileges
--no-acl

不转储访问权限(grant/revoke 命令)。

-X use-set-session-authorization
--use-set-session-authorization

这个选项已经过时,但仍然被接受以保持向后兼容性。pg_dump 现在总是以此选项以前所选的方式工作。

-X disable-triggers
--disable-triggers

此选项只在创建只包含数据的转储时才相关。它指示 pg_dump 在输出中包含一些命令,以便在重新装载 数据时临时禁用目标表上的触发器。如果这些表上存在不希望在数据重新装载期间触发的引用完整性检查或其他触发器,请使用此选项。

目前,为 --disable-triggers 输出的这些命令必须由超级用户执行。因此,还应通过 -S 指定一个超级用户名,或者更好的做法是谨慎地以超级用户身份运行生成的脚本。

此选项只对纯文本格式有意义。对于其他格式,可以在调用 pg_restore 时指定该选项。

-Z 0..9
--compress=0..9

指定所用的压缩级别。零表示不压缩。对于自定义归档格式,该选项指定对各个表数据段的压缩,默认以适中的级别压缩。对于纯文本输出,设置非零压缩级别会压缩整个输出文件,就像将其传给 gzip 处理一样;但默认不压缩。tar 归档格式目前完全不支持压缩。

下面的命令行选项控制数据库连接参数。

-h host
--host=host

指定运行服务器的机器的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值取自 PGHOST 环境变量(如果已设置);否则会尝试使用 Unix 域套接字连接。

-p port
--port=port

指定服务器正在监听连接的 TCP 端口,或本地 Unix 域套接字文件扩展名。默认值取自 PGPORT 环境变量(如果已设置),否则使用编译时默认值。

-U username

以给定用户身份连接。

-W

强制提示输入密码。如果服务器要求密码认证,这一步本应自动发生。

环境

PGDATABASE
PGHOST
PGPORT
PGUSER

默认连接参数。

诊断

pg_dump 内部执行 SELECT 语句。如果在运行 pg_dump 时遇到问题,请确保你能够使用例如 psql 从数据库中选择信息。

注意

如果你的数据库集簇对 template1 数据库有任何本地新增内容,请务必把 pg_dump 的输出恢复到一个真正空的数据库中;否则可能会因为新增对象的重复定义而出错。要创建一个没有任何本地新增内容的空数据库,应从 template0 而不是 template1 复制,例如:

CREATE DATABASE foo WITH TEMPLATE template0;

pg_dump 有一些限制:

  • 在转储单个表或以纯文本转储时,pg_dump 不处理大对象。必须使用某种非文本归档格式对整个数据库进行转储来转储大对象。

  • 当选择只转储数据并使用 --disable-triggers 选项时,pg_dump 会在插入数据之前发出禁用用户表上触发器的命令,并在数据插入完成后发出重新启用它们的命令。如果恢复在中途中止,系统目录可能会处于错误状态。

tar 归档的成员大小限制为小于 8 GB。(这是 tar 文件格式的固有限制。)因此,如果某个表的文本表示超过该大小,就不能使用这种格式。tar 归档和其他任何输出格式的总大小不受限制(操作系统可能除外)。

恢复之后,明智的做法是对每个已恢复的表运行 ANALYZE,这样优化器才有可用的统计信息。

例子

要转储一个数据库:

$ 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 中引入的。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。