您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

pg_dump

Name

pg_dump --  将一个 PostgreSQL 数据库抽出到一个脚本文件 或者其它归档文件中

Synopsis

pg_dump [-a | -s] [-b] [-c] [-C] [-d | -D] [-f file ] [-F format ] [-i] [-n | -N] [-o] [-O] [-R] [-S] [-t table ] [-v] [-x] [-X keyword ] [-Z 0...9 ] [-h host ] [-p port ] [-U username ] [-W] dbname

描述

pg_dump 是一个将 PostgreSQL 数据库保存到一个脚本或者归档文件中的工具. 这个脚本文件的格式是纯文本,它包含许多 SQL 命令, 这些 SQL 命令可以用于重建该数据库并将之恢复到保存成脚本的时候的状态. 它们伸直可以用于在其它机器甚至是其它硬件体系的机器上 重建该数据库,通过对脚本进行一些修改,甚至可以在其它 RDBMS 产品 上重建该数据库.另外,候选的归档文件格式是为了和 pg_restore 一起使用重建数据库的, 并且它们也允许 pg_restore 对恢复什么东西进行选择, 或者甚至是在恢复之前对需要恢复的条目进行重新排序. 归档文件也是设计成可以跨平台移植的.

pg_dump 将保存用于重建所有用户定义的类型,函数,表, 索引聚集和操作符所必须的信息.另外, 所有数据是用文本格式拷贝出来的,因而也可以很容易地拷贝回去, 也很容易用工具编辑.

pg_dump 在从 PostgreSQL 节点向另一个节点一个转移数据时很有用.

如果一种候选文件格式和 pg_restore 结合,那么 pg_dump 就能提供一种灵活的归档和传输机制. pg_dump 可以用于备份整个数据库, 然后就可以使用 pg_restore 检查 这个归档和/或选择要恢复的数据库部分. 最灵活等输出文件格式是 "custom(客户化)" 格式 ( -Fc ).它允许对归档元素进行选取和重新排列, 并且缺省时是压缩的. tar 格式 ( -Ft ) 不是压缩的并且我们在装载等时候不可能重排列, 不过它也很灵活;还有,它可以用其它工具,比如 tar 处理.

在运行 pg_dump 的时候,我们应该检查 输出,看看是否有任何警告存在(在标准错误上打印), 特别是下面列出的限制.

即使数据库在并行使用着的时候, pg_dump 也制作出连贯的备份. pg_dump 并不阻塞其它 用户对数据库的访问(读或写).

选项

pg_dump 接受下面的命令行参数: (长选项形式只有在一些平台上可以使用.)

dbname

声明将要转储的数据库名.

-a
--data-only

只输出数据,不输出结构(表定义).

这个选项只是对纯文本格式有意义.对于其它格式,你可以在调用 pg_restore 的时候声明选项.

-b
--blobs

转储数据和 BLOB 数据.

-c
--clean

输出在创建数据库创建命令之前先清理(删除) 该数据库对象的命令.

这个选项只是对纯文本格式有意义.对于其它格式,你可以在调用 pg_restore 的时候声明选项.

-C
--create

以一条创建该数据库本身并且与这个数据库联接等命令开头进行输出. (如果是这种形式的脚本,那么你在运行脚本之前和哪个数据库联接就 不重要了.)

这个选项只对纯文本格式有意义.对于其它格式,你可以在调用 pg_restore 的时候声明该选项.

-d
--inserts

将数据输出为的 INSERT 命令 (而不是 COPY ). 这样会导致恢复非常缓慢.但却令归档更容易移植到其它 RDBMS.

-D
--attribute-inserts

把数据转储为带有明确字段名的 INSERT 命令. 这样会导致恢复非常缓慢, 但是如果你想重新排列字段的顺序,那么它是必须的.

-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 知道许多关于系统表的信息, 任何给定版本的 pg_dump 只能和对应的数据库服务器版本一并使用. 如果你需要跨越版本检查时才使用这个选项( 而且如 pg_dump 失效,别说我没警告你).

