psql_data_lineage. Сбор информации о движении данных
Версия: 1.0.0.
В исходном дистрибутиве установлено по умолчанию: да.
Связанные компоненты: отсутствуют.
Схема размещения:
public.
Разработано СУБД Pangolin.
Расширение предназначено для сбора информации о движении данных внутри БД.
Объекты
Параметры конфигурирования расширения
В рамках реализации функциональности были добавлены параметры:
Параметр | Тип | Значение по умолчанию | Контекст | Описание |
|---|---|---|---|---|
|
| – |
| Суффикс, добавляемый к уникальным идентификаторам; может быть использован для обеспечения уникальности идентификаторов между различными экземплярами СУБД при централизованном сборе DL |
|
|
|
| Включение функциональности по определению потоков данных и связанной статистической информации |
|
|
|
| Управляет включением дополнительной функциональности отслеживания потоков данных в PL/pgSQL-функциях |
|
|
|
| Максимальное количество записей о статистике уникальных запросов DL (определяется уникальным идентификатором запроса с учетом наименования объектов). Интервал допустимых значений: |
|
| – |
| Исключенные БД, по ним статистика не ведется. Параметр |
|
| – |
| Включенные БД. Статистика будет собираться по этим базам данных. Если параметр не заполнен, то данные будут собираться по всем таблицам (если переменная |
|
|
|
| Параметр конфигурации расширения со значением по умолчанию Можно задать либо относительный путь ( |
Функции
Во всех приведенных далее функциях отсутствуют входные параметры.
psql_data_lineage_objects_meta – метаданные об объектах, участвующих в данном потоке данных.
Выходной параметр | Тип | Описание |
|---|---|---|
|
| Идентификатор запроса, обработанного Data Lineage (не совпадает с |
|
| Идентификатор объекта в рамках СУБД на момент выполнения запроса |
|
| Полное имя объекта в рамках данного потока данных |
|
| Полное имя объекта в рамках БД postgres |
|
| Идентификатор базы данных на момент выполнения запроса |
|
| Тип объекта* |
psql_data_lineage_attributes_meta – метаданные об атрибутах объектов, участвующих в данном потоке данных.
Выходной параметр | Тип | Описание |
|---|---|---|
|
| Идентификатор запроса, обработанного Data Lineage (не совпадает с |
|
| Идентификатор объекта в рамках СУБД на момент выполнения запроса |
|
| Полное имя объекта |
|
| Порядковый номер атрибута. Нумерация начинается с |
|
| Полное имя объекта |
|
| Тип объекта* |
psql_data_lineage_objects – определение потока данных, включая источники/приемники запроса, а также статистическую информацию о потоках.
Выходной параметр | Тип | Описание |
|---|---|---|
|
| Идентификатор. Через этот идентификатор происходит связывание со всеми остальными предоставляемыми данными. Идентификатор формируется на основе идентификатора запроса расширенного метаинформацией ( Номер потока разделяет потоки в рамках одного запроса. Такие потоки появляются в запросах |
|
| Время начала последнего исполнения запроса |
|
| Тип объекта источника* |
|
| Идентификатор объекта источника (пустой при |
|
| Тип объекта приемника* |
|
| Идентификатор объекта приемника |
|
| Текст последнего исполненного плана |
|
| Генерализованный текст запроса |
|
| Время начала первого исполнения запроса |
|
| Длительность последнего исполнения запроса |
|
| Количество успешных исполнений запроса с начала сбора статистики |
|
| Суммарное количество строк, обработанных запросом с начала сбора статистики |
|
| Идентификатор запроса в рамках БД postgres |
|
| Идентификатор родительского запроса, обработанного Data Lineage (не совпадает с Запросы могут иметь вложенный характер. Это поле позволяет отследить цепочку вызовов. Для порождающего запроса в качестве родительского указывается он сам |
|
| Идентификатор запроса, обработанного Data Lineage (не совпадает с |
psql_data_lineage_attributes – информация о движении данных на уровне атрибутов.
Выходной параметр | Тип | Описание |
|---|---|---|
|
| Идентификатор потока данных уровня атрибутов |
|
| Тип объекта источника* |
|
| Идентификатор объекта источника |
|
| Номер атрибута источника |
|
| Номер атрибута приемника |
|
| Идентификатор потока для связи с данными из |
psql_data_lineage_freeze_data – создает файл dl_freezed_stat.stat собранных данных, по которой выполняются все операции просмотра в текущем процессе (до отмены/удаления).
| Тип результата | Описание |
|---|---|
integer | Количество замороженных записей |
psql_data_lineage_reset_freezed – консистентно обновляет замороженные данные, созданные функцией psql_data_lineage_freeze_data. У старых объектов пересчитываются exec_count и rowsCount, новые объекты добавляются.
| Тип результата | Описание |
|---|---|
integer | Количество обновленных записей |
psql_data_lineage_restore_freezed – отменяет заморозку: удаляет файл dl_freezed_stat.stat данных и возвращает сбор статистики в реальном времени.
| Тип результата | Описание |
|---|---|
boolean | Успех выполнения |
psql_data_lineage_reset – неконсистентно очищает общую память от накопленных статистических данных и удаляет файлы, хранящие информацию о потоках данных.
| Тип результата | Описание |
|---|---|
boolean | Успех выполнения |
psql_data_lineage_clean(keep_interval TEXT) – неконсистентно удаляет данные о потоках, старше заданного keep_interval.
| Тип результата | Описание |
|---|---|
integer | Количество удаленных записей |
* – все возможные типы отношений из pg_class (однако на практике индексы не участвуют в потоках данных, поэтому не могут попасть в качестве значения в это поле):
r– обычная таблица;i– индекс (index);S– последовательность (sequence);v– представление (view);m– материализованное представление (materialized view);c– составной тип (composite);t– таблица TOAST;f– сторонняя таблица (foreign).
Дополнительно введенные типы:
T– временная таблица;P– параметр;C– константа;F– функция.
Представления
psql_dl_stats_with_meta показывает статистику метаданных об объектах, участвующих в данном потоке данных. psql_dl_stats_with_meta состоит из следующих столбцов:
Имя столбца | Тип | Описание |
|---|---|---|
|
| Идентификатор. Через этот идентификатор происходит связывание со всеми остальными предоставляемыми данными |
|
| Идентификатор запроса, обработанного Data Lineage (не совпадает с |
|
| Идентификатор запроса, обработанного Data Lineage (не совпадает с Запросы могут иметь вложенный характер. Это поле позволяет отследить цепочку запросов, вызывавших друг друга. Для порождающего запроса в качестве родительского указывается он сам |
|
| Идентификатор запроса в рамках БД postgres |
|
| Источник происхождения атрибута |
|
| Результат преобразования атрибута |
|
| Время начала первого исполнения запроса |
|
| Время начала последнего исполнения запроса |
|
| Текст последнего исполненного плана |
|
| Генерализованный текст запроса |
|
| Длительность последнего исполнения запроса |
|
| Количество успешных исполнений запроса с начала сбора статистики |
|
| Суммарное количество строк, обработанных запросом с начала сбора статистики |
psql_dl_attrstats_with_meta показывает статистику метаданных об атрибутах объектов, участвующих в данном потоке данных, и состоит из следующих столбцов:
Имя столбца | Тип | Описание |
|---|---|---|
|
| Полное имя атрибута в рамках данного потока данных |
|
| Источник происхождения атрибута |
|
| Результат преобразования атрибута |
|
| Текст SQL-запроса, вызвавшего изменение |
Доработка
Доработка: Добавлена поддержка отслеживания потоков данных в PL/pgSQL-функциях.
Версия: 6.7.0
Поддержка отслеживания PL/pgSQL-функций
Расширение psql_data_lineage доработано для отслеживания потоков данных, возникающих при выполнении PL/pgSQL-функций.
Реализована поддержка отслеживания запросов с закешированным планом и отслеживания потоков данных между объектами базы данных как напрямую, так и через переменные plpgsql.
Особенности реализации
При анализе конструкций plpgsql установлено, что генерализация запроса с использованием ранее применявшихся механизмов невозможна. Это связано с тем, что путь выполнения может зависеть от ветвлений (IF), а также от параметров функции или состояния таблиц на момент выполнения.
По этой причине при каждом выполнении запроса, содержащего переменные plpgsql, выполняется повторный разбор дерева запроса. Такой подход соответствует типичному поведению plpgsql и позволяет избежать использования сохраненных на диске данных, которые могут не содержать актуального набора источников данных.
Потоки данных, проходящие через переменные, в статистике Data Lineage отображаются как потоки между объектами базы данных. Если переменная используется в запросе, вместо нее в Data Lineage указываются объекты базы данных, из которых эта переменная была сформирована. Промежуточные потоки, где приемником являлась переменная, в статистике не сохраняются.
Для отслеживания потоков через переменные поддерживаются категории операций:
- определение переменных, участвующих в запросе в качестве источников;
- выборка в переменные (
SELECT ... INTO ...); - присваивание переменным (
:=); - возврат значения переменной в конструкциях
RETURNиRETURN QUERY.
Переменная типа record рассматривается как единый объект потока данных. Если источником является любое поле такой переменной, в качестве реальных источников фиксируются источники всех ее полей.
Например, поток (table1.col1 -> rec1.a), (table2.col2 -> rec1.b), (rec1.a -> table3.col3) в статистике Data Lineage будет эквивалентен потоку (table1.col1 -> table3.col3), (table2.col2 -> table3.col3).
Если для выходного параметра функции не задано имя, вместо undefined используется имя атрибута $return$, что исключает конфликт с пользовательскими переменными.
Дополнительно реализованы изменения:
- Добавлена обработка
RAISE EXCEPTIONс блоком перехвата ошибок. Ранее такие конструкции могли приводить к некорректному состоянию стека вызовов функций в Data Lineage и отмене транзакции. - Сохранение информации о потоках данных для
SELECTвнутри функций допускается даже в случаях, когда назначение запроса невозможно определить. - Устранен конфликт с использованием
pgauditдля роли, выполняющей запросы. Ранее в таких случаях отчет Data Lineage мог не содержать информации оtargetиз-за вложенных запросов, фиксирующих операцииDDL.
Управление
Параметр psql_data_lineage.plpgsql_enable по умолчанию имеет значение true и не требует дополнительной настройки.
При необходимости отключить обработку plpgsql выполните:
ALTER SYSTEM SET psql_data_lineage.plpgsql_enable='false';
После изменения параметра требуется перезагрузка СУБД.
Ограничения
В одной транзакции можно использовать не более 255 уникальных ID-запросов для DDL-запросов, которые имеют одинаковый инициализирующий запрос. Далее ID-запросы могут повторяться.
Ограничения функциональности plpgsql
Для функциональности отслеживания plpgsql действуют ограничения:
- Не поддерживается отслеживание переменных, заданных через
\gset. Такие переменные считаются источником типаCONST. RAISE NOTICEне рассматривается как источник или приемник данных.- Не гарантируется корректная обработка
EXECUTE, если текст запроса формируется из переменной. - Существуют ограничения при использовании пользовательских типов, если переменные таких типов возвращаются из PL/pgSQL-функции.
- Для вложенных запросов может отсутствовать информация о функции-приемнике, если функция вызвана внешним
SELECT, который не содержит потока данных. - Не поддерживается обработка операций
COPY. - Возможна потеря данных при аварийном завершении процесса (
kill -9), поскольку данные хранятся вshared memory. - Для
DDL-запросов максимальное количество объектов, создаваемых одним и тем же запросом без коллизии идентификаторов, ограничено значением 256. - Функции, реализованные на языке C, не обрабатываются.
Ограничения совместимости
Расширение требует соответствия версии ядра СУБД, версии расширения, версии файлов сохраненных планов на диске.
При переносе данных Data Lineage между серверами версии продукта должны совпадать. В ином случае файлы Data Lineage игнорируются, а в журнал выводится предупреждение вида:
WARNING: ignoring invalid data in file ...
Для корректного переноса требуется также файл dl_stat.stat, который создается при остановке сервера и содержит данные из shared memory.
Установка
Для оптимизации выгрузки данных DL рекомендуется создать отдельную обслуживающую БД в которой производится чтение данных DL в структуру обработки информации на усмотрение Администратора DL и дальнейшее использование этих данных для выгрузки администраторами DL. Данная рекомендация не является обязательной, и установка может быть выполнена в любую из существующих БД.
Для включения и настройки функциональности выполните шаги:
-
Добавьте к параметру
shared_preload_librariesзначениеpsql_data_lineage. При необходимости получения дополнительной информации о запросах (например,OIDсоздаваемого объекта при выполненииDDL-запросов) рекомендуется также указать расширениеpg_stat_statements.ALTER SYSTEM SET shared_preload_libraries='psql_data_lineage,pg_stat_statements'; -
Перезагрузите СУБД.
-
Выставьте параметр конфигурации
psql_data_lineage.enableв БД postgres в значениеon:ALTER SYSTEM SET psql_data_lineage.enable='on'; -
Создайте расширение:
CREATE EXTENSION IF NOT EXISTS psql_data_lineage;
Отключение расширения
Для отключения функциональности:
-
Удалите расширение:
DROP EXTENSION psql_data_lineage; -
Сбросьте значение параметра
psql_data_lineage.enable(верните значениеoff):ALTER SYSTEM RESET psql_data_lineage.enable; -
Уберите значение
psql_data_lineageизshared_preload_librariesв конфигурационном файлеpostgresql.confили используя командуALTER SYSTEMс указанием списка расширений с исключеннымpsql_data_lineage:ALTER SYSTEM SET shared_preload_libraries='список расширений'; -
Перезагрузите СУБД.
-
Удалите каталог, заданный параметром
psql_data_lineage.stat_directory:rm -rf {каталог psql_data_lineage.stat_directory}
Настройка
-
Настройте список БД, для которых будет собираться статистика. Для этого реализованы параметры
psql_data_lineage.exclude_databasesиpsql_data_lineage.include_databases. По умолчанию статистика собирается для всех БД, так как по умолчанию в значении параметров пустая строка. Изменение любого из параметров требует перезагрузки СУБД.Примеры использования:
ALTER SYSTEM SET psql_data_lineage.exclude_databases='dl_1,dl_2,dl_3'– сбор статистики по всем существующим БД в сущности СУБД кромеdl_1,dl_2,dl_3;ALTER SYSTEM SET psql_data_lineage.include_databases='dl_3,dl_4,dl_5'– сбор статистики только в БДdl_3,dl_4,dl_5.
Указание
dl_3для обоих параметров возможно, но в таком случае статистика будет собираться только в БДdl_4,dl_5. -
Перезагрузите СУБД для применения параметров.
-
Настройте путь к месту сохранения файлов со статистикой:
-
Пример использования при сохранении данных вне
$PGDATA(рекомендовано):-
Создайте директорию в необходимом месте:
mkdir -p /opt/example_info/dl_stat_new -
Переопределите параметр
psql_data_lineage.stat_directory:ALTER SYSTEM SET psql_data_lineage.stat_directory='/opt/example_info/dl_stat_new'; -
Перезагрузите СУБД для применения параметра. После применения параметра путь сохранения файлов статистики будет:
/opt/example_info/dl_stat_new.
-
-
Пример использования при сохранении в пределах
$PGDATA:-
Создайте директорию в
$PGDATA:mkdir -p $PGDATA/new_info/dl_stat_example -
Переопределите параметр
psql_data_lineage.stat_directory:ALTER SYSTEM SET psql_data_lineage.stat_directory='new_info/dl_stat_example'; -
Перезагрузите СУБД для применения параметра. После применения параметра путь сохранения файлов статистики будет:
$PGDATA/new_info/dl_stat_example.
-
-
Использование расширения
С примерами использования расширения можно ознакомиться в подразделе «Сценарии использования» раздела «Механизм сбора информации о движении данных (Data Lineage)» документа «Руководство администратора».