E.51. Выпуск 10.7
Дата выпуска: 2019-02-14
В этот выпуск вошли различные исправления, внесённые после версии 10.6. За информацией о нововведениях версии 10 обратитесь к Разделу E.58.
E.51.1. Миграция на версию 10.7
Если используется версия 10.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 10.6, см. также Раздел E.52.
E.51.2. Изменения
- Во избежание повреждения данных вместо повторения вызова - fsync()при ошибке теперь выполняется аварийный останов (Крейг Рингер, Томас Манро)- В ряде популярных операционных систем ядро сбрасывает буферы данных, не имея возможности сохранить их на диске, и выдаёт ошибку в - fsync(). При этом повторный вызов- fsync()будет успешным, но на самом деле данные уже потеряны, так что продолжение работы сервера чревато повреждением базы. В случае же аварийного останова мы можем воспроизвести данные из WAL, где в такой ситуации может остаться единственная копия данных. Хотя это, определённо, неэффективное и не очень красивое поведение, других вариантов нет, а подобные ситуации, к счастью, крайне редки.- Для управления этим поведением был добавлен новый параметр сервера data_sync_retry; если вы уверены, что ядро вашей ОС не теряет незаписанные буферы данных при описанном сценарии, вы можете задать для - data_sync_retryзначение- onи восстановить прежнее поведение.
- Отныне в документацию каждой версии включаются только замечания к выпускам, относящимся к данной основной версии, а не к выпускам данной и всех предшествующих версий, как было раньше (Том Лейн) - Дублирование информации, присущее прежней схеме, вышло за допустимые рамки. Теперь мы не дублируем замечания к выпускам в каждой версии, но планируем поддерживать их полный архив на сайте нашего проекта. 
- Обеспечение контроля ограничений - NOT NULLв секциях секционированной таблицы (Альваро Эррера, Амит Ланготе)
- Использование безопасного уровня блокировки таблицы при отсоединении секции (Альваро Эррера) - Ранее блокировка была недостаточно сильной и позволяла параллельно производить с таблицей DDL-операции, что могло привести к нежелательным результатам. 
- Устранение проблем с применением - ON COMMIT DROPи- ON COMMIT DELETE ROWSк секционированным таблицам и таблицам с потомками в иерархии наследования (Микаэль Пакье)
- Недопущение выполнения - COPY FREEZEс секционированными таблицами (Дэвид Роули)- Принципиально данный режим должен поддерживаться, но реализация может потребовать слишком сложных изменений, переносить которые в ранние версии рискованно. 
- Предупреждение возможных взаимоблокировок при попытке блокирования множества страниц в буфере (Нишант Фну) 
- Предупреждение взаимоблокировки процесса очистки GIN с параллельными операциями добавления в индекс (Александр Коротков, Андрей Бородин, Питер Гейган) - Вследствие этого изменения пришлось частично отказаться от оптимизации, добавленной в версии 10.0 с целью сократить число индексных страниц, блокируемых при удалении страницы списка идентификаторов GIN. Было обнаружено, что она приводит к взаимоблокировкам, так что мы отключили её на время разбирательства. 
- Недопущение взаимоблокировки запросов на сервере горячего резерва с воспроизведением операций удаления страниц индекса GIN (Александр Коротков) 
- Устранение возможности сбоев при логической репликации в случае использования индексов с выражениями или предикатами (Питер Эйзентраут) 
- Исключение бесполезного и дорогостоящего логического декодирования данных TOAST при перезаписи таблицы (Томаш Вондра) 
- Исправление логики остановки подмножества передатчиков WAL при включении синхронной репликации (Пол Гуо, Микаэль Пакье) 
- Устранение возможности сохранения некорректного значения идентификатора реплики в записи WAL об удалении кортежа (Стас Кельвич) 
- Предотвращение некорректного применения оптимизации с пропуском WAL во время выполнения - COPYв представление или стороннюю таблицу (Амит Ланготе, Микаэль Пакье)
- Повышение приоритета файлов истории 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 пытались вывести ошибку (Том Лейн) 
- Игнорирование ошибок - 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без версии.
- Добавление поддержки новых переменных - PG_CFLAGS,- PG_CXXFLAGSи- PG_LDFLAGSв Makefile для pgxs (Кристоф Берг)- Это упрощает организацию нестандартных процессов сборки расширений. 
- Исправление написанных на Perl скриптов сборки, чтобы они не полагались на присутствие элемента « - .» в пути поиска, так как в последних версиях Perl он отсутствует (Эндрю Дунстан)
- Устранение проблем с разбором параметров командной строки в OpenBSD (Том Лейн) 
- Перемещение вызова - set_rel_pathlist_hook, чтобы расширения могли использовать его для передачи частичных путей при выполнении параллельных запросов (КайГай Кохэй)- Ожидается, что это никак не повлияет на существующие сценарии использования. 
- Переход в названиях функций поддержки red-black tree (красно-чёрного дерева) от префикса - rbк- rbt(Том Лейн)- Это позволяет избежать конфликта имён с функциями Ruby, нарушающего работу PL/Ruby. Хочется надеяться, что в результате не пострадают другие расширения. 
- Обновление данных часовых поясов до версии tzdata 2018i, включающее изменения правил перехода на летнее время в Казахстане, Метлакатле и на Сан-Томе и Принсипи. Часовой пояс Кызылорды в Казахстане разделился на два, при этом появился новый пояс Asia/Qostanay (Азия/Костанай), а в некоторых областях смещение UTC не изменилось. Также скорректированы исторические данные для Гонконга и многочисленных тихоокеанских островов.