pg_upgrade

Название

pg_upgrade -- обновить экземпляр сервера PostgreSQL

Синтаксис

pg_upgrade -b старый_каталог_bin -B новый_каталог_bin -d старый_каталог_данных -D новый_каталог_данных [ параметр ...]

Описание

Программа pg_upgrade (ранее называвшаяся pg_migrator) позволяет обновить данные в каталоге базы данных PostgreSQL до последней основной версии PostgreSQL без операции выгрузки/перезагрузки данных, обычно необходимой при обновлениях основной версии, например, при переходе от 8.4.7 к текущей основной версии PostgreSQL. Эти действия не требуются при установке корректирующей версии, например, при переходе от 9.0.1 к 9.0.4.

С выходом новых основных версий в PostgreSQL регулярно добавляются новые возможности, которые часто меняют структуру системных таблицы, но внутренний формат хранения меняется редко. Учитывая этот факт, pg_upgrade позволяет выполнить быстрое обновление, создавая системные таблицы заново, но сохраняя старые файлы данных. Если при обновлении основной версии формат хранения данных изменится так, что данные в старом формате окажутся нечитаемыми, pg_upgrade не сможет произвести такое обновление. (Сообщество разработчиков постарается не допустить подобных ситуаций.)

Программа pg_upgrade делает всё возможное, чтобы убедиться в том, что старый и новый кластеры двоично-совместимы, в частности проверяя параметры времени компиляции и разрядность (32/64 бита) исполняемых файлов. Важно, чтобы и все внешние модули тоже были двоично-совместимыми, хотя это pg_upgrade проверить не может.

pg_upgrade поддерживает обновление с версии 8.3.X и новее до текущей основной версии PostgreSQL, включая альфа-выпуски и сборки снимков кода.

Параметры

pg_upgrade принимает следующие аргументы командной строки:

-b каталог_bin
--old-bindir=каталог_bin

каталог с исполняемыми файлами старой версии PostgreSQL; переменная окружения PGBINOLD

-B каталог_bin
--new-bindir=каталог_bin

каталог с исполняемыми файлами новой версии PostgreSQL; переменная окружения PGBINNEW

-c
--check

только проверить кластеры, не изменять никакие данные

-d datadir
--old-datadir=datadir

каталог данных старого кластера; переменная окружения PGDATAOLD

-D datadir
--new-datadir=datadir

каталог данных нового кластера; переменная окружения PGDATANEW

-j
--jobs

число одновременно задействуемых процессов или потоков

-k
--link

использовать жёсткие ссылки вместо копирования файлов в новый кластер (в Windows использовать точки соединения)

-o параметры
--old-options параметры

параметры, передаваемые непосредственно старой программе postgres

-O параметры
--new-options параметры

параметры, передаваемые непосредственно новой программе postgres

-p порт
--old-port=порт

номер порта старого кластера; переменная окружения PGPORTOLD

-P порт
--new-port=порт

номер порта нового кластера; переменная окружения PGPORTNEW

-r
--retain

сохранить SQL и журналы сообщений даже при успешном завершении

-U имя_пользователя
--username=имя_пользователя

имя суперпользователя кластера; переменная окружения PGUSER

-v
--verbose

включить подробные внутренние сообщения

-V
--version

показать версию, а затем завершиться

-?
--help

показать справку, а затем завершиться

Usage

