Клиент с проектом на Rails 5.2 наконец согласился обновить базу. Стоит десятка, поддержка которой закончилась ещё в ноябре. База 48 ГБ, VPS с двумя дисками, простой ночью до часа клиент готов терпеть. Выбираю между pg_dump с восстановлением и pg_upgrade. Кто как делал на таком объёме? И не будет ли сюрпризов у Rails 5.2 на 15-й версии?
На 48 ГБ дамп с восстановлением и пересборкой индексов в час можно не уложиться. pg_upgrade с --link проходит за минуты, потому что не копирует файлы данных, а делает жёсткие ссылки. Минус: после запуска нового кластера на старый уже не вернёшься, так что сначала полный бэкап. Сначала проверка:
sudo -u postgres /usr/lib/postgresql/15/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/10/main \
--new-datadir=/var/lib/postgresql/15/main \
--old-bindir=/usr/lib/postgresql/10/bin \
--new-bindir=/usr/lib/postgresql/15/bin \
--link --check
С --check он ничего не трогает, только смотрит совместимость. Потом то же самое без него. И после апгрейда обязательно vacuumdb --all --analyze-in-stages: статистика планировщика не переносится, без неё первые запросы будут странные.
Rails 5.2 на 15-м живёт нормально, проверьте только версию gem pg. И отрепетируйте на копии: снимок диска у хостера, отдельный VPS, тот же апгрейд. Узнаете реальное время и заодно поймаете расширения, которые надо обновлять.
Отчитываюсь. Репетиция на копии: 6 минут на сам pg_upgrade и 25 минут на analyze. На проде в 1:00 остановили приложение и Sidekiq, сделали бэкап, в 1:40 запустили апгрейд, в 1:47 база поднялась на 15-м. Analyze шёл в три стадии, первые минут десять поиск по каталогу был медленный, потом пришёл в норму. Единственный сюрприз: pg_trgm обновил через ALTER EXTENSION pg_trgm UPDATE, на репетиции про это забыл, а на проде вспомнил вовремя. Лёг спать в Гатчине в четвёртом часу, утром от клиента уже было спасибо. Выставил 6 часов, включая репетицию.
на Debian-подобных есть pg_upgradecluster -m upgrade --link 10 main, он делает то же самое и сам переносит конфиги, на будущее