Обновление PostgreSQL на CentOS

Обновлено и опубликовано Опубликовано:

В нашей инструкции мы рассмотрим пример обновления СУБД PostgreSQL с версии 11 на версию 13. В качестве рабочей операционной системы будет использоваться CentOS, однако, с заменой путей до баз и конфигурационных файлов, можно будет выполнить обновление для других систем.

Процедура обновления состоит из нескольких шагов:

  1. Создание резервных копий.
  2. Установка и запуск PostgreSQL новой версии (она будет работать параллельно со старой).
  3. Запуск pg_upgrade для проверки возможности обновления.
  4. Запуск pg_upgrade для выполнения обновления.
  5. Проверка работоспособности СУБД.
  6. Настройка новой версии в качестве основного экземпляра сервера баз данных.

Предполагается, что у нас уже установлена одна СУБД, которую мы и будем обновлять.

Прежде чем начать

1. Операция по обновлению PostgreSQL, потенциально, опасна. Поэтому стоит позаботиться о создании резервной копии.

Подробнее процесс описан в инструкции Резервное копирование PostgreSQL.

Также, если мы работает на виртуальной машине, можно создать снапшот.

2. Заранее посмотрим список расширений, которые мы используем в текущем PostgreSQL (это делается из консоли psql):

su - postgres -c "psql"

=# \dx

Мы можем увидеть что-то на подобие:

     Name     | Version |   Schema   |             Description
--------------+---------+------------+---------------------------------------
 btree_gin    | 1.3     | public     | support for indexing common datatypes
 btree_gist   | 1.5     | public     | support for indexing common datatypes

В данной таблице представлен список установленных расширений postgresql. Вам нужно будет установить те же расширения для новой версии СУБД. Также обратите внимание, что некоторые расширения могут быть установлены для конкретной базы. Нужно по очереди подключиться к каждой базе:

=# \c database_name

И запросить список расширений:

=> \dx

После окончания работы, выходим из оболочки psql:

=> quit

Установка и запуск PostgreSQL 13

В нашей инструкции мы планируем обновление до версии 13. Установим нужный нам пакет.

Для этого необходимо установить репозиторий.

Так как в нашей системе уже установлен PostgreSQL, скорее всего, репозиторий уже настроен, но мы все же, рассмотрим его установку.

Вводим команду:

yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

* в данном примере мы установим репозиторий для CentOS 7 с архитектурой x86_64 (EL-7-x86_64). Полный список вариантов можно посмотреть по на странице репозитория PostgreSQL.

Если мы получим ошибку:

...
Error: Nothing to do

... значит репозиторий уже настроен. Идем дальше.

Устанавливаем postgresql:

yum install postgresql13 postgresql13-server postgresql13-contrib

* где:

  • postgresql13 — клиент.
  • postgresql13-server — сервер.
  • postgresql13-contrib — набор дополнительных утилит и расширений для postgresql.

Инициализируем базу для нового postgresql:

/usr/pgsql-13/bin/postgresql-13-setup initdb

Откроем конфигурационный файл для postgresql 13:

vi /var/lib/pgsql/13/data/postgresql.conf

Как минимум, нам нужно поменять порт, на котором должен запуститься наш сервер:

port = 5433

* порт по умолчанию 5432 и, скорее всего, на нем работает наш сервер версии 11, который мы будем обновлять. Поэтому мы поменяли порт, например, на 5433.

Стоит сравнить настройки для файлов postgresql.conf и pg_hba.conf. Некоторые настройки, которые явно менялись для текущей версии СУБД, стоит перенести в конфигурационные файлы нового postgresql.

Запускаем сервис для установленного PostgreSQL:

systemctl start postgresql-13

Стоит сразу проверить, запустилась ли служба и слушает ли сервис на нужном порту (мы настроили 5433):

systemctl status postgresql-13

ss -tunlp | grep :5433

Подключиться к новой версии СУБД можно командой:

su - postgres -c "PGPORT=5433 psql"

Сбор данных и запуск проверки на возможность обновления

И так, на текущий момент у нас запущены две версии postgresql (в нашем примере 11 и 13). Так как СУБД позволяет системному администратору тонко настроить расположение путей до рабочих данных и конфигов, выполним запросы, которые позволят однозначно определить их локацию.

Для текущей версии:

su - postgres -c "psql"

=# SELECT current_setting('data_directory'), current_setting('config_file');

=# quit

Для новой:

su - postgres -c "PGPORT=5433 psql"

=# SELECT current_setting('data_directory'), current_setting('config_file');

=# quit

Фиксируем полученные ответы. Они нам понадобятся для теста конфигурации.

Останавливаем службу postgresql для новой версии:

systemctl stop postgresql-13

Выполняем тест — в моем случае получилась такая команда:

su - postgres -c " \
/usr/pgsql-13/bin/pg_upgrade \
--old-datadir=/var/lib/pgsql/11/data \
--new-datadir=/var/lib/pgsql/13/data \
--old-bindir=/usr/pgsql-11/bin \
--new-bindir=/usr/pgsql-13/bin \
--old-options '-c config_file=/var/lib/pgsql/11/data/postgresql.conf' \
--new-options '-c config_file=/var/lib/pgsql/13/data/postgresql.conf' \
--check \
"

