Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Обновление версии PostgreSQL: инструкция

Команда Timeweb Cloud
Команда Timeweb Cloud
Наши инженеры, технические писатели, редакторы и маркетологи
15 сентября 2022 г.
6570
7 минут чтения
Средний рейтинг статьи: 5

В 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. Суть этого метода в том, чтобы выгрузить данные из одной основной версии, а затем загрузить их в другую.

  1. Прежде чем выгружать данные, убедитесь, что в БД не проводятся никакие изменения прямо сейчас. В противном случае часть изменений может не попасть в итоговый дамп.
  2. Получите дамп и запишите его в файл:
pg_dumpall > output_file
  1. Остановите сервер:
pg_ctl stop
  1. Измените имя старого каталога чтобы исключить появление конфликта имён:
mv /usr/local/pgsql /usr/local/pgsql.old

Старый каталог можно просто удалить. Но разумнее будет его переименовать, чтобы оставить возможность для восстановления. Вместо /usr/local/pgsql укажите путь до своего каталога.

  1. Установите новую версию из исходного кода. Подробная инструкция на русском языке —  в документации.
  2. Сформируйте новый кластер:
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
  1. Перенесите все изменения в файлы pg_hba.conf и postgresql.conf.
  2. Запустите сервер БД:
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
  1. Восстановите данные из резервной копии:
/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.

  1. Переместите старый кластер. Это нужно сделать, если каталог не был привязан к старому релизу. Например, он находится по адресу /usr/local/pgsql. Если вы его не переименуете, то при обновлении произойдёт конфликт.

Переименование выполняется при выключенном сервере командой:

mv /usr/local/pgsql /usr/local/pgsql.old
  1. Соберите новую версию из исходного кода. Настройте configure, чтобы флаги были совместимы с конфигурацией старого кластера. Прежде чем начинать обновление, pg_upgrade проверит совместимость флагов.
  2. Инсталлируйте новые исполняемые файлы. Для размещения сервера в нестандартной директории, используйте prefix:
make prefix=/usr/local/pgsql.new install
  1. Используйте initdb, чтобы инициализировать новый кластер. Проверьте, что флаги совместимы с флагами старого кластера.
  2. Инсталлируйте разделяемые объектные файлы расширения. Если для них доступны обновления, pg_upgrade самостоятельно создаст скрипт для их последующей установки.
  3. Перенесите файлы полнотекстового поиска.
  4. Настройте аутентификацию peer в pg_hba.conf. Это нужно сделать, потому что pg_upgrade будет несколько раз подключаться к старому и новому хостам.
  5. Проверьте, что старый и новый серверы остановлены:
pg_ctl -D /opt/PostgreSQL/9.6 stop
pg_ctl -D /opt/PostgreSQL/14 stop
  1. Запустите pg_upgrade от нового сервера. Для начала вызовите программу в режиме проверки, добавив флаг: pg_upgrade --check. В ответ вы получите перечень корректировок, которые необходимо внести вручную после опгрейда.
  2. Если вы вносили правки в файл pg_hba.conf, восстановите его предыдущее состояние pg_hba.conf. Иногда требуются изменения других конфигов на новом кластере, чтобы они соответствовали параметрам старого кластера.
  3. Запустите сервер.

Если результат устраивает, удалите ненужный кластер.

Подробности и особенности использования pg_upgrade смотрите в документации.

Использование логической репликации

В 10-й версии СУБД появился метод логической репликации объектов данных и изменений в них. Он основан на использовании репликационных идентификаторов — обычно ими выступают первичные ключи. 

В основе логической репликации лежит использование модели публикаций и подписок. Пользователь создаёт снимок публикуемой базы данных и копирует его на подписчика. В документации PostgreSQL одним из типичных сценариев использования логической репликации названа как раз репликация между разными основными версиями PostgreSQL. 

Подробнее о том, как работает логическая репликация, вы можете узнать из отдельной статьи.

Резервный сервер может располагаться на том же хосте или на другом. После завершения синхронизации доступны разные опции. Например, вы можете сделать новый сервер главным, а старый — отключить.

Главный плюс логической репликации — минимальный downtime. Прерывание работы сервера в некоторых случаях ограничивается несколькими секундами. 

Заключение

Мы рассмотрели универсальные методы апдейта PostgreSQL. Иногда процесс отличается. Например, обновление версии PostgreSQL для 1C требует установки дополнительных зависимостей.

В некоторых случаях обязанности по обновлению PostgreSQL можно делегировать. Например, Timeweb предлагает облачные базы данных. Среди них — PostgreSQL актуальной версии. Обновление и администрирование базы в этом случае возьмет на себя провайдер. При таком подходе изменить версию PostgreSQL можно в один клик через панель управления. 

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону