如何使用pg_dump,pg_restore进行数据库的备份和还原?/备份还原指定表/指定导出表insert语句

rt

已邀请:

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

大纲

pg_dump [connection-option...] [option...] [dbname]

描述

pg_dump是用于备份一种PostgreSQL数据库的工具。即使数据库正在被并发使用,它也能创建一致的备份。pg_dump不阻塞其他用户访问数据库(读取或写入)。

pg_dump只转储单个数据库。要备份一个集簇中 对于所有数据库公共的全局对象(例如角色和表空间),应使用 pg_dumpall

转储可以被输出到脚本或归档文件格式。脚本转储是包含 SQL 命令的纯文本文件,它们可以用来重构数据库到它被转储时的状态。要从这样一个脚本恢复,将它喂给psql。脚本文件甚至可以被用来在其他机器和其他架构上重构数据库。在经过一些修改后,甚至可以在其他 SQL 数据库产品上重构数据库。

另一种可选的归档文件格式必须与pg_restore配合使用来重建数据库。它们允许pg_restore能选择恢复什么,或者甚至在恢复之前对条目重排序。归档文件格式被设计为在架构之间可移植。

当使用归档文件格式之一并与pg_restore组合时,pg_dump提供了一种灵活的归档和传输机制。pg_dump可以被用来备份整个数据库,然后pg_restore可以被用来检查归档并/或选择数据库的哪些部分要被恢复。最灵活的输出文件格式是自定义格式(-Fc)和目录格式(-Fd)。它们允许选择和重排序所有已归档项、支持并行恢复并且默认是压缩的。目录格式是唯一一种支持并行转储的格式。

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

选项

