PostgreSQL:提高pg_dump,pg_restore性能


78

开始时,我使用pg_dump默认的纯格式。我不知所措。

研究表明,使用可以节省时间和文件大小pg_dump -Fc | gzip -9 -c > dumpfile.gz。我很开悟。

是时候重新创建数据库了,

# 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个小时来创建数据库,但这只是它的一部分:

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

由于有预言,该数据库将达到数TB,因此我现在需要研究提高性能。

拜托,请赐教。

Answers:


55

首先检查您是否从磁盘设置中获得了合理的IO性能。然后检查您的PostgreSQL安装是否已正确调整。特别是shared_buffers应正确设置,maintenance_work_mem应在还原过程中增加,full_page_writes应在还原过程中关闭,应在还原过程wal_buffers中增加到16MB,checkpoint_segments应在还原过程中增加到16左右,不应有任何不合理的登录信息(例如记录执行的每个语句),auto_vacuum应在还原期间禁用。

如果您使用的是8.4,还可以尝试并行还原,请使用pg_restore的--jobs选项。


如果您连接了一个从属服务器,而主服务器上的负载已经相当大,那么您可能只想在从属服务器上进行备份。特别是由于从属服务器是只读的,因此我认为这可能在某种程度上也有所帮助。在大型群集中,如果备份需要很长时间,则有一个或多个从属服务器专门用于交错备份可能会有所帮助。为了不丢失任何内容,您希望这些备用数据库通过流复制进行连接,以便将它们从主数据库上的WAL写入。
StartupGuy 2013年

12
shared_buffers should be set correctly那是什么意思?
Juan Carlos Oropeza

1
@JuanCarlosOropeza —我遇到了以下文档,shared_buffers它可能会有所帮助。
Darragh Enright

25

改善pg转储和还原

PG_DUMP | 始终使用格式目录和-j选项

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

PG_RESTORE | 始终对postgres.conf和format-directory和-joptions使用调整

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/

这里改进的性能显著使用的配置参数
ramnar

3
该链接被打破
哈米德

哇!这对我有很大帮助!谢谢!
stasdeep

14

两个问题/想法:

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

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


我们目前是8.3;升级的新理由。
Joe Creighton 2010年

您可以将pg_restore的8.4版本与服务器的8.3版本一起使用。只要确保使用8.3中的pg_dump。
Magnus Hagander 2010年

呸。由于我们使用Postgres的Solaris10软件包安装,因此我们停留在8.3级别,并且“目前没有计划将PG8.4集成到S10中”。[参考 mail-archive.com/pgsql-general@postgresql.org/msg136829.html] 我将不得不承担安装和维护开源postgres的任务。不确定我们是否可以在这里做... Fe。
乔·克里顿

10

我假设您需要备份,而不是数据库的主要升级。

对于大型数据库的备份,应设置连续归档而不是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“选择pg_stop_backup()”

还原就像pg_start_backup从备份位置还原数据库和WAL日志不早于时间并启动Postgres一样简单。而且速度会更快。


1
我们没有考虑PITR(WAL归档),因为该系统的事务处理量不是很大,但是会保留许多历史记录。但是,现在考虑一下,更“增量”的备份可能会有所帮助。我会调查。谢谢。
乔·克里顿

7
zcat dumpfile.gz | pg_restore -d db_name

删除将未压缩的数据完全写入磁盘的操作,这是当前的瓶颈。


3

正如您可能只是通过压缩备份可以提高性能来猜测那样,备份受I / O约束。毫不奇怪,因为备份几乎总是受I / O约束的。压缩数据将I / O负载换为CPU负载,并且由于大多数CPU在怪兽数据传输期间处于空闲状态,因此压缩是最终的胜利。

因此,为了加快备份/还原时间,您需要更快的I / O。除了将数据库重组为一个巨大的单一实例之外,您几乎可以做的所有事情。


如果仅优化pg_dump时间,而从v9.3开始使用并行转储,则压缩> 0可能会造成很大的伤害!这是因为pg_dump和postmaster进程已经占用了CPU足够多的空间,以至于压缩> = 1的增加使整个任务明显受CPU约束,而不是受I / O约束。基本上,旧的假设是CPU处于空闲状态而没有压缩,这对于并行转储无效。
Acumenus 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.