Обновление PostgreSQL 15

Во время обновления я получал

Остановка сервера базы данных PostgreSQL 15: main
Ошибка: владелец конфигурации (postgres:101) и владелец данных (runit-log:999) не совпадают, а владелец конфигурации не является root … не удалось!
не удалось!
не удалось открыть файл версии “/shared/postgres_data/PG_VERSION”: Отказано в доступе
Сбой, выход

Это было решено с помощью

sudo ./launcher enter app

а затем

chown -R postgres:postgres /shared/postgres_data
chown -R postgres:postgres /shared/postgres_run
chmod -R 700 /shared/postgres_data

3 лайка

Я нахожусь в бесконечном цикле: база данных обновилась успешно, но при запуске ./launcher rebuild app процесс просто зацикливается. Я вижу только следующее:

РЕДАКТИРОВАНО: Нашел это сообщение…

mv: межсетевого перемещение не удалось: '/shared/postgres_data_new' в '/shared/postgres_data/postgres_data_new'; невозможно удалить целевой объект: Каталог не пуст

В вашей установке есть расширения, которые следует обновить
с помощью команды ALTER EXTENSION. Файл
    update_extensions.sql
при выполнении через psql суперпользователем базы данных обновит
эти расширения.

Пожалуйста, дайте совет.

Обновление завершено
----------------
Статистика оптимизатора не переносится pg_upgrade.
После запуска нового сервера рекомендуется выполнить:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Выполнение этого скрипта удалит файлы данных старого кластера:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
ОБНОВЛЕНИЕ POSTGRES ЗАВЕРШЕНО

Старая база данных версии 13 хранится в /shared/postgres_data_old

Чтобы завершить обновление, выполните повторную сборку с помощью:

./launcher rebuild app
-------------------------------------------------------------------------------------

Хорошо, похоже, проблема именно здесь:

Эти файлы находятся в shared/standalone/ и уже были перемещены вручную…

