Я пытаюсь сократить время восстановления резервной копии базы данных PostgreSQL, используя pg_restore
. Файл резервной копии, сжатый gzip, размером 29 ГБ, создается из базы данных 380 ГБ PostgreSQL с использованием pg_dump -Z0 -Fc
, переданной в pigz
.
. В течение pg_restore
размер базы данных увеличивается со скоростью 50 МБ / минута, оцененная с использованием запроса SELECT pg_size_pretty(pg_database_size())
. При такой скорости потребуется приблизительно 130 часов для завершения восстановления, что является очень длительным временем.
При дальнейшем исследовании выясняется, что загрузка ЦП низкая, несмотря на установку pg_restore
для использования 4 рабочих.
Скорость записи на диск и IOPS также очень низки:
Сравнительный анализ ввода-вывода системы с использованием fio
показал, что он может выполнять запись 300 МБ / с и 2000 операций ввода-вывода в секунду, поэтому мы используем только около 20% потенциальных возможностей ввода-вывода.
Есть ли способ ускорить восстановление базы данных?
Система
- Ubuntu 18.04.3
- 1 vCPU, 2 ГБ оперативной памяти, 4 ГБ подкачки
- 500 ГБ ZFS (двухсторонняя зеркальная матрица)
- PostgreSQL 11,6
- TimescaleDB 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();