Вышел релиз 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_valuelog_cnt и is_called. Остальные свойства последовательностей, такие как начальное значение и инкремент, сохранены в соответствующей строке каталога pg_sequenceALTER SEQUENCE теперь полностью транзакционна, подразумевая блокировку последовательности до коммита. Функции nextval() и setval() остаются нетранзакционными.
    Основная несовместимость, внесённая этим изменением, состоит в том, что выборка из таблицы с последовательностями вернёт только три поля, перечисленных выше. Для получения остальных свойств последовательности приложение должно найти их в pg_sequence. Новое системное представление pg_sequences может быть также использовано для этих целей; оно предоставляет имена колонок, более совместимые с существующим кодом.
  • pg_basebackup стримит WAL, необходимый для восстановления бэкапа по умолчанию (Magnus Hagander). Это изменяет значение по умолчанию параметра -X/--xlog-method команды pg_basebackup в stream. Значение none добавлено для воспроизведения старого поведения. Опция  -x команды pg_basebackup была удалена (используйте взамен -X fetch).
  • Изменен способ использования  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 and CIDR SP-GiST-индексы (Emre Hasegeli).
  • Добавлен параметр для более агрессивной суммаризации BRIN-индексов (Alvaro Herrera). Новая опция CREATE INDEX включает автосуммаризацию предыдущего диапазона BRIN-страниц, когда создаётся новый страничный диапазон.
  • Добавлены функции для удаления и повторного добавления BRIN-суммаризации для индексных диапазонов BRIN (Alvaro 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, Fabrizio Mello). Например, изменение настройки таблицы effective_io_concurrency может быть выполнено с более легковесной блокировкой.
  • Разрешена настройка промотирования порогов предикатных блокировок (Dagfinn Ilmari Mannsaker). Промотирование блокировок может контролироваться двумя новыми серверными параметрами: max_pred_locks_per_relation и max_pred_locks_per_page.

E.1.3.1.4. Оптимизатор


  • Добавлена многоколоночная статистика оптимизатора для вычисления коэффициента корреляции и количества уникальных значений (Tomas Vondra, David Rowley, Alvaro Herrera). Добавлены новые команды CREATE STATISTICSALTER 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_monitorpg_read_all_settingspg_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 reloadSELECT 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_levelmax_wal_sendersmax_replication_slots и hot_standby, чтобы сделать их более подходящими для использования из коробки.
  • Включена репликация с локальных соединений по умолчанию в pg_hba.conf (Michael Paquier). Ранее строки с соединениями репликации в pg_hba.conf были закомментированы по умолчанию. В частности, это полезно для pg_basebackup.
  • Добавлены колонки в pg_stat_replication для отчета по времени отставания репликации (Thomas Munro). Новые колонки: write_lagflush_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, Alvaro 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 SERVERCREATE USER MAPPING и CREATE COLLATION (Anastasia Lubennikova, Peter Eisentraut).
  • VACUUM VERBOSE сообщает о количестве пропущенных замороженных страниц и старейшем xmin (Masahiko Sawada, Simon Riggs). Эта информация также включена в вывод log_autovacuum_min_duration.
  • Увеличена скорость удаления пустых хвостовых табличных страниц при VACUUM-е (Claudio Freire, Alvaro 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 Mannsaker). Используется синтаксис 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() интерпретирует отрицательные годы, как годы до н. э. (Alvaro 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 Verite, 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 Mannsaker).

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_dumppg_dumpallpg_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е.


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


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


Улучшенный мониторинг и администрирование: благодаря добавлению новых ролей упрощается процесс снятия метрик для мониторинга.


Какие фичи понравились вам больше всего? Когда планируете мигрировать?