mv: невозможно переместить '/shared/postgres_data' в '/shared/postgres_data_old': Устройство или ресурс занят
mv: межсетевого перемещение не удалось: '/shared/postgres_data_new' в '/shared/postgres_data/postgres_data_new'; невозможно удалить целевой объект: Каталог не пуст
I, [2025-02-08T15:22:42.078189 #1]  INFO -- : Генерация локалей (это может занять некоторое время)...
1 лайк

Кажется, ни одно решение не работает. Это так раздражает.

1 лайк

Это было бы очень необычно, если бы кто-то просто предложил такую услугу, не будучи предварительно запрошенным.
Если вы хотите нанять кого-то, вот нужное место: Marketplace - Discourse Meta

4 лайка

Ваша многосайтовая инсталляция перестала работать после обновления. Появилось сообщение:

Ваша установка содержит расширения, которые необходимо обновить с помощью команды ALTER EXTENSION. Файл
update_extensions.sql
при выполнении через psql пользователем с правами суперпользователя базы данных обновит эти расширения.

Я не могу найти файл update_extensions.sql нигде. Где он может находиться?

2 лайка

Проверьте это

mv: не удалось переместить '/shared/postgres_data' в '/shared/postgres_data_old': Устройство или ресурс занят
mv: перемещение между устройствами не удалось: '/shared/postgres_data_new' в '/shared/postgres_data/postgres_data_new'; не удалось удалить цель: Каталог не пуст
I, [2025-02-08T15:22:42.078189 #1]  INFO -- : Генерация локалей (это может занять некоторое время)...

Это был я. Я предлагаю помощь, когда вижу, что кто-то оказался в ситуации, которую будет трудно разрешить с помощью здесь.

4 лайка

Вопрос из любопытства.

Существует ли стандарт или стратегия, касающаяся обновлений ключевых компонентов, таких как Postgres?

Я вижу, что поддержка Postgres 13 действовала до 25 ноября, поддержка версии 15 — до 2027 года, а текущая версия — 17.

Просто хочу разобраться и понять. Обновление версий базы данных обычно является серьёзной задачей и требует значительных усилий.

Спасибо!

1 лайк

Я работаю ещё с версии PostgreSQL 10. Обычно они обновляются каждые два релиза, хотя в этот раз перешли с 12 на 13, так как в ней были улучшения, которые сделали раннее обновление целесообразным. Я немного удивился, что они не перешли сразу на 16.

Обычно процесс проходит довольно гладко, если у вас достаточно места на диске и актуальная версия Docker.

3 лайка

Я вернулся к шаблону 13, пока не будет исправление, спасибо

Я решил проблему, с которой столкнулся при обновлении PostgreSQL с версии 13 до 15. После восстановления сервера из резервных копий после неудачного обновления мне помогли следующие шаги с локалью PostgreSQL en_GB.UTF-8:

sudo -i
su - discourse
cd /var/discourse
git stash
git stash drop
git pull
./launcher stop app
docker run --rm \
    --entrypoint=/bin/bash \
    -e LANG='en_GB.UTF-8' \
    -v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
    -v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
    tianon/postgres-upgrade:13-to-15 \
    -c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
    apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
    docker-upgrade'
exit
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
chown -R 101:104 /var/discourse/shared/standalone/postgres_data
su - discourse
cd /var/discourse
docker run --rm -v /var/discourse/shared/standalone:/shared \
local_discourse/app chown -R postgres:postgres /shared/postgres_data 
./launcher rebuild app

Мне пришлось удалить локальные изменения, которые ранее были внесены для настройки LANG в PostgreSQL, с помощью команд git stash; git stash drop. Перемещение директорий с данными PostgreSQL требовало выполнения от имени root, а также было необходимо выполнить команду chown.

5 лайков

Нужно ли на этот раз выполнить git pull? Обычно это не требуется.

1 лайк

Сейчас это никогда не требуется, так как rebuild делает это за вас.

3 лайка

Сообщение Device or resource busy в конце первой ошибки указывает на то, что кто-то удерживает блокировку каталога postgres_data, поэтому его невозможно переместить.

Поскольку это каталог базы данных, наиболее вероятное объяснение — postgres_data является точкой монтирования. Это ещё более вероятно, учитывая сообщение inter-device move failed во второй команде mv, что означает, что shared/postgres_data_new и shared/postgres_data находятся на разных дисках или разделах.

Если вы подтвердите, что postgres_data — это точка монтирования, вам придётся вручную переместить все файлы из postgres_data в какой-либо другой резервный каталог, а затем переместить все файлы изнутри postgres_data_new в (теперь пустой) каталог postgres_data. Оба перемещения следует выполнить после завершения первой пересборки с сообщением UPGRADE OF POSTGRES COMPLETE, но перед запуском второй.

Если postgres_data не является точкой монтирования, вам поможет утилита lsof. С её помощью можно попытаться определить, что вызывает блокировку.

Конечно, сначала создайте необходимые резервные копии.

3 лайка

Это отлично, спасибо.

Файлы находились в следующей папке:

/var/postgres_data_discourse как postgres_data_new

Это помогло исправить ситуацию.

Я переместил postgres_data_new в /var.
Переименовал postgres_data_discourse в postgres_data_discourse_old.
Переименовал postgres_data_new в postgres_data_discourse.
Выполнил ./launcher rebuild app.

Ещё раз спасибо :+1:

5 лайков

У меня база данных объёмом 62 ГБ. Какое решение вы посоветуете для оптимального обновления?

62G /var/discourse/shared/standalone/postgres_data

1 лайк

Я рекомендую перенести всё на новую виртуальную машину, развернуть новый экземпляр Discourse с пустой базой данных (при желании скопировав каталоги ssl и letsencrypt для обеспечения переключения без простоя) и восстановить текущую базу данных на новый сервер. Это позволит выполнить обновление без простоя и с нулевым риском возникновения ошибок.

В любом случае, скорее всего, уже пора обновить вашу операционную систему.

2 лайка

Это хорошая идея.
Могу ли я перенести

резервную копию версии 3.4.0.beta4-dev ### на новую установку последней версии?

1 лайк

Если вы спрашиваете, можно ли восстановить любую старую версию Discourse до любой новой версии Discourse, которую вы можете получить, ответ — да.

4 лайка