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

:warning: ВНИМАНИЕ! Если ваша база данных очень велика, вам потребуется значительный объем дополнительного дискового пространства (в 2 раза больше размера базы данных), и вы должны быть крайне осторожны при выполнении этого обновления!

Мы наконец-то внедрили давно ожидаемое обновление основной версии PostgreSQL. Все администраторы сайтов, которые собирают Discourse из командной строки, будут обновлены с предыдущей версии PostgreSQL 10 до PostgreSQL 12.

Мы уже какое-то время используем эту новую версию на Meta, и всё работает безупречно. PostgreSQL 12 приносит множество улучшений, которые автоматически будут использованы Discourse.

Обновление

Официальная инструкция по установке (один контейнер)

При следующей пересборке вы увидите в конце следующее сообщение:

Upgrade Complete
----------------

To complete the upgrade, rebuild again using:

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

Это означает, что обновление прошло успешно! Вам нужно лишь запустить новую пересборку, чтобы ваш сайт снова заработал.

Установка с выделенным контейнером данных

Если вы используете конфигурацию с выделенным контейнером данных на основе примера, предоставленного в нашем репозитории discourse_docker, убедитесь, что вы корректно и безопасно останавливаете PostgreSQL.

В настоящее время у нас выполняются фоновые задачи с запросами, длящимися несколько минут, поэтому остановка веб-контейнера поможет безопасно завершить работу контейнера данных.

./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only

Перед выполнением первой пересборки контейнера данных вы можете отслеживать лог PostgreSQL, чтобы убедиться, что он был остановлен корректно.

Выполнение команды tail -f shared/data/log/var-log/postgres/current должно показать следующий лог в случае корректной остановки:

2020-05-13 18:33:33.457 UTC [36] LOG:  received smart shutdown request
2020-05-13 18:33:33.464 UTC [36] LOG:  worker process: logical replication launcher (PID 52) exited with exit code 1
2020-05-13 18:33:33.465 UTC [47] LOG:  shutting down
2020-05-13 18:33:33.479 UTC [36] LOG:  database system is shut down

Ручное обновление / Ограниченное дисковое пространство

:warning::warning::warning:
ОБЯЗАТЕЛЬНО СОЗДАЙТЕ РЕЗЕРВНУЮ КОПИЮ POSTGRES_DATA ПЕРЕД ПОПЫТКОЙ ЭТОГО
:warning::warning::warning:

Если вы работаете в среде с ограниченным дисковым пространством и у вас нет возможности его увеличить, вы можете попробовать следующее:

./launcher stop app #(или оба web_only и data, если это ваш случай)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/10/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/12/data \
	tianon/postgres-upgrade:10-to-12
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
./launcher rebuild app #(или сначала data, а затем web_only, если это ваш случай)

По моим тестам, эта процедура требует менее 1x от текущего размера вашей базы данных в виде свободного места.

Откладывание обновления

Если вам нужно отложить обновление при следующей пересборке, вы можете изменить шаблон PostgreSQL в файле app.yml, заменив "templates/postgres.template.yml" на "templates/postgres.10.template.yml".

Это не рекомендуется, так как некоторые администраторы сайтов могут забыть вернуть изменения обратно.

Дополнительные задачи после обновления

Оптимизация статистики PostgreSQL

После обновления новая версия PostgreSQL не будет иметь актуальной статистики по таблицам. Вы можете сгенерировать её с помощью:

cd /var/discourse
./launcher enter app
su postgres
psql
\connect discourse
VACUUM VERBOSE ANALYZE;
\q
exit
exit

Или используйте однострочную версию вышеуказанной команды:

/var/discourse/launcher run app "echo 'vacuum verbose analyze;' | su postgres -c 'psql discourse'"

Очистка старых данных

Для стандартной установки вы можете удалить старые данные в формате PG10 следующей командой:

cd /var/discourse
./launcher cleanup

Если у вас есть отдельный контейнер данных, вам нужно удалить резервную копию следующим образом:

