E.21. Выпуск 9.5.5

Дата выпуска: 2016-10-27

В этот выпуск вошли различные исправления, внесённые после версии 9.5.4. За информацией о нововведениях версии 9.5 обратитесь к Разделу E.26.

E.21.1. Миграция на версию 9.5.5

Если используется версия 9.5.X, выгрузка/восстановление базы не требуется.

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

Также, если вы обновляете сервер с более ранней версии, чем 9.5.2, см. Раздел E.24.

E.21.2. Изменения

  • Корректировка записи в WAL отметки об очистке карт свободного пространства и видимости (Паван Деоласи, Хейкки Линнакангас)

    Ранее могло получаться так, что эти файлы не восстанавливались корректно при восстановлении после сбоя или оказывались неправильными на резервном сервере. Обращение к недействительному содержимому карты свободного пространства могло повлечь попытки использовать страницы, которые были стёрты из самого отношения, что обычно приводило к ошибкам типа «не удалось прочитать блок XXX: прочитано только 0 из 8192 байт». Также были возможны нарушения контрольных сумм в карте видимости, при включённом механизме контрольных сумм.

    Процедуры для определения наличия проблемы и её исправления рассматриваются в https://wiki.postgresql.org/wiki/Free_Space_Map_Problems.

  • Исправление некорректного создания в WAL записей, относящихся к индексам GIN, на машинах с порядком байт от старшего (Том Лейн)

    Типичным симптомом данной проблемы были ошибки «unexpected GIN leaf action» (неожиданное действие на уровне листьев GIN) при воспроизведении WAL.

  • Исправление команды SELECT FOR UPDATE/SHARE, чтобы кортежи, изменённые впоследствии прерванной транзакцией, блокировались корректно (Альваро Эррера)

    Начиная с версии 9.5, команда SELECT иногда могла вообще не выдавать такие кортежи. Подтверждений того, что это могло иметь место в предыдущих версиях, не было, но теоретически при одновременных изменениях это возможно.

  • Исправление перепроверок EvalPlanQual в ситуациях со сканированием CTE (Том Лейн)

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

  • Исправлено удаление спекулятивно добавленных кортежей TOAST при выходе из INSERT ... ON CONFLICT (Оскари Сааренмаа)

    В условиях гонки, когда две транзакции пытаются вставить конфликтующие кортежи, в проигравшей транзакции происходила ошибка «попытка удаления невидимого кортежа», если при добавлении вставлялись поля TOAST.

  • Предотвращение ошибок сериализации при операции добавлении данных, конфликтующей с собой же, в INSERT ... ON CONFLICT (Томас Манро, Питер Гейган)

  • Исправление некорректного повторения предыдущих результатов агрегирования по хешу в подзапросе (Эндрю Гирт)

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

  • Ликвидирована утечка памяти на протяжении запроса в массовой команде UPDATE для таблицы с индексом PRIMARY KEY или REPLICA IDENTITY (Том Лейн)

  • Исправление COPY со списком имён столбцов из таблицы, в которой включена защита на уровне строк (Адам Брайтвелл)

  • Исправление EXPLAIN, чтобы она выдавала корректный XML, когда параметр track_io_timing включён (Маркус Винанд)

    Ранее вывод в формате XML содержал синтаксически некорректные теги, как например <I/O-Read-Time>. Сейчас выдаётся такой тег: <I-O-Read-Time>.

  • Подавление вывода нулей для неизмеренного времени в EXPLAIN (Максим Милютин)

    При определённом сочетании параметров команда EXPLAIN выдавала нулевые значения для того времени, которое на самом деле даже не замеряется при этих параметрах. Мы придерживаемся политики не выдавать такие поля в выводе EXPLAIN, так что нужно обеспечить согласованность во всех случаях.

  • Исправление обновления статистики при TRUNCATE в подготовленной транзакции (Стас Кельвич)

  • Исправление длительности тайм-аута, установленного для ожидания командой VACUUM исключительной блокировки, чтобы она могла опустошить таблицу (Саймон Риггс)

    Длительность таймаута должна была составлять 50 миллисекунд, но на самом деле это было лишь 50 микросекунд, в результате чего команда VACUUM оставляла попытку опустошить таблицу гораздо раньше, чем планировалось. Теперь устанавливается запланированное значение.

  • Исправление ошибок при объединении наследуемых ограничений CHECK в процессе создания или изменения структуры таблицы (Том Лейн, Амит Ланготе)

    Теперь одинаковые ограничения CHECK могут добавляться в родительскую и дочернюю таблицу в любом порядке. С другой стороны, слияние проверенного ограничения из родительской таблицы с непроверенным (NOT VALID) ограничением в дочерней не должно допускаться. Подобным образом, не должно допускаться слияние дочернего ненаследуемого (NO INHERIT) ограничения с наследуемым.

  • Вывод разумного значения в pg_settings.unit для параметров min_wal_size и max_wal_size (Том Лейн)

  • Ликвидация искусственных ограничений на значения, принимаемые функциями numeric_in() и numeric_recv() (Том Лейн)

    Мы принимаем числовые значения, не превышающие предела хранения (больше 1e100000), поэтому кажется довольно неразумным, что numeric_in() не принимала в научной записи экспоненты больше 1000. Также нет смысла не принимать в numeric_recv() более 1000 цифр во вводимом значении.

  • Предотвращение очень маловероятного повреждения данных в результате проверки видимости кортежа без удержания блокировки буфера (Томас Манро, Питер Гейган, Том Лейн)

  • Сохранение времени фиксирования транзакций после перезагрузки сервера (Жюльен Руо, Крейг Рингер)

    При включённом параметре track_commit_timestamp старые метки времени фиксации становились недоступными после полной перезагрузки сервера.

  • Исправление логического декодирования WAL в случаях, когда вывод WAL из подтранзакции оказывался слишком большим и вымещался на диск (Андрес Фройнд)

  • Исправление возможной ошибки сортировки при прекращении использования сокращённых ключей (Питер Гейган)

    В худшем случае это могло приводить к повреждению индекса-B-дерева, что потребует перестроить его с помощью команды REINDEX. Но, как нам представляется, такие ситуации очень редки.

  • Ликвидация утечки дескриптора файла, имевшей место при опустошении временного отношения размером более 1 Гбайта (Андрес Фройнд)

  • Запрещение запуска самостоятельного обслуживающего процесса при включённом режиме standby_mode (Микаэль Пакье)

    Такой режим не будет ничем полезен, так как никакой процесс-приёмник WAL не сможет получать данные WAL; и это может привести к некорректному поведению кода, который не рассчитан на такую ситуацию.

  • Исправление инициализации состояния слота репликации при повторном использовании слота (Микаэль Пакье)

    В результате того, что не все поля слота сбрасывались, команда VACUUM могла не удалять «мёртвые» кортежи.

  • Округление размера запроса разделяемой памяти до числа, кратного размеру огромной страницы, когда огромные страницы используются в Linux (Том Лейн)

    Это позволяет избежать возможных сбоев в munmap() в системах с нетипичными размерами огромных страниц. За исключением случаев краха, эти сбои проявлялись только в сообщениях в журнале.

  • Выбор более случайного значения для идентификатора управляющего сегмента динамической разделяемой памяти (Роберт Хаас, Том Лейн)

    Ранее каждый раз выбиралось одно и то же значение, потому что оно получалось из random(), но srandom() к этому моменту ещё не вызывалась. Это относительно безвредно, однако планировалось другое поведение.

  • В Windows нужно повторять попытку создания управляющего сегмента динамической разделяемой памяти после ошибки «нет доступа» (Кётаро Хоригути, Амит Капила)

    Иногда Windows выдаёт ошибку ERROR_ACCESS_DENIED вместо ERROR_ALREADY_EXISTS, когда такой сегмент уже существует. Получая такую ошибку, главный процесс не мог запуститься, считая, что столкнулся с неисправимой ошибкой.

  • Исправление в PL/pgSQL поведения с параметрами и локальными переменными типов int2vector и oidvector (Том Лейн)

  • Не пытаться разделять контекст SSL между несколькими подключениями в libpq (Хейкки Линнакангас)

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

  • Предотвращение утечек памяти в особых случаях в libpq (Том Лейн)

    Поступило сообщение об утечке в процессе PQreset(), но были возможны проявления и в связанных случаях.

  • Согласование поведения параметров --help и --version программы ecpg со всеми остальными нашими программами (Харибабу Комми)

  • Исправление расчёта средней задержки в pgbench (Фабьен Коэльо)

    Этот расчёт был неверным при наличии в скрипте команд \sleep или когда длительность теста ограничивалась числом транзакций, а не общим временем.

  • В pg_upgrade проверка загружаемости библиотек должна производиться по порядку имён (Том Лейн)

    Это обходное решение проблемы зависимостей между расширениями, образуемых связями модулей трансформации языков с базовыми модулями самих языков и типов данных.

  • Программа pg_dump никогда не должна выгружать функции-конструкторы диапазонов (Том Лейн)

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

  • При запуске pg_dump с ключом -C должно подавляться предложение TABLESPACE команды CREATE DATABASE, если указан ключ --no-tablespaces (Том Лейн)

  • Исправление работы pg_receivexlog с ключом --synchronous без слотов (Габриэль Бартолини)

  • Недопущение одновременного указания аргументов --source-server и --source-target для pg_rewind (Михаэль Банк)

  • Программа pg_rewind должна отключать synchronous_commit в своём сеансе на исходном сервере (Михаэль Банк, Микаэль Пакье)

    При этом pg_rewind сможет работать, даже когда на исходном сервере настроена синхронная репликация, но она по какой-то причине не функционирует.

  • В pg_xlogdump нужно повторять попытку открыть новый сегмент WAL, когда используется параметр --follow (Магнус Хагандер)

    Это позволяет справиться с возможной задержкой при создании сервером следующего сегмента.

  • Исправление программы pg_xlogdump, чтобы она корректно работала с файлом WAL, начинающимся с записи продолжения, располагающейся на нескольких страницах (Паван Деоласи)

  • Исправление contrib/pg_buffercache для работы со значением shared_buffers, превышающим 256 Гбайт (КайГай Кохэй)

  • Исправление скрипта contrib/intarray/bench/bench.pl, чтобы он выводил результаты команды EXPLAIN, которую он выполняет при запуске с ключом -e (Даниэль Густафссон)

  • Поддержка OpenSSL 1.1.0 (Хейкки Линнакангас)

  • Внедрение инфраструктуры тестирования TAP, чтобы её можно было применять для тестирования расширений (Крейг Рингер)

    Когда PostgreSQL конфигурируется с параметром --enable-tap-tests, теперь команда «make install» будет устанавливать файлы поддержки Perl для тестирования TAP туда, где PGXS сможет найти их. Благодаря этому внешние расширения смогут использовать $(prove_check) без дополнительных проверок.

  • В сборках MSVC программа pg_recvlogical включена в клиентский набор (МауМау)

  • Корректировка сопоставления часовых поясов в Windows, чтобы сервер корректно распознавал имена часовых поясов, появившиеся в последних версиях Windows (Микаэль Пакье)

  • Предупреждение ошибок при использовании устаревших аббревиатур динамических часовых поясов (Том Лейн)

    Если аббревиатуре динамического часового пояса не соответствует запись в данных часового пояса, считать её равнозначной имени часового пояса. Это предупреждает неожиданные ошибки, когда IANA удаляет аббревиатуры из своей базы данных часовых поясов, что произошло в выпуске tzdata 2016f и, вполне вероятно, повторится в будущем. Вследствие этого не только не распознавались отдельные аббревиатуры; при любом расхождении происходил сбой в представлении pg_timezone_abbrevs.

  • Обновление данных часовых поясов до версии tzdata 2016h, включающее изменение правил перехода на летнее время в Палестине и Турции, а также исторические изменения для Турции и некоторых регионов России. Переход к числовым аббревиатурам для некоторых часовых поясов в Антарктике, бывшем Советском Союзе и на Шри-Ланке.

    Ранее в базе данных часовых поясов IANA предоставлялись текстовые аббревиатуры для всех часовых поясов и иногда при этом указывались аббревиатуры, которые практически не употреблялись местным населением. Сейчас происходит процесс ухода от этой практики в пользу использования числовых смещений UTC в тех часовых поясах, где нет никаких свидетельств реального использования английской аббревиатуры. Как минимум на данном этапе, PostgreSQL продолжит принимать подобные удалённые аббревиатуры при вводе дат/времени. Но они не будут видны при просмотре представления pg_timezone_names и не будут выводиться с датами/временем.

    Начиная с этого выпуска, аббревиатура AMT более не считается занятой часовым поясом Армении. Поэтому мы изменили значение этой аббревиатуры по умолчанию, чтобы она обозначала Амазонское время (Amazon Time), так что теперь она означает UTC-4, а не UTC+4.