pg 备份恢复之 pg_dump
pg_dump
pg_dump — 把 PostgreSQL 数据库抽取为一个脚本文件或其他归档文件
大纲:
[root@pg-test ~]# pg_dump --help
pg_dump dumps a database as a text file or to other formats.
Usage:
pg_dump [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 时,我们应该检查输出中有没有任何警告(打印在标准错误上),特别是考
虑到下面列出的限制。
诊断
pg_dump 在内部执行 SELECT 语句。如果你运行 pg_dump 时出现问题,确定你能够从正在使用
的数据库中选择信息,例如 psql 。此外,libpq前端-后端库所使用的任何默认连接设置和环
境变量都将适用。
pg_dump 的数据库活动会被统计收集器正常地收集。如果不想这样,你可以通
过 PGOPTIONS 或 ALTER USER 命令设置参数 track_counts 为假。
注解
如果你的数据库集簇对于 template1 数据库有任何本地添加,要注意将 pg_dump 的输出恢复到
一个真正的空数据库。否则你很可能由于以增加对象的重复定义而得到错误。要创建一个不
带任何本地添加的空数据库,从 template0 而不是 template1 复制它,例如:
CREATE DATABASE foo WITH TEMPLATE template0;
当一个只含数据的转储被选中并且使用了选项 --disable-triggers 时,pg_dump在开始插入数据
之前会发出命令禁用用户表上的触发器,并且接着在数据被插入之后发出命令重新启用它
们。如果恢复中途被停止,系统目录可能会停留在一种错误状态。
pg_dump 产生的转储文件不包含优化器用来做出查询计划决定的统计信息。因此,在从一个
转储文件恢复后运行 ANALYZE 来确保最优性能是明智的
转储文件也不包含任何 ALTER DATABASE … SET 命令,这些设置会与数据库用户及其他安
装设置一起被 pg_dumpall 转储。
因为 pg_dump 被用来传输数据到更新版本的PostgreSQL,pg_dump的输出被认为可以载入到比
pg_dump 版本更新的 PostgreSQL 服务器中。pg_dump也能够从比其版本更旧的 PostgreSQL 服务
器中转储(当前支持回退到版本 8.0)。不过,pg_dump无法从比起主版本号更新的
PostgreSQL 服务器中转储,它甚至将拒绝冒着创建一个非法转储的风险尝试。还有,不保证
pg_dump 的输出能被载入到一个更旧主版本的服务器 — 即使该转储是从该版本的服务器中被
取得也不行。将一个转储文件载入到一个更旧的服务器可能需要手工编辑该转储文件来移除
旧服务器无法理解的语法。在跨版本的情况下,推荐使用 --quote-all-identifiers 选项,因为它
可以避免因为不同 PostgreSQL 版本间的保留词列表变化而发生问题。
在转储逻辑复制订阅时,pg_dump将生成使用
NOCONNECT 选项的 CREATE
SUBSCRIPTION 命令, 以便恢复订阅不会创建远程连接复制插槽或初始表副本。这样,可以
恢复转储, 而不需要网络访问远程服务器。然后由用户以合适的方式重新激活订阅。 如果
涉及的主机已更改,则可能必须更改连接信息。 在启动新的全表副本之前截断目标表也许是
适当的。
实例
接下来我用我的测试库来做一些实验:
- 要把一个数据库 mydb 转储到一个 SQL 脚本文件:
pg_dump [connection-option...] [option...] [dbname]
$ pg_dump mydb > db.sql
[root@pg-test pgdb_backup]# pwd
/data/pgdb_backup
[root@pg-test pgdb_backup]# pg_dump -U postgres mydb > ./pgdb_bk_`date +%F`.sql
--当然,也可以压缩来节省存储空间:
[root@pg-test pgdb_backup]# pg_dump -U postgres mydb |gzip > ./pgdb_bk_`date +%F`.sql.gz
现在我测试把这个库删除用psql来恢复:
postgres=# drop database mydb;
ERROR: database "mydb" is being accessed by other users
DETAIL: There is 1 other session using the database.
postgres=# drop database mydb;
DROP DATABASE
--注意杀删除数据库的时候不能用会话连接到这个数据库上;
用psql恢复:
[root@pg-test pgdb_backup]# psql -U postgres -d mydb < pgdb_bk_2019-11-04.sql
psql: FATAL: database “mydb” does not exist
报错了,提示没有数据库mydb,也就是说导出的sql是没有创建数据库的sql的,我们给他创建上:
CREATE DATABASE mydb
WITH
TEMPLATE = template0
OWNER = mydb
ENCODING = 'UTF8'
LC_COLLATE = 'zh_CN.utf8'
LC_CTYPE = 'zh_CN.utf8'
TABLESPACE = app_tbs
CONNECTION LIMIT = -1;
连接到指定的库,scaame后查看表都回来了;
- 接下来再测试导出归档日志文件格式的一种恢复:
要转储一个数据库到一个自定义格式归档文件:
$ pg_dump -U postgres -Fc mydb > db.dump
导入的时候:
$ pg_restore -U postgres -d mydb pgdb_bk_2019-11-04.dump --需要重新创建mydb数据库
$ pg_restore -U postgres -C -d postgres pgdb_bk_2019-11-04.dump --不需要创建mydb
这是因为:
-C
--create
在恢复一个数据库之前先创建它。如果还指定了 --clean ,在连接到目标数据库之前丢弃
并且重建它。
在使用这个选项时, -d 提到的数据库只被用于发出初始的 DROP DATABASE 和 CREATE
DATABASE 命令。所有要恢复到该数据库名中的数据都出现在归档中。
-d dbname
--dbname=dbname
连接到数据库 dbname 并且直接恢复到该数据库中。
附
以上两种备份恢复的方法可以满足基本的维护了,其余的一些参数研究,有空再搞吧:
选项
下列命令选项控制输出的内容和格式。
dbname
指定要被转储的数据库名。如果没有指定,将使用环境变量 PGDATABASE 。如果环境
变量也没有设置,则使用指定给该连接的用户名。
-a
–data-only
只转储数据,而不转储模式(数据定义)。表数据、大对象和序列值都会被转储。
这个选项类似于指定 --section=data ,但是由于历史原因又不完全相同。
-b
–blobs
在转储中包括大对象。这是当 --schema 、 --table 或 --schema-only 被指定时的默认行为,因
此 -b 开关仅对于将大对象添加到已请求特定模式或表的转储中时有用。 请注意,blob被
视为数据,因此仅在使用-- data-only 时才会包含, 但在-- schema-only 时不会包含。
-B
–no-blobs
排除转储中的大对象。
当给定 -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 schema
–exclude-schema=schema
不转储匹配 schema 模式的任何模式。该模式被根据 -n 所用的相同规则被解释。 -N 可以被
给定多次来排除匹配几个模式中任意一个的模式。
当 -n 和 -N 都被给定时,该行为是只转储匹配至少一个 -n 开关但是不匹配 -N 开关的模式。
如果只有 -N 而没有 -n ,那么匹配 -N 的模式会被从一个正常转储中排除。
-o
–oids
转储对象标识符(OID)作为每个表数据的一部分。如果你的应用以某种方式引用 OID 列
(例如在一个外键约束中),应使用这个选项。否则,这个选项不应该被使用。
-O
–no-owner
不输出设置对象拥有关系来匹配原始数据库的命令。默认情况下,pg_dump会发
出 ALTER OWNER 或 SET 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 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-data 、 data 或 post-data 。这个选项可以被指定多次来
选择多个节。默认是转储所有节。
数据节包含真正的表数据、大对象内容和序列值。数据后项包括索引、触发器、规则和
除了已验证检查约束之外的约束的定义。数据前项包括所有其他数据定义项。
–serializable-deferrable
为转储使用一个可序列化事务,以保证所使用的快照与后来的数据库状态是一致的。但
是这样做是在事务流中等待一个点,在该点上不能存在异常,这样就不会有转储失败或
者导致其他事务带着 serialization_failure 回滚的风险。关于事务隔离和并发控制
对于一个只为灾难恢复存在的转储,这个选项没什么益处。如果一个转储被用来在原始
数据库持续被更新期间载入一份用于报表或其他只读负载的数据库拷贝时,这个选项就
有所帮助。如果没有这个选项,转储可能会反映一个与最终提交事务的任何执行序列都
不一致的状态。例如,如果使用了批处理技术,一个批处理在转储中可以显示为关闭,
而其中的所有项都不出现。
如果 pg_dump 被启动时没有读写事务在活动,则这个选项没有什么不同。如果有读写事
务在活动,该转储的启动可能会被延迟一段不确定的时间。一旦开始运行,有没有这个
开关的表现是相同的。
–snapshot=snapshotname
在做一个数据库的转储时指定一个同步的快照(详见 表 9.82 )。
在需要把转储和一个逻辑复制槽(见第 48 章) 或者一个并发会话同步时可以用上这个选
项。
在并行转储的情况下,将使用这个选项指定的快照名而不是取一个新快照。
–strict-names
要求每一个模式( -n/–schema )和表( -t/–table )限定符匹配要转储的数据库中至少一个
模式/表。注意,如果没有找到有这样的模式/表限定符匹配,即便没有 --strict-
names ,pg_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 工具相似
要转储一个数据库到一个目录格式的归档:
$ pg_dump -Fd mydb -f dumpdir
要用 5 个并行的工作者任务转储一个数据库到一个目录格式的归档:
$ pg_dump -Fd mydb -j 5 -f dumpdir
要把一个归档文件重新载入到一个(新创建的)名为 newdb 的数据库:
$ pg_restore -d newdb db.dump
要转储一个名为 mytab 的表:
$ pg_dump -t mytab mydb > db.sql
要转储 detroit 模式中名称以 emp 开始的所有表,排除名为 employee_log 的表:
$ pg_dump -t ‘detroit.emp*’ -T detroit.employee_log mydb > db.sql
要转储名称以 east 或者 west 开始并且以 gsm 结束的所有模式,排除名称包含词 test 的任何模
式:
$ pg_dump -n ‘eastgsm’ -n 'westgsm’ -N ‘test’ mydb > db.sql
同样,用正则表达式记号法来合并开关:
$ pg_dump -n ‘(east|west)gsm’ -N ‘test’ mydb > db.sql
要转储除了名称以 ts_ 开头的表之外的所有数据库对象:
$ pg_dump -T 'ts_’ mydb > db.sql
要在 -t 和相关开关中指定一个大写形式或混合大小写形式的名称,你需要双引用该名称,否
则它会被折叠到小写形式(见模式(Pattern))。但是双引号对于 shell 是特殊的,所以反
过来它们必须被引用。因此,要转储一个有混合大小写名称的表,你需要类似这样的东西:
$ pg_dump -t ““MixedCaseName”” mydb > mytab.sql