E.53. Выпуск 11.2

Дата выпуска: 2019-02-14

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

E.53.1. Миграция на версию 11.2

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

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

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

  • Во избежание повреждения данных вместо повторения вызова fsync() при ошибке теперь выполняется аварийный останов (Крейг Рингер, Томас Манро)

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

    Для управления этим поведением был добавлен новый параметр сервера data_sync_retry; если вы уверены, что ядро вашей ОС не теряет незаписанные буферы данных при описанном сценарии, вы можете задать для data_sync_retry значение on и восстановить прежнее поведение.

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

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

  • Исправление поведения уникальных индексов, содержащих неключевые столбцы (INCLUDE), в секционированных таблицах (Альваро Эррера)

    В таких индексах условие уникальности не проверялось должным образом.

  • Обеспечение контроля ограничений NOT NULL в секциях секционированной таблицы (Альваро Эррера, Амит Ланготе)

  • Корректное изменение свойств ограничений секционированной таблицы в каталоге при отсоединении её секций (Амит Ланготе, Альваро Эррера)

    Ранее поле pg_constraint.conislocal для таких ограничений могло сохранять неверное значение false, что не позволяло затем это ограничение удалить. Эта проблема устранится после выгрузки/восстановления данных или pg_upgrade, но при необходимости данное поле можно изменить и вручную.

  • Корректное создание и удаление триггеров, обеспечивающих целостность внешнего ключа, при подключении и отключении секции в секционированной таблице с ограничением внешнего ключа (Амит Ланготе, Альваро Эррера)

  • Предотвращение создания повторяющихся ограничений внешнего ключа в секционированных таблицах (Альваро Эррера)

  • При создании индекса с указанием ONLY в секционируемой таблице, которая пока ещё не содержит секций, он должен сразу считаться проверенным (Альваро Эррера)

    В противном случае нет никакой возможности сделать его проверенным.

  • Использование безопасного уровня блокировки таблицы при отсоединении секции (Альваро Эррера)

    Ранее блокировка была недостаточно сильной и позволяла параллельно производить с таблицей DDL-операции, что могло привести к нежелательным результатам.

  • Устранение проблем с применением ON COMMIT DROP и ON COMMIT DELETE ROWS к секционированным таблицам и таблицам с потомками в иерархии наследования (Микаэль Пакье)

  • Недопущение выполнения COPY FREEZE с секционированными таблицами (Дэвид Роули)

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

  • Устранение возможности повреждения индекса, содержащего столбец с «быстрым значением по умолчанию» (то есть, добавленный командой ALTER TABLE ADD COLUMN с постоянным значением по умолчанию, отличным от NULL, когда таблица уже содержала какие-то строки) (Андрес Фройнд)

  • Корректное изменение «быстрых значений по умолчанию» при выполнении ALTER TABLE ... ALTER COLUMN TYPE (Эндрю Дунстан)

  • Предупреждение возможных взаимоблокировок при попытке блокирования множества страниц в буфере (Нишант Фну)

  • Предупреждение взаимоблокировки процесса очистки GIN с параллельными операциями добавления в индекс (Александр Коротков, Андрей Бородин, Питер Гейган)

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

  • Недопущение взаимоблокировки запросов на сервере горячего резерва с воспроизведением операций удаления страниц индекса GIN (Александр Коротков)

  • Устранение возможности сбоев при логической репликации в случае использования индексов с выражениями или предикатами (Питер Эйзентраут)

  • Исключение бесполезного и дорогостоящего логического декодирования данных TOAST при перезаписи таблицы (Томаш Вондра)

  • Исправление логики остановки подмножества передатчиков WAL при включении синхронной репликации (Пол Гуо, Микаэль Пакье)

  • Устранение возможности сохранения некорректного значения идентификатора реплики в записи WAL об удалении кортежа (Стас Кельвич)

  • Предотвращение некорректного применения оптимизации с пропуском WAL во время выполнения COPY в представление или стороннюю таблицу (Амит Ланготе, Микаэль Пакье)

  • Повышение приоритета файлов истории WAL по отношению к другим файлам данных WAL при выборе архиватором очередных файлов для архивации (Дэвид Стил)

  • Устранение возможности сбоя в UPDATE с множественным SET и вложенным SELECT в качестве источника данных (Том Лейн)

  • Устранение сбоя при поступлении нуля строк в json[b]_populate_recordset() и json[b]_to_recordset() (Том Лейн)

  • Устранение сбоя в случае, когда libxml2 возвращает null вместо сообщения об ошибке (Серхио Конде Гомес)

  • Исправление ошибочного кода JIT-обработки кортежей для таблиц, содержащих большое количество столбцов (порядка 800 и более) (Андрес Фройнд)

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

  • Устранение ложных ошибок разбора, связанных с группировкой, которые были вызваны несогласованной обработкой присваиваний с правилами сортировки (Эндрю Гирт)

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

  • Исправление разбора выражений, зависящих от правил сортировки, в аргументах оператора CALL (Питер Эйзентраут)

  • Обеспечение корректной очистки после выявления ошибки в списке аргументов оператора CALL (Том Лейн)

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

    Собственно утечку информации из функций сравнения btree обычно сложно организовать, но в принципе это возможно.

  • Исправление некорректного планирования запросов с вложенными циклами над и под узлом Gather в плане (Том Лейн)

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

  • Исправлено некорректное планирование запросов, в которых подзапрос LATERAL должен выполняться при сканировании сторонней таблицы (Том Лейн)

  • Исправлена ошибка планировщика, проявлявшаяся, когда первый столбец сравниваемых строк соответствует столбцу индекса, а последующие нет, и при этом индекс содержит неключевые столбцы (Том Лейн)

  • Исправлена ошибка при оценке стоимости соединения слиянием, проявляющаяся в особом случае (Том Лейн)

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

  • Предотвращение увеличения времени планирования порядка O(N^2) с запросами, содержащими тысячи индексируемых выражений (Том Лейн)

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

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

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

  • Операция TRUNCATE теперь игнорирует дочерние таблицы, являющиеся временными таблицами других сеансов (Амит Ланготе, Микаэль Пакье)

    Таким образом поведение TRUNCATE теперь соответствует поведению других команд. Ранее в таких случаях обычно происходил сбой.

  • Исправление обновления счётчиков статистики в ходе TRUNCATE для нужной таблицы (Том Лейн)

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

  • Корректная обработка ALTER TABLE ONLY ADD COLUMN IF NOT EXISTS (Грег Старк)

  • Поддержка команды UNLISTEN в режиме горячего резерва (Шэй Роджански)

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

  • Исправление зависимостей ролей в списках прав для схем и типов данных (Том Лейн)

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

  • Недопущение использования временной схемы сеанса в двухфазных транзакциях (Микаэль Пакье)

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

  • Обеспечение корректного сброса кеша отношений после добавления или удаления ограничений внешнего ключа (Альваро Эррера)

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

  • Обеспечение должного обновления кешей отношений после переименования ограничений (Амит Ланготе)

  • Исправление воспроизведения операций микроочистки индекса GiST, устраняющее возможность получения несогласованного состояния в параллельных запросах на серверах горячего резерва (Александр Коротков)

  • Недопущение досрочной утилизации пустых страниц индекса GIN, чреватой ошибками при параллельном поиске по индексу (Андрей Бородин, Александр Коротков)

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

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

  • Исправлен разбор параметра ldapserver, который содержит разделённый пробелами список имён серверов в записях типа LDAP в pg_hba.conf (Томас Манро)

  • В запросе аутентификации PAM значение PAM_RHOST не должно задаваться для соединений, установленных через сокет Unix (Томас Манро)

    Ранее эта переменная принимала значение [local], которое как минимум было бесполезным, так как в ней ожидается имя узла.

  • Недопущение в client_min_messages более высоких уровней, чем ERROR (Джона Харрис, Том Лейн)

    Ранее в этой переменной можно было установить уровень FATAL или PANIC, в результате чего подавлялась передача клиенту обычных сообщений об ошибках. Однако это противоречит гарантиям, заложенным в протоколе обмена данными PostgreSQL, и некоторые клиенты могут этого не понять. В уже выпущенных версиях исправление заключается в неявной подмене таких уровней значением ERROR, а начиная с версии 12, они просто не будут приниматься.

  • Переход в ecpglib к использованию функции uselocale() или _configthreadlocale() вместо setlocale() (Михаэль Мескес, Том Лейн)

    Так как функция setlocale() не является внутрипотоковой и может быть даже непотокобезопасной, предыдущая реализация вызывала проблемы в многопоточных приложениях на базе ecpg.

  • Исправление ошибочных результатов при получении числовых данных через область дескриптора SQLDA ecpg (Дайсукэ Хигути)

    Ранее значения с ведущими нулями копировались некорректно.

  • Исправление метакоманды psql \g назначение для операции COPY TO STDOUT (Даниэль Верите)

    Ранее параметр назначение игнорировался, и копируемые данные всегда попадали в текущий поток вывода.

  • Исправление обработки специальных символов для вывода psql в формате LaTeX (Том Лейн)

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

  • Замена алгоритма генерирования случайных чисел в pgbench на полностью детерминированный и платформонезависимый в случае указания параметра --random-seed=N (Фабьен Коэльо, Том Лейн)

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

  • Исправление выбора игнорируемых временных файлов в pg_basebackup и pg_verify_checksums (Михаэль Банк, Микаэль Пакье)

  • Исправление обработки программой pg_dump материализованных представлений с неявными зависимостями от первичных ключей (Том Лейн)

    В результате этой ошибки могли неправильно помечаться записи таких представлений в архиве, что приводило к безобидным предупреждениям «archive items not in correct section order» (в последовательности элементов архива нарушен порядок разделов); и, что более значимо, могли некорректно работать варианты избирательного восстановления, например с указанием таких меток в --section.

  • Включение в вывод pg_dump команд ALTER INDEX SET STATISTICS (Микаэль Пакье)

    Когда появилась возможность добавлять ориентиры статистики к выражениям индекса, мы забыли ознакомить с ней pg_dump, так что эта метаинформация терялась при выгрузке/восстановлении.

  • Исправление в pg_dump выгрузки таблиц с OID (Питер Эйзентраут)

    Ранее предложение WITH OIDS опускалось, если оно должно было добавляться к первой таблице, подлежащей выгрузке.

  • Устранение сбоя, имевшего место на некоторых платформах при обращении по нулевому указателю, когда pg_dump или pg_restore пытались вывести ошибку (Том Лейн)

  • Предупреждение ложных сообщений о разрушении индекса, которые выдавал contrib/amcheck, встречая внутренне сжатые данные (Питер Гейган)

  • Игнорирование ошибок SIGPIPE в случаях, когда COPY FROM PROGRAM прекращает читать вывод программы досрочно (Том Лейн)

    Такие случаи невозможны на практике именно с COPY, но могут иметь место при использовании contrib/file_fdw.

  • Исправление в contrib/hstore вычисления хеша для пустых значений hstore, созданных в версии 8.4 или более ранней (Эндрю Гирт)

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

  • Устранение сбоев и ускорение операций при обработке данных большого объёма операторами класса gist__int_ops модуля contrib/intarray (Эндрю Гирт)

  • Установление в скрипте configure следующего порядка поиска python: собственно python, затем python3, и только потом python2 (Питер Эйзентраут)

    Это позволяет конфигурировать PL/Python, не задавая явно переменную окружения PYTHON на тех платформах, где теперь отсутствует программа python без версии.

  • Включение заголовочных файлов, относящихся к JIT, в набор устанавливаемых заголовочных файлов (Дональд Донг)

  • Добавление поддержки новых переменных PG_CFLAGS, PG_CXXFLAGS и PG_LDFLAGS в Makefile для pgxs (Кристоф Берг)

    Это упрощает организацию нестандартных процессов сборки расширений.

  • Исправление написанных на Perl скриптов сборки, чтобы они не полагались на присутствие элемента «.» в пути поиска, так как в последних версиях Perl он отсутствует (Эндрю Дунстан)

  • Устранение проблем с разбором параметров командной строки в OpenBSD (Том Лейн)

  • Перемещение вызова set_rel_pathlist_hook, чтобы расширения могли использовать его для передачи частичных путей при выполнении параллельных запросов (КайГай Кохэй)

    Ожидается, что это никак не повлияет на существующие сценарии использования.

  • Обновление данных часовых поясов до версии tzdata 2018i, включающее изменения правил перехода на летнее время в Казахстане, Метлакатле и на Сан-Томе и Принсипи. Часовой пояс Кызылорды в Казахстане разделился на два, при этом появился новый пояс Asia/Qostanay (Азия/Костанай), а в некоторых областях смещение UTC не изменилось. Также скорректированы исторические данные для Гонконга и многочисленных тихоокеанских островов.