9.3 版本开始,pg_dump 增加 -j njobs 参数支持并行导出功能,而之前版本的 pg_dump 备份时不支持这一功能,当然这个并行也有很多限制,之后会介绍到。
环境信息
主机: 8 核 8GB 数据库: PostgreSQL9.3beta1 系统:CentOS release 5.4
1.1 数据库信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
[pg93@server1 ~]$ psql psql (9.3 beta1) Type "help" for help. francs=> select pg_size_pretty(pg_database_size('francs')); pg_size_pretty ---------------- 5678 MB(1 row) francs=> /dt+ List of relations Schema | Name | Type | Owner | Size | Description --------+------------+-------+--------+------------+------------- francs | big_table1 | table | francs | 1613 MB | francs | big_table2 | table | francs | 1074 MB |francs | big_table3 | table | francs | 535 MB |francs | big_table4 | table | francs | 265 MB |francs | big_table5 | table | francs | 1073 MB |francs | test_1 | table | francs | 8192 bytes |francs | test_json1 | table | francs | 16 kB |(7 rows)
并行备份测试
2.1 普通备份
1
pg_dump -h 127.0 .0 .1 -E UTF8 -Fc -U postgres -v francs > francs .dmp
备注:耗时 9分51秒; 备份文件大小 1046 MB 。
2.2 并行备份: -j 2 2.2.1 备份脚本
1
pg_dump -h 127.0 .0 .1 -E UTF8 -Fd -j 2 -U postgres -v francs -f francs_j2
备注:耗时 4分59秒; 备份目录大小 1045 MB。
2.2.2 备份过程中有两个 copy 进程。
1 2 3
[pg93@server1 tf]$ ps -ef | grep COPY pg93 15813 32478 42 13:53 ? 00:00:02 postgres: postgres francs 127.0.0.1(59247) COPY pg93 15814 32478 40 13:53 ? 00:00:02 postgres: postgres francs 127.0.0.1(59248) COPY
2.2.3 备份目录的文件
1 2 3 4 5 6 7 8 9 10 11
[pg93@server1 tf]$ ll francs_j2 total 1.1 G -rw-rw-r-- 1 pg93 pg93 52 May 17 13 :57 2751 .dat .gz -rw-rw-r-- 1 pg93 pg93 74 May 17 13 :57 2753 .dat .gz -rw-rw-r-- 1 pg93 pg93 368 M May 17 13 :56 2754 .dat .gz -rw-rw-r-- 1 pg93 pg93 246 M May 17 13 :55 2755 .dat .gz -rw-rw-r-- 1 pg93 pg93 124 M May 17 13 :57 2756 .dat .gz -rw-rw-r-- 1 pg93 pg93 62 M May 17 13 :58 2757 .dat .gz -rw-rw-r-- 1 pg93 pg93 246 M May 17 13 :57 2758 .dat .gz -rw-rw-r-- 1 pg93 pg93 7.4 K May 17 13 :53 toc.dat
备注:pg_dump 加了 -j 参数后,会对每张表生成一个已压缩的备份文件。
2.3 并行备份: -j 4 2.3.1 备份脚本
1
pg_dump -h 127.0 .0 .1 -E UTF8 -Fd -j 4 -U postgres -v francs -f francs_j4
备注:耗时 4分16秒 ; 备份目录大小 1045 MB。
2.3.2 对应有 4 个 COPY 进程
1 2 3 4 5
[pg93@server1 tf]$ ps -ef | grep COPY pg93 16280 32478 39 14:00 ? 00:00:03 postgres: postgres francs 127.0.0.1(55852) COPY pg93 16283 32478 30 14:00 ? 00:00:03 postgres: postgres francs 127.0.0.1(55853) COPY pg93 16285 32478 34 14:00 ? 00:00:03 postgres: postgres francs 127.0.0.1(55854) COPY pg93 16286 32478 33 14:00 ? 00:00:03 postgres: postgres francs 127.0.0.1(55855) COPY
备注:开启 4 个并行进程时,服务器明显负载升高,负载达到 6 左右。
2.4 总结 从上面测试来看,开启并行备份产生的文件和不开启并行的文件大小差不多大,但开启并行的总体时间要短些,服务器负载也高些。
数据库大小: 5678 MB
并行度
消耗时间
备份文件大小
-j 2
4分59秒
1045 MB
-j 4
4分16秒
1045 MB
恢复测试
加了 -j 参数的 pg_dump 最后产生的是目录,并且目录里存放的是已压缩的表文件,那么如何利用这个目录恢复数据库呢,接着测试。
3.1 创建新库 francs2
1 2 3 4 5 6 7 8 9 10 11
postgres =# create database francs2;CREATE DATABASE postgres =# grant all on database francs2 to francs with grant option;GRANT postgres =# /c francs2 francsYou are now connected to database "francs2" as user "francs" . francs2 => create schema francs;CREATE SCHEMA
3.2 将备份文件导入库 francs2
1
pg_restore -h 127.0 .0 .1 -d francs2 -U postgres -v -j 2 francs_j4
备注:francs_j4 是数据目录,之前版本这里需要指定文件,而这里指定的是目录。
3.3 验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14
francs=> /c francs2 francs You are now connected to database "francs2" as user "francs" . francs2=> /dt List of relations Schema | Name | Type | Owner --------+------------+-------+-------- francs | big_table1 | table | francs francs | big_table2 | table | francs francs | big_table3 | table | francs francs | big_table4 | table | francs francs | big_table5 | table | francs francs | test_1 | table | francs francs | test_json1 | table | francs
备注:导入正常。
pg_dump 开启并行注意事项
要开启 pg_dump 的并行参数,归档格式必须为 -Fd 。
开启并行后,会产生一个数据目录,并在这个目录中产生已压缩的数据文件。
开启并行后,运行过程中数据库负载会增加,但总体运行时间要短些。
使用 9.3 版本的 pg_dump 并行备份 pre-9.2 版本需要特别注意,建议不要这么做。
参考
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/tech/database/237963.html