У меня есть рабочий сервер с Postgres 9.4. База данных> 10 ГБ. Можно ли выполнить обновление до Postgres 9.5 без простоев и потери данных?
В руководствах по обновлению рекомендуется останавливать Postgres при выполнении sudo pg_upgradecluster 9.4 main
, но это может занять много времени. Обновление кластера 10 ГБ может занять несколько часов!
Я также пробовал pg_dump mydb> db.sql
. Удаление базы данных и повторная вставка дампа в PG 9.4 ( psql -d mydb -f db.sql
) заняли около 50 минут.
Но вставка дампа в PG 9.5 завершилась только через более чем 7 часов. . В частности, создание индекса было очень медленным ...
2016-07-18 00:13:55 CEST [60358-5] ERROR: canceling autovacuum task
2016-07-18 00:13:55 CEST [60358-6] CONTEXT: automatic analyze of table ...
2016-07-18 00:36:20 CEST [60366-1] ERROR: canceling autovacuum task
2016-07-18 00:36:20 CEST [60366-2] CONTEXT: automatic analyze of table ...
2016-07-18 04:21:40 CEST [60361-1] ERROR: canceling autovacuum task
2016-07-18 04:21:40 CEST [60361-2] CONTEXT: automatic analyze of table ...
2016-07-18 07:55:19 CEST [61316-1] ERROR: canceling autovacuum task
2016-07-18 07:55:19 CEST [61316-2] CONTEXT: automatic analyze of table ...
Так что ни pg_upgradecluster
, ни pg_dump
не являются приемлемым решением. Даже с PG 4 у вас будет не менее 50 минут простоя. Следовательно: как можно обновить базы данных на производственных серверах или больших мастер-подчиненных кластерах без простоев и потерь данных?
Никакой пробой вообще невозможен без какой-то кластерной магии.
Другие возможности:
pg_upgrade
с опцией --link
. При использовании этой опции исходные файлы БД не копируются, а жестко привязываются к новому каталогу, что значительно ускоряет процесс. Обратите внимание, что эта опция навсегда изменит исходные файлы БД.pg_dump
и восстановите в новой БД. Вы можете значительно сократить время, отключив синхронную запись в новой базе данных (fsync = false
в новом конфигурационном файле экземпляра PG)pg_dump
, загрузите по сети дамп на новый экземпляр. После этого поменяйте местами порты и используйте новый экземпляр.Обновление (почти) без простоев должно быть возможно с pglogical . По крайней мере, для PostgreSQL> = 9.4 и новее он должен работать.
Это относительно новый проект (2016), основанный на коде из Bi-Направленная репликация для PostgreSQL . Для установки вам понадобится репозиторий 2ndQuadrant .
Использование описано в README , требуется перезапуск БД (необходимо обновить конфигурацию репликации), но, по крайней мере, этого не должно быть вызовет несколько часов простоя.
В отличие от repmgr , pglogical
предназначен для одноразовой репликации БД, которая займет гораздо больше времени, чем копирование двоичных файлов WAL.
Сначала включите расширение для каждой БД, которую необходимо скопировать (обновить):
CREATE EXTENSION pglogical;
В настоящее время все команды должны выполняться от имени суперпользователя ( postgres
). Начните с создания «главного узла» ( поставщик
):
SELECT pglogical.create_node(
node_name := 'provider1',
dsn := 'host=providerhost port=5432 dbname=db'
);
и отметьте схемы (схемы) для репликации:
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
и репликацию последовательностей:
SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']);
Обратите внимание, что для каждой таблицы требуется первичный ключ, в противном случае репликация не запускается. В отличие от других методов резервного копирования, здесь важна согласованность таблиц.
Продолжите с «резервного узла» ( подписчик
)
SELECT pglogical.create_node(
node_name := 'subscriber1',
dsn := 'host=thishost port=5432 dbname=db'
);
и, наконец, начните репликацию:
SELECT pglogical.create_subscription(
subscription_name := 'subscription1',
provider_dsn := 'host=providerhost port=5432 dbname=db'
);
Я думаю, вы уже решили это, так что, возможно, для других с аналогичными проблемами.
После нескольких лет работы с postgresql с версии 8.4 до последней версии 9.6 я бы порекомендовал для этих случаев - не «обновляться». Если возможно, создайте новую машину или новый облачный экземпляр с последней версией используемой вами ОС (очень важно - предотвращает множество проблем) и новейшей версией pg и дублирующими данными.
Способ копирования данных зависит от вашего приложения, версии PostgreSQL и окружающей среды. База данных ~ 10 ГБ не такая большая, так что вам подойдет. Я работаю с dbs> 400 ГБ, так что представьте себе множество проблем ...
Я видел варианты всех этих сценариев в реальной жизни. Так что веселитесь! Скрещиваю пальцы: -)