database - 从 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 功能。
有什么方法可以加快数据库恢复速度?
系统
- Ubuntu 18.04.3
- 1 个 vCPU、2 GB RAM、4 GB 交换
- 500 GB ZFS(2 路镜像阵列)
- PostgreSQL 11.6
- 时标数据库 1.60
执行恢复的步骤:
将.gz文件解压到
/var/lib/postgresql/backups/backup_2020-02-29
(~40分钟)修改
postgresql.conf
设置
work_mem = 32MB
shared_buffers = 1GB
maintenance_work_mem = 1GB
full_page_writes = off
autovacuum = off
wal_buffers = -1
pg_ctl restart
在里面运行以下命令
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();
解决方案
%iowait
您的数据库系统是 I/O 绑定的,从63.62 的值可以看出。
增加maintenance_work_mem
可能会稍微改善这种情况,但本质上您需要更快的存储。
推荐阅读
- python - 正则表达式搜索返回“nonetype”
- nvd3.js - NVD3 多系列折线图
- java - Spring中对象列表的分页
- php - 无法在循环中向 cakephp4 中的返回查询添加字段
- git - 在 gitlab 中意外将 staging 合并到 master 分支
- r - 如何对r中的所有列使用ifelse函数?
- go - Golang 默认返回 2 位小数
- regex - 单个正则表达式和组匹配(命名组)以确定在 dart 中满足哪些条件
- python - Python EEL,从 python 到 javascript 的缓慢传输数据(视频流)
- api - 将 HTML 页面链接到 .Net Core Web API 项目的基本 URL