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

В нашей инструкции мы рассмотрим пример обновления СУБД PostgreSQL с версии 11 на версию 13. В качестве рабочей операционной системы будет использоваться CentOS, однако, с заменой путей до баз и конфигурационных файлов, можно будет выполнить обновление для других систем.
Процедура обновления состоит из нескольких шагов:
- Создание резервных копий.
- Установка и запуск PostgreSQL новой версии (она будет работать параллельно со старой).
- Запуск pg_upgrade для проверки возможности обновления.
- Запуск pg_upgrade для выполнения обновления.
- Проверка работоспособности СУБД.
- Настройка новой версии в качестве основного экземпляра сервера баз данных.
Предполагается, что у нас уже установлена одна СУБД, которую мы и будем обновлять.
Подготовка к обновлению
Установка новой СУБД
Тестирование системы перед обновлением
Обновление PostgreSQL
Проверка после обновления
Решение возможных проблем
Читайте также
Прежде чем начать
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.