PostgreSQL9.3Beta1:pg_dump 新增并行参数 (Parallel pg_dump)

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.3beta1)
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.1G

-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 368M May 17 13:56 2754.dat.gz
-rw-rw-r-- 1 pg93 pg93 246M May 17 13:55 2755.dat.gz
-rw-rw-r-- 1 pg93 pg93 124M May 17 13:57 2756.dat.gz
-rw-rw-r-- 1 pg93 pg93 62M May 17 13:58 2757.dat.gz
-rw-rw-r-- 1 pg93 pg93 246M May 17 13:57 2758.dat.gz
-rw-rw-r-- 1 pg93 pg93 7.4K 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 francs
You 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 开启并行注意事项

  1. 要开启 pg_dump 的并行参数,归档格式必须为 -Fd 。
  2. 开启并行后,会产生一个数据目录,并在这个目录中产生已压缩的数据文件。
  3. 开启并行后,运行过程中数据库负载会增加,但总体运行时间要短些。
  4. 使用 9.3 版本的 pg_dump 并行备份 pre-9.2 版本需要特别注意,建议不要这么做。

参考

原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/tech/database/237963.html

(0)
上一篇 2022年1月29日 22:32
下一篇 2022年1月29日 22:32

相关推荐

发表回复

登录后才能评论