E.5. Выпуск 9.6.12

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

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

E.5.1. Миграция на версию 9.6.12

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

Однако если вы обновляете сервер с более ранней версии, чем 9.6.9, см. Раздел E.8.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Вместо презумпции герметичности функции сравнения, которую вызывают функции 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 не допускается в режиме горячего резерва, но возможность выполнения этой пустой операции упрощает логику сброса состояния для клиентов.

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

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

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

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

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

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

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

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

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

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

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

  • В запросе аутентификации 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 выводились некорректно, следствием чего были ошибки синтаксиса в документе или отображение некорректных символов.

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

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

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

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

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

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

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

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

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

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

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

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

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