pg_upgrade
pg_upgrade — обновить экземпляр сервера PostgreSQL
Синтаксис
pg_upgrade
-b
старый_каталог_bin
[-B
новый_каталог_bin
] -d
старый_каталог_конфигурации
-D
новый_каталог_конфигурации
[параметр
...]
Описание
Программа pg_upgrade (ранее называвшаяся pg_migrator) позволяет обновить данные в каталоге базы данных PostgreSQL до последней основной версии PostgreSQL без операции выгрузки/восстановления данных, обычно необходимой при обновлениях основной версии, например, при переходе от 12.14 к 13.10 или от 14.9 к 15.5. Эти действия не требуются при установке корректирующей версии, например, при переходе от 12.7 к 12.8 или от 14.1 к 14.5.
С выходом новых основных версий в PostgreSQL регулярно добавляются новые возможности, которые часто меняют структуру системных таблиц, но внутренний формат хранения меняется редко. Учитывая этот факт, pg_upgrade позволяет выполнить быстрое обновление, создавая системные таблицы заново, но сохраняя старые файлы данных. Если при обновлении основной версии формат хранения данных изменится так, что данные в старом формате окажутся нечитаемыми, pg_upgrade не сможет произвести такое обновление. (Сообщество разработчиков постарается не допустить подобных ситуаций.)
Программа pg_upgrade делает всё возможное, чтобы убедиться в том, что старый и новый кластеры двоично-совместимы, в частности проверяя параметры времени компиляции и разрядность (32/64 бита) исполняемых файлов. Важно, чтобы и все внешние модули тоже были двоично-совместимыми, хотя это pg_upgrade проверить не может.
pg_upgrade поддерживает обновление с версии 9.2.X и новее до текущей основной версии PostgreSQL, включая бета-выпуски и сборки снимков кода.
Параметры
pg_upgrade принимает следующие аргументы командной строки:
-b
каталог_bin
--old-bindir=
каталог_bin
каталог с исполняемыми файлами старой версии PostgreSQL; переменная окружения
PGBINOLD
-B
каталог_bin
--new-bindir=
каталог_bin
каталог с исполняемыми файлами новой версии PostgreSQL, по умолчанию это каталог, в котором располагается pg_upgrade; переменная окружения
PGBINNEW
-c
--check
только проверить кластеры, не изменять никакие данные
-d
каталог_конфигурации
--old-datadir=
каталог_конфигурации
каталог конфигурации старого кластера; переменная окружения
PGDATAOLD
-D
каталог_конфигурации
--new-datadir=
каталог_конфигурации
каталог конфигурации нового кластера; переменная окружения
PGDATANEW
-j
число_заданий
--jobs=
число_заданий
число одновременно задействуемых процессов или потоков
-k
--link
использовать жёсткие ссылки вместо копирования файлов в новый кластер
-N
--no-sync
По умолчанию
pg_upgrade
ждёт, пока все файлы обновлённого кластера не будут надёжно записаны на диск. С данным параметромpg_upgrade
завершается быстрее, без ожидания, но в случае последующего сбоя операционной системы каталог данных может оказаться испорченным. Этот параметр может быть полезен при тестировании; в производственной среде применять его не следует.-o
параметры
--old-options
параметры
параметры, передаваемые непосредственно старой программе
postgres
; несколько параметров складываются вместе-O
параметры
--new-options
параметры
параметры, передаваемые непосредственно новой программе
postgres
; несколько параметров складываются вместе-p
порт
--old-port=
порт
номер порта старого кластера; переменная окружения
PGPORTOLD
-P
порт
--new-port=
порт
номер порта нового кластера; переменная окружения
PGPORTNEW
-r
--retain
сохранить SQL и журналы сообщений даже при успешном завершении
-s
каталог
--socketdir=
каталог
каталог, в котором будет создавать сокеты процесс postmaster во время обновления; по умолчанию выбирается текущий рабочий каталог; переменная окружения
PGSOCKETDIR
-U
имя_пользователя
--username=
имя_пользователя
имя пользователя, установившего кластер; переменная окружения
PGUSER
-v
--verbose
включить подробные внутренние сообщения
-V
--version
показать версию, а затем завершиться
--clone
Использовать эффективное клонирование файлов (в ряде систем это называется «reflink») вместо копирования файлов в новый кластер. В результате файлы данных могут копироваться практически мгновенно, как и с использованием
-k
/--link
, но последующие изменения не будут затрагивать старый кластер.Клонирование файлов поддерживается не во всех операционных системах и только с определёнными файловыми системами. Если этот режим выбран, но клонирование не поддерживается, при выполнении pg_upgrade произойдёт ошибка. В настоящее время оно поддерживается в Linux (с ядром 4.5 или новее) с Btrfs и XFS (если файловая система была создана с поддержкой reflink), а также в macOS с APFS.
--copy
Копировать файлы в новый кластер. Это поведение по умолчанию. (См. также
--link
и--clone
.)--copy-file-range
Использовать системный вызов
copy_file_range
для эффективного копирования. В некоторых файловых системах результаты будут схожи с--clone
, позволяя совместное использование физических дисковых блоков, в то время как на других могут копироваться блоки, но по оптимизированному пути. В настоящее время параметр поддерживается в Linux и FreeBSD.--sync-method=
метод
Со значением
fsync
(по умолчанию)pg_upgrade
рекурсивно откроет и синхронизирует все файлы в каталоге данных обновлённого кластера. Поиск файлов будет осуществляться по символическим ссылкам для каталога WAL и каждого настроенного табличного пространства.В Linux возможен вариант
syncfs
, когда от ОС требуется синхронизировать целиком каждую из файловых систем, содержащих каталог данных обновлённого кластера, файлы WAL и табличные пространства. Более подробно особенности использованияsyncfs
описаны в recovery_init_sync_method.В режиме
--no-sync
этот параметр не оказывает никакого влияния.-?
--help
показать справку, а затем завершиться
Использование
Далее описан план обновления с использованием pg_upgrade:
Переместить старый кластер (необязательно)
Если ваш каталог инсталляции привязан к версии, например,
/opt/PostgreSQL/17
, перемещать его не требуется. Все графические инсталляторы выбирают при установке каталоги, привязанные к версии.Если ваш каталог инсталляции не привязан к версии, например
/usr/local/pgsql
, необходимо переместить каталог текущей инсталляции PostgreSQL, чтобы он не конфликтовал с новой инсталляцией PostgreSQL. Когда текущий сервер PostgreSQL отключён, каталог этой инсталляции PostgreSQL можно безопасно переместить; если старый каталог/usr/local/pgsql
, его можно переименовать, выполнив:mv /usr/local/pgsql /usr/local/pgsql.old
Собрать новую версию при установке из исходного кода
Соберите из исходного кода новую версию PostgreSQL с флагами
configure
, совместимыми с флагами старого кластера. Программа pg_upgrade проверит результатыpg_controldata
, чтобы убедиться, что все параметры совместимы, прежде чем начинать обновление.Установить новые исполняемые файлы PostgreSQL
Установите новые исполняемые файлы сервера и вспомогательные файлы. Программа pg_upgrade включена в инсталляцию по умолчанию.
При установке из исходного кода, если вы хотите разместить сервер в нестандартном каталоге, воспользуйтесь переменной
prefix
:make prefix=/usr/local/pgsql.new install
Инициализировать новый кластер PostgreSQL
Инициализируйте новый кластер, используя
initdb
. При этом так же необходимо указать флагиinitdb
, совместимые с флагами в старом кластере. Многие готовые инсталляторы выполняют это действие автоматически. Запускать новый кластер не требуется.Установить разделяемые объектные файлы расширения
Многие расширения и пользовательские модули, как из
contrib
, так и из других источников, используют разделяемые объектные файлы (или библиотеки DLL), например,pgcrypto.so
. Если они использовались в старом кластере, разделяемые объектные файлы, соответствующие новому исполняемому файлу сервера, должны быть установлены в новом кластере, обычно средствами операционной системы. Не загружайте определения схемы, например, выполняяCREATE EXTENSION pgcrypto
, потому что они будут скопированы из старого кластера. Если доступны обновления расширений, pg_upgrade сообщит об этом и создаст скрипт, который можно будет запустить позже, чтобы обновить эти расширения.Скопировать пользовательские файлы полнотекстового поиска
Скопировать пользовательские файлы полнотекстового поиска (словари, тезаурусы, списки синонимов и стоп-слов) из старого кластера в новый.
Настроить аутентификацию
Программа
pg_upgrade
будет подключаться к новому и старому серверу несколько раз, так что имеет смысл установить режим аутентификацииpeer
вpg_hba.conf
или использовать файл~/.pgpass
(см. Раздел 32.16).Подготовиться к обновлению публикующего сервера
Программа pg_upgrade пытается мигрировать логические слоты. Это устраняет необходимость определять те же логические слоты на новом публикующем сервере вручную. Миграция логических слотов поддерживается только в случае, если старый кластер версии 17.0 или выше. Логические слоты на кластерах до версии 17.0 будут игнорироваться без уведомления.
Прежде чем начать обновление публикующего кластера, убедитесь, что подписка временно отключена, выполнив команду
ALTER SUBSCRIPTION ... DISABLE
. Включите подписку после завершения обновления.Необходимо выполнить ряд предварительных требований, чтобы программа pg_upgrade смогла обновить логические слоты. В противном случае будет выдаваться ошибка.
В новом кластере
wal_level
должен иметь значениеlogical
.В новом кластере параметр
max_replication_slots
должен иметь значение, большее или равное числу слотов в старом кластере.Модули вывода, на которые ссылаются слоты на старом кластере, должны быть установлены в каталоге с исполняемыми файлами новой версии PostgreSQL.
В старом кластере все транзакции и сообщения логического декодирования передавались подписчикам.
Все слоты в старом кластере должны использоваться, т. е. не должно быть слотов, , в которых pg_replication_slots.
conflicting
не имеет значениеtrue
.В новом кластере не должно быть постоянных логических слотов, т. е. не должно быть слотов, в которых pg_replication_slots.
temporary
имеет значениеfalse
.
Подготовиться к обновлению подписчика
Настройте конфигурации подписчика на новом подписчике. pg_upgrade пытается мигрировать зависимости подписки, включая информацию о таблице подписки, представленную в системном каталоге pg_subscription_rel, и об источнике репликации подписки. Таким образом логическая репликация для нового подписчика может продолжаться с того места, где остановился старый. Миграция зависимостей подписки поддерживается только в случае, если старый кластер версии 17.0 или выше. Зависимости подписки на кластерах до версии 17.0 будут игнорироваться без уведомления.
Чтобы программа pg_upgrade смогла обновить подписки, должны выполняться определённые условия. В противном случае будет выдаваться ошибка.
Все таблицы подписки в старом подписчике должны быть в состоянии
i
(initialize, инициализация) илиr
(ready, готовность). Это можно проверить с помощью pg_subscription_rel.srsubstate
.В старом кластере должна быть запись об источнике репликации для каждой из подписок. Это можно проверить в системных таблицах pg_subscription и pg_replication_origin.
В новом кластере параметр
max_replication_slots
должен иметь значение, большее или равное числу подписок в старом.
Остановить оба сервера
Убедитесь в том, что оба сервера баз данных остановлены. Для этого в Unix можно выполнить:
pg_ctl -D /opt/PostgreSQL/12 stop pg_ctl -D /opt/PostgreSQL/17 stop
А в Windows, с соответствующими именами служб:
NET STOP postgresql-12 NET STOP postgresql-17
Ведомые серверы с потоковой репликацией и трансляцией журнала должны продолжать работать во время этого отключения, чтобы получить все изменения.
Подготовиться к обновлению ведомых серверов
Если вы производите обновление ведомых серверов (как описано в разделе Шаг 13), удостоверьтесь, что эти серверы находятся в актуальном состоянии, запустив pg_controldata в старых ведущем и ведомых кластерах. Убедитесь в том, что «Положение последней контрольной точки» во всех кластерах одинаковое. Также смените
wal_level
наreplica
в файлеpostgresql.conf
нового ведущего кластера.Запустить pg_upgrade
Всегда запускайте программу pg_upgrade от нового сервера, а не от старого. pg_upgrade требует указания каталогов данных старого и нового кластера, а также каталогов исполняемых файлов (
bin
). Вы можете также определить имя пользователя и номера портов, и нужно ли копировать файлы данных (по умолчанию), клонировать их или создавать ссылки на них.Если выбрать вариант со ссылкой на данные, обновление выполнится гораздо быстрее (так как файлы не копируются) и потребует меньше места на диске, но вы лишитесь возможности обращаться к вашему старому кластеру, запустив новый после обновления. Этот вариант также требует, чтобы каталоги данных старого и нового кластера располагались в одной файловой системе. (Табличные пространства и
pg_wal
могут находиться в других файловых системах.) Вариант с клонированием работает так же быстро и экономит место на диске, но позволяет сохранить рабочее состояние старого кластера при запуске нового. Для этого варианта тоже требуется, чтобы старый и новый каталоги данных находились в одной файловой системе. Клонирование возможно только в некоторых операционных системах с определёнными файловыми системами.Параметр
--jobs
позволяет задействовать для копирования/связывания файлов и для выгрузки/восстановления схем баз данных несколько процессорных ядер. В качестве начального значения параметра стоит выбрать максимум из числа процессорных ядер и числа табличных пространств. Этот параметр может радикально сократить время обновления сервера со множеством баз данных, работающего в многопроцессорной системе.В Windows вы должны войти в систему с административными полномочиями и затем запустить pg_upgrade с путями каталогов в кавычках, например, так:
pg_upgrade.exe --old-datadir "C:/Program Files/PostgreSQL/12/data" --new-datadir "C:/Program Files/PostgreSQL/17/data" --old-bindir "C:/Program Files/PostgreSQL/12/bin" --new-bindir "C:/Program Files/PostgreSQL/17/bin"
При запуске
pg_upgrade
проверит два кластера на совместимость и, если всё в порядке, выполнит обновление. Также возможно запуститьpg_upgrade --check
, чтобы ограничиться только проверками (при этом старый сервер может продолжать работать). Командаpg_upgrade --check
также сообщит, какие коррективы вам нужно будет внести вручную после обновления. Если вы планируете использовать режим ссылок или клонирования, укажите вместе с параметром--check
параметр--link
или--clone
, чтобы включить специальные проверки для этих режимов. Программеpg_upgrade
требуются права на запись в текущий каталог.Очевидно, никто не должен обращаться к кластерам в процессе обновления. Программа pg_upgrade по умолчанию запускает серверы с портом 50432, чтобы не допустить нежелательных клиентских подключений. В процессе обновления оба кластера могут использовать один номер порта, так как они не будут работать одновременно. Однако для проверки старого работающего сервера новый порт должен отличаться от старого.
Если при восстановлении схемы базы данных происходит ошибка,
pg_upgrade
завершает свою работу и вы должны вернуться к старому кластеру, как описывается ниже в Шаг 19. Чтобы попробоватьpg_upgrade
ещё раз, вы должны внести коррективы в старом кластере, чтобы pg_upgrade могла успешно восстановить схему. Если проблема возникла в модулеcontrib
, может потребоваться удалить этот модульcontrib
в старом кластере, а затем установить его в новом после обновления (предполагается, что этот модуль не хранит пользовательские данные).Обновить ведомые серверы с потоковой репликацией и трансляцией журнала
Если вы используете режим ссылок и у вас реализована потоковая репликация (см. Подраздел 26.2.5) или трансляция журнала (см. Раздел 26.2) для ведомых серверов, вы можете быстро обновить эти серверы следующим образом. Вам не нужно будет запускать на них pg_upgrade, вместо этого вы выполните rsync на ведущем. Не запускайте никакие серверы на этом этапе.
Если вы не используете режим ссылок, либо у вас нет rsync или вы не хотите его использовать, либо если вам нужен более простой вариант, пропустите инструкции в этом разделе и просто пересоздайте ведомые серверы сразу после завершения pg_upgrade и запуска нового ведущего сервера.
Установите новые исполняемые файлы PostgreSQL на ведомых серверах
Убедитесь в том, что на всех ведомых серверах установлены новые исполняемые и вспомогательные файлы.
Убедитесь в том, что новые каталоги данных на ведомых серверах не существуют
Новые каталоги данных ведомых серверов должны отсутствовать либо быть пустыми. Если запускалась программа initdb, удалите новые каталоги данных на ведомых.
Установить разделяемые объектные файлы расширения
Установите на новых ведомых серверах те же разделяемые объектные файлы расширения, что вы установили в новом ведущем кластере.
Остановите ведомые серверы
Если ведомые серверы продолжают работу, остановите их, следуя приведённым выше инструкциям.
Сохраните файлы конфигурации
Сохраните все нужные вам файлы конфигурации из старых каталогов конфигурации ведомых серверов, в частности
postgresql.conf
(и все файлы, включённые в него),postgresql.auto.conf
иpg_hba.conf
, так как они будут перезаписаны или удалены на следующем этапе.Запустите rsync
Когда используется режим ссылок, ведомые серверы можно быстро обновить, применив rsync. Для этого в каталоге, внутри которого находятся каталоги старого и нового кластера, для каждого ведомого сервера выполните на ведущем:
rsync --archive --delete --hard-links --size-only --no-inc-recursive old_cluster new_cluster remote_dir
Здесь каталоги
old_cluster
иnew_cluster
задаются относительно текущего каталога на ведущем, аremote_dir
находится над каталогами старого и нового кластера на ведомом. Структура подкаталогов в заданных каталогах на ведущем и ведомых серверах должна быть одинаковой. Обратитесь к странице руководства rsync, где подробно описано, как указать удалённый каталог, например так:rsync --archive --delete --hard-links --size-only --no-inc-recursive /opt/PostgreSQL/12 \ /opt/PostgreSQL/17 standby.example.com:/opt/PostgreSQL
Проверить, что будет делать команда, можно, воспользовавшись параметром rsync
--dry-run
. Выполнить rsync на ведущем необходимо как минимум с одним ведомым, но затем, пока обновлённый ведомый остаётся остановленным, можно запускать rsync на нём для обновления других ведомых.В ходе этой операции записываются ссылки, созданные режимом ссылок pg_upgrade, связывающие файлы нового и старого кластера на ведущем сервере. Затем в старом кластере ведомого находятся соответствующие файлы и в новом кластере ведомого создаются ссылки на них. Файлы, не связанные ссылками на ведущем, копируются с него на ведомый. (Обычно их объём невелик.) Это позволяет произвести обновление ведомого быстро. К сожалению, при этом rsync будет напрасно копировать файлы, связанные с временными и нежурналируемыми таблицами, так как они обычно не будут существовать на ведомых серверах.
Если у вас есть табличные пространства, вам потребуется выполнить подобную команду rsync для каталогов всех табличных пространств, например:
rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tblsp/PG_12_201909212 \ /vol1/pg_tblsp/PG_17_202307071 standby.example.com:/vol1/pg_tblsp
Если вы вынесли
pg_wal
за пределы каталогов данных, нужно будет запустить rsync и для этих каталогов.Настройте ведомые серверы с потоковой репликацией и трансляцией журнала
Настройте серверы для трансляции журнала. (Запускать
pg_backup_start()
иpg_backup_stop()
или делать копию файловой системы не нужно, так как ведомые серверы остаются синхронизированными с ведущим.) Если версия старого ведущего ниже 17.0, слоты не будут копироваться на новый ведомый, и все слоты нужно будет воссоздавать вручную. Если старый ведущий сервер версии 17.0 или выше, логические слоты на ведущем сервере будут скопированы на новый ведомый сервер, но слоты на старом ведомом сервере копироваться не будут, и их нужно будет воссоздавать вручную.
Восстановить
pg_hba.conf
Если вы изменяли
pg_hba.conf
, восстановите его исходное состояние. Также может потребоваться скорректировать другие файлы конфигурации в новом кластере, чтобы они соответствовали старому, например,postgresql.conf
(и файлы, включённые в него) иpostgresql.auto.conf
.Запустить новый сервер
Теперь можно безопасно запустить новый сервер, а затем ведомые серверы, синхронизированные с ним с помощью rsync.
Действия после обновления
Если после обновления требуются какие-то дополнительные действия, программа pg_upgrade выдаст предупреждения об этом по завершении работы. Она также сгенерирует файлы скриптов, которые должны запускаться администратором. Эти скрипты будут подключаться к каждой базе данных, требующей дополнительных операций. Каждый такой скрипт следует выполнять командой:
psql --username=postgres --file=script.sql postgres
Эти скрипты могут выполняться в любом порядке, а после выполнения их можно удалить.
Внимание
Обычно к таблицам, задействованным в перестраивающих базу скриптах, опасно обращаться, пока эти скрипты не сделают свою работу; при этом можно получить некорректный результат или плохую производительность. К таблицам, не задействованным в таких скриптах, можно обращаться немедленно.
Статистика
Так как статистика оптимизатора не передаётся в процессе работы
pg_upgrade
, вы получите указание запустить соответствующую команду для воссоздания этой информации после обновления. Возможно, для этого вам понадобится установить параметры подключения к новому кластеру.Команда
vacuumdb --all --analyze-only
эффективно генерирует такую статистику, а параметр--jobs
поможет ускорить процесс. Параметр--analyze-in-stages
можно использовать для быстрого получения минимального объёма статистики. Если значениеvacuum_cost_delay
не равно нулю, его можно переопределить, чтобы ускорить генерацию статистики с помощьюPGOPTIONS
, напримерPGOPTIONS='-c vacuum_cost_delay=0' vacuumdb ...
.Удалить старый кластер
Если вы удовлетворены результатами обновления, вы можете удалить каталоги данных старого кластера, запустив скрипт, упомянутый в выводе
pg_upgrade
после обновления. (Автоматическое удаление невозможно, если в старом каталоге данных находятся дополнительные табличные пространства.) Также вы можете удалить каталоги старой инсталляции (например,bin
,share
).Возврат к старому кластеру
Если выполнив команду
pg_upgrade
, вы захотите вернуться к старому кластеру, возможны следующие варианты:Если использовался ключ
--check
, в старом кластере ничего не меняется; его можно просто перезапустить.Если не использовался ключ
--link
, в старом кластере ничего не меняется; его можно просто перезапустить.Если использовался ключ
--link
, у старого и нового кластера могут оказаться общие файлы данных:Если работа
pg_upgrade
была прервана до начала расстановки ссылок, в старом кластере ничего не меняется; его можно просто перезапустить.Если вы не запускали новый кластер, старый кластер не претерпел никаких изменений, за исключением того, что при создании ссылки на данные к имени
$PGDATA/global/pg_control
было добавлено окончание.old
. Чтобы продолжить использование старого кластера, достаточно убрать окончание.old
из имени файла$PGDATA/global/pg_control
; после этого старый кластер можно будет перезапустить.Если вы запускали новый кластер, он внёс изменения в общие файлы, и использовать старый кластер небезопасно. В этом случае старый кластер нужно будет восстановить из резервной копии.
Переменные окружения
Некоторые переменные окружения могут передавать значения по умолчанию для параметров командной строки:
PGBINOLD
Каталог с исполняемыми файлами старой версии PostgreSQL; параметр
-b
/--old-bindir
.PGBINNEW
Каталог с исполняемыми файлами новой версии PostgreSQL; параметр
-B
/--new-bindir
.PGDATAOLD
Каталог конфигурации старого кластера; параметр
-d
/--old-datadir
.PGDATANEW
Каталог конфигурации нового кластера; параметр
-D
/--new-datadir
.PGPORTOLD
Номер порта старого кластера; параметр
-p
/--old-port
.PGPORTNEW
Номер порта нового кластера; параметр
-P
/--new-port
.PGSOCKETDIR
Каталог, в котором будет создавать сокеты postmaster во время обновления; параметр
-s
/--socketdir
.PGUSER
Имя пользователя для установки кластера; параметр
-U
/--username
.
Примечания
Программа pg_upgrade создаёт различные временные файлы, например выгружая схему базы, в своём рабочем каталоге pg_upgrade_output.d
внутри каталога данных нового кластера. При каждом запуске в этом рабочем каталоге создаётся подкаталог с именем, содержащим отметку времени в формате стандарта ISO 8601 (%Y%m%dT%H%M%S
), и в данный подкаталог помещаются все создаваемые файлы. Каталог pg_upgrade_output.d
со всем содержимым удаляется автоматически в случае успешного выполнения pg_upgrade; но если возникает проблема, сохранённые в нём файлы могут быть полезны для диагностики.
Программа pg_upgrade запускает на короткое время процессы postmaster со старым и новым каталогом данных. Временные файлы сокетов Unix для взаимодействия с этими процессами по умолчанию создаются в текущем рабочем каталоге. В некоторых ситуациях путь к файлу в текущем каталоге может оказаться слишком длинным для имени сокета. В этом случае вы можете передать параметр -s
, чтобы файлы сокетов создавались в другом каталоге с более коротким путём. В целях безопасности этот каталог не должен быть доступен для чтения и записи другим пользователям. (В Windows это не поддерживается.)
Программа pg_upgrade сообщит обо всех актуальных для вашей инсталляции ошибках и потребностях перестроения или переиндексации базы; при этом будут созданы завершающие обновление скрипты, перестраивающие таблицы или индексы. Если вы попытаетесь автоматизировать обновление множества серверов, вы обнаружите, что для кластеров с одинаковыми схемами баз данных потребуются одинаковые действия после обновления; это объясняется тем, что эти действия диктуются схемой базы данных, а не данными пользователей.
Для проверки развёртывания новой версии создайте копию только схемы старого кластера, наполните этот кластер фиктивными данными, и попробуйте обновить его.
pg_upgrade не поддерживает обновление баз данных, в которых есть таблицы со столбцами, имеющими следующие системные типы данных reg*
, ссылающиеся на OID:
regcollation |
regconfig |
regdictionary |
regnamespace |
regoper |
regoperator |
regproc |
regprocedure |
(Обновление regclass
, regrole
и regtype
поддерживается.)
Если вы хотите использовать режим ссылок на данные, но при этом исключить изменения в старом кластере при запуске нового, вам может подойти режим клонирования. Если же этот режим недоступен, сделайте копию старого кластера и обновите его в этом режиме. Чтобы получить рабочую копию старого кластера, воспользуйтесь командой rsync
и создайте предварительную копию кластера при работающем сервере, а затем отключите старый сервер и ещё раз запустите rsync --checksum
, чтобы привести эту копию в согласованное состояние. (Ключ --checksum
необходим, потому что rsync
различает время с точностью только до секунд.) При этом вы можете исключить некоторые файлы, например postmaster.pid
, как описано в Подразделе 25.3.4. Если ваша файловая система поддерживает снимки файловой системы или копирование при записи, вы можете воспользоваться этим для создания копии старого кластера и табличных пространств; при этом важно, чтобы такие снимки и копии файлов создавались одномоментно или когда сервер баз данных отключён.