Вышел релиз PostgreSQL 10. Мы долго ждали появления новых фич. Мои коллеги ещё весной тестировали новую версию и отправляли баг-репорты: раз, два. А я был очень рад обновлению и подготовил перевод Release Notes на русский язык. Давайте обсуждать.
Содержание
E.1.1. Обзор (TLDR)
E.1.2. Миграция на версию 10
E.1.3. Изменения
E.1.3.1. Сервер
E.1.3.1.1. Параллельные запросы
E.1.3.1.2. Индексы
E.1.3.1.3. Блокировки
E.1.3.1.4. Оптимизатор
E.1.3.1.5. Общая производительность
E.1.3.1.6. Мониторинг
E.1.3.1.6.1. Логгирование
E.1.3.1.6.2. pg_stat_activity
E.1.3.1.7. Проверка подлинности
E.1.3.1.8. Конфигурация сервера
E.1.3.1.9. Надёжность
E.1.3.1.9.1. Журнал упреждающей записи (WAL)
E.1.3.2. Репликация и восстановление
E.1.3.3. Запросы
E.1.3.4. Вспомогательные команды
E.1.3.5. Типы данных
E.1.3.6. Функции
E.1.3.7. Серверные языки
E.1.3.7.1. PL/Tcl
E.1.3.8. Клиентские интерфейсы
E.1.3.9. Клиентские приложения
E.1.3.9.1. psql
E.1.3.9.2. pgbench
E.1.3.10. Серверные приложения
E.1.3.10.1. pg_dump, pg_dumpall, pg_restore
E.1.3.10.2. pg_basebackup
E.1.3.10.3. pg_ctl
E.1.3.11. Исходный код
E.1.3.12. Дополнительные модули
E.1.1. Обзор (TLDR)
Основные улучшения в PostgreSQL 10:
- Логическая репликация с использованием publish/subscribe
- Декларативное партицирование таблиц
- Улучшенная параллельная обработка запросов
- Значительные улучшения общей производительности
- Более сильная проверка подлинности, основанная на SCRAM-SHA-256
- Улучшенный мониторинг и администрирование
Всё перечисленное подробно описано ниже.
E.1.2. Миграция на версию 10
Для перехода с любых предыдущих версий необходимо выполнить dump/restore, используя pg_dumpall, или воспользоваться pg_upgrade.
Версия 10 содержит ряд изменений, которые могут затронуть совместимость с предыдущими релизами. Вот эти изменения:
- Хэш-индексы должны быть перестроены после выполнения pg_upgrade с любых предыдущих мажорных версий PostgreSQL (Mithun Cy, Robert Haas, Amit Kapila). Важные изменения в хэш-индексах делают перестроение необходимым. pg_upgrade создаст скрипт для помощи в перестроении.
- Переименование директории журнала упреждающей записи
pg_xlog
вpg_wal
и переименование директории со статусами транзакцийpg_clog
вpg_xact
(Michael Paquier).
Пользователи иногда думали, что эти каталоги содержат только несущественные файлы журнала, удаляли файлы журнала упреждающей записи или файлы со статусами транзацкций вручную, что приводило к невосполнимой потере данных. Такие переименования должны предотвратить подобные действия пользователей в будущем. - Переименование SQL-функций, утилит и опций, относящихся к “xlog” в “wal” (Robert Haas).
Например,pg_switch_xlog()
станетpg_switch_wal()
,pg_receivexlog
станетpg_receivewal
;--xlogdir
станет--waldir
. Это делается для единообразия с переименованиемpg_xlog
; в общем, термин “xlog” в дальнейшем не будет использоваться со стороны пользователя. - Переименование функций и представлений, относящихся к WAL, с использованием
lsn
вместоlocation
(David Rowley). Ранее возникали противоречия при использовании двух терминов. - Изменена реализация SRF (set-returning functions), задействованных в списке
SELECT
(Andres Freund). Функции, возвращающие множества (Set-returning functions, SRF), теперь вычисляются до вычисления скалярных выражений в спискеSELECT
, как будто они были помещены в выражениеLATERAL FROM
. Это даёт более здравую семантику при использовании нескольких SRF. Если они возвращают разное количество строк, более короткие результаты будут расширены до самого длинного путём добавления NULL-значений. Ранее находился наименьший общий множитель размеров результатов SRF, и они циклично повторялись. Также вызов SRF теперь запрещен с конструкциямиCASE
иCOALESCE
. Более подробная информация содержится в разделе документации Section 37.4.8. - Когда
ALTER TABLE ... ADD PRIMARY KEY
устанавливает атрибут колонкиNOT NULL
, это изменение также распространяется на унаследованные дочерние таблицы (Michael Paquier). - Предотвращен вызов statement-триггеров от вызова более одного раза за запрос (statement) (Tom Lane). В случаях использования пишуших CTE, при обновлении той же таблицы, или другим пишущим CTE,
BEFORE STATEMENT
- илиAFTER STATEMENT
-триггеры вызывались более одного раза. Также если были statement-триггеры на таблице, затронутой ограничением внешнего ключа (таким, какON DELETE CASCADE
), они могли вызваться более одного раза для внешнего SQL-выражения. Это противоречило стандарту, поэтому было изменено. - Метаданные последовательностей перенесены в новый системный каталог
pg_sequence
(Peter Eisentraut). Новая таблица содержит в себе поля, которые могут быть изменены с помощью функцииnextval()
, то естьlast_value
,log_cnt
иis_called
. Остальные свойства последовательностей, такие как начальное значение и инкремент, сохранены в соответствующей строке каталогаpg_sequence
.ALTER SEQUENCE
теперь полностью транзакционна, подразумевая блокировку последовательности до коммита. Функцииnextval()
иsetval()
остаются нетранзакционными.
Основная несовместимость, внесённая этим изменением, состоит в том, что выборка из таблицы с последовательностями вернёт только три поля, перечисленных выше. Для получения остальных свойств последовательности приложение должно найти их вpg_sequence
. Новое системное представлениеpg_sequences
может быть также использовано для этих целей; оно предоставляет имена колонок, более совместимые с существующим кодом. pg_basebackup
стримитWAL
, необходимый для восстановления бэкапа по умолчанию (Magnus Hagander). Это изменяет значение по умолчанию параметра-X/--xlog-method
командыpg_basebackup
вstream
. Значение none добавлено для воспроизведения старого поведения. Опция -x командыpg_basebackup
была удалена (используйте взамен -Xfetch
).- Изменен способ использования pg_hba.conf логической репликацией (Peter Eisentraut). В предыдущих релизах логическая репликация требовала использования ключевого слова
replication
в колонке базы данных. С этого релиза логическая репликация использует обычное вхождение имени базы данных или ключевого словаall
. Физическая репликация продолжает использовать ключевое словоreplication
. Так как логическая репликация — новинка данного релиза, изменение затрагивает только пользователей сторонних плагинов для репликации. - Все действия
pg_ctl
ожидают завершения по умолчанию (Peter Eisentraut). До этого момента некоторые действияpg_ctl
не ожидали завершения и требовали для этого использования параметра-w
. - Изменено значение по умолчанию серверного параметра
log_directory
сpg_log
наlog
(Andreas Karlsson). - Добавлена опция конфигурации
ssl_dh_params_file
для указания файла с измененными параметрами Диффи-Хеллмана (Heikki Linnakangas). Это убирает захардкоженное недокументированное имя файлаdh1024.pem
. Обратите внимание,dh1024.pem
более не проверяется по умолчанию; вы должны выставить значение опции для использования собственных параметров Диффи-Хеллмана. - Увеличен размер параметров Диффи-Хеллмана по умолчанию до 2048 для эфемерного алгоритма Диффи-Хеллмана OpenSSL (Heikki Linnakangas). Размер поставляемых параметров Диффи-Хеллмана был увеличен с 1024 до 2048 бит, делая обмен ключами Диффи-Хеллмана более устойчивым к брутфорс-атакам. Тем не менее, некоторые старые реализации SSL, в частности некоторые редакции Java Runtime Environment версии 6, не будут принимать параметры Диффи-Хеллмана длиннее, чем 1024 бита, и, следовательно, не смогут подключиться через SSL. Если требуется поддерживать такие старые клиенты, вы можете использовать обычный 1024-битные параметры параметров Диффи-Хеллмана вместо поставляемых по умолчанию. См. ssl_dh_params_file.
- Удалена возможность сохранять незашифрованные пароли на сервере (Heikki Linnakangas). Серверный параметр
password_encryption
более не поддерживает значенияoff
илиplain
. ОпцияUNENCRYPTED
более не поддерживается в командеCREATE/ALTER USER ... PASSWORD
. Аналогично, опция--unencrypted
была удалена из командыcreateuser
. Незашифрованные пароли при миграции со старых версий будут сохранены зашифрованными в этом релизе. Значение по умолчанию для параметраpassword_encryption
всё ещёmd5
. - Добавлены серверные параметры min_parallel_table_scan_size и min_parallel_index_scan_size для управления параллельными запросами (Amit Kapila, Robert Haas). Это заменяет
min_parallel_relation_size
, который оказался слишком общим. - Значение параметра
shared_preload_libraries
и ему подобных не приводится к нижнему регистру, если оно не взято в кавычки (QL Zhuo). Эти настройки являются списком имён файлов, но до этого момента обрабатывались как идентификаторы SQL, которые обрабатываются по другим правилам. - Удалён серверный параметр
sql_inheritance
(Robert Haas). Изменение значения по умолчанию для этого параметра приводило к тому, что запросы к родительским таблицам не включали данные из дочерних таблиц. Стандарт SQL требует, чтобы они были включены, однако, это и так было по умолчанию с PostgreSQL 7.1. - Разрешена передача многомерных массивов в функции на PL/Python и возврат в виде вложенных списков языка Python (Alexey Grishchenko, Dave Cramer, Heikki Linnakangas). Эта возможность потребовала обратно несовместимых изменений в обработке массивов составных типов PL/Python. Ранее можно было возвращать массив с составными значениями написав, к примеру,
[[col1, col2], [col1, col2]]
; но теперь это интерпретируется как двумерный массив. Составные типы в массивах теперь должны быть записаны как кортежи Python, а не списки, чтобы устранить неоднозначность; это значит, что следует писать так:[(col1, col2), (col1, col2)]
. - Убрана возможность автозагрузки из модуля PL/Tcl's (Tom Lane). Эта функциональность заменена двумя новыми серверными параметрами pltcl.start_proc и pltclu.start_proc, которые проще в использовании и более похожи на возможности в других процедурных языках.
- Удалена поддержка версий до 8.0 в pg_dump/pg_dumpall (Tom Lane). Пользователям, которым необходимо снять дамп с версий до 8.0, необходимо воспользоваться версией PostgreSQL 9.6 или более ранней. Результирующий вывод должен успешно загрузиться в более новые версии.
- Удалена поддержка для таймстампов и интервалов с плавающей точкой (Tom Lane). Удалён параметр конфигурации
--disable-integer-datetimes
. Таймстампы с плавающей точкой имеют некоторые преимущества, но не использовались по умолчанию с PostgreSQL 8.3. - Удалена серверная поддержка протокола клиент-серверного протокола версии 1.0 (Tom Lane). Этот протокол не поддерживался с версии PostgreSQL 6.3.
- Удалён модуль
contrib/tsearch2
(Robert Haas). Этот модуль предоставлял совместимость с версией полнотекстового поиска, поставляемого до версий 8.3. - Удалены утилиты командной строки
createlang
иdroplang
(Peter Eisentraut). Они устарели в версии PostgreSQL 9.1. Вместо них используйте командыCREATE EXTENSION
иDROP EXTENSION
. - Удалена поддержка соглашения о вызове функций версии 0 (Andres Freund). Расширения, использующие функции на C, должны соответствовать версии 1 соглашения о вызове функций. Версия 0 устарела в 2001 году.
E.1.3. Изменения
Ниже приведена детальная информация об изменениях между PostgreSQL 10 и предыдущим мажорным релизом.
E.1.3.1. Сервер
E.1.3.1.1. Параллельные запросы
- Поддержаны параллельные index scans для B-tree (Rahila Syed, Amit Kapila, Robert Haas, Rafia Sabih). Это изменение позволяет индексным страницам B-tree быть просмотренными различными parallel workers.
- Поддержаны параллельные bitmap heap scans (Dilip Kumar). Это позволяет одиночному index scan диспетчеризовать просмотр кучи различными parallel workers.
- Разрешено параллельное выполнение merge joins (Dilip Kumar).
- Разрешено параллельное выполнение невзаимосвязанных подзапросов (Amit Kapila).
- Улучшена возможность parallel workers по возврату предсортированных данных (Rushabh Lathia).
- Увеличено использование параллельных запросов в процедурных функциях (Robert Haas, Rafia Sabih).
- Добавлен серверный параметр max_parallel_workers для ограничения количества воркеров, которые могут быть использованы для параллельной обработки запроса (Julien Rouhaud). Этот параметр может быть установлен в меньшее значение, чем max_worker_processes для резервирования воркеров, отличающихся от параллельной обработки запросов целей.
E.1.3.1.2. Индексы
- Добавлена поддержка записи в WAL для хэш-индексов (Amit Kapila). Это позволяет сделать их устойчивыми к сбоям и добавить их в репликацию. Сообщение об опасности их использования удалено.
- Улучшена производительность хэш-индексов (Amit Kapila, Mithun Cy, Ashutosh Sharma).
- Добавлена поддержка типов
INET
andCIDR
SP-GiST-индексы (Emre Hasegeli). - Добавлен параметр для более агрессивной суммаризации BRIN-индексов (Álvaro Herrera). Новая опция
CREATE INDEX
включает автосуммаризацию предыдущего диапазона BRIN-страниц, когда создаётся новый страничный диапазон. - Добавлены функции для удаления и повторного добавления BRIN-суммаризации для индексных диапазонов BRIN (Álvaro Herrera). Новая SQL-функция
brin_summarize_range()
обновляет суммаризацию BRIN-индекса для указанного диапазона иbrin_desummarize_range()
для ее удаления. Это полезно для обновления суммаризации диапазона, который сейчас меньше из-за UPDATE-ов и DELETE-ов. - Повышена точность определения выгодности сканирования BRIN-индекса (David Rowley, Emre Hasegeli).
- Разрешены более быстрые вставки и обновления посредством более эффективного переиспользования индексных страниц GiST (Andrey Borodin).
- Уменьшен уровень блокировки страниц во время обновления GIN-индекса (Andrey Borodin).
E.1.3.1.3. Блокировки
- Уменьшен уровень блокировок, необходимый для добавления значений в перечисления (Andrew Dunstan, Tom Lane). Ранее было невозможно запустить команду
ALTER TYPE ... ADD VALUE
в блоке транзакции, если это перечисление не было создано в нём. Теперь запрещены только ссылки на незафиксированные значения перечислений из других транзакций. - Уменьшен уровень блокировок, необходимый для изменения параметров таблиц (Simon Riggs, Fabrízio Mello). Например, изменение настройки таблицы
effective_io_concurrency
может быть выполнено с более легковесной блокировкой. - Разрешена настройка промотирования порогов предикатных блокировок (Dagfinn Ilmari Mannsåker). Промотирование блокировок может контролироваться двумя новыми серверными параметрами:
max_pred_locks_per_relation
иmax_pred_locks_per_page
.
E.1.3.1.4. Оптимизатор
- Добавлена многоколоночная статистика оптимизатора для вычисления коэффициента корреляции и количества уникальных значений (Tomas Vondra, David Rowley, Álvaro Herrera). Добавлены новые команды
CREATE STATISTICS
,ALTER STATISTICS
иDROP STATISTICS
. Эта возможность полезна при оценке использования памяти запросом и при комбинировании статистики из разных колонок. - Увеличена производительность запросов, затронутых ограничениями row-level security (Tom Lane). Оптимизатор обладает большим количеством знаний о том, где он может расположить фильтры RLS, позволяя строить лучшие планы и безопасно обеспечивать условия RLS.
E.1.3.1.5. Общая производительность
- Ускорены агрегатные функции, вычисляющие текущую сумму при использовании арифметики
numeric
-типа, включая некоторые вариантыSUM()
,AVG()
иSTDDEV()
(Heikki Linnakangas). - Увеличена производительность преобразований кодировки символов с использованием radix-деревьев (Kyotaro Horiguchi, Heikki Linnakangas).
- Уменьшены накладные расходы на вычисление выражений во время выполения запроса, а также накладные расходы на вызов узлов плана (Andres Freund). В частности это полезно для запросов, обрабатывающих большое количество строк.
- Добавлена возможность использования хэш-агрегации с grouping sets (Andrew Gierth).
- Использованы гарантии уникальности для оптимизации некоторых типов объединений (David Rowley).
- Увеличена производительность сортировки типа данных
macaddr
(Brandur Leach). - Сокращены накладные расходы на отслеживание статистики в сеансах, которые используют многие тысячи отношений (Aleksander Alekseev).
E.1.3.1.6. Мониторинг
- Добавлено явное управление отображением времени планирования и выполнения команды
EXPLAIN
(Ashutosh Bapat). По умолчанию время планирования и выполнения отображалось командойEXPLAIN ANALYZE
и не отображалось в других случаях. Новая опция командыEXPLAIN SUMMARY
позволяет явно управлять отображением. - Добавлены правила мониторинга по умолчанию (Dave Page). Новые роли
pg_monitor
,pg_read_all_settings
,pg_read_all_stats
иpg_stat_scan_tables
позволяют проще настраивать привилегии. - Правильное обновление сборщика статистики во время выполнения
REFRESH MATERIALIZED VIEW
(Jim Mlodgenski).
E.1.3.1.6.1. Логгирование
- Изменено значение по умолчанию параметра
log_line_prefix
с включением таймстампа с миллисекундами и PID в каждой строке вывода postmaster'а (Christoph Berg). В прошлом префикс был пустым. - Добавлены функции для возврата содержимого каталогов log и WAL (Dave Page)
Новые функции pg_ls_logdir() и pg_ls_waldir() могут быть запущены несуперпользователями с правильными настройками привилегий. - Добавлена функция pg_current_logfile() для вывода имени файла, в который коллектор ошибок пишет текущий stderr или csvlog (Gilles Darold).
- Сообщается об адресе и номере порта каждого слушающего сокета в логе сервера во время запуска postmaster'а (Tom Lane). Кроме того, при ошибке подключения к слушающему сокету, указывается конкретный адрес, к которому пытались подключиться.
- Уменьшено количество сообщений в лог о запуске и остановке подпроцессов launcher'а (Tom Lane). Теперь они используют уровень сообщений
DEBUG1
. - Уменьшена многословность сообщений низких отладочных уровней управляемых log_min_messages (Robert Haas). Это также меняет многословность отладочных уровней client_min_messages.
E.1.3.1.6.2. pg_stat_activity
- Добавлена отчетность о низкоуровневых состояниях ожидания в
pg_stat_activity
(Michael Paquier, Robert Haas, Rushabh Lathia). Это изменение позволяет сообщать о многочисленных низкоуровневых блокировках, включая latch waits, чтение/запись fsync файлов, клиентские чтение/запись и синхронную репликацию. - Добавлено отображение фоновых процессов, background workers и процессов walsender в
pg_stat_activity
(Kuntal Ghosh, Michael Paquier). Это упрощает мониторинг. Новая колонкаbackend_type
идентифицирует тип процесса. - В pg_stat_activity добавлено отображение SQL запущенного parallel workers (Rafia Sabih).
- Переименованы значения
pg_stat_activity.wait_event_type LWLockTranche
иLWLockNamed
вLWLock
(Robert Haas). Это делает вывод более последовательным.
E.1.3.1.7. Проверка подлинности
- Добавлена поддержка SCRAM-SHA-256 для передачи и хранения паролей (Michael Paquier, Heikki Linnakangas). Это даёт большую безопасность, чем текущий (
md5
) метод передачи и хранения. - Изменен тип серверного параметра the password_encryption с
boolean
наenum
(Michael Paquier). Это было необходимо для поддержки дополнительных опций хэширования паролей. - Добавлено представление
pg_hba_file_rules
для отображения содержимогоpg_hba.conf
(Haribabu Kommi). Показывается содержимое файла, но не текущие активные настройки. - Поддержка нескольких RADIUS-серверов (Magnus Hagander). Все параметры, относящиеся к RADIUS, теперь записаны во множественном числе и поддерживают список серверов, разделённый запятыми.
E.1.3.1.8. Конфигурация сервера
- Конфигурацию SSL стало можно обновлять при перезагрузке конфигурации (Andreas Karlsson, Tom Lane). Это позволяет переконфигурировать SSL без перезагрузки сервера, используя
pg_ctl reload
,SELECT pg_reload_conf()
или отправляя сигналSIGHUP
. Однако перезагрузка конфигурации SSL не работает, если серверный ключ SSL требует пароль, так как нет возможности предложить ввод пароля. В этом случае будет применена первоначальная конфигурация. - Максимальное значение bgwriter_lru_maxpages сделано действительно неограниченным (Jim Nasby).
E.1.3.1.9. Надёжность
- После создания или удаления файлов выполняется вызов fsync для их родительского каталога (Michael Paquier). Это уменьшает риск потери данных при сбоях питания.
E.1.3.1.9.1. Журнал упреждающей записи (WAL)
- Убраны ненужные checkpoint'ы и архивация WAL'а при простое системы (Michael Paquier)
- Добавлен серверный параметр wal_consistency_checking, чтобы добавить сведения в WAL, которые нужно проверить на стендбае (Kuntal Ghosh, Robert Haas). Любая ошибка при проверке порождает фатальную ошибку на стендбае.
- Увеличен максимальный конфигурируемый сегмент WAL до гигабайта (Beena Emerson)
Больший размер WAL-сегмента позволяет реже вызывать archive_command и управлять меньшим количеством WAL-файлов.
E.1.3.2. Репликация и восстановление
- Добавлена возможность логически реплицировать таблицы на стендбаи (Petr Jelinek). Логическая репликация даёт большую гибкость, чем физическая, включая репликацию между различными мажорными версиями PostgreSQL и выборочную репликацию.
- Разрешено ожидание подтверждения коммита от стендбаев вне зависимости от порядка, в котором они перечислены в synchronous_standby_names (Masahiko Sawada). До этого сервер ждал активного стендбая, который встречался первым в списке
synchronous_standby_names
. Новое ключевое словоsynchronous_standby_names ANY
позволяет ожидать любое количество стендбаев, вне зависимости от их порядка. Это называется кворумным коммитом. - Уменьшено количество изменений в конфигурации необходимых для подготовки потоковой репликации и бэкапа (Magnus Hagander, Dang Minh Huong). Конкретно, умолчания поменялись для wal_level, max_wal_senders, max_replication_slots и hot_standby, чтобы сделать их более подходящими для использования из коробки.
- Включена репликация с локальных соединений по умолчанию в
pg_hba.conf
(Michael Paquier). Ранее строки с соединениями репликации вpg_hba.conf
были закомментированы по умолчанию. В частности, это полезно дляpg_basebackup
. - Добавлены колонки в pg_stat_replication для отчета по времени отставания репликации (Thomas Munro). Новые колонки:
write_lag
,flush_lag
иreplay_lag
. - Добавлено указание точки останова восстановления с помощью Log Sequence Number (LSN) в
recovery.conf
(Michael Paquier). До этого точка останова могла быть указана с помощью таймстампа или XID'а. - Пользователям разрешено отключать
pg_stop_backup()
, ждущий архивации всех WAL'ов (David Steele). Управляет этим поведением необязательный второй аргументpg_stop_backup()
. - Разрешено создание временных слотов репликации (Petr Jelinek). Временные слоты удаляются автоматически при ошибке или завершении сеанса.
- Увеличена производительность реплея на хот стендбае с лучшей обработкой блокировок уровня Access Exclusive (Simon Riggs, David Rowley).
- Ускорена производительность двухфазного коммита (Stas Kelvich, Nikhil Sontakke, Michael Paquier).
E.1.3.3. Запросы
- Добавлена функция
XMLTABLE
, конвертирующаяXML
-данные в список строк (Pavel Stehule, Álvaro Herrera). - Добавлена поддержка стандартного синтаксиса конструктора строки в
UPDATE ... SET (column_list) = row_constructor
(Tom Lane).row_constructor
может начинаться с ключевого словаROW
; ранее оно опускалось. Также вхождениеtable_name.*
вместе сrow_constructor
теперь раскрывается в несколько колонок, как и в других случаях примененияrow_constructors
. - Исправлена обработка символьных классов в регулярных выражениях для больших кодов символов, конкретно для символов Unicode выше
U+7FF
(Tom Lane). Ранее такие символы никогда не распознавались, как относящиеся к локалезависимым классам, таким как[[:alpha:]]
.
E.1.3.4. Вспомогательные команды
- Добавлен синтаксис партицирования таблиц, который автоматически выставляет ограничения на партиции и управляет вставками и обновлениями (Amit Langote). Синтаксис поддерживает диапазонное и списочное партицирование.
- Добавлены таблицы переходов для
AFTER
-триггеров, для записи измененных строк (Kevin Grittner, Thomas Munro). Таблицы переходов теперь доступны для триггеров, написаных на серверных языках программирования. - Добавлены ограничительные политики безопасности на уровне строк (Stephen Frost). Ранее политики безопасности были разрешающими, что означает, что любая политика разрешает доступ. Запрещающая политика должна совпадать с доступом, который должен быть выдан. Такие типы политик могут комбинироваться.
- При создании ограничения внешнего ключа проверяется
REFERENCES
-привилегия только на целевой таблице (Tom Lane). РанееREFERENCES
-привилегия требовалась на ссылающейся таблице. Похоже, это произошло из-за неправильного прочтения стандарта SQL. Поскольку создание ограничения внешнего ключа (или любого другого типа) требует права собственности на целевую таблицу, дополнительно требоватьREFERENCES
-привилегию выглядит довольно бессмысленным. - Добавлены привилегии по умолчанию для схем (Matheus Oliveira). Это делается с использованием команды
ALTER DEFAULT PRIVILEGES
. - Добавлена команда
CREATE SEQUENCE AS
чтобы создать последовательность, соответствующую целочисленному типу данных (Peter Eisentraut). Это упрощает создание последовательностей, соответствующих диапазону базовых колонок. - Разрешено
COPY view FROM source
на представлениях сINSTEAD INSERT
-триггерами (Haribabu Kommi). Триггеры получают строки данных изCOPY
. - Разрешено определение функции без аргументов в DDL, если сигнатура уникальна (Peter Eisentraut). Например, допустимо выполнение
DROP FUNCTION
с именем функции без аргументов, если такая функция одна. Это поведение требует стандарт SQL. - Разрешено удаление нескольких функций, операторов и агрегатов в одиночной команде
DROP
(Peter Eisentraut). - Поддержан
IF NOT EXISTS
вCREATE SERVER
,CREATE USER MAPPING
иCREATE COLLATION
(Anastasia Lubennikova, Peter Eisentraut). VACUUM VERBOSE
сообщает о количестве пропущенных замороженных страниц и старейшем xmin (Masahiko Sawada, Simon Riggs). Эта информация также включена в вывод log_autovacuum_min_duration.- Увеличена скорость удаления пустых хвостовых табличных страниц при
VACUUM
-е (Claudio Freire, Álvaro Herrera).
E.1.3.5. Типы данных
- Добавлена поддержка полнотекстового поиска для
JSON
иJSONB
(Dmitry Dolgov). Функцииts_headline()
иto_tsvector()
могут использоваться с этими типами данных. - Добавлена поддержка для EUI-64 MAC-адресов в виде нового типа данных macaddr8 (Haribabu Kommi). Это дополняет существующую поддержку MAC-адресов EUI-48 (type
macaddr
). - Добавлены столбцы идентификаторов для присвоения числового значения колонкам при вставке (Peter Eisentraut). Они подобны колонкам
SERIAL
, но более соответствуют стандарту SQL. - Разрешено переименовывать значения ENUM (Dagfinn Ilmari Mannsåker). Используется синтаксис ALTER TYPE… RENAME VALUE.
- Правильная обработка массивов псевдотипов (
anyarray
) как массивов вto_json()
иto_jsonb()
(Andrew Dunstan). Ранее колонки, объявленные какanyarray
(в частности, такие есть в представленииpg_stats
) преобразовывались вJSON
-строки, а не массивы. - Добавлены операторы для умножения и деления of значений типа
money
на значения int8 (Peter Eisentraut). Ранее такие случаи приводили бы к преобразованиюint8
-значений вfloat8
использовалисьmoney
-и-float8
операторы. Новое поведение позволяет избежать возможной потери точности. Но обратите внимание, что делениеmoney
наint8
теперь усекает частное, как и в других случаях целочисленного деления, в то время как предыдущее поведение округлило бы результат. - Проверка на переполнение в функции ввода типа
money
(Peter Eisentraut).
E.1.3.6. Функции
- Добавлена упрощенная функция
regexp_match()
(Emre Hasegeli). Она похожа наregexp_matches()
, но возвращает результаты с первого совпадения, так что не нужно возвращать набор данных, делая её использование более простым в простых случаях. - Добавлена версия оператора удаления для
jsonb
, принимающего список ключей для удаления (Magnus Hagander). - Функции
json_populate_record()
и аналогичные обрабатывают массивы JSON рекурсивно (Nikita Glukhov). С этим изменением массивы SQL правильно конвертируются из массиово JSON, а также композитные типы правильно конвертируются из объектов JSON. Ранее подобное не работало, так как на входarray_in()
илиrecord_in()
подавалось текстовое представление JSON-значения, этот синтаксис не соответствовал тому, что ожидала функция. - Добавлена функция
txid_current_ifassigned()
для возврата текущего идентификатора транзакции или значенияNULL
, если идентификатор транзакции не был присвоен (Craig Ringer). Она отличается отtxid_current()
, которая всегда возвращает идентификатор транзакции или присваивает его, если необходимо. Эта функция может выполняться только на стендбаях. - Добавлена функция
txid_status()
для проверки фиксации транзакции (Craig Ringer). Это полезно для проверки после резкого отключения, была ли совершена предыдущая транзакция, и вы просто не получили подтверждение. - Функция
make_date()
интерпретирует отрицательные годы, как годы до н. э. (Álvaro Herrera). - Функции
to_timestamp()
иto_date()
не принимают выходящие за диапазон допустимых значений поля (Artur Zakirov). Например, ранееto_date('2009-06-40','YYYY-MM-DD')
принималось и возвращалось2009-07-10
. Сейчас это приводит к ошибке.
E.1.3.7. Серверные языки
- Разрешено функциям
cursor()
иexecute()
PL/Python быть вызванными как методы объектов (Peter Eisentraut). Это позволяет использовать более объектно-ориентированный стиль программирования. - Разрешено получение
GET DIAGNOSTICS
в PL/pgSQL в массив элементов (Tom Lane). Ранее синтаксическое ограничение не позволяло целевой переменной быть элементом массива.
E.1.3.7.1. PL/Tcl
- PL/Tcl могут возвращать композитные типы и множества (Karl Lehenbauer).
- Добавлена команда подтранзакций в PL/Tcl (Victor Wagner). Это позволяет PL/Tcl-запросам падать без отмены всей функции.
- Добавлены параметры сервера pltcl.start_proc и pltclu.start_proc для вызова функций инициализации при старте PL/Tcl (Tom Lane).
E.1.3.8. Клиентские интерфейсы
- Добавлена возможность задавать множественные имена хостов или адреса в строках соединений и URI libpq (Robert Haas, Heikki Linnakangas). libpq будет соединяться с первым доступным сервером в списке.
- Добавлена возможность для строк соединения и URI libpq запрашивать читающий/пишуший хост для различия мастера и стендбая (Victor Wagner, Mithun Cy). Это полезно при указании нескольких имен хостов. Он управляется с помощью параметра соединения библиотеки libpq
target_session_attrs
. - Разрешено использовать имя файла с паролем в качестве параметра соединения libpq (Julian Markwort). В прошлом это было возможно только с помощью задания переменной окружения.
- Добавлена функция
PQencryptPasswordConn()
, позволяющая создавать большее количество типов зашифрованных паролей на стороне клиента (Michael Paquier, Heikki Linnakangas). До этого моментаMD5
-хэшированные пароли могли быть созданы с использованием PQencryptPassword(). Новая функция может создаватьSCRAM-SHA-256-
шифрованные пароли. - Изменена версия обработчика ecpg с 4.12 на 10 (Tom Lane). Впоследствии версия ecpg будет соответствовать номеру дистрибутива PostgreSQL.
E.1.3.9. Клиентские приложения
E.1.3.9.1. psql
- Добавлена поддержка ветвления в psql (Corey Huinker). Эта фича добавляет в psql метакоманды
if
,elif
,else
иendif
. В первую очередь, это удобно для сценариев. - Добавлена метакоманда psql
gx
для запуска (g
) запроса в расширенном режиме (x
) (Christoph Berg). - Переменные psql раскрываются в строках, обрамлённых в обратные кавычки (Tom Lane). В частности, это удобно для новых команд условного ветвления в psql.
- Предотвращена установка неправильных значений специальных переменных psql (Daniel Vérité, Tom Lane). Ранее установка одной специальной переменной psql в неправильное значение выполнялась молча.
set
для специальной переменной теперь выполняется с ошибкой, если новое значение некорректно. Как особое исключение,set
с пустым или пропущенным значением для булевой специальной переменной выставляет эту переменную в значениеon
; но теперь он получает это значение, а не пустую строку.unset
теперь явно выставляет в значение по умолчанию, которое является значением, полученным при запуске. В итоге управляющая переменная теперь всегда имеет отображаемое значение, которое отражает то, что на самом деле делает psql. - Добавлены переменные, показывающие версию сервера и psql (Fabien Coelho).
- Улучшены команды psql
d
(показать отношение) иdD
(показать домен), чтобы показать сортировку, значение null, и свойства по умолчанию в разных колонках (Peter Eisentraut)
До этого они отображались в одиночной колонке “Modifiers”. - Обработка командами
d
несоответствующих объектов выполнена более последовательно (Daniel Gustafsson). Сообщения выводятся в stderr, не в stdout, формулировка стала более последовательной. - Улучшено автодополнение в psql (Jeff Janes, Ian Barwick, Andreas Karlsson, Sehrope Sarkuni, Thomas Munro, Kevin Grittner, Dagfinn Ilmari Mannsåker).
E.1.3.9.2. pgbench
- Добавлена опция pgbench
--log-prefix
для управления префиксом в логе (Masahiko Sawada). - Добавлена многострочность метакоманд pgbench (Fabien Coelho). Метакоманды могут продолжаться с новой строки при использовании обратного слэша.
- Удалено ограничение на использование опции
-M
, относящейся к другим опциям командной строки (Tom Lane).
E.1.3.10. Серверные приложения
- Добавлена опция pg_receivewal
-Z/--compress
для указания уровня сжатия (Michael Paquier). - Добавлена опция pg_recvlogical
--endpos
для указания конечной позиции (Craig Ringer). Это соответствует существующей опции--startpos
. - Переименованы опции initdb --noclean и
--nosync
в--no-clean
и--no-sync
(Vik Fearing, Peter Eisentraut). Старые варианты всё ещё поддерживаются.
E.1.3.10.1. pg_dump, pg_dumpall, pg_restore
- Добавлена возможность pg_restore исключать схемы (Michael Banck). Это добавляет новую опцию
-N/--exclude-schema
. - Добавлена опция
--no-blobs
в pg_dump (Guillaume Lelarge). Это подавляет дамп больших объектов. - Добавлена опция pg_dumpall
--no-role-passwords
, чтобы исключить пароли ролей (Robins Tharakan, Simon Riggs). Это позволяет использовать pg_dumpall несуперпользователям, без этой опции он аварийно завершался от невозможности прочитать пароли. - Поддержка использования синхронизированных снэпшотов при снятии дампа со стендбая (Petr Jelinek).
- Запуск
fsync()
для файлов, сгенерированных pg_dump и pg_dumpall (Michael Paquier). Это обеспечивает большую сохранность данных при внезапных завершениях программы, т.к. данные принудительно сохраняются на диск. Может быть выключено с помощью новой опции--no-sync
.
E.1.3.10.2. pg_basebackup
- Добавлена возможность pg_basebackup стримить WAL в tar-режиме (Magnus Hagander). WAL будет сохранён в отдельном tar-файле от base backup'а.
- Дана возможность pg_basebackup использовать временные слоты репликации (Magnus Hagander). Временные слоты репликации используются по умолчанию, когда pg_basebackup использует стриминг WAL со стандартными опциями.
- Более аккуратный fsync во всех требуемых местах pg_basebackup и pg_receivewal (Michael Paquier).
- Добавлена опция pg_basebackup
--no-sync
для отключения fsync (Michael Paquier). - Улучшена обработка pg_basebackup'ом, какие директории нужно пропустить (David Steele).
E.1.3.10.3. pg_ctl
- Добавлена опция ожидания для операции промотирования pg_ctl (Peter Eisentraut).
- Добавлены длинные эквиваленты для pg_ctl wait (
--wait
) и no-wait (--no-wait
) (Vik Fearing). - Добавлен длинный эквивалент для серверных опций в pg_ctl (
--options
) (Peter Eisentraut). pg_ctl start --wait
определяет готовность сервера по наблюдению заpostmaster.pid
, не по попыткам соединиться (Tom Lane). postmaster изменен, чтобы отобразить готовность к приёму соединений в postmaster.pid, и pg_ctl теперь просматривает этот файл, чтобы понять, что запуск завершен. Этот метод более эффективный и надеждный, чем старый, и убирает из лога сообщения о попытках подключения во время старта.- Уменьшено время реакции pg_ctl при ожидании старта/остановки postmaster'а (Tom Lane). pg_ctl теперь проверяет десять раз в секунду изменение состояния postmaster'а, а не один раз в секунду.
- pg_ctl завершает работу с ненулевым кодом возврата, если операция не завершилась по таймауту (Peter Eisentraut). Операции
start
иpromote
теперь возвращают 1, не 0, в таких случаях. Операцияstop
всегда работала так.
E.1.3.11. Исходный код
- Нумерация релизов изменена на двухномерную (Peter Eisentraut, Tom Lane). Номера релизов теперь будут состоять из двух частей (например, 10.1), а не трех (e.g., 9.6.3). Мажорные версии будут увеличивать первое число, минорные — второе. Релизные ветки будут именоваться одиночными числами (например, 10 вместо 9.6). Это изменение направлено на уменьшение путаницы среди пользователей, какой релиз PostgreSQL является мажорным или минорным.
- Улучшена работа pgindent (Piotr Stefaniak, Tom Lane). Мы перешли на новую версию pg_bsd_indent, основанную на последних улучшениях, сделанных проектом FreeBSD. Она исправляет многочисленные маленькие ошибки, к которым приводило нечёткое форматирование кода на C. В частности, строки в скобках (как, например, многострочные вызовы функций), теперь отступают равномерно, даже если приходится пересекать границу справа.
- Разрешено опциональное использование библиотеки ICU для поддержки сортировки (Peter Eisentraut). Библиотека ICU использует версионирование, позволяющее обнаружить изменение сортировки между версиями. Она включается с помощью опции конфигурации
--with-icu
. По умолчанию используется системная библиотека параметров сортировки. - Все функции PG_FUNCTION_INFO_V1 автоматически маркируются атрибутом
DLLEXPORT
на Windows (Laurenz Albe). Если сторонний код использует декларациюextern
функции, он так же должен использовать отметкуDLLEXPORT
для таких деклараций. - Удалены функции
SPI SPI_push()
,SPI_pop()
,SPI_push_conditional()
,SPI_pop_conditional()
иSPI_restore_connection()
как ненужные (Tom Lane). Их функциональность теперь выполняется автоматически. В настоящее время эти имена не содержат макросов, поэтому внешние модули не нуждаются в немедленном обновлении, но в конечном итоге такие вызовы должны быть удалены.
Побочный эффект состоит в том, чтоSPI_palloc()
и аналогичные функции теперь требуют активного SPI-подключения; они не вырождаются в простыеpalloc()
, если его нет. Предыдущее поведение было не очень полезным и порождало риски неожиданных утечек памяти. - Разрешено динамическое выделение общей памяти (Thomas Munro, Robert Haas).
- Добавлен slab-like аллокатор памяти для более эффективного выделения памяти фиксированных размеров (Tomas Vondra).
- Использование семафоров POSIX вместо семафоров SysV на Linux и FreeBSD (Tom Lane). Это позволяет избежать платформозависимых ограничений при использовании семафоров SysV.
- Улучшена поддержка 64-битных атомик-типов (Andres Freund).
- Включены 64-битные атомарные операции на ARM64 (Roman Shaposhnik).
- Переход на использование
clock_gettime()
, где это возможно, для измерений производительности (Tom Lane).gettimeofday()
используется там, гдеclock_gettime()
недоступен. - Добавлены более быстрые генераторы случайных чисел для использования в криптографии (Magnus Hagander, Michael Paquier, Heikki Linnakangas). Если не найдено ни одного стойкого генератора случайных чисел, configure будет завершаться с ошибкой, если не указана опция
--disable-strong-random
. Однако с этой опцией функцииpgcrypto
, требующие стойкого генератора случайных чисел будут недоступны. - Разрешены
WaitLatchOrSocket()
соединения на сокете на Windows (Andres Freund). - Функции
tupconvert.c
более не конвертируют туплы, только встраивают в них композитный OID (Ashutosh Bapat, Tom Lane). В большинстве случаев о составных OID не заботятся, но если результирующий тупл должен использоваться как композитный Datum, необходимо выполнить определенные шаги, чтобы убедиться, что в него вставлен правильный OID. - Убрана поддержка SCO и Unixware (Tom Lane).
- Переписана документация по процессу сборки (Alexander Lakhin).
- Используется XSLT для сборки документации PostgreSQL (Peter Eisentraut). До этого использовались Jade, DSSSL, и JadeTex.
- Сборка HTML-документации использует XSLT-таблицы стилей по умолчанию (Peter Eisentraut).
E.1.3.12. Дополнительные модули
- Добавлена возможность file_fdw читать вывод программ, так же как и файлы (Corey Huinker, Adam Gomaa).
- В postgres_fdw агрегатные функции отправляются на удалённый сервер, когда это возможно (Jeevan Chalke, Ashutosh Bapat). Это уменьшает объем данных, которые должны передаваться с удаленного сервера, и разгружает агрегационные вычисления с запрашивающего сервера.
- В postgres_fdw джойны отправляются на удалённые сервера в большем количестве случаев (David Rowley, Ashutosh Bapat, Etsuro Fujita).
- Правильная поддержка колонок
OID
в таблицах postgres_fdw (Etsuro Fujita). До этого колонкиOID
всегда возвращали нули. - Добавлена возможность для btree_gist и btree_gin индексировать перечислимые типы (Andrew Dunstan). Это позволяет использовать перечисления в exclusion constraints.
- Добавлена индексная поддержка в btree_gist для типа данных
UUID
(Paul Jungwirth). - Добавлен amcheck, который может проверять валидность индексов B-tree (Peter Geoghegan).
- Представление проигнорированных констант как
$N
вместо?
в pg_stat_statements (Lukas Fittl). - Улучшена обработка ноль-размерных кубов (cube) (Tom Lane). Это также улучшает обработку
infinite-
иNaN
-значений. - Добавлена возможность запуска pg_buffercache с меньшим количеством блокировок (Ivan Kartyshov). Это делает запуски на продакшне менее деструктивными.
- Добавлена функция pgstattuple
pgstathashindex()
для просмотра статистики хэш-индексов (Ashutosh Sharma). - Использование
GRANT
для выдачи привилегий на использование pgstattuple (Stephen Frost). Это позволяет администраторам дать права на запуск этих функций не суперпользователям. - Уменьшен уровень блокировок при просмотре хэш-индексов с помощью pgstattuple (Amit Kapila).
- В pageinspect добавлена функция
page_checksum()
, выводящая контрольную сумму страницы (Tomas Vondra). - В pageinspect добавлена функция
bt_page_items()
для вывода страничных записей из образа странцы (Tomas Vondra). - В pageinspect добавлена поддержка хэш-индексов (Jesper Pedersen, Ashutosh Sharma).
От переводчика
Вот мои мысли о новых фичах.
Логическая репликация — очень мощный и гибкий инструмент. Очень хотелось бы иметь механизмы восстановления после аварий источника событий. А также увидеть опциональное хранение данных для логической репликации в отдельной структуре, а не в WALе.
Декларативное партицирование закладывает хороший фундамент для будущих улучшений в этой области. Есть надежда, что существующие проблемы уйдут в прошлое, и будет меньше головной боли с партициями.
Параллельная обработка запросов дает существенный прирост производительности во многих случаях.
Улучшенный мониторинг и администрирование: благодаря добавлению новых ролей упрощается процесс снятия метрик для мониторинга.
Какие фичи понравились вам больше всего? Когда планируете мигрировать?
Автор: pkorobeinikov