E.34. Выпуск 10.16
Дата выпуска: 2021-02-11
В этот выпуск вошли различные исправления, внесённые после версии 10.15. За информацией о нововведениях версии 10 обратитесь к Разделу E.50.
E.34.1. Миграция на версию 10.16
Если используется версия 10.X, выгрузка/восстановление базы не требуется.
Однако обратите внимание на первый пункт в списке изменений, описывающий случаи, в которых рекомендуется перестроить индексы после обновления версии.
Также, если вы обновляете сервер с более ранней версии, чем 10.11, см. Раздел E.39.
E.34.2. Изменения
Добавление в
CREATE INDEX CONCURRENTLY
ожидания завершения подготовленных транзакций (Андрей Бородин)На этапе, когда команда
CREATE INDEX CONCURRENTLY
ждёт завершения всех выполняющихся в это время транзакций, чтобы она могла увидеть добавленные ими строки, она с той же целью должна дожидаться завершения и всех подготовленных транзакций. В противном случае строки, добавленные подготовленными транзакциями, могут не попасть в новый индекс, вследствие чего запросы, использующие этот индекс, не будут их видеть. В инсталляциях, где включены подготовленные транзакции (max_prepared_transactions
> 0), рекомендуется перестроить все ранее построенные в неблокирующем режиме индексы, если их могла затронуть эта проблема.Недопущение ошибочных результатов при применении
WHERE CURRENT OF
к курсору, план выполнения которого содержит узел MergeAppend (Том Лейн)Такая конструкция не поддерживается (вообще говоря, курсор с
ORDER BY
не обязательно будет поддерживать простое изменение); ранее её не запрещалось использовать, но это было чревато незаметными ошибками.Устранение сбоя при применении
WHERE CURRENT OF
к курсору, план выполнения которого содержит нестандартный узел сканирования (Дэвид Гейер)Исправление обработки местозаполнителя, который вычисляется на некотором уровне соединения и используется только на этом же уровне (Том Лейн)
В результате данного упущения планировщик мог выдавать ошибки «failed to build any
N
-way joins» (не удалось построить никакиеN
-сторонние соединения).Проверка поддержки пометки/восстановления позиций индексными методами доступа (Эндрю Гирт)
Тем самым предупреждаются ошибки с сообщениями об отсутствии опорных функций, возникавшие в редких особых случаях.
Изменение параметров для решения проблемы нехватки слотов DSM при очень активном использовании параллельных запросов (Томас Манро)
Обеспечение корректной обработки в команде
ALTER DEFAULT PRIVILEGES
повторяющихся аргументов (Микаэль Пакье)Ранее в случае повторения имени роли или схемы в одной команде могли выдаваться ошибки «tuple already updated by self» (кортеж уже изменился сам собой) или нарушаться ограничения уникальности.
Осуществление сброса связанных с ACL кешей при изменениях в
pg_authid
(Ной Миш)Тем самым гарантируется, что решения, связанные с правами доступа, будут приниматься с учётом действия
ALTER ROLE ... [NO] INHERIT
.Предотвращение некорректной обработки неоднозначных предложений
CREATE TABLE LIKE
(Том Лейн)Предложение
LIKE
повторно рассматривается после создания новой таблицы, когда выполняется импорт индексов и т. п. Ранее при повторном анализе могла быть найдена другая таблица с тем же именем, что приводило к неожиданному поведению; например, это происходило при создании новой временной таблицы с тем же именем, что у исходной таблицы вLIKE
.Изменение порядка действий в
CREATE TABLE LIKE
, чтобы индексы копировались до создания ограничений внешнего ключа (Том Лейн)Теперь случай, когда ограничение внешнего ключа, объявленное на внешнем уровне
CREATE TABLE
и ссылающееся на саму таблицу, зависит от индекса, создаваемого предложениемLIKE
, обрабатывается корректно.Запрет выполнения
CREATE STATISTICS
с системными каталогами (Томаш Вондра)Недопущение преобразования наследуемой дочерней таблицы в представление (Том Лейн)
Обеспечение корректного освобождения дискового пространства, выделенного для удаляемого отношения, при фиксировании транзакции (Томас Манро)
Ранее, если удаляемое отношение занимало несколько сегментов по 1 ГБ, немедленно освобождался объём только первого. Файлы остальных сегментов просто удалялись, что не позволяло ядру освободить занимаемое ими место, пока эти файлы были открытыми в других обслуживающих процессах.
Исправление обработки многобайтовых символов, экранированных обратной косой чертой, в
COPY FROM
(Хейкки Линнакангас)Ранее многобайтовый символ, идущий после обратной косой черты, обрабатывался некорректно. Так, в некоторых клиентских кодировках часть многобайтового символа могла восприниматься как разделитель полей или как маркер конца данных.
Отказ от ненужного создания хеш-таблиц для исполнителя при выполнении
EXPLAIN
безANALYZE
(Алексей Баштанов)Устранение недавно привнесённых условий гонки при обработке очереди
LISTEN
/NOTIFY
(Том Лейн)Только что подключившийся к очереди процесс-приёмник уведомлений мог попытаться прочитать страницы SLRU, которые в этот момент обрезались, что могло привести к ошибке.
Указатель на хвост очереди мог получить значение, не соответствующее позиции ни одного из процессов, в результате чего логика очистки очереди фактически отключалась. Продолжающиеся вызовы
NOTIFY
затем приводили к появлению предупреждений о переполнении очереди, и в конце концов передача уведомлений полностью останавливалась до перезапуска сервера.Реализация поддержки всех возможных сочетаний типов JSON оператором конкатенации
jsonb
(Том Лейн)До этого поддерживалась конкатенация двух объектов или двух массивов JSON. Теперь обрабатываются и другие случаи — отличные от массивов аргументы помещаются в одноэлементные массивы, которые затем складываются. Ранее некоторые сочетания аргументов обрабатывались по этому принципу, а с другими возникали ошибки.
Исправление ошибки обращения к неинициализированному значению при разборе квантификатора
*
в регулярном выражении в режиме BRE (Том Лейн)В результате ошибки этот квантификатор мог работать как «нежадный», то есть как квантификатор
*?
в расширенных регулярных выражениях.Исправления поведения
power()
со значениемnumeric
, равнымINT_MIN
(-2147483648) (Дин Рашид)Ранее для такого числа возвращался результат без значимых цифр.
Предотвращение возможной потери данных вследствие некорректного определения позиции зацикливания в журнале SLRU (Ной Миш)
Позиция зацикливания обычно оказывается в середине страницы и должна округляться до границы страницы, однако это делалось неправильно. Негативные последствия это могло иметь, только если SLRU-кеш переполнялся в пределах одной страницы, что маловероятно в правильно функционирующей системе. Проявляться это могло в последующих ошибках «apparent wraparound» (видимо, произошло зацикливание) и «could not access status of transaction» (не удалось получить состояние транзакции).
Устранение утечек памяти в процессах walsender при передаче новых снимков для логического декодирования (Амит Капила)
Исправление поведения walsender при получении дополнительных команд после завершения репликации (Джефф Девис)
Выявление взаимоблокировок, возможных между серверами горячего резерва и стартовым процессом (применяющим WAL) (Фудзии Масао)
Стартовый процесс не выполнял процедуру обнаружения взаимоблокировок, поэтому когда он оказывался последним в ситуации взаимного ожидания, взаимоблокировка не диагностировалась.
Обеспечение очистки необработанных запросов к фоновым рабочим процессам в начале процедуры выключения в режимах «smart» и «fast» (Том Лейн)
Ранее были возможны условия гонки, когда дочерний процесс, запросивший для себя фоновый рабочий процесс непосредственно перед выключением сервера, оказывался в состоянии бесконечного ожидания и таким образом препятствовал выключению.
Устранение платформенных особенностей при разборе значений
recovery_target_xid
(Микаэль Пакье)Целевой XID может задаваться как 64-битное значение, а для его разбора использовалась функция
strtoul()
, неподходящая для этого на платформах, гдеlong
имеет размер 32 бита (например, в Windows).Устранение сбоя утверждения истинности в
pg_get_functiondef()
при анализе функции с указаниемTRANSFORM
(Том Лейн)Восстановление в psql возможности передавать пароль в аргументе
строка_соединения
команды\connect
(Том Лейн)Это работало раньше, но в результате недавнего исправления этот пароль перестал восприниматься (и поэтому запрашивался дополнительно).
Устранение разнообразных дефектов в реализации команды psql
\help
(Кётаро Хоригути, Том Лейн)Команда
\help
с двумя словами в аргументах не могла найти описание команды только для первого слова. Например, команда\help reset all
должна была показать справку поRESET
, но она этого не делала. Кроме того,\help
в ряде случаев не вызывала постраничник, тогда как должна была. Наконец, в прежней реализации имелись утечки памяти.Изменение поведения pg_dump с тем, чтобы в скрипте восстановления команды
ALTER PUBLICATION ADD TABLE
выполнялись от имени владельца публикации (Том Лейн)Ранее эти команды выполнялись от имени роли, запустившей скрипт восстановления; в большинстве случаев это должно работать, но в некоторых ситуациях эта роль может не иметь нужных прав.
Исправление в pg_dump обработки указаний
WITH GRANT OPTION
в изначально устанавливаемых правах в расширениях (Ной Миш)В случае, когда скрипт расширения создаёт объект и даёт права доступа к нему с правом передачи, а пользователь затем отзывает эти права, pg_dump не мог выдать корректный SQL восстановления состояния. (Эта проблема если и затрагивает, то лишь немногие расширения.)
Рассмотрение в процедуре pg_rewind всех требующихся WAL-файлов при синхронизации резервного сервера (Иэн Барвик, Хейкки Линнакангас)
Передача имени корректной базы данных в сообщениях об ошибках подключения, выдаваемых некоторых клиентскими программами (Альваро Эррера)
Когда имя базы данных не задавалось в командной строке, а выбиралось подразумеваемое по умолчанию, программы pg_dumpall, pgbench, oid2name и vacuumlo выдавали неверные сообщения об ошибках в случае сбоя подключения.
Устранение утечки памяти в
contrib/auto_explain
(Ли Япинь)Память, занятая в процессе формирования вывода
EXPLAIN
, не освобождалась до конца текущей транзакции (для оператора верхнего уровня) или до завершения внешнего оператора (для вложенного оператора). В частности это создавало проблемы при включённом параметреlog_nested_statements
.Устранение в
contrib/postgres_fdw
утечки открытых подключений к внешним серверам при удалении сопоставлений пользователей или объекта стороннего сервера (Бхарат Рупиредди)Использовать подключения, связанные с удалённым сопоставлением пользователя или сторонним сервером, нельзя, но ранее они сохранялись открытыми на протяжении локального сеанса.
Добавление в
contrib/pgcrypto
проверки кода возврата, выдаваемого функциями OpenSSL EVP (Микаэль Пакье)В действительности ошибки в этом месте не ожидаются, но это изменение убирает предупреждения статистических анализаторов.
Предотвращения сбоя в коде поддержки индексов GiST в модуле
contrib/pg_trgm
, происходившего в редком случае вызова функции picksplit для разделения ровно двух элементов (Эндрю Гирт, Александр Коротков)Исправление расчёта тайм-аутов в
contrib/pg_prewarm
иcontrib/postgres_fdw
(Алексей Кондратов, Том Лейн)В основном цикле главного процесса
contrib/pg_prewarm
ошибочно вычислялась задержка в 1000 раз меньше ожидаемой, вследствие чего он создавал лишнюю нагрузку для процессора. Ожидая результата от удалённого сервера, модульcontrib/postgres_fdw
устанавливал вместо желаемого тайм-аута в 1000 раз больший (хотя эта ошибка нивелировалась 60-секундным ограничением сверху).Обе эти ошибки были следствием неправильного пересчёта секунд с микросекундами в миллисекунды. Чтобы в будущем таких ошибок не было, добавлена удобная функция
TimestampDifferenceMilliseconds()
.Улучшение логики configure в части выбора
PG_SYSROOT
в macOS (Том Лейн)Новый подход с большей вероятностью даст желаемый результат в случаях, когда Xcode новее нижележащей операционной системы. В случае выбора sysroot, не соответствующего версии ОС, скомпилированные программы могут не работать.
Добавление при сборке в macOS ключа
-isysroot
на этапах компоновки и компиляции (Джеймс Хиллиард)Это должно помогать в ситуациях, когда версия Xcode не согласуется с версией операционной системы.
Обновление данных часовых поясов до версии tzdata 2021a, включающее изменение правил перехода на летнее время в России (смену часового пояса в Волгограде) и Южном Судане, а также корректировку исторических данных для Австралии, Багам, Белиза, Бермуд, Ганы, Израиля, Кении, Нигерии, Палестины, Сейшел и Вануату.
В частности, часовой пояс Australia/Currie был признан равнозначным Australia/Hobart и ненужным.