Руководство по миграции на Postgres 13
В рамках данной инструкции будет рассмотрен пример миграции с СУБД PostgreSQL 11 на PostgreSQL 13 с переносом данных. Также мы разберем несколько разных сценариев:
- Обновление PostgreSQL на отдельном сервере.
- Обновление PostgreSQL на кластере.
- Обновление PostgreSQL с переходом на новую операционную систему.
Начнем с предварительной подготовки к миграции.
Подготовка к миграции
Прежде чем перейти к обновлению СУБД, выполним предварительные действия. Подразумевается, что мы будем работать с базой mi.
В зависимости от того, работает ли мы с кластером PostgreSQL или одним сервером СУБД, наши действия будут немного различаться. Соответствующие нюансы будут описаны.
Отключение активных соединений с базой данных
Необходимо убедиться, что с базой данных нет активных соединений.
Для начала, остановим службы:
systemctl stop luxmsbi-datagate luxmsbi-importer luxmsbi-web luxmsbi-appserver
* обратите внимание, что данные службы могут быть запущены на разных серверах кластера LuxmsBI.
Входим в командную оболочку SQL (для кластера СУБД, только на мастере):
su - postgres
Посмотреть активные подключения можно командой:
SELECT * FROM pg_stat_activity;
Необходимо добиться, чтобы их не было. Для этого можно использовать команду:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mi';
Создание резервной копии
Операция по обновлению PostgreSQL, потенциально, опасна. Поэтому стоит позаботиться о создании резервной копии.
Если мы работает на виртуальной машине, можно создать снапшот. Только стоит иметь ввиду, что снапшоты плохо влияют на обслуживание виртуальной машины. Рекомендуется удалить его после успешного выполнения обновления PostgreSQL.
Помимо этого, рекомендуется создать дамп базы данных.
Важно отметить, что резервная копия, созданная с помощью утилиты pg_basebackup
или на ее базе не позволяет восстанавливать данные на другую версию PostgreSQL. Если мы создадим дамп с ее помощью, то восстановление нужно выполнять на сервере с той же версией СУБД.
Так как он может занять много места на диске, убедитесь в наличие свободного пространства на носителе.
Посмотреть список баз и их размер можно sql-командой:
=# \l+
Для самого резервного копирования PostgreSQL могут использоваться профессиональные средства или штатная утилита pg_dump/pg_basebackup.
Выбор конкретного инструмента должен соответствовать внутренним нормативным документам вашей организации.
Получение списка расширений
Заранее посмотрим список расширений, которые мы используем в текущем PostgreSQL (это делается из консоли psql):
su - postgres -c "psql mi"
=# \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. Вам нужно будет установить те же расширения для новой версии СУБД, поэтому фиксируем список.
После окончания работы, выходим из оболочки psql:
=# quit
Обновление Luxmsbi-pg
Перед обновлением СУБД, необходимо обновить пакет luxmsbi-pg до последней версии.
Выполним команды (если мы работает на кластере PostgreSQL, на всех нодах СУБД):
yum makecache
yum update luxmsbi-pg
И обновим базу (если мы работает на кластере PostgreSQL,только на мастере):
su - postgres -c "/usr/share/luxmsbi-pg/luxmsbi-setupdb.sh --upgrade"
При обновлении пакета с версии 8.9.3 на 8.9.4 мы получим ошибку:
schema "ag_catalog" does not exist
Проблема появляется из-за удаления поддержки расширения age в версии 8.9.3. Но в самой СУБД расширение продолжает перехватывать sql-запросы.
Необходимо удалить настройку shared_preload_libraries из конфигурации postgres и перезагрузить СУБД:
su - postgres -c 'psql -c "ALTER system reset shared_preload_libraries;"'
su - postgres -c 'psql -c "ALTER USER bi reset shared_preload_libraries;"'
systemctl restart postgresql-11
и снова выполнить обновление:
su - postgres -c "/usr/share/luxmsbi-pg/luxmsbi-setupdb.sh --upgrade"
Обновление PostgreSQL на CentOS (один сервер)
В нашей инструкции мы рассмотрим пример обновления СУБД PostgreSQL с версии 11 на версию 13. В качестве рабочей операционной системы будет использоваться CentOS 7.
Процедура обновления состоит из нескольких шагов:
- Установка и запуск PostgreSQL новой версии (она будет работать параллельно со старой).
- Запуск pg_upgrade для проверки возможности обновления.
- Запуск pg_upgrade для выполнения обновления.
- Проверка работоспособности СУБД.
- Настройка новой версии в качестве основного экземпляра сервера баз данных.
Предполагается, что у нас уже установлена одна СУБД, которую мы и будем обновлять.
Установка и запуск 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).
Если мы получим ошибку:
...
Error: Nothing to do
… значит репозиторий уже настроен. Идем дальше.
Устанавливаем postgresql:
yum install postgresql13 postgresql13-server postgresql13-contrib
* где:
- postgresql13 — клиент.
- postgresql13-server — сервер.
- postgresql13-contrib — набор дополнительных утилит и расширений для postgresql.
Для приложения Lixms BI также требуется установить следующие расширения:
yum install pgsql13-http pgsql13-keydb-fdw pgsql13-plv8 pgsql13-redis-pubsub
Инициализируем базу для нового 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
И разрешаем его автозапуск:
systemctl enable postgresql-13
Стоит сразу проверить, запустилась ли служба и слушает ли сервис на нужном порту (мы настроили 5433):
systemctl status postgresql-13
ss -tunlp | grep :5433
Обновление postgresql
Процесс состоит из двух этапов - тестирование и обновление.
Сбор данных и запуск проверки на возможность обновления
И так, на текущий момент у нас запущены две версии 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 и индивидуальных настроек.
Описание опций pg_upgrade:
-b bindir или –old-bindir=bindir или системная переменная PGBINOLD
Путь до каталога с бинарными файлами старого PostgreSQL.-B bindir или –new-bindir=bindir или системная переменная PGBINNEW
Путь до каталога с бинарными файлами нового PostgreSQL.-c или –check
Не вносить изменений, только проверка на возможность выполнить обновление.-d configdir или –old-datadir=configdir или системная переменная PGDATAOLD
Путь до рабочего каталога с данными старого PostgreSQL.-D configdir или –new-datadir=configdir или системная переменная PGDATANEW
Путь до рабочего каталога с данными нового PostgreSQL.-j njobs или –jobs=njobs
Количество одновременных процессов для использования-k или –link
Не копировать данные из старой СУБД в новую. Вместо этого использовать жесткую ссылку.-o options или –old-options options
Опции, с которыми запускается старый PostgreSQL.-O options или –new-options options
Опции, с которыми запускается новый PostgreSQL.-p port или –old-port=port или системная переменная PGPORTOLD
Порт, на котором слушает старый PostgreSQL.-P port или –new-port=port или системная переменная PGPORTNEW
Порт, на котором слушает новый PostgreSQL.-r или –retain
Сохранить файлы SQL и журналов даже после успешного обновления-s dir или –socketdir=dir или системная переменная PGSOCKETDIR
Каталог для сокетов postmaster во время обновления. По умолчанию текущий рабочий каталог.-U username или –username=username или системная переменная PGUSER
Пользователь, под которым запускать процедуру обновления.-v или –verbose
Подробный вывод информации.-V или –version
Показать версию.–clone
Эффективное клонирование файлов (также известное как «ссылки» в некоторых системах) вместо копирования файлов в новый кластер. Это может привести к почти мгновенному копированию файлов данных, предоставляя преимущества скорости -k/–link, оставляя старый кластер нетронутым. В настоящее время он поддерживается в Linux (ядро 4.5 или новее) с Btrfs и XFS (в файловых системах, созданных с поддержкой reflink), а также в macOS с APFS.
Если все хорошо, то мы увидим:
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
systemctl disable 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 \
"
Обратите внимание на опцию –link. Она создает hard 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
В данном тексте предлагается перенести статистику оптимизатора на новый сервер. В двух словах, данная статистика позволяет делать большие запросы быстрее. Также, в сообщении предлагается удалить данные старого сервера.
Открываем конфигурационный файл:
vi /var/lib/pgsql/13/data/postgresql.conf
Меняем порт, на котором должен слушать сервер:
port = 5432
* ранее мы использовали порт 5433.
Стартуем новый сервер:
systemctl start postgresql-13
Тест сервера и завершение настройки
Напоследок, проверим, что наш сервер выполняет запросы и настроим ему порт по умолчанию.
Зайдем в командную оболочку нового сервера:
su - postgres -c "psql"
На свое усмотрение, сделаем несколько запросов, чтобы убедиться в базовой работоспособности СУБД. Если запросы прошли, выходим из оболочки:
=# quit
Проверяем работу портала Luxms BI.
Обновление PostgreSQL можно считать завершенным.
Если все хорошо, можно перенести статистику командой (для кластера это делаем на лидере):
su - postgres -c "/var/lib/pgsql/analyze_new_cluster.sh"
И если мы, совсем, уверены в работе нашего сервера, удаляем файлы старого PostgreSQL:
su - postgres -c "/var/lib/pgsql/delete_old_cluster.sh"
Возможные проблемы
В данном разделе рассмотрим проблемы, с которыми можно столкнуться при обновлении 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 pgsql13-tap
Однако, некоторые расширения нужно будет собирать, поэтому решение проблемы имеет индивидуальный характер.
Проблема подключения к СУБД после обновления
После завершения работы утилиты 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.
Обновление PostgreSQL на CentOS (кластер Patroni)
В нашей инструкции мы рассмотрим пример обновления СУБД PostgreSQL с версии 11 на версию 13. В качестве рабочей операционной системы будет использоваться CentOS 7.
Процедура обновления состоит из нескольких шагов:
- Установка и запуск PostgreSQL новой версии (она будет работать параллельно со старой).
- Запуск pg_upgrade для проверки возможности обновления.
- Запуск pg_upgrade для выполнения обновления.
- Проверка работоспособности СУБД.
- Настройка новой версии в качестве основного экземпляра сервера баз данных.
Предполагается, что у нас уже работает кластер Patroni + Consul с PostgreSQL версии 11.
Установка и запуск PostgreSQL 13 (на всех узлах кластера)
В нашей инструкции мы планируем обновление до версии 13. Установим нужный нам пакет.
Так как в нашей системе уже установлен PostgreSQL, скорее всего, репозиторий уже настроен.
Но если репозитория нет, то необходимо его установить. В зависимости от сценария безопасности, есть два варианта:
- Если используются внешние репозитории - устанавливаем его.
- Если доступ к внешним репозиториям отсутствует, используем свои внутренние репозитории с PostgreSQL 13.
Устанавливаем postgresql:
sudo yum install postgresql13 postgresql13-server postgresql13-contrib
* где:
- postgresql13 — клиент.
- postgresql13-server — сервер.
- postgresql13-contrib — набор дополнительных утилит и расширений для postgresql.
Для приложения Lixms BI также требуется установить следующие расширения:
sudo yum install pgsql13-http pgsql13-keydb-fdw pgsql13-plv8 pgsql13-redis-pubsub pgsql13-tap
Обновление postgresql
Процесс состоит из пяти этапов:
- остановка узлов replica.
- проверка состояния перед обновлением.
- обновление.
- тестирование.
- включение узлов replica.
Останавливаем узлы с репликой
Чтобы не прописывать путь к конфигурационному файлу Patroni, вводим:
export PATRONICTL_CONFIG_FILE=/etc/patroni/patroni.yml
Определяем, какой узел в данный момент работает в режиме Replica:
sudo patronictl list
Мы должны увидеть следующий вывод:
+ Cluster: pgdb (7151035635083057487) -------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------------+-----------------+---------+---------+----+-----------+
| test01 | 192.168.0.200 | Replica | running | 2 | 0 |
| test02 | 192.168.0.210 | Leader | running | 2 | |
+----------------+-----------------+---------+---------+----+-----------+
В нашем примере Replica на сервере test01 - заходим на него и останавливаем patroni:
sudo systemctl stop patroni
После переходим на сервер с ролью Leader. Обновление будем выполнять на нем.
Сбор данных и запуск проверки на возможность обновления
И так, на текущий момент у нас установлены две версии postgresql (в нашем примере patroni - 11 и pgsql - 13).
Инициализируем базу для pgsql13:
sudo su - postgres -c "/usr/pgsql-13/bin/pg_ctl -D /pgdata/newdata initdb"
* новая база будет находиться в каталоге /pgdata/newdata. После обновления мы планируем вернуть рабочий каталог /pgdata/data.
Изучаем конфигурационный файл patroni:
cat /etc/patroni/patroni.yml
Необходимо обратить внимание на опции:
- data_dir - путь хранения данных.
- bin_dir - каталог с бинарниками.
Данные пути нам нужны для выполнения теста:
sudo su - postgres -c " \
/usr/pgsql-13/bin/pg_upgrade \
--old-datadir=/pgdata/data \
--new-datadir=/pgdata/newdata \
--old-bindir=/usr/pgsql-11/bin \
--new-bindir=/usr/pgsql-13/bin \
--old-options '-c config_file=/pgdata/data/postgresql.conf' \
--new-options '-c config_file=/pgdata/newdata/postgresql.conf' \
--check \
"
Если все хорошо, то мы увидим:
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
Остается выполнить само обновление.
Сначала нужно остановить patroni уже на лидере:
sudo systemctl stop patroni
Для обновления используем такую же команду, как при проверке, за исключением опции check:
sudo su - postgres -c " \
/usr/pgsql-13/bin/pg_upgrade \
--old-datadir=/pgdata/data \
--new-datadir=/pgdata/newdata \
--old-bindir=/usr/pgsql-11/bin \
--new-bindir=/usr/pgsql-13/bin \
--old-options '-c config_file=/pgdata/data/postgresql.conf' \
--new-options '-c config_file=/pgdata/newdata/postgresql.conf' \
--link \
"
Обратите внимание на опцию –link. Она создает hard 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
В данном тексте предлагается перенести статистику оптимизатора на новый сервер. В двух словах, данная статистика позволяет делать большие запросы быстрее. Также, в сообщении предлагается удалить данные старого сервера.
Откроем конфигурационный файл patroni:
sudo vi /etc/patroni/patroni.yml
Внесем изменения в путь к бинарникам:
...
postgresql:
...
bin_dir: /usr/pgsql-13/bin/
...
Удаляем каталог со старыми данными:
rm -rf /pgdata/data
Переносим каталог с новыми данным в каталог, который использовался до обновления:
mv /pgdata/newdata /pgdata/data
Открываем файл:
vi /pgdata/data/postmaster.opts
Меняем в путях /pgdata/newdata на /pgdata/data.
Переходим в Web-консоль сервера Consul. Нам нужно удалить ключ-значение initialize для нашего кластера. Это можно сделать в веб-интерфейсе, перейдя в раздел Key/Value - service - pgdb (данное имя зависит от настройки scope в patroni) - initialize.
Также мы можем удалить данный ключ из командной строки:
sudo consul kv delete service/pgdb/initialize
* еще раз напомню, pgdb зависит от названия кластера patroni (опция scope).
Стартуем patroni:
sudo systemctl start patroni
Проверить, что служба запустилась и наш сервер стал лидером можно командой:
patronictl list
Запускаем службы luxms, которые были нами выключены перед началом работ:
sudo systemctl start luxmsbi-datagate luxmsbi-importer luxmsbi-web luxmsbi-appserver
Тест сервера и завершение настройки
Проверяем, что наш сервер выполняет запросы.
Зайдем в командную оболочку нового сервера:
sudo su - postgres -c "psql"
На свое усмотрение, сделаем несколько запросов, чтобы убедиться в базовой работоспособности СУБД. Если запросы прошли, выходим из оболочки:
=# quit
Проверяем работу портала Luxms BI.
Изучаем журнал работы patroni:
journalctl -u patroni -f
А также журнал работы postgresql:
tail -f /pgdata/data/log/postgresql-<День недели>.log
Если детальное изучение работы приложения, запросов и логов не выявили ошибок, обновление PostgreSQL на одном из хостов можно считать завершенным.
Можно перенести статистику командой (делаем только на лидере):
sudo su - postgres -c "/var/lib/pgsql/analyze_new_cluster.sh"
Запуск узлов replica
Убедившись в работоспособности лидера, переключаем реплики на новую базу.
Для этого откроем конфигурационный файл:
sudo vi /etc/patroni/patroni.yml
Внесем изменения в путь с bin_dir:
...
postgresql:
bin_dir: /usr/pgsql-13/bin/
...
Удаляем содержимое старого каталога:
sudo rm -rf /pgdata/data/*
Запускаем сервис patroni:
sudo systemctl start patroni
Проверяем статус:
patronictl list
Откат базы
Если в результате проверки работоспособности базы мы обнаружили ошибки и приняли решение вернуть старую версию базы, выполняем следующие действия.
На лидере останавливаем сервис patroni:
sudo systemctl stop patroni
Переходим в Web-консоль сервера consul. Нам нужно удалить ключ-значение initialize для нашего кластера. Это можно сделать в веб-интерфейсе, перейдя в раздел Key/Value - service - pgdb (данное имя зависит от настройки scope в patroni) - initialize.
Также мы можем удалить данный ключ из командной строки:
sudo consul kv delete service/pgdb/initialize
* еще раз напомню, pgdb зависит от названия кластера patroni (опция scope).
На реплике, где мы не обновляли базу, запускаем patroni:
sudo systemctl start patroni
Проверяем. Команда:
patronictl list
Вывод комманды на консоль ожидается следующий:
+ Cluster: pgdb (7151035635083057487) -------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------------+-----------------+---------+---------+----+-----------+
| test01 | 192.168.0.200 | Leader | running | 2 | 0 |
+----------------+-----------------+---------+---------+----+-----------+
Теперь лидером является test01.
Идем на сервер, где ранее обновлял базу.
Удаляем данные из каталога postgresql:
sudo rm -rf /pgdata/data/*
Открываем на редактирование конфигурайионный файл patroni:
sudo vi /etc/patroni/patroni.yml
Вернем значение для пути с bin_dir:
...
postgresql:
bin_dir: /usr/pgsql-11/bin/
...
Запускаем сервис patroni:
sudo systemctl start patroni
Обновление PostgreSQL с переходом на новую операционную систему
При необходимости смены операционной системы, например, при ее обновлении на более свежую версию или переходе на отечественный аналог, мы можем также обновить СУБД. Наши действия будут сведены к нескольким пунктам:
- Установке и настройке СУБД.
- Установке необходимых пакетов.
- Восстановлении базы из дампа.
В данной инструкции мы рассмотрим пример перехода с CentOS 7 + PostgreSQL 11 на РЕД ОС 7.3 + Postgres Pro 13. Действия для других систем и СУБД будут схожими.
Установка и настройка СУБД
Подробнее про установку СУБД PostgreSQL рассказано в инструкции “Руководство системного администратора”, разделе “Установка и настройка сервера БД”.
Для развертывания кластера СУБД прочитайте приложение “Установка отказоустойчивой БД”.
После установки, инициализации базы и запуска службы СУБД вводим команду:
sudo -iu postgres psql -c "ALTER SYSTEM SET password_encryption = 'md5';"
Далее нужно выполнить тюнинг базы в соответствии с вашей аппаратной состовляющей. Для более эффективного решения данной задачи можно использовать онлайн калькуляторы для оптимизации postgresql.
Установка расширений для СУБД
Для того, чтобы восстановление дампа на новом сервере прошло без ошибок, необходимо установить расширения для postgresql. Точное название пакетов зависит от установленного PostgreSQL - это могут быть пакеты pgsql
или pgpro
. В нашем примере рассматривается новый сервер с Postgres Pro версии 13, поэтому команда установки расширений будет такой:
dnf -y install pgpro13-plv8 \
pgpro13-http \
pgpro13-redis-pubsub \
pgpro13-keydb-fdw
Переходим к восстановлению данных.
Восстановление из резервной копии
Создаем роль bi. Для этого выполняем в SQL-оболочке команду под пользователем postgres:
sudo -iu postgres psql -c "CREATE ROLE bi WITH LOGIN PASSWORD 'bi';"
В данном примере мы создадим роль bi
с паролем bi
. Последний используется только для примера, и в вашей инфраструктуре он должен быть таким же, как на старом сервере СУБД. В случае смены пароля также необходимо отредактировать настройки компонентов Luxms BI.
Стоит иметь ввиду, что для функционирования Luxms BI достаточно только роли bi
. Мы, хоть, и не рекомендуем, но не ограничиваем Клиента при создании дополнительных ролей. Поэтому, Если в Вашей БД существуют роли, созданные дополнительно, для успешного переноса дампа, может потребоваться предварительно перенести эти роли на новый сервер.
В зависимости от выбранного способа снятия дампа, наши действия по восстановлению будут отличаться. Так как резервная копия, сделанная с помощью pg_basebackup нам не подходит для восстановления данных на другой версии СУБД, рассмотрим процесс на примере утилиты pg_dump
.
Предположим, что мы запускаем команду для снятия дампа на новом сервере. При этом, мы подключимся к старому серверу. Для этого вводим:
pg_dump -d postgresql://bi:bi@192.168.0.10/mi -Fc -C -c --quote-all-identifiers -f /tmp/mi.sqlc
* где 192.168.0.10
- адрес сервера, где находится старая версия PostgreSQL. bi
:bi
- логин и пароль для подклчюения.
Теперь восстанавливаем данные. Для нашего примера команда будет такой:
sudo -iu postgres pg_restore -C -d postgres /tmp/mi.sqlc
Мы можем получить ошибку при создании расширения pgtap. Ее можно проигнорировать.
default
В нашем примере дамп был снят с опцией -С, которая добавляет автоматическое создание базы. При необходимости создать пустую базу mi вручную, выполняем команду:
sudo -iu postgres createdb -E UTF-8 -O bi --lc-collate=ru_RU.UTF-8 --lc-ctype=ru_RU.UTF-8 -T template0 mi
:::
После завершения восстановления данных потребуется инициализировать lpe (выполняется в SQL-оболочке):
sudo -iu postgres psql
ALTER DATABASE mi SET plv8.start_proc = '"lpe"."init"';
quit
Миграция завершена. Проверяем работу портала.
Если мы получили ошибку “auth return type not support” необходимо проверить, чтобы строка подключения в файле pg_hba.conf имела метод аутентификации md5
, например:
host all all 127.0.0.1/32 md5
* подробнее про настройку pg_hba.conf можно почитать в документации “Руководство системного администратора”, раздел “Установка компонентов Luxms BI”.
В завершении наших работ стоит также установить пакет luxmsbi-pgpro
(luxmsbi-pg
для PostgreSQL версии не Pro):
dnf install luxmsbi-pgpro
В процессе мы получим ошибку:
ERROR: DATABASE mi already exists.
Ее нужно проигнорировать.