pg_dump
pg_dump
把一个数据库提取到一个单一的脚本文件或者其他归档文件。
概要
pg_dump [connection_option ...] [dump_option ...] dbname
描述
pg_dump是备份数据库的一种标准PostgreSQL工具,并且也在Greenplum数据库中支持。它创建一个单一(非并行)的转储文件。对于Greenplum数据库的例行备份,为了最好的性能使用Greenplum数据库的备份工具gpcrondump更好。
如果用户正在把数据迁移到另一个数据库提供商的系统或者另一个有不同Segment配置(例如,要迁移的系统有更多或者更少的Segment实例)的Greenplum数据库系统,可以使用pg_dump。为了恢复,用户必须使用相应的pg_restore工具(如果转储文件是归档格式),或者可以使用psql之类的客户端程序(如果转储文件是纯文本格式)。
因为pg_dump与普通PostgreSQL兼容,它可以用来迁移数据到Greenplum数据库中。Greenplum数据库中的pg_dump工具与PostgreSQL的pg_dump工具非常类似,但有下列不同和限制:
- 如果使用pg_dump备份Greenplum数据库的数据库,记住对于非常大的数据库转储操作可能花费很长时间(几个小时)。还有,用户必须确保有充足的磁盘空间以创建转储文件。
- 如果用户正在从一个Greenplum数据库系统迁移数据到另一个Greenplum数据库系统中,使用--gp-syntax命令行选项以包括CREATE TABLE语句中的DISTRIBUTED BY子句。这确保Greenplum数据库的表数据在恢复时被用正确的分布键列分布。
即使数据库被并发地使用,pg_dump也能制作一致的备份。pg_dump不阻塞其他访问该数据库的其他用户(读取者或者写入者)。
在使用一种归档文件格式并且与pg_restore组合时,pg_dump提供一种灵活的归档和传输机制。pg_dump可以被用于备份整个数据库,然后pg_restore可以被用来检查归档并且选择要恢复数据库的哪些部分。最灵活的输出文件格式是custom格式(-Fc)。它允许选择并重排序所有被归档的项,并且这些项默认被压缩。tar格式(-Ft)不被压缩并且不能在装载时重排序数据,但它非常灵活。可以用标准的UNIX工具(例如tar)操纵它。
选项
- dbname
- 指定要被转储的数据库名。如果没有指定,将使用环境变量PGDATABASE。如果环境变量也没有设置,为使用的连接所指定的用户名将被使用。
- -a | --data-only
- 只转储数据,而不转储模式(数据定义)。这个选项只对纯文本格式有意义。对于归档格式,用户可以在调用pg_restore时指定该选项。
- -b | --blobs
- 在转储中包括大对象。这是默认行为,除非指定--schema、--table或者--schema-only,因此-b开关仅对向选择性转储中加入大对象有用。
- -c | --clean
- 对文本输出文件增加命令以便在创建数据库对象(的命令)之前清除(删除)它们。注意在转储操作开始前对象并未被删除,但是DROP命令会被加到DDL转储输出文件中,这样当用户使用那些文件做恢复时,DROP命令会在CREATE命令之前运行。这个选项只对纯文本格式有意义。对于归档格式,用户可以在调用pg_restore时指定该选项。
- -C | --create
- 以一个创建数据库本身并且重新连接到所创建数据库的命令开始输出文件(对于一个这种形式的脚本,开始运行脚本前用户连接到的数据库是哪一个没有关系)。这个选项仅对纯文本格式有意义。对于归档格式,用户可以在调用pg_restore时指定这一选项。
- -d | --inserts
- 把数据转储为INSERT命令(而不是COPY)。这将让恢复非常慢,它主要作用是让转储能被载入到不基于PostgreSQL的数据库。还有,由于这个选项为每行生成一个单独的命令,重新装载一行中的错误会导致只有该行被丢失而不是整个表内容。注意如果用户重新安排了列顺序,恢复可能一起失败。-D选项对列序更改是安全的,不过会更慢。
- -D | --column-inserts | --attribute-inserts
- 将数据转储为带有显式列名的INSERT命令( INSERT INTOtable(column, ...) VALUES ...)。这将让恢复非常慢,它主要作用是让转储能被载入到不基于PostgreSQL的数据库。还有,由于这个选项为每行生成一个单独的命令,重新装载一行中的错误会导致只有该行被丢失而不是整个表内容。
- -E encoding | --encoding=encoding
- 以指定的字符集编码创建转储。默认情况下,该转储被以数据库编码创建(另一种得到相同结果的方法是设置PGCLIENTENCODING环境变量为想要的转储编码)。
- -f file | --file=file
- 把输出发送到指定文件。如果被省略,会使用标准输出。
- -F p|c|t | --format=plain|custom|tar
- 选择输出的格式。格式可以是下列之一:
- p | plain — 输出纯文本的SQL脚本(默认)。
- c | custom — 输出适合输入给pg_restore的自定归档。这是最灵活的格式,它允许重新排序数据装载以及对象定义。这种格式默认也被压缩。
- t | tar — 输出适合输入给pg_restore的tar归档。使用这种归档格式允许在数据库被恢复时重新排序以及排除数据库对象。还可以在恢复时限制重新装载哪些数据。
- -i | --ignore-version
-
注意: 这个选项已被弃用并且将在未来的发行中被移除。忽略pg_dump和数据库服务器之间的版本失配。pg_dump可以从运行之前版本的Greenplum数据库(或者PostgreSQL)的服务器转储,但是非常老的版本可能不再被支持。如果用户需要覆盖版本检查,可使用这一选项。
- -n schema | --schema=schema
- 仅转储匹配方案模式的方案,这会选择方案本身以及所有它包含的对象。当这个选项没有被指定时,目标数据库中的所有非系统方案都将被转储。可以通过书写多个-n开关选择多个方案。还有,schema参数被解释为与psql的 \d命令具有相同规则的模式,因此还可以通过在该模式中书写通配符来选择多个方案,如果需要防止shell扩展通配符,请小心地引用该模式。
- 注意:当-n被指定时,pg_dump不会尝试转储任何被选中方案可能依赖的其他数据库对象。因此,不保证一个特定方案的转储能够凭借自身成功地恢复到一个干净的数据库中。注意: 在-n被指定时,blob之类的非方案对象不会被转储。用户可以用--blobs开关把blob加回到转储中。
- -N schema | --exclude-schema=schema
- 不转储匹配方案模式的任何方案。该模式会被根据和-n相同的规则解释。-N可以被给出多次来排除匹配任一模式的方案。当-n和-N都被给出时,行为是只转储匹配至少一个-n开关但不匹配任何-N开关的方案。如果-N出现而没有-n,那么匹配-N的方案会被从普通转储中排除。
- -o | --oids
- 将对象标识符(OID)转储为每个表数据的一部分。不推荐对将要恢复到Greenplum数据库的文件使用这一选项。
- -O | --no-owner
- 不要输出设置对象拥有关系的命令以匹配原始数据库。默认情况下,pg_dump会发出ALTER OWNER或者SET SESSION AUTHORIZATION语句以设置被创建的数据库对象的拥有关系。除非该脚本由超级用户(或者拥有脚本中所有对象的同一用户)启动,该脚本运行时这些语句将会失败。要让一个脚本能被任何用户恢复但给所有对象该用户的拥有关系,可指定-O。这个选项只对纯文本格式有意义。对于归档格式,用户可以在调用pg_restore时指定该选项。
- -s | --schema-only
- 仅转储对象定义(模式)而不转储数据。
- -S username | --superuser=username
- 指定在禁用触发器时要使用的超级用户用户名。只有在--disable-triggers被使用时这个选项才相关。去掉这个选项为好,转而作为超级用户启动结果脚本。注意: Greenplum数据库不支持用户定义的触发器。
- -t table | --table=table
- 仅转储匹配表模式的表(或者视图或者序列)。以格式schema.table指定表。
- 可以通过书写多个-t开关选择多个表。还有,table参数被解释为与psql的 \d命令具有相同规则的模式,因此还可以通过在该模式中书写通配符来选择多个方案,如果需要防止shell扩展通配符,请小心地引用该模式。
当-t被使用时,-n和-N开关没有效果,因为被-t选中的表将会被转储而不考虑那些开关,而非表对象将不会被转储。注意: 当-t被指定时,pg_dump不会尝试转储任何被选中表可能依赖的其他数据库对象。因此,不保证一个特定表的转储能够凭借自身成功地恢复到一个干净的数据库中。
还有,-t不能被用来指定一个子表分区。要转储一个分区表,用户必须指定父表名称。
- -T table | --exclude-table=table
- 不转储任何匹配该表模式的表。该模式会被根据和-t相同的规则解释。-T可以被给出多次来排除匹配任一模式的表。当-t和-T都被给出时,行为是只转储匹配至少一个-t开关但不匹配任何-T开关的表。如果-T出现而没有-t,那么匹配-T的表会被从普通转储中排除。
- -v | --verbose
- 执行详细模式。这将导致pg_dump输出详细的对象注释以及开始/停止时间到转储文件,并且把进度消息输出到标准错误。
- -x | --no-privileges | --no-acl
- 防止转储访问特权(GRANT/REVOKE命令)。
- --disable-dollar-quoting
- 这个选项禁用对函数体使用美元引用并且强制使用SQL标准的字符串语法引用它们。
- --disable-triggers
- 在创建只有数据的转储时,这个选项才相关。它指示pg_dump包括在重新装载数据时临时禁用目标表上触发器的命令。如果在表上有不想在数据重新装载时调用的触发器,就使用这个选项。为--disable-triggers发出的命令必须作为超级用户完成。因此,用户还应该用-S指定一个超级用户名,或者宁愿小心地作为超级用户启动结果脚本。这个选项只对纯文本格式有意义。对于归档格式,用户可以在调用pg_restore时指定该选项。注意: Greenplum数据库不支持用户定义的触发器。
- --use-set-session-authorization
- 输出SQL标准的SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来确定对象拥有关系。这会让转储更加兼容标准,但会依赖转储中对象的历史,可能无法正确地恢复。使用SET SESSION AUTHORIZATION的转储将要求超级用户特权以正确地恢复,而ALTER OWNER则要求较少的特权。
- --gp-syntax | --no-gp-syntax
- 使用--gp-syntax转储CREATE TABLE语句中的Greenplum数据库语法。这允许Greenplum数据库表的分布策略(DISTRIBUTED BY或者DISTRIBUTED RANDOMLY子句)被转储,这对于恢复到其他Greenplum数据库系统很有用。默认是在连接到一个Greenplum数据库系统时包括Greenplum数据库语法,并且在连接到一个普通PostgreSQL系统时排除它。
- -Z 0..9 | --compress=0..9
- 指定在支持压缩的归档格式中使用的压缩级别。当前仅有custom归档格式支持压缩。
- -h host| --host host
- 指定Greenplum的Master数据库服务器在其上运行的机器的主机名。如果没有指定,会从环境变量PGHOST读取或者默认为localhost。
- -p port| --port port
- 指定Greenplum的Master数据库服务器在其上监听连接的TCP端口。如果没有指定,会从环境变量PGPORT读取或者默认为5432。
- -U username| --username username
- 要用其进行连接的数据库角色名。如果没有指定,会从环境变量PGUSER读取或者默认为当前系统用户名。
- -W | --password
- 强制口令提示。
注解
当只含数据的转储被选择并且选项--disable-triggers被使用时,pg_dump在插入数据之前会发出禁用用户表上触发器的命令并且在数据被插入后发出重新启用它们的命令。如果恢复在中途被停止,系统目录可能处在错误的状态。
tar归档的成员被限制为小于8GB的尺寸(这是tar文件格式的固有限制)。因此如果任一表的文本表达超过这一尺寸,这种格式就无法使用。tar归档以及任何其他输出格式的总尺寸没有限制,除非操作系统有限制。
pg_dump产生的转储文件不包含优化器用来做出查询规划决定的统计信息。因此,在从转储文件完成恢复后运行ANALYZE来确保好性能是很明智的。
示例
把名为mydb的数据库转储到一个SQL脚本文件:
pg_dump mydb > db.sql
把这样一个脚本重新装载到(新创建的)名为newdb的数据库中:
psql -d newdb -f db.sql
以tar文件格式转储Greenplum数据库并且包括分布策略信息:
pg_dump -Ft --gp-syntax mydb > db.tar
转储数据库为自定格式归档文件:
pg_dump -Fc mydb > db.dump
把一个归档文件重新装载到一个(新创建的)名为newdb的数据库:
pg_restore -d newdb db.dump
转储一个名为mytab的表:
pg_dump -t mytab mydb > db.sql
要在-t和相关开关中指定大写或者混合大小写的名称,用户需要用双引号引用名称,否则它将被折叠为小写。但是双引号对于shell是特殊的,因此它们又必须被引用。因此,要转储混合大小写名称的表,用户需要这样的命令:
pg_dump -t '"MixedCaseName"' mydb > mytab.sql