rm -fr /var/discourse/shared/data/postgres_data_old/

Часто задаваемые вопросы (FAQ)

Исходный кластер не был остановлен корректно

Если вы получаете ошибку обновления с вышеуказанным сообщением, вы можете попробовать более простой подход, чтобы вернуть систему в нормальное состояние.

Перезапустите старый контейнер командой ./launcher start app. Подождите несколько минут, пока он снова не запустится.

Теперь остановите его снова командой ./launcher stop app. После этого просмотрите логи, чтобы убедиться, что остановка была корректной:

tail -f shared/data/log/var-log/postgres/current
2020-05-13 18:33:33.457 UTC [36] LOG:  received smart shutdown request
2020-05-13 18:33:33.464 UTC [36] LOG:  worker process: logical replication launcher (PID 52) exited with exit code 1
2020-05-13 18:33:33.465 UTC [47] LOG:  shutting down
2020-05-13 18:33:33.479 UTC [36] LOG:  database system is shut down

Если логи выглядят как выше, вы можете снова попробовать выполнить обновление командой ./launcher rebuild app.

Значения lc_collate для базы данных “postgres” не совпадают

Эта ошибка возникает, если вы используете нестандартные локали для вашей базы данных. Сообщалось, что для успешного выполнения необходимо наличие 3 переменных. Убедитесь, что секция env: в вашем файле app.yml содержит следующие 3 строки:

  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

Замените en_US.UTF-8 на вашу локаль.

Каждая пересборка снова выполняет обновление (цикл обновления)

В этом случае логи обновления будут содержать:

mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty

Это означает, что файлы из предыдущего обновления всё ещё остались. Переместите их в другое место перед продолжением.

68 лайков
Update failed (postgresql)
Trouble with latest update
Discourse Update Probs. Help please
Cant backup because of version mismatch on aws
User profile page and other features page not available
Error after Upgrading
SAML error after upgrade
Updated to latest version: ./analyze_new_cluster.sh message
Discourse 2.5.0.beta5 Release Notes
Problem with upgrading the latest version
UPGRADE OF POSTGRES FAILED - I've tried everything
Trouble with postgre(maybe)
Postgres upgrade success loop due to prior postgres 8 to 10 migration
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
Failed upgrade from 2.5.0beta4 to 2.5.0beta5
Corrupt indexes in PG12, how do I fix?
PostgreSQL 13 update
Fixing discourse after disk full
LDAP Auth Missing from Plugins
Today error when upgrade from 2.5.1 to 2.5.2, discourse-assign
Discourse for Teams (Alpha Testing summer 2020)
Issue Rebuilding App Failing on Postgres Upgrade
How hard is it to handle Discourse after installation
Primary Postgres database process (postmaster) eating all CPU
Discourse failing to connect to port 3000
Upgrade of postgres failed
Search 502 errors in 2.5.0.beta6
2.6.0 beta 3 update failed on disk and/or memory space
How to backup and restore a whole /var/discourse app folder?
PostgreSQL update wrecked my forum. Please help!
Instead of auto-deleting old replies, make them auto-hide?
Add print CSS for front page and category page?
Site down after failed update: permission denied to create extension "unaccent"
Migrate quickly to separate web and data containers
Rebuild failed - FAILED TO BOOTSTRAP
Old Postgres on Docker Image with two containers: web and data
Can't rebuild due to failed postgres 12 upgrade
Should I also rebuild my data container when upgrading
Old Postgres on Docker Image with two containers: web and data
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
UPGRADE OF POSTGRES FAILED - I've tried everything
PostgreSQL 15 update
Help! Problem with firewall/permissions and postgre?
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade
Problem with upgrading the latest version
Restore failed at "EXCEPTION: x of y uploads are not migrated to S3. S3 migration failed for db 'default'."
Trouble with latest update
Can't upgrade due to old docker version
Database migration chokes on huge value of a "calendar-details" item in table "post_custom_fields"
Slow Sidekiq + Postmaster using 95%+ CPU (32 cores) after Postgresql Version Upgrade