* еще раз стоит отметить, что пути зависят от версий postgresql и индивидуальных настроек.

Если все хорошо, то мы увидим:

Performing Consistency Checks on Old Live Server
------------------------------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

*Clusters are compatible*

Мы готовы обновить СУБД.

Обновление PostgreSQL

Остается выполнить само обновление.

Сначала нужно остановить текущий экземпляр СУБД:

systemctl stop postgresql-11

Для обновления используем такую же команду, как при проверке, за исключением опции check:

su - postgres -c " \
/usr/pgsql-13/bin/pg_upgrade \
--old-datadir=/var/lib/pgsql/11/data \
--new-datadir=/var/lib/pgsql/13/data \
--old-bindir=/usr/pgsql-11/bin \
--new-bindir=/usr/pgsql-13/bin \
--old-options '-c config_file=/var/lib/pgsql/11/data/postgresql.conf' \
--new-options '-c config_file=/var/lib/pgsql/13/data/postgresql.conf' \
"

Если размер базы большой, и места на сервере не хватит для создания полной копии, мы можем добавить опцию --link. Она создает символьные ссылки вместо полноценных копий данных.

После ее работы мы должны увидеть:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

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

Стартуем новый сервер:

systemctl start postgresql-13

Переносим статистику командой:

su - postgres -c "PGPORT=5433 /var/lib/pgsql/analyze_new_cluster.sh"

Тест сервера и завершение настройки

Напоследок, проверим, что наш сервер выполняет запросы и настроим ему порт по умолчанию.

Зайдем в командную оболочку нового сервера:

su - postgres -c "PGPORT=5433 psql"

На свое усмотрение, сделаем несколько запросов, чтобы убедиться в базовой работоспособности СУБД. Если запросы прошли, выходим из оболочки:

=# quit

Открываем конфигурационный файл:

vi /var/lib/pgsql/13/data/postgresql.conf

Меняем порт, на котором должен слушать сервер:

port = 5432

* ранее мы использовали порт 5433.

Перезапускаем сервер:

systemctl restart postgresql-13

Проверяем работу приложений, которые используют СУБД.

Если тесты прошли успешно и мы не использовали опцию --link при обновлении, то можно удалить данные старого кластера:

su - postgres -c "/var/lib/pgsql/delete_old_cluster.sh"

Обновление PostgreSQL можно считать, полностью, завершенным.

Возможные проблемы

В данном разделе рассмотрим проблемы, с которыми можно столкнуться при обновлении PostgreSQL.

Checking for presence of required libraries

Появляется при проверке на возможность сделать обновление. Ошибка также сопровождается текстом:

Your installation references loadable libraries that are missing from the
new installation.  You can add these libraries to the new installation,
or remove the functions using them from the old installation.  A list of
problem libraries is in the file:
    loadable_libraries.txt

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

Решение: смотрим содержимое файла loadable_libraries.txt:

cat /var/lib/pgsql/loadable_libraries.txt

В нем перечислены библиотеки, которые нужно доустановить в новой версии. Установка расширений для postgresql, как правило, выполняется с помощью пакетного менеджера, например:

yum install pgtap_13

Однако, некоторые расширения нужно будет собирать, поэтому решение проблемы имеет индивидуальный характер.

Проблема подключения к СУБД после обновления

После завершения работы утилиты pg_upgrade и запуска службы, мы можем подключиться к СУБД от пользователя postgres, но не можем подключиться по сети или из приложения.

Причина: как правило, проблема в конфигурации pg_hba.

Решение: файл pg_hba.conf регламентирует условия подключения к СУБД — с каких узлов, для каких учетных записей, к каким базам и с помощью какого метода аутентификации. Необходимо привести в соответствие наши файлы. Данный файл находится в том же каталоге, что и основной файл конфигурации, в нашем примере это:

vi /var/lib/pgsql/11/data/pg_hba.conf

Файл для нового postgresql:

vi /var/lib/pgsql/13/data/pg_hba.conf

Также необходимо обратить внимание на методы шифрования паролей. Например, в 11 версии по умолчанию используется md5, например:

host    all             all             127.0.0.1/32            md5

В то время, как в 13 версии уже используется scram-sha-256:

host    all             all             127.0.0.1/32            scram-sha-256

Таким образом, при миграции данных в новую базу были перенесены и пароли с алгоритмом шифрования md5, а при подключении система пытается использовать scram-sha-256. Полученная таким образом последовательность не соответствует записанной, что приводит к ошибкам аутентификации. Для решения проблемы можно поменять scram-sha-256 на md5 в файле pg_hba.conf.

Читайте также

Возможно, это тоже будет интересным:

1. Установка и запуск PostgreSQL на CentOS.

2. Как работать с пользователями в PostgreSQL.

3. Как настроить удаленное подключение к PostgreSQL.

# Серверы # CentOS # Базы данных
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет