Задачи администрирования
Управление расширениями
16
Авторские права
© Postgres Professional, 2016–2025
Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов, Игорь Гнатюк
Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
Postgres Professional. Запрещается внесение изменений в материалы
курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу:
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за
любые повреждения и убытки, включая потерю дохода, нанесенные
прямым или непрямым, специальным или случайным использованием
материалов курса. Компания Postgres Professional не предоставляет
каких-либо гарантий на материалы курса. Материалы курса
предоставляются на основе принципа «как есть» и компания Postgres
Professional не обязана предоставлять сопровождение, поддержку,
обновления, расширения и изменения.
2
Темы
Расширения в PostgreSQL
Создание расширений и управление ими
Обновление расширений
Особенности работы pg_dump
3
Расширяемость PostgreSQL
Возможности
функции и языки программирования
типы данных, операторы, методы доступа
обертки сторонних данных (FDW)
Механизмы
изменяемый системный каталог
API для подключения внешних обработчиков
загрузка и выполнение пользовательского кода
Расширяемость — важнейшая черта PostgreSQL — это возможность
подключать «на лету» новый функционал без изменения кода сервера.
Таким образом можно добавлять языки программирования
и разрабатывать на них функции, определять новые типы данных
и операторы для работы с ними, создавать новые методы доступа для
типов данных, разрабатывать обертки сторонних данных для
подключения к внешним источникам.
Для того чтобы это было возможным, системный каталог PostgreSQL
хранит большое количество информации об объектах БД. Эта
информация не зашита жестко в код сервера. Пользователи могут
изменять содержимое таблиц системного каталога, тем самым
добавляя новые объекты и связанный с ними функционал.
Кроме того, в исходном коде PostgreSQL встроено большое количество
хуков и различных API для подключения пользовательских функций.
Это дает возможность разрабатывать такие расширения как
pg_stat_statements, auto_explain, pldebugger и многие, многие другие.
Завершает картину возможность загружать в серверные процессы
пользовательский код. Например, можно написать разделяемую
библиотеку и подключать ее по ходу работы.
В качестве предостережения следует отметить, что выполнение
процессами сервера неправильно написанного пользовательского кода
может привести к катастрофическим последствиям. Следует доверять
только проверенному коду из надежных источников.
4
Расширения
Группа взаимосвязанных объектов БД
установка всех объектов одной командой
невозможность удалить отдельный объект
сохранение связи при выгрузке с помощью pg_dump
инструменты для перехода на новую версию
Источники
в составе дистрибутива (contrib)
внешние расширения
возможность создания собственных расширений
Бывают ситуации, когда несколько объектов базы данных логически
связаны между собой. Например, несколько типов данных, функции
и операторы для работы с ними, классы операторов. Такую связь
можно сделать явной с помощью механизма расширений.
Это облегчает управление объектами:
все объекты устанавливаются одной командой;
невозможно удалить отдельный объект — расширение можно
удалить только полностью;
связь между объектами сохраняется и при создании резервной копии
с помощью утилиты pg_dump;
есть инструменты для управления версиями расширений.
В состав PostgreSQL входит значительное количество полезных
расширений, частью из которых мы уже пользовались.
Другой источник — PostgreSQL Extension Network (PGXN) — сеть
расширений по аналогии с CPAN для Perl: https://pgxn.org/
Расширения могут распространяться и другими способами, в том числе
через пакетные репозитории дистрибутивов ОС.
5
Создание расширения
1.0
CREATE EXTENSION
VERSION '1.0'
имя--1.0.sql
имя.control
скрипт
создания
параметры
DROP EXTENSION
Расширение устанавливается в базу данных командой CREATE
EXTENSION. При этом должны существовать два файла:
управляющий файл «имя.control» с параметрами расширения;
скрипт создания объектов расширения «имя--версия.sql».
Версия традиционно имеет вид «1.0», «1.1» и т. д., но это не
обязательно: она может состоять из любых символов (но не должна
содержать «--» и начинаться или заканчиваться на «-»).
Обычно версию не указывают в команде CREATE EXTENSION,
поскольку текущая актуальная версия записана в управляющем файле
(параметр default_version) и используется по умолчанию.
Другие параметры в управляющем файле указывают на возможность
перемещения объектов расширения между схемами (relocatable),
зависимости от других расширений (requires), возможность установки
только суперпользователем (superuser) и пр.
Расширение удаляется командой DROP EXTENSION. Скрипт для
удаления объектов не требуется.
7
Обновление расширения
1.0 1.1
ALTER EXTENSION
UPDATE TO '1.1'
1.2
ALTER EXTENSION
UPDATE TO '1.2'
CREATE EXTENSION
VERSION '1.0'
имя--1.0.sql
имя.control
имя--1.0--1.1.sql имя--1.1--1.2.sql
скрипт
создания
скрипт
обновления
параметры
имя--1.2.control
дополнит.
параметры
Обновление версии расширения выполняется командой ALTER
EXTENSION UPDATE. При этом должен существовать скрипт
обновления «имя--старая-версия--новая-версия.sql», содержащий
необходимые для обновления команды.
Также необходимо изменить управляющий файл «имя.control», обновив
актуальную версию и, возможно, другие параметры.
При необходимости может существовать и отдельный управляющий
файл, привязанный к версии. Например, если в версии 1.2 появилась
зависимость от другого расширения, то эту зависимость лучше указать
не в основном управляющем файле, а в дополнительном файле версии
1.2. Параметры, указанные в дополнительном управляющем файле,
имеют приоритет над параметрами основного.
В примере, приведенном на слайде, показаны скрипты обновления
1.0→1.1 и 1.1→1.2. Можно создать и скрипт 1.0→1.2, но, как правило,
это не требуется: механизм расширений сам берет на себя выбор пути
обновления с учетом доступных переходов между версиями. Например,
если установлена версия 1.0, то ее можно обновить сразу до 1.2:
сначала автоматически применится скрипт 1.0→1.1, а затем 1.1→1.2.
Как и при создании, при обновлении номер версии обычно не
указывают — в этом случае обновление происходит до последней
актуальной версии, записанной в основном управляющем файле.
9
Итоги
Расширяемость — важнейшее свойство PostgreSQL
Расширения — упаковка связанных объектов БД
Механизм расширений содержит инструменты для
обновления версий, поддержки работы pg_dump
10
Практика
1. Установите расширение uom и убедитесь, что оно появилось
в списке доступных.
2. Создайте расширение uom, не указывая версию.
Какая версия создалась и какими скриптами?
3. Добавьте в справочник футы и дюймы.
4. Измените доступ к справочной таблице:
привилегия SELECT должна быть только у специально
созданной роли, а не у всех.
5. Проверьте, как pg_dump выгружает объекты расширения:
таблицу, тип, функции и операторы, содержимое таблицы,
права доступа.
1. Файлы расширения расположены в подкаталоге uom домашнего
каталога пользователя student. Процесс установки аналогичен тому,
что использовался в демонстрации.
3. При добавлении данных важно, чтобы у новых записей значение
столбца predefined было false.
Коэффициенты пересчета:
1 фут = 0,3048 м
1 дюйм = 0,0254 м