首页 > 解决方案 > 从 130 小时提高 PostgreSQL pg_restore 性能

问题描述

我正在尝试缩短使用pg_restore. 29 GB gzip 压缩备份文件是使用pg_dump -Z0 -Fc管道从 380 GB PostgreSQL 数据库创建的pigz

在 期间,使用查询pg_restore估计数据库大小以 50 MB/分钟的速度增加。SELECT pg_size_pretty(pg_database_size())按照这个速度,大约需要 130 小时才能完成恢复,这是一个很长的时间。

pg_restore经过进一步调查,尽管设置为使用 4 个工作人员,但 CPU 使用率似乎很低。

在此处输入图像描述

磁盘写入速度和 IOPS 也很低:

在此处输入图像描述 在此处输入图像描述

对系统的 IO 使用进行基准测试fio表明,它可以执行 300 MB/s 的写入和 2000 IOPS,因此我们仅利用了大约 20% 的潜在 IO 功能。

有什么方法可以加快数据库恢复速度?

系统

执行恢复的步骤:

  1. 将.gz文件解压到/var/lib/postgresql/backups/backup_2020-02-29(~40分钟)

  2. 修改postgresql.conf设置

work_mem = 32MB
shared_buffers = 1GB            
maintenance_work_mem = 1GB      
full_page_writes = off
autovacuum = off
wal_buffers = -1
  1. pg_ctl restart

  2. 在里面运行以下命令psql

CREATE DATABASE database_development;
\c database_development
CREATE EXTENSION timescaledb;
SELECT timescaledb_pre_restore();

\! time pg_restore -j 4 -Fc -d database_development /var/lib/postgresql/backups/backup_2020-02-29

SELECT timescaledb_post_restore();

标签: databasepostgresqlbackuppg-restoretimescaledb

解决方案


%iowait您的数据库系统是 I/O 绑定的,从63.62 的值可以看出。

增加maintenance_work_mem可能会稍微改善这种情况,但本质上您需要更快的存储。


推荐阅读