下列命令选项控制输出的内容和格式。

  • dbname

  • 指定要被转储的数据库名。如果没有指定,将使用环境变量PGDATABASE。如果环境变量也没有设置,则使用指定给该连接的用户名。

  • -a
    --data-only

  • 只转储数据,而不转储模式(数据定义)。表数据、大对象和序列值都会被转储。

    这个选项类似于指定--section=data,但是由于历史原因又不完全相同。

  • -b
    --blobs

  • 在转储中包括大对象。这是当--schema--table或 --schema-only被指定时的默认行为,因此-b 开关仅对于将大对象添加到已请求特定模式或表的转储中时有用。 请注意,blob被视为数据,因此仅在使用--data-only时才会包含, 但在--schema-only时不会包含。

  • -B
    --no-blobs

  • 排除转储中的大对象。

    当给定-b-B时,行为是当数据被转储时输出大对象, 请参阅-b文档。

  • -c
    --clean

  • 在输出创建数据库对象的命令之前输出清除(删除)它们的命令 (除非也指定了--if-exists,如果任何对象不存在于 目的数据库中,恢复可能会产生一些伤害性的错误消息)。

    这个选项只对纯文本格式有意义。对于归档格式,你可以在调用pg_restore时指定该选项。

  • -C
    --create

  • 使得在输出的开始是一个创建数据库本身并且重新连接到被创建的数据库的命令(通过这种形式的一个脚本,在运行脚本之前你连接的是目标安装中的哪个数据库都没有关系)。如果也指定了--clean,脚本会在重新连接到目标数据库之前先删除它然后再重建。

    这个选项只对纯文本格式有意义。对于归档格式,你可以在你调用pg_restore时指定这个选项。

  • -E encoding
    --encoding=encoding

  • 以指定的字符集编码创建转储。在默认情况下,该转储会以该数据库的编码创建(另一种得到相同结果的方式是将PGCLIENTENCODING环境变量设置成想要的转储编码)。

  • -f file
    --file=file

  • 将输出发送到指定文件。对于基于输出格式的文件这个参数可以被忽略,在那种情况下将使用标准输出。不过对于目录输出格式必须给定这个参数,在目录输出格式中指定的是一个目录而不是一个文件。在这种情况中,该目录会由pg_dump创建并且不需要以前就存在。

  • -F format
    --format=format

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

    • p
      plain

    • 输出一个纯文本形式的SQL脚本文件(默认值)。

    • c
      custom

    • 输出一个适合于作为pg_restore输入的自定义格式归档。和目录输出格式一起,这是最灵活的输出格式,它允许在恢复时手动选择和排序已归档的项。这种格式在默认情况还会被压缩。

    • d
      directory

    • 输出一个适合作为pg_restore输入的目录格式归档。这将创建一个目录,其中每个被转储的表和大对象都有一个文件,外加一个所谓的目录文件,该文件以一种pg_restore能读取的机器可读格式描述被转储的对象。一个目录格式归档能用标准 Unix 工具操纵,例如一个未压缩归档中的文件可以使用gzip工具压缩。这种格式默认情况下是被压缩的并且也支持并行转储。

    • t
      tar

    • 输出一个适合于输入到pg_restore中的tar-格式归档。tar 格式可以兼容目录格式,抽取一个 tar 格式的归档会产生一个合法的目录格式归档。不过,tar 格式不支持压缩。还有,在使用 tar 格式时,表数据项的相对顺序不能在恢复过程中被更改。

  • -j njobs
    --jobs=njobs

  • 通过同时归档njobs个表来运行并行转储。这个选项缩减了转储的时间,但是它也增加了数据库服务器上的负载。你只能和目录输出格式一起使用这个选项,因为这是唯一一种让多个进程能在同一时间写其数据的输出格式。

    pg_dump将打开njobs + 1 个到该数据库的连接,因此确保你的max_connections设置足够高以容纳所有的连接。

    在运行一次并行转储时请求数据库对象上的排他锁可能导致转储失败。其原因是,pg_dump主控进程会在工作者进程将要稍后转储的对象上请求共享锁,以便确保在转储运行时不会有人删除它们并让它们出错。如果另一个客户端接着请求一个表上的排他锁,那个锁将不会被授予但是会被排入队列等待主控进程的共享锁被释放。因此,任何其他对该表的访问将不会被授予或者将排在排他锁请求之后。这包括尝试转储该表的工作者进程。如果没有任何防范措施,这可能会是一种经典的死锁情况。要检测这种冲突,pg_dump工作者进程使用NOWAIT选项请求另一个共享锁。 如果该工作者进程没有被授予这个共享锁,其他某人必定已经在同时请求了一个排他锁并且没有办法继续转储,因此pg_dump除了中止转储之外别无选择。

    对于一个一致的备份,数据库服务器需要支持同步的快照,在PostgreSQL 9.2中引入了一种针对主服务器特性和10个针对备用服务器的特性。有了这种特性,即便数据库客户端使用不同的连接,也可以保证他们看到相同的数据集。pg_dump -j使用多个数据库连接,它用主控进程连接到数据一次,并且为每一个工作者任务再一次连接数据库。如果没有同步快照特征,在每一个连接中不同的工作者任务将不能被保证看到相同的数据,这可能导致一个不一致的备份。

    如果你希望运行一个 9.2 之前服务器的并行转储,你需要确保数据库内容从主控进程连接到数据库一直到最后一个工作者任务连接到数据库之间不会改变。做这些最简单的方法是在开始备份之前停止任何访问数据库的数据修改进程(DDL 以及 DML)。当对一个 9.2 之前的PostgreSQL服务器运行pg_dump -j时,你还需要指定--no-synchronized-snapshots参数。

  • -n schema
    --schema=schema

  • 只转储匹配schema的模式,这会选择模式本身以及它所包含的所有对象。当没有指定这个选项时,目标数据库中所有非系统模式都将被转储。多个模式可以通过书写多个-n开关来选择。另外,schema参数可以被解释为一种根据psql's \d命令所用的相同规则(见模式(Pattern))编写的模式,这样多个模式也可以通过在该模式中书写通配字符来选择。在使用通配符时,如果需要阻止 shell 展开通配符需要小心引用该模式,见实例

    注意

    -n被指定时,pg_dump不会尝试转储所选模式可能依赖的任何其他数据库对象。因此,无法保证一次指定模式转储的结果能够仅凭其本身被成功地恢复到一个干净的数据库中。

    注意

    -n被指定时,非模式对象(如二进制大对象)不会被转储。你可以使用--blobs开关将二进制大对象加回到该转储中。

  • -N schema
    --exclude-schema=schema

  • 不转储匹配schema模式的任何模式。该模式被根据-n所用的相同规则被解释。-N可以被给定多次来排除匹配几个模式中任意一个的模式。

    -n-N都被给定时,该行为是只转储匹配至少一个-n开关但是不匹配-N开关的模式。如果只有-N而没有-n,那么匹配-N的模式会被从一个正常转储中排除。

  • -o
    --oids

  • 转储对象标识符(OID)作为每个表数据的一部分。如果你的应用以某种方式引用OID列(例如在一个外键约束中),应使用这个选项。否则,这个选项不应该被使用。

  • -O
    --no-owner

  • 不输出设置对象拥有关系来匹配原始数据库的命令。默认情况下,pg_dump会发出ALTER OWNERSET SESSION AUTHORIZATION语句来设置被创建的数据库对象的拥有关系。除非该脚本被一个超级用户(或是拥有脚本中所有对象的同一个用户)启动,这些语句都将会失败。要使一个脚本能够被任意用户恢复,但把所有对象的拥有关系都给这个用户,可指定-O

    这个选项只对纯文本格式有意义。对于归档格式,你可以在调用pg_restore时指定该选项。

  • -R
    --no-reconnect

  • 这个选项已经废弃,但是为了向后兼容仍然能被接受。

  • -s
    --schema-only

  • 只转储对象定义(模式),而非数据。

    这个选项是--data-only的逆选项。它和指定--section=pre-data --section=post-data相似,但是由于历史原因又不完全相同。

    (不要把这个选项和--schema选项混淆,后者在schema的使用上有不同的含义)。

    要为数据库中表的一个子集排除表数据,见--exclude-table-data

  • -S username
    --superuser=username

  • 指定要在禁用触发器时使用的超级用户的用户名。只有使用--disable-triggers时,这个选项才相关(通常,最好省去这个选项,而作为超级用户来启动结果脚本来取而代之)。

  • -t table
    --table=table

  • 只转储名字匹配table的表,table还可以包括视图、物化视图、序列和外部表。通过写多个-t开关可以选择多个表。另外,table参数可以被解释为一种根据psql's \d命令所用的相同规则(见模式(Pattern))编写的模式,这样多个表也可以通过在该模式中书写通配字符来选择。在使用通配符时,如果需要阻止 shell 展开通配符需要小心引用该模式,见实例

    -t被使用时,-n-N开关不会有效果,因为被-t选择的表将被转储而无视那些开关,并且非表对象将不会被转储。

    注意

    -t被指定时,pg_dump不会尝试转储所选表可能依赖的任何其他数据库对象。因此,无法保证一次指定表转储的结果能够仅凭其本身被成功地恢复到一个干净的数据库中。

    注意

    -t开关的行为不完全向前兼容 8.2 之前的PostgreSQL版本。以前,写-t tab将转储所有命名为tab的表,但现在它仅仅转储在你默认搜索路径中可见的那一个。要得到旧的行为,你可以写成-t '*.tab'。还有,你必须写类似-t sch.tab的东西来选择一个特定模式中的一个表,而不是用老的惯用语-n sch -t tab

  • -T table
    --exclude-table=table

  • 不转储匹配table模式的任何表。该模式被根据-t所用的相同规则被解释。-T可以被给定多次来排除匹配几个模式中任意一个的模式。

    -t-T都被给定时,该行为是只转储匹配至少一个-t开关但是不匹配-T开关的表。如果只有-T而没有-t,那么匹配-T的表会被从一个正常转储中排除。

  • -v
    --verbose

  • 指定冗长模式。这将导致pg_dump向标准错误输出详细的对象注释以及转储文件的开始/停止时间,还有进度消息。

  • -V
    --version

  • pg_dump版本并退出。

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

  • 防止转储访问特权(授予/收回命令)。

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

  • 指定要使用的压缩级别。零意味着不压缩。对于自定义归档格式,这会指定个体表数据段的压缩,并且默认是进行中等级别的压缩。对于纯文本输出,设置一个非零压缩级别会导致整个输出文件被压缩,就好像它被gzip处理过一样,但是默认是不压缩。tar 归档格式当前完全不支持压缩。

  • --binary-upgrade

  • 这个选项用于就地升级功能。我们不推荐也不支持把它用于其他目的。这个选项在未来的发行中可能被改变而不做通知。

  • --column-inserts
    --attribute-inserts

  • 将数据转储为带有显式列名的INSERT命令(INSERT INTO table (column, ...) VALUES ...)。这将使得恢复过程非常慢,这主要用于使转储能够被载入到非PostgreSQL数据库中。不过,由于这个选项为每一行都产生一个单独的命令,重载一行时的一个错误只会导致那一行被丢失而不是整个表内容丢失。

  • --disable-dollar-quoting

  • 这个选项禁止在函数体中使用美元符号引用,并且强制它们使用 SQL 标准字符串语法被引用。

  • --disable-triggers

  • 只有在创建一个只转储数据的转储时,这个选项才相关。它指示pg_dump包括在数据被重新载入时能够临时禁用目标表上的触发器的命令。如果你在表上有引用完整性检查或其他触发器,并且你在数据重新载入期间不想调用它们,请使用这个选项。

    当前,为--disable-triggers发出的命令必须作为超级用户来执行。因此,你还应当使用-S指定一个超级用户名,或者宁可作为一个超级用户启动结果脚本。

    这个选项只对纯文本格式有意义。对于归档格式,你可以在调用pg_restore时指定这个选项。

  • --enable-row-security

  • 只有在转储具有行安全性的表的内容时,这个选项才相关。默认情况下, pg_dump将把 row_security设置为 off 来确保从该表中转储 出所有的数据。如果用户不具有足够能绕过行安全性的特权,那么会抛出 一个错误这个参数指示pg_dump将 row_security设置为 on,允许用户只转储该表中 它们能够访问到的部分内容。

    请注意,如果您当前使用此选项,则可能还需要以INSERT格式转储, 因为还原期间的COPY FROM不支持行安全性。

  • --exclude-table-data=table

  • 不转储匹配table模式的任何表中的数据。该模式根据-t的相同规则被解释。--exclude-table-data可以被给定多次来排除匹配多个模式的表。当你需要一个特定表的定义但不想要其中的数据时,这个选项就有用了。

    要排除数据库中所有表的数据,见--schema-only

  • --if-exists

  • 时间条件性命令(即增加一个IF EXISTS子句)来清除数据库和其他对象。 只有同时指定了--clean时,这个选项才可用。

  • --inserts

  • 将数据转储为INSERT命令(而不是COPY)。这将使得恢复非常慢,这主要用于使转储能够被载入到非PostgreSQL数据库中。不过,由于这个选项为每一行都产生一个单独的命令,重载一行时的一个错误只会导致那一行被丢失而不是整个表内容丢失。注意如果你已经重新安排了列序,该恢复可能会一起失败。--column-inserts选项对于列序改变是安全的,但是会更慢。

  • --lock-wait-timeout=timeout

  • 在转储的开始从不等待共享表锁的获得。而是在指定的timeout内不能锁定一个表时失败。超时时长可以用SET statement_timeout接受的任何格式指定(允许的格式根据你从其转出的服务器版本变化,但是所有版本都接受一个整数表示的毫秒数。)。

  • --no-publications

  • 不转储发布。

  • --no-security-labels

  • 不转储安全标签。

  • --no-subscriptions

  • 不转储订阅。

  • --no-sync

  • 默认情况下,pg_dump将等待所有文件安全写入磁盘。 这个选项会导致pg_dump无需等待而返回,这更快, 但意味着后续的操作系统崩溃可能会导致转储损坏。通常, 此选项对于测试非常有用,但在从生产安装中转储数据时不应使用此选项。

  • --no-synchronized-snapshots

  • 这个选项允许对 9.2 以前的服务器运行pg_dump -j,详见-j参数的文档。

  • --no-tablespaces

  • 不要输出选择表空间的命令。通过这个选项,在恢复期间所有的对象都会被创建在任何作为默认的表空间中。

    这个选项只对纯文本格式有意义。对于归档格式,你可以在调用pg_restore时指定该选项。

  • --no-unlogged-table-data

  • 不转储非日志记录表的内容。这个选项对于表定义(模式)是否被转储没有影响,它只会限制转储表数据。当从一个后备服务器转储时,在非日志记录表中的数据总是会被排除。

  • --quote-all-identifiers

  • 强制引用所有标识符。当从PostgreSQL主版本与pg_dump不同的服务器上转储一个数据库时或者当输出准备载入到一个具有不同主版本的服务器时,推荐使用这个选项。默认情况下,pg_dump只对在其主版本中是被保留词的标识符加上引号。在转储其他版本服务器时,这种默认行为有时会导致兼容性问题,因为那些版本可能具有些许不同的被保留词集合。使用--quote-all-identifiers能阻止这种问题,但代价是转储脚本更难阅读。

  • --section=sectionname

  • 只转储命名节。节的名称可以是pre-datadatapost-data。这个选项可以被指定多次来选择多个节。默认是转储所有节。

    数据节包含真正的表数据、大对象内容和序列值。数据后项包括索引、触发器、规则和除了已验证检查约束之外的约束的定义。数据前项包括所有其他数据定义项。

  • --serializable-deferrable

  • 为转储使用一个可序列化事务,以保证所使用的快照与后来的数据库状态是一致的。但是这样做是在事务流中等待一个点,在该点上不能存在异常,这样就不会有转储失败或者导致其他事务带着serialization_failure回滚的风险。关于事务隔离和并发控制详见第 13 章

    对于一个只为灾难恢复存在的转储,这个选项没什么益处。如果一个转储被用来在原始数据库持续被更新期间载入一份用于报表或其他只读负载的数据库拷贝时,这个选项就有所帮助。如果没有这个选项,转储可能会反映一个与最终提交事务的任何执行序列都不一致的状态。例如,如果使用了批处理技术,一个批处理在转储中可以显示为关闭,而其中的所有项都不出现。

    如果 pg_dump 被启动时没有读写事务在活动,则这个选项没有什么不同。如果有读写事务在活动,该转储的启动可能会被延迟一段不确定的时间。一旦开始运行,有没有这个开关的表现是相同的。

  • --snapshot=snapshotname

  • 在做一个数据库的转储时指定一个同步的快照(详见 表 9.82)。

    在需要把转储和一个逻辑复制槽(见第 48 章) 或者一个并发会话同步时可以用上这个选项。

    在并行转储的情况下,将使用这个选项指定的快照名而不是取一个新快照。

  • --strict-names

  • 要求每一个模式(-n/--schema)和表(-t/--table)限定符匹配要转储的数据库中至少一个模式/表。注意,如果没有找到有这样的模式/表限定符匹配,即便没有--strict-namespg_dump也将生成一个错误。

    这个选项对-N/--exclude-schema-T/--exclude-table或者--exclude-table-data没有效果。无法匹配任何对象的排除模式不会被当作错误。

  • --use-set-session-authorization

  • 输出 SQL-标准的SET SESSION AUTHORIZATION命令取代ALTER OWNER命令来确定对象的所有关系。这让该转储更加兼容标准,但是取决于该转储中对象的历史,该转储可能无法正常恢复。而且,一个使用SET SESSION AUTHORIZATION的转储将一定会要求超级用户特权来正确地恢复,而ALTER OWNER要求更少的特权。

  • -?
    --help

  • 显示有关pg_dump命令行参数的帮助并退出。


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

  • -d dbname
    --dbname=dbname

  • 指定要连接到的数据库名。这等效于指定dbname为命令行上的第一个非选项参数。

    如果这个参数包含一个=符号或者以一个合法的URI前缀(postgresql://postgres://)开始,它将被视作一个conninfo字符串。详见第 33.1 节

  • -h host
    --host=host

  • 指定服务器正在运行的机器的主机名。如果该值开始于一个斜线,它被用作一个 Unix 域套接字的目录。默认是从PGHOST环境变量中取得(如果被设置),否则将尝试一次 Unix 域套接字连接。

  • -p port
    --port=port

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

  • -U username
    --username=username

  • 要作为哪个用户连接。

  • -w
    --no-password

  • 从不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那么连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。

  • -W
    --password

  • 强制pg_dump在连接到一个数据库之前提示要求一个口令。

    这个选项从来不是必须的,因为如果服务器要求口令认证,pg_dump将自动提示要求一个口令。但是,pg_dump将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下,值得键入-W来避免额外的连接尝试。

  • --role=rolename

  • 指定一个用来创建该转储的角色名。这个选项导致pg_dump在连接到数据库后发出一个SET ROLE rolename命令。当已认证用户(由-U指定)缺少pg_dump所需的特权但是能够切换到一个具有所需权利的角色时,这个选项很有用。一些安装有针对直接作为超级用户登录的策略,使用这个选项可以让转储在不违反该策略的前提下完成。


环境

  • PGDATABASE
    PGHOST
    PGOPTIONS
    PGPORT
    PGUSER

  • 默认连接参数

和大部分其他PostgreSQL工具相似,这个工具也使用libpq(见第 33.14 节)支持的环境变量。

诊断

pg_dump在内部执行SELECT语句。如果你运行pg_dump时出现问题,确定你能够从正在使用的数据库中选择信息,例如psql。此外,libpq前端-后端库所使用的

pg_restore — 从一个由pg_dump创建的归档文件恢复一个PostgreSQL数据库

大纲

pg_restore [connection-option...] [option...] [filename]

描述

pg_restore是一个用来从pg_dump创建的非文本格式归档恢复PostgreSQL数据库的工具。它将发出必要的命令把该数据库重建成它被保存时的状态。这些归档文件还允许pg_restore选择恢复哪些内容或者在恢复前对恢复项重排序。这些归档文件被设计为可以在不同的架构之间迁移。

pg_restore可以在两种模式下操作。如果指定了一个数据库名称,pg_restore会连接那个数据库并且把归档内容直接恢复到该数据库中。否则,会创建一个脚本,其中包含着重建该数据库所必要的 SQL 命令,它会被写入到一个文件或者标准输出。这个脚本输出等效于pg_dump的纯文本输出格式。因此,一些控制输出的选项与pg_dump的选项类似。

显然,pg_restore无法恢复不在归档文件中的信息。例如,如果归档使用INSERT命令转储数据选项创建, pg_restore将无法使用COPY语句装载数据。

选项

pg_restore接受下列命令行参数。

  • filename

  • 指定要被恢复的归档文件(对于一个目录格式的归档则是目录)的位置。如果没有指定,则使用标准输入。

  • -a
    --data-only

  • 只恢复数据,不恢复模式(数据定义)。如果在归档中存在,表数据、大对象和序列值会被恢复。

    这个选项类似于指定--section=data,但是由于历史原因两者不完全相同。

  • -c
    --clean

  • 在重新创建数据库对象之前清除(丢弃)它们(除非使用了--if-exists,如果有对象在目标数据库中不存在,这可能会生成一些无害的错误消息)。

  • -C
    --create

  • 在恢复一个数据库之前先创建它。如果还指定了--clean,在连接到目标数据库之前丢弃并且重建它。

    在使用这个选项时,-d提到的数据库只被用于发出初始的DROP DATABASECREATE DATABASE命令。所有要恢复到该数据库名中的数据都出现在归档中。

  • -d dbname
    --dbname=dbname

  • 连接到数据库dbname并且直接恢复到该数据库中。

  • -e
    --exit-on-error

  • 在发送 SQL 命令到该数据库期间如果碰到一个错误就退出。默认行为是继续并且在恢复结束时显示一个错误计数。

  • -f filename
    --file=filename

  • 为生成的脚本或列表(当使用-l时)指定输出文件。默认是标准输出。

  • -F format
    --format=format

  • 指定归档的格式。并不一定要指定该格式,因为pg_restore将会自动决定格式。如果指定,可以是下列之一:

    • c
      custom

    • 归档是pg_dump的自定义格式。

    • d
      directory

    • 归档是一个目录归档。

    • t
      tar

    • 归档是一个tar归档。

  • -I index
    --index=index

  • 只恢复提及的索引的定义。可以通过写多个-I开关指定多个索引。

  • -j number-of-jobs
    --jobs=number-of-jobs

  • 使用并发任务运行pg_restore中最耗时的部分 — 载入数据、创建索引或者创建约束。对于一个运行在多处理器机器上的服务器,这个选项能够大幅度减少恢复一个大型数据库的时间。

    每一个任务是一个进程或者一个线程,这取决于操作系统,它们都使用一个独立的服务器连接。

    这个选项的最佳值取决于服务器、客户端以及网络的硬件设置。因素包括 CPU 的核心数和磁盘设置。一个好的建议是服务器上 CPU 的核心数,但是更大的值在很多情况下也能导致更快的恢复时间。当然,过高的值会由于超负荷反而导致性能降低。

    这个选项只支持自定义和目录归档格式。输入必须是一个常规文件或目录(例如,不能是一个管道)。当发出一个脚本而不是直接连接到数据库服务器时会忽略这个选项。还有,多任务不能和选项--single-transaction一起用。

  • -l
    --list

  • 列出归档的内容的表。这个操作的输出能被用作-L选项的输入。注意如果把-n-t这样的过滤开关与-l一起使用,它们将会限制列出的项。

  • -L list-file
    --use-list=list-file

  • 只恢复在list-file中列出的归档元素,并且按照它们出现在该文件中的顺序进行恢复。注意如果把-n-t这样的过滤开关与-L一起使用,它们将会进一步限制要恢复的项。

    list-file通常是编辑一个-l操作的输出来创建。行可以被移动或者移除,并且也可以通过在行首放一个(;)将其注释掉。例子见下文。

  • -n schema
    --schema=schema

  • 只恢复在被提及的模式中的对象。可以用多个-n开关来指定多个模式。这可以与-t选项组合在一起只恢复一个指定的表。

  • -N schema
    --exclude-schema=schema

  • 不要恢复命名模式中的对象。可以使用多个-N开关指定要排除的多个模式。

    当为同一个模式名同时给出-n-N时, -N开关胜利并且排除它指出的模式。

  • -O
    --no-owner

  • 不要输出将对象的所有权设置为与原始数据库匹配的命令。默认情况下,pg_restore会发出ALTER OWNER或者SET SESSION AUTHORIZATION语句来设置已创建的模式对象的所有权。 如果最初的数据库连接不是由超级用户 (或者是拥有脚本中所有对象的同一个用户)发起的,那么这些语句将失败。 通过-O,任何用户名都可以被用于初始连接,并且这个用户将会拥有所有被创建的对象。

  • -P function-name(argtype [, ...])
    --function=function-name(argtype [, ...])

  • 只恢复被提及的函数。要小心地拼写函数的名称和参数使它们正好就是出现在转储文件的内容表中的名称和参数。可以使用多个-P开关指定多个函数。

  • -R
    --no-reconnect

  • 这个选项已被废弃,但是出于向后兼容性的目的,系统仍然还接受它。

  • -s
    --schema-only

  • 只恢复归档中的模式(数据定义)不恢复数据。

    这个选项是--data-only的逆选项。它与指定--section=pre-data --section=post-data相似,但是由于历史原因并不完全相同。

    (不要把这个选项和--schema选项弄混,后者把词schema用于一种不同的含义)。

  • -S username
    --superuser=username

  • 指定在禁用触发器时要用的超级用户名。只有使用--disable-triggers时这个选项才相关。

  • -t table
    --table=table

  • 只恢复所提及的表的定义和数据。出于这个目的,table包括视图、物化视图、序列和外部表。可以写上多个-t开关可以选择多个表。这个选项可以和-n选项结合在一起指定一个特定模式中的表。

    注意

    在指定-t时,pg_restore不会尝试恢复所选表可能依赖的任何其他数据库对象。因此,无法确保能成功地把一个特定表恢复到一个干净的数据库中。

    注意

    这个标志的行为和pg_dump-t标志不一样。在pg_restore中当前没有任何通配符匹配的规定,也不能在其-t选项中包括模式的名称。

    注意

    PostgreSQL 9.6之前的版本中,这个标志只匹配表,而并不匹配其他类型的关系。

  • -T trigger
    --trigger=trigger

  • 只恢复所提及的触发器。可以用多个-T开关指定多个触发器。

  • -v
    --verbose

  • 指定冗长模式。

  • -V
    --version

  • 打印该pg_restore的版本并退出。

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

  • 阻止恢复访问特权(授予/收回命令)。

  • -1
    --single-transaction

  • 将恢复作为单一事务执行(即把发出的命令包裹在BEGIN/COMMIT中)。这可以确保要么所有命令完全成功,要么任何改变都不被应用。这个选项隐含了--exit-on-error

  • --disable-triggers

  • 只有在执行一个只恢复数据的恢复时,这个选项才相关。它指示pg_restore在装载数据时执行命令临时禁用目标表上的触发器。如果你在表上有参照完整性检查或者其他触发器并且你不希望在数据载入期间调用它们时,请使用这个选项。

    目前,为--disable-triggers发出的命令必须以超级用户身份完成。因此你还应该用-S指定一个超级用户名,或者更好的方法是以一个PostgreSQL超级用户运行pg_restore

  • --enable-row-security

  • 只有在恢复具有行安全性的表的内容时,这个选项才相关。默认情况下,pg_restore将把row_security设置为 off 来确保所有数据都被恢复到表中。如果用户不拥有足够绕过行安全性的特权,那么会抛出一个错误。这个参数指示pg_restorerow_security设置为 on允许用户尝试恢复启用了行安全性的表的内容。如果用户没有从转储向表中插入行的权限,这仍将失败。

    注意当前这个选项还要求转储处于INSERT格式,因为COPY FROM不支持行安全性。

  • --if-exists

  • 在清理数据库对象时使用条件命令(即增加一个IF EXISTS子句)。只有指定了--clean时,这个选项才有效。

  • --no-data-for-failed-tables

  • 默认情况下,即便表的创建命令失败(例如因为表已经存在),表数据也会被恢复。通过这个选项,对这类表的数据会被跳过。如果目标数据库已经包含了想要的表内容,这种行为又很有有用。例如,PostgreSQL扩展(如PostGIS)的辅助表可能已经被载入到目标数据库中,指定这个选项就能阻止把重复的或者废弃的数据载入到这些表中。

    只有当直接恢复到一个数据库中时这个选项才有效,在产生 SQL脚本输出时这个选项不会产生效果。

  • --no-publications

  • 不要输出命令来恢复发布,即使存档包含它们。

  • --no-security-labels

  • 不要输出恢复安全标签的命令,即使归档中包含安全标签。

  • --no-subscriptions

  • 不要输出命令来恢复订阅,即使存档包含它们。

  • --no-tablespaces

  • 不输出命令选择表空间。通过这个选项,所有的对象都会被创建在恢复时的默认表空间中。

  • --section=sectionname

  • 只恢复提及的小节。小节的名称可以是pre-datadata或者post-data。可以把这个选项指定多次来选择多个小节。默认值是恢复所有小节。

    数据小节包含实际的表数据以及大对象定义。Post-data 项由索引定义、触发器、规则和除已验证的检查约束之外的约束构成。Pre-data 项由所有其他数据定义项构成。

  • --strict-names

  • 要求每一个模式(-n/--schema)以及表(-t/--table)限定词匹配备份文件中至少一个模式/表。

  • --use-set-session-authorization

  • 输出 SQL 标准的SET SESSION AUTHORIZATION命令取代ALTER OWNER命令来决定对象拥有权。这会让转储更加兼容标准,但是依赖于转储中对象的历史,可能无法正确恢复。

  • -?
    --help

  • 显示有关pg_restore命令行参数的帮助,并且退出。


pg_restore也接受下列用于连接参数的命令行参数:

  • -h host
    --host=host

  • 指定服务器正在运行的机器的主机名。如果该值开始于一个斜线,它被用作一个 Unix 域套接字的目录。默认是从PGHOST环境变量中取得(如果被设置),否则将尝试一次 Unix 域套接字连接。

  • -p port
    --port=port

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

  • -U username
    --username=username

  • 要作为哪个用户连接。

  • -w
    --no-password

  • 不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那么连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。

  • -W
    --password

  • 强制pg_restore在连接到一个数据库之前提示要求一个口令。

    这个选项不是必须的,因为如果服务器要求口令认证,pg_restore将自动提示要求一个口令。但是,pg_restore将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下,值得键入-W来避免额外的连接尝试。

  • --role=rolename

  • 指定一个用来创建该转储的角色名。这个选项导致pg_restore在连接到数据库后发出一个SET ROLE rolename命令。当已认证用户(由-U指定)缺少pg_restore所需的特权但是能够切换到一个具有所需权利的角色时,这个选项很有用。一些安装有针对直接作为超级用户登录的策略,使用这个选项可以让转储在不违反该策略的前提下完成。


环境

  • PGHOST
    PGOPTIONS
    PGPORT
    PGUSER

  • 默认连接参数

和大部分其他PostgreSQL工具相似,这个工具也使用libpq(见第 33.14 节)支持的环境变量。

诊断

当使用-d选项指定一个直接数据库连接时,pg_restore在内部执行SELECT语句。如果你运行pg_restore时出现问题,确定你能够从正在使用的数据库中选择信息,例如psql。此外,libpq前端-后端库所使用的任何默认连接设置和环境变量都将适用。

注解

如果你的数据库集簇对于template1数据库有任何本地添加,要注意将pg_restore的输出载入到一个真正的空数据库。否则你很可能由于以增加对象的重复定义而得到错误。要创建一个不带任何本地添加的空数据库,从template0而不是template1复制它,例如:

CREATE DATABASE foo WITH TEMPLATE template0;


下面将详细介绍pg_restore的局限性。

  • 在恢复数据到一个已经存在的表中并且使用了选项--disable-triggers时,pg_restore会在插入数据之前发出命令禁用用户表上的触发器,然后在完成数据插入后重新启用它们。如果恢复在中途停止,可能会让系统目录处于错误的状态。

  • pg_restore不能有选择地恢复大对象,例如只恢复特定表的大对象。如果一个归档包含大对象,那么所有的大对象都会被恢复,如果通过-L-t或者其他选项进行了排除,它们一个也不会被恢复。


pg_dump的局限性详见pg_dump文档。

一旦完成恢复,应该在每一个被恢复的表上运行ANALYZE,这样优化器能得到有用的统计信息。更多信息请见第 24.1.3 节第 24.1.6 节

示例

假设我们已经以自定义格式转储了一个叫做mydb的数据库:

$ pg_dump -Fc mydb > db.dump


要删除该数据库并且从转储中重新创建它:

$ dropdb mydb$ pg_restore -C -d postgres db.dump

-d开关中提到的数据库可以是任何已经存在于集簇中的数据库,pg_restore只会用它来为mydb发出CREATE DATABASE命令。通过-C,数据总是会被恢复到出现在归档文件的数据库名中。

要把转储重新载入到一个名为newdb的新数据库中:

$ createdb -T template0 newdb$ pg_restore -d newdb db.dump

注意我们不使用-C,而是直接连接到要恢复到其中的数据库。还要注意我们是从template0而不是template1创建了该数据库,以保证它最初是空的。

要对数据库项重排序,首先需要转储归档的表内容:

$ pg_restore -l db.dump > db.list

列表文件由一个头部和一些行组成,这些行每一个都用于一个项,例如:

;
; Archive created at Mon Sep 14 13:55:39 2009
;     dbname: DBDEMOS
;     TOC Entries: 81
;     Compression: 9
;     Dump Version: 1.10-0
;     Format: CUSTOM
;     Integer: 4 bytes
;     Offset: 8 bytes
;     Dumped from database version: 8.3.5
;     Dumped by pg_dump version: 8.3.8
;
;
; Selected TOC Entries:
;
3; 2615 2200 SCHEMA - public pasha
1861; 0 0 COMMENT - SCHEMA public pasha
1862; 0 0 ACL - public pasha
317; 1247 17715 TYPE public composite pasha
319; 1247 25899 DOMAIN public domain0 pasha

分号表示开始一段注释,行首的数字表明了分配给每个项的内部归档 ID。

文件中的行可以被注释掉、删除以及重排序。例如:

10; 145433 TABLE map_resolutions postgres
;2; 145344 TABLE species postgres
;4; 145359 TABLE nt_header postgres
6; 145402 TABLE species_records postgres
;8; 145416 TABLE ss_old postgres

把这样一个文件作为pg_restore的输入将会只恢复项 10 和 6,并且先恢复 10 再恢复 6。

$ pg_restore -L db.list db.dump


1、只导出表insert语句

pg_dump -h 192.168.80.1 -d postgres -U postgres  -W -p 5901 -t pg_database --inserts -a --column-inserts  --encoding=UTF8 -f d:\test1.sql



2、导出建表语句及、建constraint语句、insert into语句、建立索引

pg_dump -h 192.168.80.1 -d postgres -U postgres  -W -p 5901 -t t_lei --inserts   --encoding=UTF8 -Fp -f d:\lei_2.sql


要回复问题请先登录注册