В PostgreSQL обновление версии выполняется разными способами:
pg_dumpall
— надёжный способ, но возможен длительный downtime.pg_upgrade
— быстрый способ, но возможны ошибки.Выбор зависит от того, какой релиз используется на сервере и до какой версии вы хотите обновиться.
В этой статье разберём способы обновления.
Главное — понимать особенности обновлений между разными версиями.
Номера состоят из двух цифр — например, 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.
dbaas
Если нужно изменить основную версию, используйте программу 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
помогает обновиться с PostgreSQL 8.4.X до текущего релиза СУБД.
Рассмотрим общий план обновления с помощью pg_upgrade
.
/usr/local/pgsql
. Если вы его не переименуете, то при обновлении произойдёт конфликт.Переименование выполняется при выключенном сервере командой:
mv /usr/local/pgsql /usr/local/pgsql.old
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. Иногда процесс отличается. Например, обновление версии PostgreSQL для 1C требует установки дополнительных зависимостей.
В некоторых случаях обязанности по обновлению PostgreSQL можно делегировать. Например, Timeweb предлагает облачные базы данных. Среди них — PostgreSQL актуальной версии. Обновление и администрирование базы в этом случае возьмет на себя провайдер. При таком подходе изменить версию PostgreSQL можно в один клик через панель управления.