• Postgresso 21



      Жизнь продолжается. Продолжаем знакомить вас с самыми интересными новостями PostgreSQL

      Главная новость


      PostgreSQL 13beta

      Вышла долгожданная Бета. Новшества и изменения подробно расписаны здесь, а информация для бета-тестировщиков тут. Кроме того есть и советы по установке на конкретные ОС: вот, например, пошаговая инструкция для RHEL/CentOS/Fedora.

      В статье "Много ли нового в Чёртовой Дюжине?" мы уже подробно описали, чего нового ждать от версии (ответ: много). А если есть повод обсудить тему с англоязычными коллегами, то есть и английская версия.

      Появляются и статьи, посвященные отдельным новым фичам. Габриэле Бартолини (Gabriele Bartolini, 2ndQuadrant) рассказывает, например о Backup manifests and pg_verifybackup in PostgreSQL 13. А о (auto)VACUUM вы найдёте 2 ссылке в нашем разделе статьи.



      Релизы


      PostgreSQL 12.3

      Эта плановая версия решает в том числе проблему безопасности, найденную в инсталляторе для Windows. Вместе с ней вышли и 11.8, 10.13, 9.6.18, и 9.5.22. До этого можно было запустить зловредный код в директориях, куда был загружен инсталлятор, или в рабочей директории. Теперь четко прописаны пути исполняемых файлов. Проблема заведомо существовала и до 9.5, но это уже останется заботой обладателей этих старинных версий.
      Читать дальше →
      • +10
      • 2,5k
      • 8
    • PostgreSQL: Серверное программирование на «человеческом» языке (PL/Perl, PL/Python, PL/v8)

        Postgres знаменит своей расширяемостью, что относится и к поддержке процедурных языков (PL). Никто не может похвастаться языком списком языков такой длины, а потенциально этот список и вовсе не ограничен: для того, чтобы подключить язык к серверу, не требуется сверхусилий. Можно даже придумать собственный язык и сделать его серверным процедурным языком. Переделок в СУБД это не потребует. Как и многое другое, такая расширяемость была заложена с самого начала в архитектуру Postgres.

        Можно и иногда нужно писать PL-языки под задачи. А еще лучше, если кто-то напишет такой фреймворк для написания языков, чтобы можно было писать не на C, а выбрать более комфортный для разработчика языков язык. Как с FDW, которые можно писать на Python.

        Эта статья написана на основе ряда докладов и мастер-классов по этой теме, делавшихся автором на конференциях PgConf.Russia 2019, PgConf.Russia 2018 и DevConf 2017.

        Речь пойдет не об экзотике, а о самых распространённых процедурных языках PL/Perl, PL/Python и PL/V8 (то есть JavaScript) и сравнении их возможностей с PL/pgSQL.
        Читать дальше →
        • +34
        • 4,8k
        • 5
      • Postgresso 20


          Жизнь продолжается. Продолжаем знакомить вас с самыми интересными новостями PostgreSQL

          Главная новость


          Feature Freeze
          Функциональность 13-й версии PostgreSQL заморожена. Теперь только доработки и исправления багов. Список нового, вопреки многим ожиданиям, довольно обширный. Читайте нашу статью
          Много ли нового в «Чёртовой дюжине», где много примеров. Но и в разделе Статьи Postgresso есть ссылки на статьи, посвященные отдельным фичам.

          Релизы


          Postgres Pro Enterprise 12.2.1

          В этой версии совмещены новшества PostgreSQL 12 и особенности ветки Enterprise.
          Расширение multimaster: как и в 11.x, и в других версиях Enterprise, рекомендуется использовать в конфигурации 2+1, когда один из узлов рефери. Подробнее в документации. А ещё теперь можно проверить согласованность данных на узлах кластера, используя функцию mtm.check_query().

          В CFS теперь можно выбирать алгоритмы сжатия. Поддерживаются zstd (по умолчанию), zlib и pglz, но можно добавить другие алгоритмы.

          Ещё одна ударная фича Enterprise — механизм PTRACK, необходимый для эффективной работы нашего приложения pg_probackup, — был основательно переработан и получил новый внешний API. Чтобы резервные копии, уже созданные с PTRACK в pg_probackup, работали в Postgres Pro Enterprise 12.x, нужно обновить pg_probackup до версии 2.2.6 или выше и настроить копирование PTRACK заново.

          Важный патч дедупликации индексов B-tree (автор Анастасия Лубенникова, Postgres Professional) в PostgreSQL 13, но его функциональность уже есть в Enterprise 12.2.1. Причем исключение дубликатов можно отключить для создаваемых индексов, воспользовавшись параметром deduplicate_items команды CREATE INDEX. Об этом есть здесь.
          Читать дальше →
          • +14
          • 3,6k
          • 2
        • Много ли нового в Чёртовой Дюжине?

            Речь пойдёт всего лишь о PostgreSQL 13. 8 апреля состоялась «заморозка» — PostgreSQL feature freeze, теперь в эту версию войдут только те фичи, которые приняты до этой даты.

            Революционной эту версию, пожалуй, трудно назвать. Кардинальных, концептуальных изменений в ней нет. К тому же не успели войти в неё такие важные патчи, как Table и Functions для стандарта JSON/SQL, которых хотелось видеть еще в PG12 рядом с патчем JSONPath; не появились готовые встраиваемые хранилища — лишь дорабатывается интерфейс. Но список доработок всё же впечатляет. Мы подготовили довольно полную сводку вошедших в Чёртову Дюжину патчей.




            Изменения в командах SQL


            CREATE DATABASE… LOCALE

            Утилиты initdb, createdb и команда CREATE COLLATION имеют параметр LOCALE, позволяющий сразу указать значения для LC_CTYPE и LC_COLLATE. Теперь такая же возможность появилась в команде CREATE DATABASE:

            CREATE DATABASE db_koi8r TEMPLATE template0 
                ENCODING 'KOI8R' LOCALE 'ru_RU.KOI8R';
            Читать дальше →
          • Postgresso 19


              Жизнь продолжается. Продолжаем знакомить вас с самыми интересными новостями PostgreSQL.

              Релизы


              Postgres Pro Enterprise 11.17.1 и Postgres Pro Standard 11.17.1

              В Postgres Pro Enterprise 11.17.1 исправлены недостатки, на которые указали пользователи. Серьезные доработки сделаны в расширении multimaster:
              — теперь рекомендуется использовать его в конфигурации с тремя узлами, один из которых голосующий. Подробнее здесь;
              — устранена проблема раздувания WAL путём очистки точек синхронизации удалённого узла и исправления расчёта минимального требующегося LSN. Ранее раздувание WAL иногда случалось при удалении узла из кластера;
              — устранена проблема с возвращением узла в кластер после длительного отключения этого узла;
              исправлена ошибка в точке синхронизации при инициализации модуля multimaster, возникавшая в случае сбоя до первой синхронизации.
              Кроме этого усовершенствован механизм встроенного пула соединений. По сравнению с предыдущей версией, в нём появились следующие новшества:
              — параметр dedicated_users, позволяющий задать список пользователей, для которых в режиме пула соединений будут использоваться выделенные обслуживающие процессы;
              — отдельные обслуживающие процессы теперь могут принимать подключения разных пользователей, так что все подключения к одной базе данных будут относиться к одному общему пулу.
              Есть доработки, общие для Postgres Pro Enterprise 11.17.1 и Postgres Pro Standard 11.17.1. Например, утилита pg_probackup обновлена до версии 2.2.7, а mamonsu — до версии 2.4.4.
              Об этих и других новшествах релиза есть в главке Замечания к выпуску из документации по PPE и PPS.

              Postgres Pro Standard 12.2.1

              Отличия этой версии от PostgreSQL 12 и от Postgres Pro Standard 11.17.1 можно проследить по соответствующим Замечаниям к выпуску.
              Читать дальше →
            • Postgresso 18



                После паузы (отпуск), продолжаем знакомить вас с самыми интересными новостями по PostgreSQL. Не будем придерживаться здесь строго отображения всех релизов и событий, произошедших после последнего, еще октябрьского выпуска Postgresso #17, но важнейшее, произошедшее ещё в конце 2019 всё же постараемся упомянуть.

                Релизы



                PostgreSQL 12.2
                А также 11.7, 10.12, 9.6.17, 9.5.21, и 9.4.26 увидели свет 13 февраля. Последняя в списке и есть последняя: 27-й уже не будет. В 12.2 исправлено огромное количество (более 70) багов, обнаруженных в 12.1. Из них многие в секционировании.

                Решили проблемы с правами в конструкции ALTER… DEPENDS ON EXTENSION. В 12.1 обладатели прав на DROP EXTENSION могли расправляться с объектами, зависимыми от этого расширения.

                Улучшили производительность parallel hash join для процессоров с большим количеством ядер и для hash join с очень большими таблицами.

                Postgres Pro Standard 12.1.1

                Эта версия вышла в конце декабре 2019 и основана, соответственно, на PostgreSQL 12.1. Об особенностях этой версии можно прочитать в этой статье. Там подробно и с примерами рассматриваются:
                — проверка версий ICU;
                — оптимизация блокировок, джойнов и GROUP BY;
                — поддержка PTRACK;
                — WaitLSN;
                и многое другое.
                Читать дальше →
                • +19
                • 6,4k
                • 4
              • PostgreSQL 13: параллельный VACUUM

                  На днях Амит Капила закоммитил патч Масахико Савады, который позволяет выполнять очистку в параллельном режиме. Сама таблица по-прежнему очищается одним (ведущим) процессом, но для очистки индексов он теперь может запускать фоновые рабочие процессы, по одному на каждый индекс. В ручном режиме это позволяет ускорить очистку больших таблиц с несколькими индексами; автоматическая очистка пока не использует эту возможность.
                  Некоторые подробности
                • Вышла Postgres Pro Standard 12.1

                    СУБД Postgres Pro Standard придумана для того, чтобы доставлять наши разработки пользователям быстрее, чем мы можем это сделать через PostgreSQL. Те фичи, которые еще не вошли в PostgreSQL, но находятся на твердом пути туда, мы включаем в Postgres Pro Standard. Также в Postgres Pro Standard входят некоторые расширения, которые востребованы нашими клиентами, но отсутствуют в обычной поставке PostgreSQL.

                    Иногда бывают исключения, когда в Postgres Pro Standard по просьбам юзеров и для их удовлетворения включаются и менее тривиальные фичи, которым по-хорошему место только в Postgres Pro Enterprise. В частности, это PTRACK, о нём ниже.

                    Не все, но изрядная доля дополнительных расширений и утилит, входящих в Standard, разработана в Postgres Professional. Все патчи Postgres Pro придуманы и реализованы нашими силами. Начнем с улучшений, потребовавших вмешательства в ядро СУБД.
                    Читать дальше →
                  • Скоро PGConf.Russia 2020

                      PGConf.Russia 2020 в этом году, как и в прошлом, пройдет в начале февраля, а именно – 3 февраля – мастер-классы, 4го и 5го – доклады. Это первый раз, когда нам не пришлось отодвигать дедлайн по приему заявок на доклады — то ли люди стали более самоорганизованными, то ли появилось больше тем, о которых хочется рассказать.
                      В этой статье я расскажу о том, что ждёт нас на конференции. Полная программа на сайте, пересказывать её ни к чему, однако основные (или показавшиеся мне основными) доклады я приведу здесь.
                      Читать дальше →
                    • Покрывающие индексы для GiST

                        «Покрывающий индекс» не просто еще одна фича, которая может пригодиться. Это вещь сугубо практичная. Без них Index Only Scan может не дать выигрыша. Хотя и покрывающий индекс в разных ситуациях эффективен по-разному.

                        Речь здесь будет не совсем о покрывающих индексах: строго говоря, в Postgres появились так называемые инклюзивные индексы. Но, по-порядку: покрывающий индекс — это индекс, который содержит все значения столбцов, необходимые запросу; при этом обращение к самой таблице уже не требуется. Почти. О «почти» и других нюансах можно прочитать в статье Егора Рогова, входящей в его индексный сериал из 10 (!) частей. А инклюзивный индекс создается специально для поиска по типичным запросам: к поисковому индексу добавляются значения полей, по которым искать нельзя, они нужны только для того, чтобы не обращаться лишний раз к таблице. Такие индексы формируются с ключевым словом INCLUDE.

                        Анастасия Лубенникова (Postgres Professional) доработала метод btree так, чтобы в индекс можно было включать дополнительные столбцы. Этот патч вошел в версию PostgreSQL 11. Но патчи для методов доступа GiST/SP-GiST не успели созреть до выхода этой версии. К 12-й GiST дозрел.
                        Читать дальше →
                      • PG12: Дюжина патчей от Postgres Professional

                          Приятно видеть знакомые фамилии в списке Acknowledgments официального релиза PostgreSQL 12. Мы решили свести вместе попавшие в релиз новшества и некоторые багфиксы, над которыми трудились наши разработчики.

                          1. Поддержка JSONPath


                          Release Notes это звучит как Add support for the SQL/JSON path language (Nikita Glukhov, Teodor Sigaev, Alexander Korotkov, Oleg Bartunov, Liudmila Mantrova)

                          Сам этот патч, возможности JSONPath и история вопроса обсуждались в деталях в отдельной статье здесь на хабре. JSONPath — серьезное достижение Postgres Professional и одно из главных новшеств PostgreSQL 12 вообще.

                          В 2014 году А.Коротковым, О.Бартуновым и Ф.Сигаевым было разработано расширение jsquery, вошедшее в результате в версию Postgres Pro Standard 9.5 (и в более поздние версии Standard и Enterprise). Оно дает дополнительные, очень широкие возможности для работы с json(b).

                          Когда появился стандарт SQL:2016, оказалось, что его семантика не так уж сильно отличается от нашей в расширении jsquery. Не исключено, что авторы стандарта даже поглядывали на jsquery, изобретая JSONPath. Нашей команде пришлось реализовывать немного по-другому то, что у нас уже было и, конечно, много нового тоже.

                          Хотя специальный патч с функциями до сих пор не закоммичен, в патче JSONPath уже есть ключевые функции для работы с JSON(B), например:

                          jsonb_path_query('{"a": [1,2,3,4,5]}', '$.a[*] ? (@ > 2)') возвращает 3, 4, 5
                          jsonb_path_query('{"a": [1,2,3,4,5]}', '$.a[*] ? (@ > 5)') возвращает 0 записей

                          Кроме того, были оптимизированы и некоторые функции, которые уже работали с JSON раньше. Этим успешно занимался Никита Глухов.

                          Например, оператор #>>, соответствующий функциям jsonb_each_text() и jsonb_array_elements_text(), раньше достаточно быстро преобразовывал JsonbValue в text, но работал неторопливо с другими типами. Сейчас всё работает быстро.
                          Читать дальше →
                        • Дайджест новостей из мира PostgreSQL. Выпуск №17



                            Мы продолжаем знакомить вас с самыми интересными новостями по PostgreSQL.

                            Главные новости


                            Релиз-кандидат PostgreSQL 12

                            В релизе-кандидате вся функциональность идентична грядущему официальному релизу. Если вновь выявленные и недоисправленные баги будут закрыты в срок, то официальный релиз выйдет 3 октября. По сравнению с PG 12 beta 4 исправлено несколько багов, в основном связанных с ECPG — SQL, встраиваемом в C. Релиз-кандидат доступен.

                            Читать дальше →
                            • +18
                            • 5,8k
                            • 2
                          • Блокировки в PostgreSQL: 4. Блокировки в памяти

                              Напомню, что мы уже поговорили о блокировках отношений, о блокировках на уровне строк, о блокировках других объектов (включая предикатные), и о взаимосвязи разных типов блокировок.

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


                              Читать дальше →
                              • +35
                              • 7,4k
                              • 8
                            • Блокировки в PostgreSQL: 3. Блокировки других объектов

                                Мы уже поговорили о некоторых блокировках на уровне объектов (в частности — о блокировках отношений), а также о блокировках на уровне строк, их связи с блокировками объектов и об очереди ожидания, не всегда честной.

                                Сегодня у нас сборная солянка. Начнем с взаимоблокировок (вообще-то я собирался рассказать о них еще в прошлый раз, но та статья и так получилась неприлично длинной), затем пробежимся по оставшимся блокировкам объектов, и в заключение поговорим про предикатные блокировки.

                                Взаимоблокировки


                                При использовании блокировок возможна ситуация взаимоблокировки (или тупика). Она возникает, когда одна транзакция пытается захватить ресурс, уже захваченные другой транзакцией, в то время как другая транзакция пытается захватить ресурс, захваченный первой. Это проиллюстрировано на левом рисунке ниже: сплошные стрелки показывают захваченные ресурсы, пунктирные — попытки захватить уже занятый ресурс.

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


                                Читать дальше →
                              • Блокировки в PostgreSQL: 2. Блокировки строк

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



                                  Блокировки строк


                                  Устройство


                                  Напомню несколько важных выводов из прошлой статьи.

                                  • Блокировка должна существовать где-то в разделяемой памяти сервера.
                                  • Чем выше гранулярность блокировок, тем меньше конкуренция (contention) среди одновременно работающих процессов.
                                  • С другой стороны, чем выше гранулярность, тем больше места в памяти занимают блокировки.

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

                                  Есть разные пути решения этой проблемы. В некоторых СУБД происходит повышение уровня блокировки: если блокировок уровня строк становится слишком много, они заменяются одной более общей блокировкой (например, уровня страницы или всей таблицы).

                                  Как мы увидим позже, в PostgreSQL такой механизм тоже применяется, но только для предикатных блокировок. С блокировками строк дело обстоит иначе.
                                  Читать дальше →
                                  • +24
                                  • 8,8k
                                  • 7
                                • Блокировки в PostgreSQL: 1. Блокировки отношений

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

                                    В этом цикле мы поговорим о блокировках (locks). Я буду придерживаться этого термина, но в литературе может встретиться и другой: замóк.

                                    Цикл будет состоять из четырех частей:

                                    1. Блокировки отношений (эта статья);
                                    2. Блокировки строк;
                                    3. Блокировки других объектов и предикатные блокировки;
                                    4. Блокировки в оперативной памяти.

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



                                    Общая информация о блокировках


                                    В PostgreSQL используется множество самых разных механизмов, которые служат для блокировки чего-либо (или по крайней мере так называются). Я поэтому начну с самых общих слов о том, зачем вообще нужны блокировки, какие они бывают и чем отличаются друг от друга. Затем мы посмотрим, что из этого разнообразия встречается в PostgreSQL и только после этого начнем разбираться с разными видами блокировок подробно.
                                    Читать дальше →
                                  • WAL в PostgreSQL: 4. Настройка журнала

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

                                      В предыдущих статьях мы уже посмотрели на довольно большое число важных настроек, так или иначе относящихся к журналу. В этой статье (последней в этом цикле) мы рассмотрим те вопросы настройки, которые еще не обсуждались: уровни журнала и их назначение, а также надежность и производительность журналирования.

                                      Уровни журнала


                                      Основная задача журнала предзаписи — обеспечить возможность восстановления после сбоя. Но, если уж все равно приходится вести журнал, его можно приспособить и для других задач, добавив в него некоторое количество дополнительной информации. Есть несколько уровней журналирования. Они задаются параметром wal_level и организованы так, что журнал каждого следующего уровня включает в себя все, что попадает в журнал предыдущего уровня, плюс еще что-то новое.
                                      Читать дальше →
                                    • WAL в PostgreSQL: 3. Контрольная точка

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

                                        Нерешенная проблема, на которой мы остановились в прошлый раз, состоит в том, что неизвестно, с какого момента можно начинать проигрывание журнальных записей при восстановлении. Начать с начала, как советовал Король из Алисы, не получится: невозможно хранить все журнальные записи от старта сервера — это потенциально и огромный объем, и такое же огромное время восстановления. Нам нужна такая постепенно продвигающаяся вперед точка, с которой мы можем начинать восстановление (и, соответственно, можем безопасно удалять все предшествующие журнальные записи). Это и есть контрольная точка, о которой сегодня пойдет речь.

                                        Контрольная точка


                                        Каким свойством должна обладать контрольная точка? Мы должны быть уверены, что все журнальные записи, начиная с контрольной точки, будут применяться к страницам, записанным на диск. Если бы это было не так, при восстановлении мы могли бы прочитать с диска слишком старую версию страницы и применить к ней журнальную запись, и тем самым безвозвратно повредили бы данные.
                                        Читать дальше →
                                      • SQL: решение задачи о рабочем времени

                                          Здравствуйте, в эфире опять Радио SQL! Сегодня у нас решение задачи, которую мы передавали в нашем предыдущем эфире, и обещали разобрать в следующий раз. И вот этот следующий раз наступил.


                                          Задача вызвала живой отклик у гуманоидов галактики Млечный путь (и неудивительно, с их-то трудовым рабством, которое они до сих пор почитают за благо цивилизации). К сожалению, на третьей планете отложили запуск космической обсерватории «Спектр-РГ» в конце июля 2019 года РХ (летоисчисление местное), с помощью которого планировалось транслировать эту передачу. Пришлось искать альтернативные пути передачи, что привело к небольшому опозданию сигнала. Но всё хорошо, что хорошо кончается.



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

                                          Сделать шаг
                                          • +22
                                          • 11,3k
                                          • 9
                                        • WAL в PostgreSQL: 2. Журнал предзаписи

                                            В прошлый раз мы познакомились с устройством одного из важных объектов разделяемой памяти, буферного кеша. Возможность потери информации из оперативной памяти — основная причина необходимости средств восстановления после сбоя. Сегодня мы поговорим про эти средства.

                                            Журнал


                                            Увы, чудес не бывает: чтобы пережить потерю информации в оперативной памяти, все необходимое должно быть своевременно записано на диск (или другое энергонезависимое устройство).

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

                                            Чтобы это работало, журнальная запись в обязательном порядке должна попасть на диск до того, как туда попадет измененная страница. Отсюда и название: журнал предзаписи (write-ahead log).

                                            Если происходит сбой, данные на диске оказываются в рассогласованном состоянии: какие-то страницы были записаны раньше, какие-то — позже. Но остается и журнал, который можно прочитать и выполнить повторно те операции, которые уже были выполнены до сбоя, но результат которых не успел дойти до диска.
                                            Читать дальше →

                                          Самое читаемое