-n
--no-quotes

除非绝对必需,禁止标识周围的双引号.如果有保留字用于标识符, 这么做有可能在装载输出的数据时导致麻烦.这是 v6.4以前的 pg_dump 缺省特性。

-N
--quotes

在标识周围包括双引号。这是缺省。

-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 发出任何 \connect 语句.

在纯文本输出模式下,禁止 pg_dump 输出那种需要在恢复数据库的过程中重新联接数据库的脚本. 一般的恢复脚本通常需要以不同的用户与服务器联接多次以设置 该对象最初的所有权.这个选项是一个相当粗糙的指令,因为 它令 pg_dump 失去了这个权限信息, 除非 你使用 -X use-set-session-authorization 选项.

我们不想在恢复的过程中重新联接的一个可能原因是也许对 数据库的访问需要手工干涉(也就是说,口令).

这个选项只是对纯文本格式有意义.对于其它格式, 你在调用 pg_restore 的时候可以声明选项.

-s
--schema-only

只输出表纲要(定义),不输出数据.

-S username
--superuser= username

在某些场合, pg_dump 创建的脚本或者归档需要有 超级用户访问的权限,比如在关闭触发器或者为大纲元素甚至所有属性时. 这个选项声明在这些场合时使用的用户名.

-t table
--table= table

只输出表 table 的数据.

-v
--verbose

声明冗余模式

-x
--no-acl

避免输出 ACL(赋予/撤消 命令)和表的所有者关系信息.

-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 的时候声明该选项.

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

声明在那些支持压缩的格式中使用的压缩级别. (目前只有客户化格式支持压缩).

pg_dump 同样接受下面的命令行参数作为联接参数:

-h host
--host= host

声明运行服务器 的机器的主机名.缺省是使用本地Unix主控套接字,而不是一个 IP 联接. 如果主机名以斜扛开头,则它被用做到 Unix 域套接字的路径.

-p port
--port= port

声明服务器 正在侦听并等待联接的TCP/IP 端口或本地 Unix 主控套接字文件句柄. 缺省的端口号是5432,或者环境变量 PGPORT 的值(如果存在).

-U username

以给出用户身分联接.

-W

强制口令提示.如果服务器需要口令认证,那么这个动作应该自动发生.

诊断


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 无法与指定主机和端口上的 postmaster 进程相联.如果看到这条信息,确认 postmaster 正在给定的主机上你所声明的端口上运行.

dumpSequence(

table

): SELECT failed
你没有读取数据库的权限. 和你的 PostgreSQL 节点管理员联系.

注意: pg_dump 在内部使用 SELECT 语句.如果你运行 pg_dump 时碰到问题,确认你能够使用象 psql 这样的程序从数据 库选择.

注意

pg_dump 有几个限制. 限制大多是源于从系统表中抽取某些元信息的困难.

  • 在转储一个表或者作为纯文本转储时, pg_dump 无法操作 大对象.大对象必须整体地使用二进制归档格式中的一种进行转储.

  • 在进行纯数据转储时, pg_dump 发出一些查询先关闭在用户 表上面的触发器,然后插入数据,数据插入完成后再发出查询打开触发器. 如果恢复动作在中间停止,那么系统表可能就会处于一种错误状态.

例子

转储一个数据库∶


$
 

pg_dump mydb > db.out

重载这个数据库∶


$
 

psql -d database -f db.out

输出一个叫 mydb 的包含 BLOB 的数据库到一个 tar 文件:


$
 

pg_dump -Ft -b mydb > db.tar

把这个数据库(连同 BLOB ) 一起恢复到一个现有的叫 newdb 的数据库:


$
 

pg_restore -d newdb db.tar

历史

pg_dump 工具最早出现在 Postgres95 版本 0.02 . 非纯文本输出格式在 PostgreSQL 版本 7.1 时引入.

又见

pg_dumpall , pg_restore , psql , PostgreSQL 管理员手册