开始时,我使用了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,所以我现在需要考虑如何提高性能。
请告诉我
7条答案
按热度按时间5cg8jx4n1#
首先检查磁盘设置是否获得了合理的IO性能。然后检查您的PostgreSQL安装是否已适当调优。特别是
shared_buffers
应该正确设置,maintenance_work_mem
应该在恢复期间增加,full_page_writes
应该在恢复期间关闭,wal_buffers
应该在恢复期间增加到16 MB,checkpoint_segments
应该在恢复期间增加到16,您不应该有任何不合理的登录(类似于记录执行的每个语句),在恢复期间应禁用auto_vacuum
。如果您使用的是8.4,也可以尝试使用并行恢复,即pg_restore的--jobs选项。
chhqkbe12#
改进pg dump&restore
PG_转储|始终使用format-directory和
-j
选项PG_RESTORE|始终使用postgres.conf和format-directory以及
-j
选项的调优t2a7ltrp3#
两个问题/想法:
1.通过指定-Fc,pg_dump输出已被压缩。压缩不是最大的,所以你可能会发现使用“gzip-9”可以节省一些空间,但我敢打赌,这不足以保证压缩和解压缩备份的-Fc版本所需的额外时间(和I/O)。
1.如果您使用的是PostgreSQL 8.4.x,则可以使用新的pg_restore命令行选项“-j n”来加快从-Fc备份恢复的速度,其中n=用于恢复的并行连接数。这将允许pg_restore加载多个表的数据或同时生成多个索引。
zbq4xfa04#
我想你需要备份,而不是数据库的重大升级。
对于大型数据库的备份,您应该设置continuous archiving而不是
pg_dump
。1.设置WAL存档。
1.例如,每天使用以下命令进行基本备份
还原将与从备份位置还原不早于
pg_start_backup
时间的数据库和WAL日志并启动Postgres一样简单。而且会快得多。suzh9iv85#
删除未压缩数据到磁盘的完整写入,这是当前的瓶颈。
q43xntqr6#
您可能已经简单地通过压缩备份可以提高性能这一事实猜到,您的备份是I/O绑定的。这并不奇怪,因为备份几乎总是受到I/O的限制。压缩数据可以用I/O负载来交换CPU负载,而且由于大多数CPU在海量数据传输期间处于空闲状态,因此压缩是一种净收益。
因此,要加快备份/恢复时间,您需要更快的I/O。除了重新组织数据库使其不是一个巨大的单个示例之外,这几乎是您所能做的全部工作。
egdjgwm87#
如果您遇到
pg_restore
的速度问题,请检查是否使用INSERT
或COPY
语句转储数据。如果使用
INSERT
(pg_dump
是通过--column-inserts
参数调用的),数据恢复速度会明显变慢。使用
INSERT
可以很好地将转储文件加载到非Postgres数据库中。但是如果你恢复到Postgres,在使用pg_dump
时省略使用--column-inserts
参数。