Далее описан план обновления с использованием pg_upgrade:

  1. Переместить старый кластер (необязательно)

    Если ваш каталог инсталляции привязан к версии, например, /opt/PostgreSQL/9.1, перемещать его не требуется. Все графические инсталляторы выбирают при установке каталоги, привязанные к версии.

    Если ваш каталог инсталляции не привязан к версии, например /usr/local/pgsql, необходимо переместить каталог текущей инсталляции PostgreSQL, чтобы он не конфликтовал с новой инсталляцией PostgreSQL. Когда текущий сервер PostgreSQL отключён, каталог этой инсталляции PostgreSQL можно безопасно переместить; если старый каталог /usr/local/pgsql, его можно переименовать, выполнив:

    mv /usr/local/pgsql /usr/local/pgsql.old

  2. Собрать новую версию при установке из исходного кода

    Соберите из исходного кода новую версию PostgreSQL с флагами configure, совместимыми с флагами старого кластера. Программа pg_upgrade проверит результаты pg_controldata, чтобы убедиться, что все параметры совместимы, прежде чем начинать обновление.

  3. Установить новые исполняемые файлы PostgreSQL

    Установите новые исполняемые файлы сервера и вспомогательные файлы.

    При установке из исходного кода, если вы хотите разместить сервер в нестандартном каталоге, воспользуйтесь переменной prefix:

    make prefix=/usr/local/pgsql.new install

  4. Установить pg_upgrade и pg_upgrade_support

    Установите программу pg_upgrade и библиотеку pg_upgrade_support в новую инсталляцию PostgreSQL.

  5. Инициализировать новый кластер PostgreSQL

    Инициализируйте новый кластер, используя initdb. При этом так же необходимо указать флаги initdb, совместимые с флагами в старом кластере. Многие готовые инсталляторы выполняют это действие автоматически. Запускать новый кластер не требуется.

  6. Установить дополнительные разделяемые объектные файлы

    Установите в новый кластер все нестандартные разделяемые объектные файлы (или DLL), которые использовались в старом кластере, например, pgcrypto.so, где бы они ни находились — в contrib или в другом месте. Устанавливать определения схемы, например pgcrypto.sql, не требуется, так как они будут перенесены из старого кластера.

  7. Настроить аутентификацию

    Программа pg_upgrade будет подключаться к новому и старому серверу несколько раз, так что имеет смысл установить режим аутентификации peer в pg_hba.conf или использовать файл ~/.pgpass (см. Раздел 31.15).

  8. Остановить оба сервера

    Убедитесь в том, что оба сервера баз данных остановлены. Для этого в Unix можно выполнить:

    pg_ctl -D /opt/PostgreSQL/8.4 stop
    pg_ctl -D /opt/PostgreSQL/9.0 stop

    А в Windows, в зависимости от имени службы:

    NET STOP postgresql-8.4
    NET STOP postgresql-9.0

    или

    NET STOP pgsql-8.3  (В PostgreSQL версии 8.3 и старее имя службы было другим)

  9. Запустите pg_upgrade

    Всегда запускайте программу pg_upgrade от нового сервера, а не от старого. pg_upgrade требует указания каталогов данных старого и нового кластера, а также каталогов исполняемых файлов (bin). Вы можете также определить имя пользователя и номера портов, и следует ли ограничиться ссылкой на данные, а не копировать их (по умолчанию).

    Если выбрать вариант со ссылкой на данные, обновление выполнится гораздо быстрее (так как файлы не копируются) и потребует меньше места на диске, но вы лишитесь возможности обращаться к вашему старому кластеру, запустив новый после обновления. Этот вариант также требует, чтобы каталоги данных старого и нового кластера располагались в одной файловой системе. (Табличные пространства и pg_xlog могут находиться в других файловых системах.) Полный список параметров вы можете получить, выполнив pg_upgrade --help.

    Параметр --jobs позволяет задействовать для копирования/связывания файлов и для выгрузки/перезагрузки схем баз данных несколько процессорных ядер. В качестве начального значения параметра стоит выбрать максимум из числа процессорных ядер и числа табличных пространств. Этот параметр может радикально сократить время обновления сервера со множеством баз данных, работающего в многопроцессорной системе.

    В Windows вы должны войти в систему с административными полномочиями, затем запустить командную строку от имени пользователя postgres, задать подходящий путь:

    RUNAS /USER:postgres "CMD.EXE"
    SET PATH=%PATH%;C:\Program Files\PostgreSQL\9.0\bin;

    Наконец, запустить pg_upgrade с путями каталогов в кавычках, например, так:

    pg_upgrade.exe
            --old-datadir "C:/Program Files/PostgreSQL/8.4/data"
            --new-datadir "C:/Program Files/PostgreSQL/9.0/data"
            --old-bindir "C:/Program Files/PostgreSQL/8.4/bin"
            --new-bindir "C:/Program Files/PostgreSQL/9.0/bin"

    При запуске pg_upgrade проверит два кластера на совместимость и, если всё в порядке, выполнит обновление. Также возможно запустить pg_upgrade --check, чтобы ограничиться только проверками (при этом старый сервер может продолжать работать). Команда pg_upgrade --check также сообщит, какие коррективы вам нужно будет внести вручную после обновления. Если вы планируете использовать режим ссылок на данные, укажите вместе с --check параметр --link, чтобы были проведены специальные проверки для этого режима. Программе pg_upgrade требуются права на запись в текущий каталог.

    Очевидно, никто не должен обращаться к кластерам в процессе обновления. Программа pg_upgrade по умолчанию запускает серверы с портом 50432, чтобы не допустить нежелательных клиентских подключений. В процессе обновления оба кластера могут использовать один номер порта, так как они не будут работать одновременно. Однако для проверки старого работающего сервера новый порт должен отличаться от старого.

    Если при восстановлении схемы базы данных происходит ошибка, pg_upgrade завершает свою работу и вы должны вернуться к старому кластеру, как описывается ниже в Шаге 14. Прежде чем попробовать pg_upgrade ещё раз, вы должны внести коррективы в старом кластере, чтобы pg_upgrade могла успешно восстановить схему. Если проблема возникла в дополнительном модуле, может потребоваться удалить этот модуль в старом кластере, а затем установить его в новом после обновления (предполагается, что этот модуль не хранит пользовательские данные).

  10. Восстановить pg_hba.conf

    Если вы изменяли pg_hba.conf, восстановите его исходное состояние. Также может потребоваться скорректировать другие файлы конфигурации в новом кластере, чтобы они соответствовали старому, например postgresql.conf.

  11. Действия после обновления

    Если после обновления требуются какие-то дополнительные действия, программа pg_upgrade выдаст предупреждения об этом по завершении работы. Она также сгенерирует файлы скриптов, которые должны запускаться администратором. Эти скрипты будут подключаться к каждой базе данных, требующей дополнительных операций. Каждый такой скрипт следует выполнять командой:

    psql --username postgres --file script.sql postgres

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

    Предостережение

    Обычно к таблицам, задействованным в перестраивающих базу скриптах, опасно обращаться, пока эти скрипты не сделают свою работу; при этом можно получить некорректный результат или плохую производительность. К таблицам, не задействованным в таких скриптах, можно обращаться немедленно.

  12. Статистика

    Так как статистика оптимизатора не передаётся в процессе работы pg_upgrade, вы получите указание запустить соответствующую команду для воссоздания этой информации после обновления. Возможно, для этого вам понадобится установить параметры подключения к новому кластеру.

  13. Удалить старый кластер

    Если вы удовлетворены результатами обновления, вы можете удалить каталоги данных старого кластера, запустив скрипт, упомянутый в выводе pg_upgrade после обновления. (Автоматическое удаление невозможно, если в старом каталоге данных находятся дополнительные табличные пространства.) Также вы можете удалить каталоги старой инсталляции (например, bin, share).

  14. Возврат к старому кластеру

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

    • Если pg_upgrade запускалась с ключом --check, никакие изменения в старом кластере не производились и его использование можно продолжить в любой момент.

    • Если pg_upgrade запускалась с параметром --link, файлы данных будут разделяться старым и новым кластером. Если новый кластер уже запускался, он произвёл запись в эти файлы, так что использовать старый кластер небезопасно.

    • Если pg_upgrade запускалась без ключа --link или новый сервер не запускался, старый кластер не претерпел никаких изменений, за исключением того, что в режиме ссылки на данные к имени $PGDATA/global/pg_control было добавлено окончание .old. Чтобы продолжить использование старого кластера, можно просто убрать окончание .old из имени файла $PGDATA/global/pg_control; после этого старый кластер можно будет перезапустить.

