PostgreSQL:提高pg_dump,pg_restore的性能

当我开始的时候,我用默认的plain格式使用了pg_dump 。 我失明了。

研究显示pg_dump -Fc | gzip -9 -c > dumpfile.gz改善时间和文件大小 pg_dump -Fc | gzip -9 -c > dumpfile.gz 。 我开悟了。

当重新创build数据库的时候,

 # create tablespace dbname location '/SAN/dbname'; # create database dbname tablespace dbname; # alter database dbname set temp_tablespaces = dbname; % gunzip dumpfile.gz # to evaluate restore time without a piped uncompression % pg_restore -d dbname dumpfile # into a new, empty database defined above 

我觉得没有意识到:恢复需要12个小时来创build数据库,这只是它的一小部分:

 # select pg_size_pretty(pg_database_size('dbname')); 47 GB 

因为有预测,这个数据库将是几TB,我现在需要看看提高性能。

请赐教。

首先检查你是否从磁盘设置获得合理的IO性能。 然后检查你的PostgreSQL安装是否适当的调整。 特别是应该正确设置shared_buffers ,在还原期间应该增加maintenance_work_mem ,在还原期间应该closuresfull_page_writes ,在还原期间wal_buffers应该增加到16MB,在还原期间应该增加checkpoint_segments到类似16的那样,你不应该有任何不合理的日志logging(如logging每个执行的语句),在恢复期间应禁用auto_vacuum

如果你在8.4也试验并行恢复,pg_restore的–jobs选项。

两个问题/想法:

  1. 通过指定-Fc,pg_dump输出已经被压缩。 压缩并不是最大的,所以你可以通过使用“gzip -9”来节省一些空间,但是我不敢保证使用额外的时间(和I / O)压缩和解压备份的-Fc版本。

  2. 如果您正在使用PostgreSQL 8.4.x,则可以使用新的pg_restore命令行选项“-jn”来加速从-Fc备份中恢复,其中n =用于恢复的并行连接数。 这将允许pg_restore加载多个表的数据或同时生成多个索引。

我假设你需要备份,而不是数据库的重大升级。

对于大型数据库的备份,您应该设置连续的归档而不是pg_dump

  1. 设置WAL归档 。

  2. 例如,每天通过使用您的基地备份
    psql template1 -c "select pg_start_backup(' `date +%F-%T“')”
    rsync -a –delete / var / lib / pgsql / data / / var / backups / pgsql / base /
    psql template1 -c“select pg_stop_backup()”

恢复将像从备份位置恢复数据库和WAL日志那样简单,并且不会比从备份位置启动Postgres的时间早于pg_start_backup时间。 而且会更快。

 zcat dumpfile.gz | pg_restore -d db_name 

删除将未压缩数据完整写入磁盘,这是目前的瓶颈。

正如您可能已经简单地通过压缩备份导致更快性能的事实猜想的,您的备份是I / O绑定的。 这应该是没有什么意外的,因为备份总是会被I / O绑定。 压缩数据为CPU负载交易I / O负载,并且由于大多数CPU在怪兽数据传输期间处于闲置状态,所以压缩以净赢的forms出现。

所以,为了加快备份/恢复时间,您需要更快的I / O。 除了重组数据库不是一个巨大的单一实例,这几乎是你所能做的。

改进pg转储和恢复

PG_DUMP | 总是使用带有-j选项的格式目录

 time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external 

PG_RESTORE | 总是使用带有-j选项的format目录对postgres.conf进行调优

 work_mem = 32MB shared_buffers = 4GB maintenance_work_mem = 2GB full_page_writes = off autovacuum = off wal_buffers = -1 time pg_restore -j 8 --format=d -C -d postgres /tmp/newout.dir/` 

欲了解更多信息

https://github.com/YanarAssaf/PostgreSQL/wiki/Improve-pg-dump%7Crestore

除了其他build议之外,不要忘记调整您的configuration,包括对maintenance_work_memcheckpoint_segments的更改。

请参阅此页面 ,了解将数据批量插入PostgreSQL的性能提示。