Обновление версии PostgreSQL: инструкция
В PostgreSQL обновление версии выполняется разными способами:
- Установка пакетов с новой версией PostgreSQL — подходит только для минорных обновлений, прежде чем выполнять, необходимо изучить release notes;
- Использование стандартной программы
pg_dumpall
— надёжный способ, но возможен длительный downtime. - Использование стандартной программы
pg_upgrade
— быстрый способ, но возможны ошибки. - Обновление через логическую репликацию — минимальный downtime, однако подходит только для версий PostgreSQL > 10.0. Для более ранних версий требуются расширения.
Выбор зависит от того, какой релиз используется на сервере и до какой версии вы хотите обновиться.
В этой статье разберём способы обновления.
Что важно знать перед обновлением PostgreSQL
Главное — понимать особенности обновлений между разными версиями.
Номера состоят из двух цифр — например, 10.1. Первая цифра — номер основной версии (10). Вторая цифра — номер корректирующего релиза (1).
До PostgreSQL 10 номера состоят из трёх цифр. Например, 9.6.3. Здесь 9.6 — номер основного выпуска, а 3 — номер дополнительной версии.
Понимать эту разницу нужно для того, чтобы правильно выбирать способ обновления.
В корректирующих версиях не меняется форма данных. Благодаря этому нет проблем с совместимостью. Поэтому переход с PostgreSQL 10.1 на 10.6 выполняется без лишних затрат ресурсов. Для обновления выключите сервер, замените исполняемые файлы и запустите сервер заново.
Однако в документации отмечается, что для некоторых выпусков могут потребоваться ручные изменения. Поэтому всегда читайте примечания к выпуску, прежде чем выполнять обновление.
В основных версиях формат данных может измениться. Это усложняет обновление. В таком случае нельзя изменить номер. Нужно или выгружать данные и загружать их заново, или использовать программу pg_upgrade
, или применять логическую репликацию.
Обо всех этих способах поговорим ниже.
Обновление в рамках одной основной версии
Посмотрим на примере апдейта PostgreSQL 14.1 до PostgreSQL 14.3 на сервере Ubuntu.
PostgreSQL доступен на Ubuntu по умолчанию. Обновитесь командой:
sudo apt-get upgrade
Debian и Ubuntu выпускают только одну версию PostgreSQL для каждого выпуска ОС. Например, в Debian Squeeze/6.0 есть только PostgreSQL 8.4. Если вам нужна другая версия PostgreSQL, используйте пакеты от PGDG.
Если вы хотите самый свежий релиз, то нужно прежде установить репозиторий Постгреса.
Добавьте репозиторий:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Импортируйте ключ подписи:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Обновите перечень пакетов в системе:
sudo apt-get update
Установите нужную версию СУБД:
sudo apt-get -y install postgresql-14.3
Чтобы посмотреть список установленных СУБД, выполните:
dpkg --get-selections | grep postgres
Также посмотрите список кластеров:
pg_lsclusters
Прежде чем вносить изменения, остановите PostgreSQL:
sudo service postgresql stop
Когда пакеты Postgres устанавливаются, они создают для вас кластер по умолчанию. Нам нужно переименовать новый кластер postgres, чтобы при апгрейде старого кластера имена не конфликтовали.
sudo pg_renamecluster 14.3 main main_pristine
Обновите старый кластер:
sudo pg_upgradecluster 14.1 main
Запустите сервис:
sudo service postgresql start
Снова проверьте список кластеров и убедитесь, что новый работает:
pg_lsclusters
Избавьтесь от старого кластера:
sudo pg_dropcluster 14.1 main
Подставьте в эти команды нужные номера версий вместо 14.1 и 14.3.
Обновление через pg_dumpall
Если нужно изменить основную версию, используйте программу pg_dumpall
. Суть этого метода в том, чтобы выгрузить данные из одной основной версии, а затем загрузить их в другую.
- Прежде чем выгружать данные, убедитесь, что в БД не проводятся никакие изменения прямо сейчас. В противном случае часть изменений может не попасть в итоговый дамп.
- Получите дамп и запишите его в файл:
pg_dumpall > output_file
- Остановите сервер:
pg_ctl stop
- Измените имя старого каталога чтобы исключить появление конфликта имён:
mv /usr/local/pgsql /usr/local/pgsql.old
Старый каталог можно просто удалить. Но разумнее будет его переименовать, чтобы оставить возможность для восстановления. Вместо /usr/local/pgsql
укажите путь до своего каталога.
- Установите новую версию из исходного кода. Подробная инструкция на русском языке — в документации.
- Сформируйте новый кластер:
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
- Перенесите все изменения в файлы
pg_hba.conf
иpostgresql.conf
. - Запустите сервер БД:
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
- Восстановите данные из резервной копии:
/usr/local/pgsql/bin/psql -d postgres -f output_file
Минус этого способа — сервер будет выключен длительное время. Для сокращения времени простоя можно установить новый сервер в другой каталог, а затем запустить старый и новый серверы на разных портах. Для переноса данных используйте команду:
pg_dumpall -p 5432 | psql -d postgres -p 5433
Вместо 5432 и 5433 укажите номера портов, на которых вы запустили серверы.
Обновление через pg_upgrade
Чтобы не делать выгрузку и загрузку данных, используйте программу pg_upgrade
. Она помогает обновиться быстрее. Программа pg_upgrade
создаёт системные таблицы заново, учитывая изменения последних версий. При этом старые файлы данных сохраняются. Кроме того, pg_upgrade проверяет, что кластеры совместимы.
Программу pg_upgrade
помогает обновиться с PostgreSQL 8.4.X до текущего релиза СУБД.
Рассмотрим общий план обновления с помощью pg_upgrade
.
- Переместите старый кластер. Это нужно сделать, если каталог не был привязан к старому релизу. Например, он находится по адресу
/usr/local/pgsql
. Если вы его не переименуете, то при обновлении произойдёт конфликт.
Переименование выполняется при выключенном сервере командой:
mv /usr/local/pgsql /usr/local/pgsql.old
- Соберите новую версию из исходного кода. Настройте configure, чтобы флаги были совместимы с конфигурацией старого кластера. Прежде чем начинать обновление,
pg_upgrade
проверит совместимость флагов. - Инсталлируйте новые исполняемые файлы. Для размещения сервера в нестандартной директории, используйте
prefix
:
make prefix=/usr/local/pgsql.new install
- Используйте
initdb
, чтобы инициализировать новый кластер. Проверьте, что флаги совместимы с флагами старого кластера. - Инсталлируйте разделяемые объектные файлы расширения. Если для них доступны обновления,
pg_upgrade
самостоятельно создаст скрипт для их последующей установки. - Перенесите файлы полнотекстового поиска.
- Настройте аутентификацию
peer
вpg_hba.conf
. Это нужно сделать, потому чтоpg_upgrade
будет несколько раз подключаться к старому и новому хостам. - Проверьте, что старый и новый серверы остановлены:
pg_ctl -D /opt/PostgreSQL/9.6 stop
pg_ctl -D /opt/PostgreSQL/14 stop
- Запустите
pg_upgrade
от нового сервера. Для начала вызовите программу в режиме проверки, добавив флаг:pg_upgrade --check
. В ответ вы получите перечень корректировок, которые необходимо внести вручную после опгрейда. - Если вы вносили правки в файл
pg_hba.conf
, восстановите его предыдущее состояниеpg_hba.conf
. Иногда требуются изменения других конфигов на новом кластере, чтобы они соответствовали параметрам старого кластера. - Запустите сервер.
Если результат устраивает, удалите ненужный кластер.
Подробности и особенности использования pg_upgrade
смотрите в документации.
Использование логической репликации
В 10-й версии СУБД появился метод логической репликации объектов данных и изменений в них. Он основан на использовании репликационных идентификаторов — обычно ими выступают первичные ключи.
В основе логической репликации лежит использование модели публикаций и подписок. Пользователь создаёт снимок публикуемой базы данных и копирует его на подписчика. В документации PostgreSQL одним из типичных сценариев использования логической репликации названа как раз репликация между разными основными версиями PostgreSQL.
Подробнее о том, как работает логическая репликация, вы можете узнать из отдельной статьи.
Резервный сервер может располагаться на том же хосте или на другом. После завершения синхронизации доступны разные опции. Например, вы можете сделать новый сервер главным, а старый — отключить.
Главный плюс логической репликации — минимальный downtime. Прерывание работы сервера в некоторых случаях ограничивается несколькими секундами.
Заключение
Мы рассмотрели универсальные методы апдейта PostgreSQL. Иногда процесс отличается. Например, обновление версии PostgreSQL для 1C требует установки дополнительных зависимостей.
В некоторых случаях обязанности по обновлению PostgreSQL можно делегировать. Например, Timeweb предлагает облачные базы данных. Среди них — PostgreSQL актуальной версии. Обновление и администрирование базы в этом случае возьмет на себя провайдер. При таком подходе изменить версию PostgreSQL можно в один клик через панель управления.