Замечания

pg_upgrade не поддерживает обновление баз данных, содержащих следующие ссылающиеся на OID системные типы данных reg*: regproc, regprocedure, regoper, regoperator, regconfig и regdictionary. (Обновление regtype возможно.)

Программа pg_upgrade сообщит обо всех актуальных для вашей инсталляции ошибках и потребностях перестроения или переиндексации базы; при этом будут созданы завершающие обновление скрипты, перестраивающие таблицы или индексы. Если вы попытаетесь автоматизировать обновление множества серверов, вы обнаружите, что для кластеров с одинаковыми схемами баз данных потребуются одинаковые действия после обновления; это объясняется тем, что эти действия диктуются схемой базы данных, а не данными пользователей.

Для проверки развёртывания новой версии создайте копию только схемы старого кластера, наполните этот кластер фиктивными данными, и попробуйте обновить его.

Если вы производите обновление кластера PostgreSQL версии до 9.2, в которой используется каталог только с файлами конфигурации, вы должны передать расположение собственно каталога с данными программе pg_upgrade, а расположение каталога конфигурации передать серверу, например -d /каталог-данных -o '-D /каталог-конфигурации'.

Если вы используете старый сервер версии до 9.1, работающий с нестандартным каталогом доменных сокетов Unix, либо его стандартное расположение отличается от принятого в новой версии, задайте в PGHOST расположение сокета старого сервера. (К Windows это не относится.)

