首页 > 数据库 > 数据库开发技术 > PostgreSQL备份的几种小技巧
使用pg_dump做导出时,比较常见下面的两种使用方式:
仅导出结构
仅导出数据
-a,--data-only dump only the data, not the schema
这两种方式的比较熟知,但pg_dump还有一个section子项,能控制导出对象的顺序。
section=pre-data,只导出对象DDL排除索引
section=data,导出数据
section=post-data,最后进行约束校验和索引创建
post-data导出包含索引、规则、触发器、唯一约束、主键、外键约束,不包含检查约束和非空约束。
使用pg_dump/pg_restore的自定义格式时,可以通过清单文件来恢复出特定的数据库对象,例如仅恢复函数或仅恢复表结构等。
清单文件需要导出时使用-Fc格式
$ pg_dump -Fc mydb -f mydatabase.db
备份文件生成之后,再使用pg_restore工具的-l开关生成清单:
$ pg_restore -l mydatabase.db > mydatabase_manifest.ini
随后我们可以按照清单文件进行恢复:
$ pg_restore -L mydatabase_manifest.ini -d mydb2 mydatabase.db
例如下面演示只导出public模式下所有表结构,而不导出序列、索引、约束及函数:
$ pg_dump -s -Fc mydb --file=dump_schema -n public testdb$ pg_restore --list dump_schema | grep "TABLE" > table_list$ pg_restore --dbname=testdb2 --use-list=table_list dump_schema
利用RR快照加速单表导出
pg_dump可以使用Fd选项,利用多个workers在db级并行化导出,但并行化是表级别的,单个表不能进一步并行化。
为了对单个大表(非分区表)并行化导出数据,需要使用多个psql客户端,每个客户端的事务隔离级别都使用REPEATABLE READ(RR),最后使用pg_dump的- -snapshot工作在同一快照下。

上面这张图里,左边面板第1个psql客户端先使用RR事务隔离级别,接着使用pg_export_snapshot()函数获取快照ID:00000008-000000AC-1
图中右边面板第2个、第3个psql客户端同样使用RR事务隔离级别,然后使用相同的快照ID。如此多个psql客户端可以在相同的事务快照下对单表进行并行化加速导出。
大表拆分的query语句可以利用表的主键进行索引扫描或系统隐藏字段ctid进行tid扫描,避免全表扫。
除大表之外的其他小表可以整体导出:
$ pg_dump -Fd -j2 \-f ./other_data.dump \--snapshot="00000008-000000AC-1" \--exclude-table-data="pgbench_accounts" testdb
待所有任务执行完后,再结束上图中第一个psql里的事务。
参考资料
1.https://www.modb.pro/db/239879
2.https://gitlab.com/postgres-ai/postgresql-consulting/postgres-howtos/-/blob/main/0008_how_to_speed_up_pg_dump.md
原文作者:象楚之行;如有侵权,请联系管理员删除。