upgrade postgresql 11 -> 14 на debian
замітка про оновлення-апгрейд postgresql 11 -> 14
спочатку потрібно зробити бекап - експорт бази даних -
#pg_dump -U my_db_user -W -F t my_db_name > backuppg11.tar
sudo -u postgres pg_dumpall > backuppg11.sql
імпортувати назад, при потребі, будемо так -
#pg_restore -d my_db_name backuppg11.tar
sudo -u postgres psql -d my_db_name -f backuppg11.sql
psql -U my_db_user -d my_db_name -f backuppg11.sql
розпочнемо апгрейд -
sudo -u postgres /usr/lib/postgresql/14/bin/pg_upgrade \
--old-datadir=/var/lib/postgresql/11/main \
--new-datadir=/var/lib/postgresql/14/main \
--old-bindir=/usr/lib/postgresql/11/bin \
--new-bindir=/usr/lib/postgresql/14/bin \
--old-options '-c config_file=/etc/postgresql/11/main/postgresql.conf' \
--new-options '-c config_file=/etc/postgresql/14/main/postgresql.conf'
перевіримо існування директорії та логи
# pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
11 main 5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
14 main 5433 online postgres /var/lib/postgresql/14/main /var/log/postgresql/postgresql-14-main.log
в процесі можуть бути такі помилки -
# sudo -u postgres /usr/lib/postgresql/14/bin/pg_upgrade \
> --old-datadir=/var/lib/postgresql/11/main \
> --new-datadir=/var/lib/postgresql/14/main \
> --old-bindir=/usr/lib/postgresql/11/bin \
> --new-bindir=/usr/lib/postgresql/14/bin \
> --old-options '-c config_file=/etc/postgresql/11/main/postgresql.conf' \
> --new-options '-c config_file=/etc/postgresql/14/main/postgresql.conf'
could not change directory to "/root": Відмовлено у доступі
could not open log file "pg_upgrade_internal.log": Відмовлено у доступі
Failure, exiting
це означає, що у користувача postgres (sudo -u postgres)
немає можливості (прав) зробити запис в поточний каталог (/root)
потрібно перейти кудись, наприклад, в /tmp
# pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
11 main 5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
14 main 5433 online postgres /var/lib/postgresql/14/main /var/log/postgresql/postgresql-14-main.log
/tmp # sudo -u postgres /usr/lib/postgresql/14/bin/pg_upgrade --old-datadir=/var/lib/postgresql/11/main --new-datadir=/var/lib/postgresql/14/main --old-bindir=/usr/lib/postgresql/11/bin --new-bindir=/usr/lib/postgresql/14/bin --old-options '-c config_file=/etc/postgresql/11/main/postgresql.conf' --new-options '-c config_file=/etc/postgresql/14/main/postgresql.conf'
Проведення перевірок цілістності
-----------------------------
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 user-defined encoding conversions ok
Checking for user-defined postfix operators ok
Checking for incompatible polymorphic functions ok
Checking for tables WITH OIDS ok
Checking for invalid "sql_identifier" user columns ok
Creating dump of global objects ok
Creating dump of database schemas
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
Якщо робота pg_upgrade після цієї точки перерветься, вам потрібно буде заново виконати initdb
для нового кластера, перед продовженням.
Виконання оновлення
------------------
Analyzing all rows in the new cluster ok
Freezing all rows in the new cluster ok
Deleting files from new pg_xact ok
Copying old pg_xact to new server ok
Setting oldest XID for new cluster ok
Setting next transaction ID and epoch for new cluster ok
Deleting files from new pg_multixact/offsets ok
Copying old pg_multixact/offsets to new server ok
Deleting files from new pg_multixact/members ok
Copying old pg_multixact/members to new server ok
Setting next multixact ID and offset for new cluster ok
Resetting WAL archives ok
Setting frozenxid and minmxid counters in new cluster ok
Restoring global objects in the new cluster ok
Restoring database schemas in the new cluster
ok
Копіювання файлів користувацьких відношень
ok
Setting next OID for new cluster ok
Sync data directory to disk ok
Creating script to delete old cluster ok
Checking for extension updates notice
Ваша інсталяція містить розширення, які потрібно оновити
командою ALTER EXTENSION . Файл
update_extensions.sql,
коли виконується суперкористувачем бази даних за допомогою
psql, оновить ці розширення.
Оновлення завершено
----------------
Статистика оптимізатора не передається за допомогою pg_upgrade.
Після запуску нового серверу, розгляньте можливість запуску:
/usr/lib/postgresql/14/bin/vacuumdb --all --analyze-in-stages
При запуску цього скрипту файли даних старого кластера будуть видалені:
./delete_old_cluster.sh
upd. здавалось, що все добре -
postgresql наче працював
проте, після перезавантаження сервера бд перестала запускатись --
хоча процес (systemd service) висів, наче робочий, наче все добре -
але бд не слухала порт..
ця проблема вирішилась видаленням та встановленням субд заново,
бекап даних не постраждав
висновок - не забувайте перезавантажувати сервер та перевіряти роботу софту після оновлень-апгрейдів)
краще це робити в штатному режимі,
замість нервувати при незапланованому перезавантаженні сервера хостером
та неочікуваному виході з ладу..
можливо, в наступних версіях postgresql upgrade відбуватиметься без таких багів-помилок :)
Посилання
https://maas.io/docs/upgrading-postgresql-12-to-version-14
https://www.postgresqltutorial.com/postgresql-administration/postgresql-backup-database/
https://www.postgresql.org/docs/9.5/auth-methods.html#AUTH-TRUST
https://www.postgresql.org/docs/11/app-pgdump.html
https://www.postgresql.org/docs/11/app-pg-dumpall.html
https://www.postgresql.org/docs/11/pgupgrade.html