# 生产转储文件
SQL 转储方法的思想是创建一个由SQL命令组成的文件,当把这个文件回馈给服务器时,服务器将利用其中的SQL命令重建与转储时状态一样的数据库。 PostgreSQL为此提供了工具[pg_dump](http://www.postgres.cn/docs/12/app-pgdump.html)。这个工具的基本用法是:
```
pg_dump dbname > dumpfile
```
由pg_dump创建的备份在内部是一致的, 也就是说,转储表现了pg_dump开始运行时刻的数据库快照,且在pg_dump运行过程中发生的更新将不会被转储。pg_dump工作的时候并不阻塞其他的对数据库的操作。
> pg_dump 只能保存某一时刻的快照。
# 从转储中恢复
pg_dump生成的文本文件可以由psql程序读取。 从转储中恢复的常用命令是:
```
psql dbname < dumpfile
```
> 其中*`dumpfile`*就是pg_dump命令的输出文件。这条命令不会创建数据库*`dbname`*,你必须在执行psql前自己从`template0`创建(例如,用命令`createdb -T template0 *`dbname`*`)。psql支持类似pg_dump的选项用以指定要连接的数据库服务器和要使用的用户名。
pg_dump和psql读写管道的能力使得直接从一个服务器转储一个数据库到另一个服务器成为可能,例如:
```
pg_dump -h host1 dbname | psql -h host2 dbname
```
**pg_dump产生的转储是相对于`template0`。这意味着在`template1`中加入的任何语言、过程等都会被pg_dump转储。结果是,如果在恢复时使用的是一个自定义的`template1`,你必须从`template0`创建一个空的数据库。**
# pg_dumpall
pg_dump每次只转储一个数据库,而且它不会转储关于角色或表空间(因为它们是集簇范围的)的信息。为了支持方便地转储一个数据库集簇的全部内容,提供了[pg_dumpall](http://www.postgres.cn/docs/12/app-pg-dumpall.html)程序。pg_dumpall备份一个给定集簇中的每一个数据库,并且也保留了集簇范围的数据,如角色和表空间定义。该命令的基本用法是:
```
pg_dumpall > dumpfile
```
转储的结果可以使用psql恢复:
```
psql -f dumpfile postgres
```
> 如我们数据库需要定时备份,就可以用这个命令转储数据库SQL,配合crontab实现定时备份。
# 处理大型数据库
使用压缩转储:
```
pg_dump dbname | gzip > filename.gz
```
恢复:
```
gunzip -c filename.gz | psql dbname
# 或者
cat filename.gz | gunzip | psql dbname
```
使用split
```
pg_dump dbname | split -b 1m - filename
```
恢复:
```
cat filename* | psql dbname
```
**使用pg_dump的自定义转储格式。.** 如果PostgreSQL所在的系统上安装了zlib压缩库,自定义转储格式将在写出数据到输出文件时对其压缩。这将产生和使用`gzip`时差不多大小的转储文件,但是这种方式的一个优势是其中的表可以被有选择地恢复。下面的命令使用自定义转储格式来转储一个数据库:
```
pg_dump -Fc dbname > filename
```
自定义格式的转储不是psql的脚本,只能通过pg_restore恢复,例如:
```
pg_restore -d dbname filename
```
**使用pg_dump的并行转储特性。.** 为了加快转储一个大型数据库的速度,你可以使用pg_dump的并行模式。它将同时转储多个表。你可以使用`-j`参数控制并行度。并行转储只支持“目录”归档格式。
```
pg_dump -j num -F d -f out.dir dbname
```
>PostgreSQL手册链接:http://www.postgres.cn/docs/12/backup-dump.html
PostgreSQL备份恢复-SQL转储