Резервные серверы, принимающие журналы (см. Раздел 25.2), обновить таким способом нельзя, так как они должны допускать запись. Поэтому проще всего будет обновить ведущий сервер, а затем перестроить резервные, применив rsync. Вы можете запустить rsync, когда ведущий будет отключён, либо в ходе восстановления базовой копии (см. Подраздел 24.3.2), что приведёт к перезаписи старого резервного кластера.

Если вы хотите использовать режим ссылок на данные, но не хотите каких-либо изменений в старом кластере при запуске нового, сделайте копию старого кластера и обновите его в этом режиме. Чтобы получить рабочую копию старого кластера, воспользуйтесь командой rsync и создайте предварительную копию кластера при работающем сервере, а затем отключите старый сервер и ещё раз запустите rsync, чтобы привести эту копию в согласованное состояние. При этом вы можете исключить некоторые файлы, например postmaster.pid, как описано в Подразделе 24.3.3. Если ваша файловая система поддерживает снимки файловой системы или копирование при записи, вы можете воспользоваться этим для создания копии старого кластера и табличных пространств; при этом важно, чтобы такие снимки и копии файлов создавались одномоментно или когда сервер баз данных отключён.

Ограничения при обновлении с PostgreSQL 8.3

При обновлении PostgreSQL с версии 8.3 накладываются ограничения, отсутствующие при обновлении с более новых выпусков PostgreSQL. Например, pg_upgrade не сможет выполнить обновление с версии 8.3, если пользовательская колонка:

  • имеет тип данных tsquery

  • имеет тип данных name и это не первая колонка

Вы должны удалить все такие колонки и обновить (воссоздать) их вручную.

pg_upgrade не будет работать, если в базе данных установлен дополнительный модуль ltree.

pg_upgrade потребует перестроить таблицу, если:

  • пользовательская колонка имеет тип данных tsvector

pg_upgrade потребует произвести переиндексацию, если:

  • тип индекса — хеш или GIN

  • индекс использует bpchar_pattern_ops

Кроме того, после PostgreSQL 8.3 у типа даты/времени формат хранения поменялся на целочисленный. Программа pg_upgrade перед обновлением проверит, совпадает ли формат хранения в старом и новом кластере. Поэтому убедитесь в том, что новый кластер был собран с флагом configure --disable-integer-datetimes.

Пользователям Windows следует заметить, что графический инсталлятор и инсталлятор MSI определяют целочисленный формат дат/времени по-разному. Поэтому только поставленную графическим инсталлятором версию 8.3 можно обновить до версии 8.4 или более поздней. Версию, поставленную инсталлятором MSI, обновить до новой версии, устанавливаемой графическим инсталлятором, нельзя.