Комментарии (15)


  1. DonPrus
    09.10.2017 14:35
    +1

    Больше всего понравились — столбцы идентификаторов
    Add identity columns for assigning a numeric value to columns on insert (Peter Eisentraut)
    These are similar to SERIAL columns, but are SQL standard compliant.


    Identity column — это очень хорошо. Но если сделать insert в таблицу с конкретными primary key, счетчик увеличится сам?


    Нет ли ограничений на вставку в такие таблицы, как в sql server?


    1. kevteev
      09.10.2017 16:15
      +1

      GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]

      This clause creates the column as an identity column. It will have an implicit sequence attached to it and the column in new rows will automatically have values from the sequence assigned to it.

      The clauses ALWAYS and BY DEFAULT determine how the sequence value is given precedence over a user-specified value in an INSERT statement. If ALWAYS is specified, a user-specified value is only accepted if the INSERT statement specifies OVERRIDING SYSTEM VALUE. If BY DEFAULT is specified, then the user-specified value takes precedence. See INSERT for details. (In the COPY command, user-specified values are always used regardless of this setting.)

      The optional sequence_options clause can be used to override the options of the sequence. See CREATE SEQUENCE for details.


  1. SXN
    09.10.2017 14:46

    Спасибо за труд автору, будет ли примеры по логическому репликации?
    Заранее спасибо!


    1. pkorobeinikov Автор
      09.10.2017 15:27
      +2

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


  1. shurutov
    09.10.2017 15:03

    Более сильная проверка подлинности, основанная на SCRAM-SHA-256

    Оригинал:
    Stronger password authentication based on SCRAM-SHA-256
    Что соответствует:
    Более сильная проверка пароля, основанная на SCRAM-SHA-256
    Одно слово, а смысл несколько меняется, не находите?


    1. pkorobeinikov Автор
      09.10.2017 15:22

      Спасибо! Сейчас поправим.


  1. BezumaBel
    09.10.2017 15:22

    Спасибо за труд!


  1. xclusn
    09.10.2017 19:01
    +1

    Возможно, будет интересен также полный перевод документации к PostgreSQL 10:
    postgrespro.ru/docs/postgresql/10/index.html
    В его составе есть перевод и этих замечаний к выпуску:
    postgrespro.ru/docs/postgresql/10/release-10.html


  1. Andronas
    09.10.2017 19:32

    Цитата: «Убраны ненужные checkpoint'ы и архивация WAL'а при простое системы (Michael Paquier)»
    Если в сегменте wal есть несколько записей, после чего активности или записей в wal нет долгое время, как обеспечивается сохранность уже записанных в wal транзакций, ведь если на диске где находится wal произойдёт сбой, онлайновые wal могут быть потеряны. Я тут вижу выход например в запуске принудительного переключения wal с последующей архивацией.


  1. stalkerg
    10.10.2017 05:08
    +1

    Если кто хочет собирать новый постгрес при помощи CMake и возможно Ninja то вы можете попробвать эту ветку:
    https://github.com/stalkerg/postgres_cmake/tree/cmake_rel10
    или патч
    https://gist.github.com/stalkerg/9da894195628d24b3cf25f399af3714e


    Там же вы найдёте как можно собрать постгрес под Windows без захода в консоль вообще.


  1. stalkerg
    10.10.2017 05:10
    +1

    Все функции PG_FUNCTION_INFO_V1 автоматически маркируются атрибутом DLLEXPORT на Windows (Laurenz Albe). Если сторонний код использует декларацию extern функции, он так же должен использовать отметку DLLEXPORT для таких деклараций.

    Наконец мои стекнания косвенно но привели к результату. Правда я всё ещё хотел бы видеть контриб модули как "плагины" и внятный API со стороны постгреса.


  1. Envek
    10.10.2017 07:59
    +1

    Добавлена индексная поддержка в btree_gist для типа данных UUID (Paul Jungwirth).

    Я джва года этого ждал! Наконец-то можно использовать многоколоночные exclude constraints для внешних ключей к таблицам с первичным UUID-ключом (ну и вообще с UUID колонками)


    1. stalkerg
      10.10.2017 12:53

      Поменяли бы только реализацию… сегодня это АДъ из-за которого чаще всего и тормозит 1С (а точнее не использует UUID).


      1. Envek
        10.10.2017 22:42

        А можно поподробнее — в чём адъ?


  1. mayorovp
    10.10.2017 09:12

    Очень хотелось бы стандартного бинарного выходного плагина для логической репликации. У меня есть мысль использовать логическую репликацию для ETL вместо надоевшей уже глючной таблицы change_log которую заполняют триггеры — но одинаково не хочется ни парсить инструкции INSERT регулярками, ни писать свой плагин.