Популярные сообщения

среда, 4 августа 2021 г.

Обновление Postgres 12.1

 

Подготовительные действия:
1. Выключаем экземпляр БД 12.1 предварительно посмотрев параметр

SHOW wal_segment_size;

2. Кладем в /u01/distr дистрибутив 13.2

3. Ставим по инструкции как написано в тут
Но не делаем шаги:
- Необходимые пакеты
- Настройка параметров ядра
- Лимиты
- Параметры монтирования

4. Что делаем но с правками: - Создание необходимых директорий

mkdir -p /u01/postgres/13.2/pgsql/data
chown -R postgres:postgres /u01/postgres/13.2/


5. Cборка Postgres 13.2 из исходников

cd /u01/distr
tar xvzf postgresql-13.2.tar.gz
cd ./postgresql-13.2
./configure --prefix=/u01/postgres/13.2/pgsql 
make -C /u01/distr/postgresql-13.2 world
make -C /u01/distr/postgresql-13.2 install-world
chown -R postgres:postgres /u01/postgres/13.2/


6. Правка сервиса systemd
vim /etc/systemd/system/postgresql.service

[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
 
[Service]
User=postgres
ExecStart=/u01/postgres/13.2/pgsql/bin/postgres -D /u01/postgres/13.2/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0
 
[Install]
WantedBy=multi-user.target

7. Перечитаем конфигурацию systemd Обязательно

systemctl daemon-reload

8. Правка профиля пользователя postgres
Здесь важно не забыть поменять пути до bin постгресовых
иначе кластер будет иницилизироваться старой версии но по новому пути
вобщем меняем везде
vim  /u01/postgres/.profile

export LD_LIBRARY_PATH=/u01/postgres/13.2/pgsql/lib
export PATH=/u01/postgres/13.2/pgsql/bin:$PATH
export MANPATH=/u01/postgres/13.2/pgsql/share/man:$MANPATH
export PGDATA=/u01/postgres/13.2/pgsql/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5432

9. Инициализация и запуск кластера  делаем из под su -l postgres

Проверяем версию initdb

initdb --version
если ответ 13.2 все ок можно инициализировать (ну или на какую версию вы обновляетесь)

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

Далее либо:

Для больших систем можно сделать больший размер wal-лога. Для небольших оставить по умолчанию (16 МБ).
# Для небольших баз
initdb --data-checksums  --pgdata=/u01/postgres/13.2/pgsql/data --encoding=utf8 --username=postgres --pwprompt
# Для больших баз
initdb --data-checksums --wal-segsize=256 --pgdata=/u01/postgres/13.2/pgsql/data --encoding=utf8 --username=postgres --pwprompt

С подготовлениями закончили, теперь само обновление.
Обновление на 13.2 с копированием содержимого data в новый экземляр *(дальше будет пояснение)
Оба экземпляра БД 12.1 и 13.2 должны быть выключены

В режиме check проверяем все ли у нас ок.
Везде ответы должны быть, что ок. Если что то не так, обязательно напишет.
(Отступы и кавычки исторически менялись пару раз от версии к версии, о том что актуально в настоящий момент можно почитать к версии на которую обновляемся в утилите pg_upgrade)

/u01/postgres/13.2/pgsql/bin/pg_upgrade \
 --old-datadir "/u01/postgres/12.1/pgsql/data" \
 --new-datadir "/u01/postgres/13.2/pgsql/data" \
 --old-bindir "/u01/postgres/12.1/pgsql/bin" \
 --new-bindir "/u01/postgres/13.2/pgsql/bin" \
 --old-options "-c config_file=/u01/postgres/12.1/pgsql/data/postgresql.conf" \
 --new-options "-c config_file=/u01/postgres/13.2/pgsql/data/postgresql.conf" \
 --check

Если все ок, то можем обновляться

(убираем check)

/u01/postgres/13.2/pgsql/bin/pg_upgrade \
 --old-datadir "/u01/postgres/12.1/pgsql/data" \
 --new-datadir "/u01/postgres/13.2/pgsql/data" \
 --old-bindir "/u01/postgres/12.1/pgsql/bin" \
 --new-bindir "/u01/postgres/13.2/pgsql/bin" \
 --old-options "-c config_file=/u01/postgres/12.1/pgsql/data/postgresql.conf" \
 --new-options "-c config_file=/u01/postgres/13.2/pgsql/data/postgresql.conf" \
 --check

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

Запускаем новый 13.2

systemctl start postgresql.service

чекаем в процессах или статусе systemd или в psql, что работает новая версия

ps auxf | grep postgres
 
psql -c "SELECT version();"

На новом кластере нет никакой статистики. Нужно запустить ANALYZE по кластеру

./analyze_new_cluster.sh

Может так получится что наш кастомный postgresql.conf и pg_hba.conf после обновления станут стандартными.
Правим все из старых в новые. Рестартуем PG.

*Пояснение к обновлению
У меня указано обновление по сути с переносом data в новый кластер.
Тоесть потребуется место по размеру как уже существующая БД.
Но можно с помощью параметра --link сделать жесткую ссылку на data старого кластера это будет без копирования data

При режиме --link
при обновлении будет нотка(для отката)
If you want to start the old cluster, you will need to remove
the ".old" suffix from /u01/postgres/12.1/pgsql/data/global/pg_control.old.
Because "link" mode was used, the old cluster cannot be safely
started once the new cluster has been started.


Так же есть параметр --clone но мне он не совсем понятен пока.
Вот описание.
(Использовать эффективное клонирование файлов (в ряде систем это называется «reflink») вместо копирования файлов в новый кластер. В результате файлы данных могут копироваться практически мгновенно, как и с использованием -k/--link, но последующие изменения не будут затрагивать старый кластер.)

Комментариев нет:

Отправить комментарий