如何让pg_dump减less资源贪婪

我已经configurationcron使用以下规则每天调用pg_dump:

# xyz database backups: 00 01 * * * root umask 077 && pg_dump --user=xyz_system xyz | gzip > /var/xyz/backup/db/xyz/`date -u +\%Y\%m\%dT\%H\%M\%S`.gz 

基本上,它的工作。 数据库增长速度相对较快,但指数不是很大。 目前压缩转储大约需要160MB。 当数据库被转储时,系统开始抓取。 我使用top命令看到的平均负载大约是200, 200, 180 。 基本上服务器很难响应。

一个问题是如何确定瓶颈在哪里。 I / O操作繁重导致性能下降吗? 是由表locking问题引起的? 也许这是一个记忆问题? pg_dump命令的输出pg_dump送到gzip命令。 它是顺序的,即整个转储放在内存(交换问题?),然后压缩或并发(即gzip压缩得到的东西,等待更多)? 可能是由其他因素引起的?

第二个问题是如何使倾销行为对系统的主要function不那么侵犯。 据我了解,由于数据库的完整性,转储不会花费太多时间。 有表写锁,等等。我可以做些什么来限制这个问题(或考虑到数据库的增长而延迟)。

第三个问题 :现在是不是应该学习更高级的数据库configuration了? 系统工作正常,当数据库备份不执行,但也许数据库转储问题是传入问题的第一个症状?

哇。 惊人数量的问题。 我会尽力解决一些,但是这个答案还没有完成。

如何确定瓶颈在哪里。

首先使用top查看转储过程中发生了什么。 检查进程CPU使用情况,进程状态。 D意思是“等待I / O”。

I / O操作繁重导致性能下降吗?

是的,最有可能的。

是由表locking问题引起的?

也许。 您可以使用pg_stat_activity系统视图来查看转储过程中postgres中发生了什么。

也许这是一个记忆问题?

非常不可能。

pg_dump命令的输出被传送到gzip命令。 它是顺序的,即整个转储放在内存中(交换问题?)

不,gzip是一个工作在stream模式下的块压缩器,它不会将所有input保存在内存中。

然后压缩或并发(即gzip压缩它得到什么,等待更多)?

是的,它会逐块压缩,输出并等待更多。

可能是由其他因素引起的?

是。

据我了解,由于数据库的完整性,转储不会花费太多时间。 有表写锁,等等。我可以做些什么来限制这个问题(或考虑到数据库的增长而延迟)。

转储时间对转储完整性没有影响。 通过所有pg_dump进程使用具有可重复读取隔离级别的一个事务来确保完整性。 没有表写入锁。

现在是时候了解更高级的数据库configuration了吗? 系统工作正常,当数据库备份不执行,但也许数据库转储问题是传入问题的第一个症状?

不算太迟。 从http://wiki.postgresql.org/wiki/Performance_Optimization开始。

我build议你看看postgresql的连续存档 。 以下是使用pg_dump的优点:

  1. 无需每次都做完整的备份。 一个完整的备份就足够了,但是build议每隔几天进行一次完整的备份。
  2. 当数据库规模增长时,恢复速度非常快。
  3. 恢复到其他点(即时恢复)的能力。
  4. 您将每小时进行一次增量备份(30分钟左右)。 这可以configuration,也取决于更新活动。

但是,有一些缺点(在大多数情况下这可能不成问题):

  1. 通常需要更多空间,因为这些是二进制备份。 DB文件夹可以被压缩。
  2. 您不能在不同的体系结构(二进制数据)上恢复它们​​。