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选项。
两个问题/想法:
-
通过指定-Fc,pg_dump输出已经被压缩。 压缩并不是最大的,所以你可以通过使用“gzip -9”来节省一些空间,但是我不敢保证使用额外的时间(和I / O)压缩和解压备份的-Fc版本。
-
如果您正在使用PostgreSQL 8.4.x,则可以使用新的pg_restore命令行选项“-jn”来加速从-Fc备份中恢复,其中n =用于恢复的并行连接数。 这将允许pg_restore加载多个表的数据或同时生成多个索引。
我假设你需要备份,而不是数据库的重大升级。
对于大型数据库的备份,您应该设置连续的归档而不是pg_dump
。
-
设置WAL归档 。
-
例如,每天通过使用您的基地备份
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_mem和checkpoint_segments的更改。
请参阅此页面 ,了解将数据批量插入PostgreSQL的性能提示。