如何使 pg_dump 减少资源贪婪

Dar*_*zak 8 postgresql performance database-backup

我已将 cron 配置为使用以下规则每天调用 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
Run Code Online (Sandbox Code Playgroud)

基本上,它有效。数据库增长相对较快且呈指数增长(但指数不是很大)。目前,压缩后的转储大约需要 160MB。当数据库被转储时,系统开始爬行。我使用该top命令看到的平均负载约为200, 200, 180. 基本上服务器几乎没有响应。

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

第二个问题是如何使倾倒操作该系统的主要功能侵扰程度较低。据我了解,由于数据库完整性,转储不能花费太多时间。有表写锁等。我可以做些什么来限制问题(或延迟它,考虑到数据库增长)。

第三个问题:是否已经时间来了解更多的高级数据库配置?系统工作正常,当不执行数据库备份时,但也许数据库转储问题是传入问题的第一个症状?

小智 14

哇。数量惊人的问题。我会尝试解决一些问题,但这个答案还不完整。

如何确定瓶颈在哪里。

top首先使用以查看转储期间发生的情况。检查进程 CPU 使用率、进程状态。D意思是“等待 I/O”。

性能低下是I/O操作繁重导致的吗?

是的,很有可能。

是由表锁定问题引起的吗?

也许。您可以使用pg_stat_activity系统视图查看转储期间 postgres 中发生的情况。

也许这是一个内存问题?

非常不可能。

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

不可以。gzip 是在流模式下工作的块压缩器,它不会将所有输入保留在内存中。

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

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

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

是的。

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

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

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

永远不会太晚。从http://wiki.postgresql.org/wiki/Performance_Optimization开始。


Kha*_*led 6

我建议您查看postgresql 的连续归档。以下是使用 pg_dump 的优点:

  1. 无需每次都进行完整备份。开始时进行一次完整备份就足够了,但建议例如每隔几天进行一次完整备份。
  2. 当数据库的大小增长时,恢复速度要快得多。
  3. 恢复到其他点的能力(时间点恢复)。
  4. 您将每小时(30 分钟左右)进行一次增量备份。这可以配置并且还取决于更新活动。

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

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