=====Расширение диспетчера разделов PostgreSQL (`pg_partman`)=====
PostgreSQL Partition Manager — это расширение, упрощающее управление секционированием таблиц по времени или серийным номерам. У него много опций, но обычно нужны лишь некоторые, поэтому его гораздо проще использовать, чем может показаться (и определенно проще, чем реализовать самому). В настоящее время триггерные функции обрабатывают только вставки в родительскую таблицу. Обновления, которые перемещают значение из одного раздела в другой, пока не поддерживаются. Некоторые возможности этого расширения были расширены в блоге автора - http://www.keithf4.com/tag/pg_partman
Если вы попытаетесь вставить данные в набор разделов, содержащий данные для несуществующего раздела, эти данные будут помещены в родительскую таблицу набора. Это предпочтительнее автоматического создания новых разделов для соответствия этим данным, поскольку ошибка, приводящая к вставке неразделенных данных, может привести к созданию множества нежелательных дочерних таблиц. Функция **check_parent()** обеспечивает мониторинг любых данных, вставляемых в родительские элементы, а набор функций **partition_data_*** может легко разбить эти данные для вас, если они являются допустимыми. Это намного проще, чем очищать потенциально сотни или тысячи ненужных разделов. А также лучше, чем выкидывать ошибку и терять данные!
Обратите внимание, что будущее создание дочерней таблицы основано на данных, которые в настоящее время находятся в разделе, установленном как для временного, так и для последовательного разделения. Это означает, что если вы поместите «будущие» данные в набор разделов, вновь создаваемые таблицы будут основываться на этом значении. Это может привести к тому, что промежуточные данные перейдут к родительской таблице, как указано выше, если дочерней таблицы не существует. Рекомендуется установить достаточно высокое значение **premake**, чтобы охватить ожидаемый диапазон вставляемых данных, и значение **optimise_trigger**, чтобы эффективно обрабатывать наиболее частый диапазон данных. Дополнительные пояснения по этим значениям конфигурации см. ниже.
Если у вас есть существующий набор разделов, и вы хотите перенести его на pg_partman, см. файл migration.md в папке doc.
====Наследование свойства дочерней таблицы====
Для этого расширения большинство атрибутов дочерних разделов получаются от исходного родителя. Сюда входят значения по умолчанию, индексы (первичные ключи, уникальные, кластеризация и т. д.), внешние ключи (необязательно), табличное пространство, ограничения, привилегии и владение. Это также включает свойства таблицы OID и UNLOGGED. Для управления привилегиями всякий раз, когда создается новый раздел, он будет получать информацию о своих привилегиях и правах собственности из того, что есть у родителя в это время. Привилегии предыдущего раздела не изменяются. Если предыдущие разделы требуют обновления своих привилегий, доступна отдельная функция. Это сохраняется как отдельный процесс из-за того, что это дорогостоящая операция, когда набор разделов становится больше. Значения по умолчанию, индексы, табличное пространство и ограничения для родителя применяются только к вновь созданным разделам и не устанавливаются задним числом для уже существующих разделов. Хотя обычно вы не создаете индексы для родителя набора разделов, в данном случае это значительно упрощает управление. В родительской таблице не будет данных (если все работает правильно), поэтому они не будут занимать место и не будут влиять на производительность системы. Использование родительской таблицы в качестве элемента управления данными дочерних таблиц, как это, дает лучшее место для управления вещами, которые немного более естественны, чем таблица конфигурации или использование функций настройки.
====Разбиение на секции====
Разбиение на секции с несколькими уровнями поддерживается. Вы можете сделать время-время, id-id, time-id и id-time. Не существует установленного ограничения на уровень разбиения, которое вы можете сделать, но будьте благоразумны и помните о соображениях производительности при управлении многими таблицами в одном наборе наследования. Кроме того, если количество таблиц в одном наборе разделов становится очень большим, вам, возможно, придется настроить параметр **max_locks_per_transaction** postgresql.conf выше значения по умолчанию, равного 64. В противном случае вы можете столкнуться с проблемами с общей памятью или даже привести к сбою кластера. По умолчанию все наборы подразделов требуют **run_maintenance()** для создания новых разделов. Одноуровневые наборы разделов, основанные на времени, уже делают это, но одноуровневые последовательные наборы этого не делают. Если у вас возникают конфликты, когда **run_maintenance()** вызывается для общего обслуживания всех наборов разделов, вы можете установить для столбца **use_run_maintenance** в таблице **part_config** значение false, если вы не хотите, чтобы этот общий вызов управлял вашим набором подразделов. Но затем вы должны вызывать **run_maintenance(parent_table)** напрямую и достаточно часто, чтобы создавать разделы в будущем. Дополнительные сведения см. в функциях **create_parent_sub()** и **run_maintenance()** ниже.
====Ограничения при секционировании====
Наименьший поддерживаемый интервал составляет 1 секунду, а верхний предел ограничен минимальным и максимальным значениями метки времени, поддерживаемыми PostgreSQL (http://www.postgresql.org/docs/current/static/datatype-datetime.html).
При первом запуске **create_parent()** для создания набора разделов интервалы менее дня округляются в меньшую сторону при определении того, какой раздел будет создан первым. Интервалы менее 24 часов, но более 1 минуты используют ближайший час с округлением в меньшую сторону. Интервалы менее 1 минуты округляются до ближайшей минуты. Однако будет создано достаточно разделов, чтобы поддерживать реальное текущее время. Это означает, что при запуске **create_parent()** может быть создано больше предыдущих разделов, чем ожидалось, и некоторые будущие разделы не будут созданы. Первый запуск **run_maintenance()** исправит этот недостаток. Это происходит из-за возможности поддержки настраиваемых интервалов времени. Любые интервалы, превышающие или равные 24 часам, должны привести к ожидаемому результату.
Имейте в виду, что для интервалов, равных или превышающих 100 лет, расширение будет использовать реальное начало века или тысячелетия для определения имени раздела и правил ограничений. Например, 21 век и 3 тысячелетие начались 1 января 2001 года (а не 2000 года). Это также означает, что нет года «0». Слишком сложно попытаться обойти это и сделать хорошие «ровные» имена разделов и правила для обработки всех возможных периодов времени, которые могут понадобиться людям. Во всем виноваты создатели григорианского календаря.
====Ограничения длины имени====
PostgreSQL имеет ограничение длины имени объекта в 63 символа. Если вы попытаетесь создать объект с более длинным именем, он обрежет все символы в конце, чтобы соответствовать этому ограничению. Это может вызвать очевидные проблемы с именами разделов, которые зависят от наличия определенного суффикса имени. PG Partman автоматически обрабатывает это для всех дочерних таблиц, триггерных функций и триггеров. Он урежет существующее имя родительской таблицы, чтобы оно соответствовало требуемому суффиксу. Имейте в виду, что если у вас есть таблицы с очень длинными похожими именами, вы можете столкнуться с конфликтами имен, если они являются частью отдельных наборов разделов. Имейте в виду, что при последовательном секционировании со временем имя таблицы будет усекаться все больше и больше, чтобы соответствовать более длинному суффиксу раздела. Поэтому, хотя расширение попытается обработать этот пограничный случай за вас, рекомендуется, чтобы имена таблиц, которые будут секционированы, были как можно короче.
====Уникальные ограничения и Upsert====
Наследование таблиц в PostgreSQL не позволяет применять первичный ключ или уникальный индекс/ограничение родительской таблицы ко всем дочерним таблицам. Ограничение применяется к каждой отдельной таблице, но не ко всему набору разделов в целом. Например, это означает, что неосторожное приложение может привести к дублированию значения первичного ключа в наборе разделов. Это одна из «больших проблем», вызывающая проблемы с производительностью при разбиении на разделы в других системах баз данных, и одна из причин задержки внедрения разбиения на разделы, встроенного в PostgreSQL. В то же время в pg_partman включен скрипт Python, который может обеспечить мониторинг, чтобы гарантировать, что отсутствие этой функции не причинит долгосрочного вреда. См. check_unique_constraint.py в разделе «Скрипты».
INSERT … ON CONFLICT (upsert) поддерживается в триггере разделения, но очень ограничено. Основные ограничения заключаются в том, что нарушения ограничений, вызывающие срабатывание предложения ON CONFLICT, происходят только в отдельных дочерних таблицах, которые фактически содержат данные, по причинам, описанным выше. Более серьезной проблемой, чем дублирование данных, является предложение ON CONFLICT DO UPDATE, которое может не срабатывать и приводить к крайне несогласованным данным, если его не учитывать. Неясно, удастся ли преодолеть это ограничение, если разделение основано на наследовании и триггерах. В ситуациях, когда вставляются только новые данные, upsert может значительно повысить производительность. Однако, если вы полагаетесь на данные в старых разделах, чтобы вызвать нарушение ограничений, которое обычно обрабатывает upsert, это, скорее всего, не сработает. Кроме того, если результирующее UPDATE в конечном итоге нарушит ограничение разделения этой таблицы chld, оно завершится ошибкой. В настоящее время pg_partman не поддерживает ОБНОВЛЕНИЯ, требующие перемещения строки из одной дочерней таблицы в другую.
Upsert является необязательным, отключенным по умолчанию, и рекомендуется тщательно протестировать его перед внедрением в производство и внимательно следить за ним. См. https://www.postgresql.org/docs/9.5/static/sql-insert.html.
====Logging/Monitoring====
Расширение PG Jobmon (https://github.com/omniti-labs/pg_jobmon) является необязательным и позволяет проводить аудит и мониторинг обслуживания разделов. Если jobmon установлен и настроен правильно, он будет автоматически использоваться partman без дополнительной настройки. Jobmon также можно включать и выключать отдельно для каждого набора разделов, используя столбец **jobmon** в таблице **part_config** или с помощью параметра **create_parent(**) во время первоначальной настройки. Обратите внимание, что если вы пытаетесь разбить таблицы **pg_jobmon**, вы ДОЛЖНЫ установить для опции **create_parent()** значение false, иначе она будет переведена в постоянную блокировку, поскольку **pg_jobmon** будет пытаться записывать в таблицу, которую он пытается разбить. По умолчанию любая функция, которая не может успешно запуститься 3 раза подряд, вызовет предупреждение **jobmon**. Вот почему значение pre-make по умолчанию установлено равным 4, так что предупреждение будет выдано вовремя для вмешательства без необходимости дополнительной настройки **jobmon**. Конечно, вы можете настроить jobmon для оповещения до (или позже) 3 сбоев, если это необходимо. Если вы используете partman в производственной среде, НАСТОЯТЕЛЬНО рекомендуется установить jobmon и настроить какой-либо сторонний мониторинг для оповещения в случае сбоя разделения (Nagios, Circonus и т. д.).
====Background Worker====
В PostgreSQL 9.4 появилась возможность создавать собственные фоновые рабочие процессы и динамически загружать их во время выполнения. BGW **pg_partman** — это, по сути, просто планировщик, который запускает для вас функцию **run_maintenance()**, поэтому вам не нужно использовать внешний планировщик (cron и т. д.). Прямо сейчас он ничем не отличается от прямого вызова **run_maintenance()**, но это может измениться в будущем. Инструкции по установке см. в файле README.md. Если вам нужно вызвать run_maintenance() непосредственно для каких-либо конкретных наборов разделов, вам все равно придется делать это вручную с помощью внешнего планировщика. Это поддерживает только те наборы разделов, для которых **use_run_maintenance** в **%%**part_config**%%** имеет значение true. Сообщения LOG выводятся в обычный файл журнала PostgreSQL, чтобы указать, когда запускается BGW. Дополнительные сообщения журнала доступны, если для параметра //log_min_messages// установлено значение «DEBUG1».
Следующие параметры конфигурации доступны для добавления в postgresql.conf для управления процессом BGW:
* **pg_partman_bgw.dbname** - Обязательный параметр. Базы данных, на которых будет работать **run_maintenance()**. Если их несколько, используйте список, разделенный запятыми. Если не установлено, BGW ничего не сделает.
* **pg_partman_bgw.interval** - Количество секунд между вызовами **run_maintenance()**. По умолчанию 3600 (1 час). Количество секунд между вызовами run_maintenance(). По умолчанию 3600 (1 час).
* **pg_partman_bgw.role** - роль, от которой будет работать **run_maintenance()**. По умолчанию «постгрес». Допускается только одно имя роли.
* **pg_partman_bgw.analyze** - Та же цель, что и у аргумента **p_analyze** для **run_maintenance()**. Подробнее см. ниже. Установите «включено» для TRUE. Установите «выкл.» для FALSE. По умолчанию включено.
* **pg_partman_bgw.jobmon** - Та же цель, что и у аргумента **p_jobmon** для **run_maintenance()**. Подробнее см. ниже. Установите «включено» для TRUE. Установите «выкл.» для FALSE. По умолчанию включено.
====Объекты расширения====
Для запуска всех этих функций необходимо использовать суперпользователя, чтобы правильно установить привилегии и права собственности во всех случаях. Все они устанавливаются с помощью SECURITY DEFINER, поэтому, если вы не можете использовать суперпользователя, просто назначьте роль суперпользователя в качестве владельца.
В качестве примечания для людей, которые не были в курсе, вы можете называть аргументы в вызовах функций, чтобы упростить их вызов и избежать путаницы, когда есть много возможных аргументов. Если для значения указано значение по умолчанию, передавать значение этому аргументу не требуется. Например: **SELECT create_parent('schema.table', 'col1', 'time', 'daily', p_start_partition := '2015-10-20');**
====Creation Functions====
create_parent(
p_parent_table text,
p_control text,
p_type text,
p_interval text,
p_constraint_cols text[] DEFAULT NULL,
p_premake int DEFAULT 4,
p_use_run_maintenance boolean DEFAULT NULL,
p_start_partition text DEFAULT NULL,
p_inherit_fk boolean DEFAULT true,
p_epoch boolean DEFAULT 'none',
p_upsert text DEFAULT '',
p_trigger_return_null boolean DEFAULT true,
p_jobmon boolean DEFAULT true,
p_debug boolean DEFAULT false)
* Основная функция для создания набора разделов с одной родительской таблицей и унаследованными дочерними. Родительская таблица уже должна существовать. Примените все значения по умолчанию, индексы, ограничения, привилегии и права собственности к родительской таблице, чтобы они распространялись на дочерние.
* Блокировка ACCESS EXCLUSIVE применяется к родительской таблице во время выполнения этой функции. При выполнении этой функции данные не перемещаются, поэтому блокировка должна быть короткой.
* **p_parent_table** — существующая родительская таблица. ДОЛЖНА соответствовать схеме, даже если она находится в общедоступной схеме.
* **p_control** - столбец, на котором будет основано разбиение. Должен быть столбцом на основе времени или целого числа.
* **p_type** — одно из следующих значений для установки используемого типа разбиения:
* * **time**
* * * Создайте набор разделов на основе времени, используя заданный ниже интервал.
* * * Количество разделов, которые наиболее эффективно управляются позади и впереди текущего, определяется значением конфигурации optim_trigger в таблице part_config (значение по умолчанию 4 означает, что лучше всего обрабатываются данные для 4 предыдущих и 4 будущих разделов).
* * * Остерегайтесь устанавливать слишком высокое значение optimize_trigger, так как это уменьшит прирост эффективности.
* * * Вставки в родительскую таблицу за пределами окна optimize_trigger будут выполняться в соответствующей дочерней таблице, если она существует, но производительность будет снижаться из-за более высоких накладных расходов на обработку этого условия.
* * * Если дочерняя таблица для этого значения времени не существует, строка будет передана родительской.
* * * Функция создания и триггера дочерней таблицы обновляется с помощью функции **run_maintenance()**.
* * **time-custom**
* * * Позволяет использовать любой временной интервал вместо предопределенных ниже. Работает так же, как «time».
* * * Обратите внимание, что этот метод использует таблицу поиска, а также оператор динамической вставки, поэтому производительность не будет такой же хорошей, как при использовании предопределенных интервалов. Таким образом, хотя он и более гибкий, он жертвует скоростью.
* * * Создание дочерней таблицы обновляется с помощью функции **run_maintenance()**.
* * **id**
* * * Создайте набор разделов на основе serial/id-based. Та же функциональность и использование значения optimize_trigger, что и у метода «time».
* * * По умолчанию, когда значение идентификатора достигает 50% от максимального значения для этого раздела, он автоматически создает следующий по порядку раздел, если он еще не существует. Это можно изменить, чтобы вместо этого использовать run_maintenance(). См. примечания для этой функции ниже.
* * * Поддерживает только значения id больше или равные нулю.
* **p_interval** - интервал времени или числового диапазона для каждого раздела. Независимо от типа разбиения, значение должно быть задано как текст. Общие интервалы «год - четверть часа» относятся к типу «time» и обеспечивают более высокую производительность, чем использование произвольного временного интервала (time-custom).
* * **yearly** - Один раздел в год
* * **quarterly** - Один раздел в годовой квартал. Разделы называются YYYYqQ (например: 2012q4))
* * **monthly** - Один раздел в месяц
* * **weekly** - Один раздел в неделю. Соответствует формату даты недели ISO (http://en.wikipedia.org/wiki/ISO_week_date). Разделы называются IYYYwIW (например: 2012w36)
* * **daily** - Один раздел в день
* * **hourly** - Один раздел в час
* * half-hour - Один раздел за 30-минутный интервал в полчаса (12:00, 12:30)
* * **quarter**-hour - Один раздел за 15-минутный интервал в четверть часа (12:00, 12:15, 12:30, 12:45)
* * - Для пользовательского типа секционирования по времени это может быть любое значение интервала, допустимое для интервального типа данных PostgreSQL. Не вводите значение параметра, просто оставьте текст.
* * - Для разделов на основе идентификаторов диапазон целочисленных значений идентификатора, который должен быть установлен для каждого раздела. Введите это как целое число в текстовом формате («100», а не 100). Должно быть больше или равно 10.
* p_constraint_cols - необязательный параметр массива для установки столбцов, для которых будут установлены дополнительные ограничения. См. раздел «О программе» выше для получения дополнительной информации о том, как это работает, и о функции **apply_constraints()** о том, как это используется.
* **p_premake** - сколько дополнительных разделов всегда должно оставаться впереди текущего раздела. Значение по умолчанию — 4. При этом будет создано как минимум 5 разделов, включая текущий. Например, если сегодня 6 сентября, а в **premake** для дневного раздела установлено значение 4, то разделы будут созданы для 6-го, а также 7-го, 8-го, 9-го и 10-го. Обратите внимание, что некоторые интервалы могут иногда привести к тому, что дополнительный раздел будет предварительно создан или один будет пропущен из-за високосных лет, разной длины месяцев, перехода на летнее время (в системах, отличных от UTC) и т. д. Это ничего не повредит и будет самокорректироваться. Если разбиение когда-либо отстает от значения **premake**, нормальный запуск **run_maintenance()** и вставка данных должны автоматически наверстать упущенное.
* **p_use_run_maintenance** - Используется, чтобы сообщить partman, хотите ли вы переопределить способ создания дочерних разделов по умолчанию. Установите это значение в **TRUE**, чтобы позволить вам использовать функцию **run_maintenance()** без каких-либо параметров таблицы для создания новых дочерних таблиц для последовательного секционирования вместо использования метода 50%, упомянутого выше. Разделение на основе времени ДОЛЖНО использовать **run_maintenance()**, поэтому либо оставьте это значение true, либо вызовите функцию **run_maintenance()** непосредственно для набора разделов, передав родительскую таблицу в качестве параметра. Дополнительную информацию см. в описании **run_mainance** в разделе «Функции обслуживания» ниже.
* **p_start_partition** - позволяет указать первый раздел набора вместо его автоматического определения. Должна быть timestamp (для основанного на времени) или положительного целого числа (для основанного на идентификаторе) значения. Имейте в виду, однако, что фактический тип данных параметра — text. Для разбиения на основе времени будут созданы все разделы, начиная с заданной временной метки до **CURRENT_TIMESTAMP** (плюс premake). Для разделения на основе идентификатора будет создан только раздел, начинающийся с заданного значения (плюс premake).
* **p_inherit_fk** - позволяет **pg_partman** автоматически наследовать любые внешние ключи, существующие в родительской таблице, всем ее дочерним элементам. По умолчанию TRUE.
* **p_epoch** - сообщает **pg_partman**, что управляющий столбец имеет целочисленный тип, но на самом деле представляет собой значение временой эпохи. Вы также можете указать, является ли значение секундами или миллисекундами. Допустимые значения для этой опции: «seconds», «milliseconds» и «none». По умолчанию «none». Все триггеры, ограничения и имена таблиц будут привязаны ко времени. В дополнение к обычному индексу для контрольного столбца убедитесь, что вы создали функциональный, основанный на времени индекс для контрольного столбца (to_timestamp(controlcolumn)), чтобы это работало эффективно.
* p_upsert - добавляет upsert для вставки запросов в триггер раздела, чтобы разрешить обработку конфликтов. По умолчанию «(пустая строка), что означает, что он неактивен.
* * введенное здесь значение представляет собой полное предложение ON CONFLICT, которое затем будет добавлено к оператору(ам) INSERT в триггере.
* * Пример: чтобы игнорировать конфликтующие строки в таблице с первичным ключом «id», установите для p_upsert значение **%%'ON CONFLICT (id) DO NOTHING'%%**
* * Пример: чтобы обновить конфликтующую строку в таблице со столбцами (id(pk), val), установите для p_upsert значение **%%'ON CONFLICT (id) DO UPDATE SET val=EXCLUDED.val'%%**
* * Требуется postgresql 9.5
* * Дополнительную информацию см. в разделе «О программе» выше.
* **p_trigger_return_null** - Логическое значение, позволяющее управлять поведением триггера раздела RETURN. По умолчанию это верно, и триггер возвращает NULL, чтобы предотвратить попадание данных в родительскую таблицу, а также в дочерние. Однако если у вас есть несколько триггеров и вы полагаетесь на то, что возвращаемое значение будет значением столбца NEW, это может вызвать проблему. Установка для этого значения конфигурации значения false приведет к тому, что триггер раздела вернется в состояние RETURN NEW. Затем вы несете ответственность за правильную обработку возвращаемого значения в другом триггере. В противном случае это приведет к тому, что новые данные попадут как в дочернюю, так и в родительскую таблицу набора разделов.
* **p_jobmon** - разрешить pg_partman использовать расширение pg_jobmon для контроля правильности работы секционирования. По умолчанию TRUE.
* **p_debug** - включает дополнительную отладочную информацию.
create_sub_parent(
p_top_parent text,
p_control text,
p_type text,
p_interval text,
p_constraint_cols text[] DEFAULT NULL,
p_premake int DEFAULT 4,
p_start_partition text DEFAULT NULL,
p_inherit_fk boolean DEFAULT true,
p_epoch boolean DEFAULT 'none',
p_jobmon boolean DEFAULT true,
p_debug boolean DEFAULT false)
RETURNS boolean;
* Создайте набор подразделов уже существующего набора разделов.
* ''p_top_parent''- Этот параметр является родительской таблицей уже существующего набора разделов. Он говорит ''pg_partman''превратить все дочерние таблицы данного набора разделов в их собственные родительские таблицы их собственных наборов разделов, используя остальные параметры этой функции.
* Все остальные параметры этой функции имеют точно такое же назначение, как и параметры ''create_parent()'', но вместо этого используются для указания ''pg_partman''того, как должна быть разделена каждая дочерняя таблица.
* Например, если у вас есть существующий раздел, созданный по годам, и вы хотите разбить каждый из годовых разделов по дням, вы должны использовать эту функцию.
* Рекомендуется, чтобы имена таблиц были короткими для наборов подразделов, если вы планируете полагаться на имена таблиц для организации. Суффикс, добавленный в конец имени таблицы, всегда гарантированно присутствует для любого типа раздела, активного для этого набора, но если общая длина превышает 63 символа, исходное имя будет усечено. Более длинные имена таблиц могут привести к усечению исходных имен родительских таблиц и, возможно, обрезанию суффикса секционирования верхнего уровня. Я не могу контролировать это и сделал требование, чтобы суффикс разделения самого низкого уровня сохранялся.
* Обратите внимание, что для первого уровня подразделов ''p_parent_table''аргумент, который вы изначально дали ''create_parent()'', будет точно таким же значением, которое вы дали ''create_sub_parent()''. Если вам нужно дальнейшее разбиение, вы должны начать давать ''create_sub_parent()''другое значение (дочерние таблицы набора разделов верхнего уровня).
* Обратите внимание, что для разбиения ID дальнейшее обслуживание раздела должно выполняться с помощью run_maintenace() и не использовать правило 50%, упомянутое выше.
partition_data_time(
p_parent_table text,
p_batch_count int DEFAULT 1,
p_batch_interval interval DEFAULT NULL,
p_lock_wait numeric DEFAULT 0,
p_order text DEFAULT 'ASC',
p_analyze boolean DEFAULT true
) RETURNS bigint
* Эта функция используется для секционирования данных, которые могли существовать до настройки родительской таблицы как набора секций на основе времени, или для исправления данных, случайно вставленных в родительскую таблицу.
* Если нужного раздела нет, он будет создан автоматически. Если нужный раздел уже существует, данные будут перемещены туда.
* Если вы пытаетесь автоматически разбить большой объем данных, рекомендуется запускать эту функцию с внешним скриптом и соответствующими пакетными настройками. Это поможет избежать блокировок транзакций и предотвратит обширный откат в случае сбоя. См. раздел « **Скрипты** » для включенного скрипта Python, который сделает это за вас.
* Для наборов с подразделами вы должны начать секционировать данные на самом высоком уровне и продвигаться вниз по каждому уровню. Все данные не будут автоматически перемещаться на самый низкий уровень при запуске сверху для набора с подразделами.
* ''p_parent_table''- существующая родительская таблица. Предполагается, что именно здесь находятся неразделенные данные. ДОЛЖЕН соответствовать схеме, даже если она находится в общедоступной схеме.
* ''p_batch_interval''- необязательный аргумент, интервал времени, сколько данных нужно переместить. Это может быть меньше интервала секционирования, что позволяет разбивать секции очень большого размера на более мелкие пакеты фиксации. По умолчанию используется сконфигурированный интервал раздела, если он не задан или если вы задали интервал, превышающий интервал раздела.
* ''p_batch_count''- необязательный аргумент, сколько раз запускать за ''batch_interval''один вызов этой функции. Значение по умолчанию — 1.
* ''p_lock_wait''- необязательный аргумент, устанавливает, сколько секунд ждать разблокировки строки до истечения времени ожидания. По умолчанию ждать вечно.
* ''p_order''- необязательный аргумент, по умолчанию данные переносятся из родителя в порядке возрастания (ASC). Позволяет изменить порядок в порядке убывания (DESC).
* ''p_analyze''- необязательный аргумент, по умолчанию всякий раз, когда создается новая дочерняя таблица, выполняется анализ родительской таблицы набора разделов, чтобы гарантировать, что исключение ограничений работает. Этот анализ можно пропустить, установив для него значение false, что поможет увеличить скорость перемещения больших объемов данных. Если для этого параметра установлено значение false, настоятельно рекомендуется выполнить ручной анализ набора разделов после завершения, чтобы обеспечить правильное обновление статистики.
* Возвращает количество строк, перемещенных из родительской таблицы в секции. Возвращает ноль, когда родительская таблица пуста и секционирование завершено.
partition_data_id(
p_parent_table text,
p_batch_count int DEFAULT 1,
p_batch_interval int DEFAULT NULL,
p_lock_wait numeric DEFAULT 0,
p_order text DEFAULT 'ASC') RETURNS bigint
* Эта функция используется для разделения данных, которые могли существовать до настройки родительской таблицы в качестве набора разделов с серийным идентификатором, или для исправления данных, которые случайно были вставлены в родительскую таблицу.
* Если нужного раздела нет, он будет создан автоматически. Если нужный раздел уже существует, данные будут перемещены туда.
* Если вы пытаетесь автоматически разбить большой объем данных, рекомендуется запускать эту функцию с внешним скриптом и соответствующими пакетными настройками. Это поможет избежать блокировок транзакций и предотвратит обширный откат в случае сбоя. См. раздел « **Скрипты** » для включенного скрипта Python, который сделает это за вас.
* Для наборов с подразделами вы должны начать секционировать данные на самом высоком уровне и продвигаться вниз по каждому уровню. Все данные не будут автоматически перемещаться на самый низкий уровень при запуске сверху для набора с подразделами.
* ''p_parent_table''- существующая родительская таблица. Предполагается, что именно здесь находятся неразделенные данные. ДОЛЖЕН соответствовать схеме, даже если она находится в общедоступной схеме.
* ''p_batch_interval''- необязательный аргумент, целое число, представляющее интервал перемещения данных. Это может быть меньше интервала секционирования, что позволяет разбивать секции очень большого размера на более мелкие пакеты фиксации. По умолчанию используется сконфигурированный интервал раздела, если он не задан или если вы задали интервал, превышающий интервал раздела.
* ''p_batch_count''- необязательный аргумент, сколько раз запускать за ''batch_interval''один вызов этой функции. Значение по умолчанию — 1.
* ''p_lock_wait''- необязательный аргумент, устанавливает, сколько секунд ждать разблокировки строки до истечения времени ожидания. По умолчанию ждать вечно.
* ''p_order''- необязательный аргумент, по умолчанию данные переносятся из родителя в порядке возрастания (ASC). Позволяет изменить порядок в порядке убывания (DESC).
* ''p_analyze''- необязательный аргумент, по умолчанию всякий раз, когда создается новая дочерняя таблица, выполняется анализ родительской таблицы набора разделов, чтобы гарантировать, что исключение ограничений работает. Этот анализ можно пропустить, установив для него значение false, что поможет увеличить скорость перемещения больших объемов данных. Если для этого параметра установлено значение false, настоятельно рекомендуется выполнить ручной анализ набора разделов после завершения, чтобы обеспечить правильное обновление статистики.
* Возвращает количество строк, перемещенных из родительской таблицы в секции. Возвращает ноль, когда родительская таблица пуста и секционирование завершено.
==== Функции обслуживания ====
run_maintenance(
p_parent_table text DEFAULT NULL,
p_analyze boolean DEFAULT true,
p_jobmon boolean DEFAULT true,
p_debug boolean DEFAULT false) RETURNS void
* Запустите эту функцию как запланированное задание (cron и т. д.), чтобы автоматически создать дочерние таблицы для наборов разделов, сконфигурированных для ее использования.
* Вы также можете использовать включенный фоновый рабочий процесс (BGW), чтобы он автоматически запускался для вас самим PostgreSQL. Обратите внимание, что этот ''p_parent_table''параметр недоступен с этим методом, поэтому, если вам нужно запустить его для определенного набора разделов, вы должны сделать это вручную или по расписанию, как указано выше. Другие параметры имеют значения postgresql.conf, которые можно установить. См. раздел BGW выше.
* Эта функция также поддерживает систему хранения разделов для всех наборов разделов, для которых она включена.
* При каждом запуске проверяются все таблицы, перечисленные в таблице **part_config с** **параметром use_run_maintenance равным** true, и либо создаются для них новые разделы, либо выполняется их политика хранения.
* По умолчанию для наборов разделов, основанных на времени, и всех наборов подразделов для use_run_maintenance установлено значение true. Эту функцию необходимо запустить для поддержания основанного на времени разделения и наборов подразделов.
* По умолчанию для наборов последовательных разделов для use_run_maintenance установлено значение false (за исключением случаев, когда они разделены на подразделы), и они не требуют ''run_maintenance()''обслуживания разделов, но это можно переопределить. По умолчанию последовательное разбиение создает новые разделы, когда текущий достигает 50% своей максимальной емкости. Это может вызвать конкуренцию за очень высокие таблицы транзакций. Если сконфигурировано ''run_maintenance()''для последовательного разбиения на разделы, вы должны вызывать его достаточно часто, чтобы создание раздела опережало скорость вставки, иначе данные попадут в родительский раздел.
* Новые разделы создаются только в том случае, если количество дочерних таблиц перед текущей меньше, чем значение предварительной подготовки, поэтому вы можете запускать это чаще, чем необходимо, не опасаясь ненужного создания большего количества разделов.
* При каждом запуске проверяются все таблицы всех типов, перечисленных в таблице **part_config** , со значением в столбце хранения , и при необходимости удаляются таблицы (см. раздел «О программе и таблица конфигурации» ниже).
* Автоматически обновит функцию разделения по времени (и **идентификатор** , если он настроен), чтобы родительская таблица указывала на правильные разделы. При использовании времени запускайте эту функцию чаще, чем интервал разбиения, чтобы функция триггера работала максимально эффективно. Например, если вы используете четверть часа, запускайте каждые 5 минут; при ежедневном использовании запускайте не менее двух раз в день и т. д.
* ''p_parent_table''- необязательный параметр, который при передаче приведет ''run_maintenance()''к запуску ТОЛЬКО для данной таблицы. Это происходит независимо от того, что ''use_run_maintenance''установлено в part_config. Таблицы с высокой скоростью транзакций могут вызывать конкуренцию, когда обслуживание выполняется для многих таблиц одновременно, поэтому это позволяет более точно контролировать, когда обслуживание разделов выполняется для определенных таблиц. Обратите внимание, что это также приведет к тому, что система хранения будет работать только для данной таблицы.
* ''p_analyze''- По умолчанию при создании новой дочерней таблицы выполняется анализ родительской таблицы, чтобы обеспечить обновление статистики для исключения ограничений. Однако для больших наборов разделов этот анализ может занять некоторое время, и если ''run_maintenance()''выполняется управление несколькими разделами за один раз, это может вызвать конкуренцию во время завершения анализа. Установите для этого параметра значение false, чтобы отключить выполнение анализа и избежать этого конфликта. Обратите внимание, что вы должны запланировать анализ родительской таблицы в какой-то момент, чтобы исключение ограничений работало должным образом для всех дочерних таблиц.
* ''p_jobmon''- необязательный параметр для управления тем ''run_maintenance()'', использует ли он ''pg_jobmon''расширение для регистрации того, что он делает. Контролируется ли обслуживание конкретной таблицы ''pg_jobmon''с помощью настройки в таблице **part_config** , и эта настройка не повлияет на это. По умолчанию имеет значение true, если не установлено.
* ''p_debug''- Выводить дополнительные уведомления, чтобы помочь с отладкой проблем или для более тщательного изучения того, что делается во время запуска.
show_partitions (
p_parent_table text,
p_order text DEFAULT 'ASC')
* Список всех дочерних таблиц данного набора разделов. Каждая дочерняя таблица возвращается как одна строка.
* Таблицы возвращаются в порядке, соответствующем интервалу секционирования, а не в соответствии с локалью в порядке их имен.
* ''p_order''- необязательный параметр для установки порядка возврата дочерних таблиц. По умолчанию ASCending. Установите на «DESC», чтобы вернуться в порядке убывания.
show_partition_name(
p_parent_table text,
p_value text,
OUT partition_table text,
OUT suffix_timestamp timestamp,
OUT suffix_id bigint,
OUT table_exists boolean)
* Учитывая родительскую таблицу, управляемую pg_partman (p_parent_table) и соответствующее значение (время или идентификатор, но заданное в текстовой форме для p_value), вернуть имя дочернего раздела, в котором будет существовать это значение.
* Если используется разбиение по времени эпохи, укажите значение метки времени, а НЕ целочисленное значение эпохи (используйте to_timestamp() для преобразования значения эпохи).
* Возвращает имя дочерней таблицы независимо от того, существует ли дочерняя таблица на самом деле или нет.
* Также возвращает необработанное значение (suffix_timestamp или suffix_id) для суффикса раздела для данной дочерней таблицы.
* Также возвращает логическое значение (table_exists), чтобы сказать, существует ли эта дочерняя таблица на самом деле.
check_parent(p_exact_count boolean DEFAULT true)
* Запустите эту функцию, чтобы следить за тем, чтобы в родительские таблицы наборов разделов, которые ''pg_partman''управляют, не вставлялись строки.
* Возвращает строку для каждой родительской таблицы вместе с количеством содержащихся в ней строк. Возвращает нулевые строки, если они не найдены.
* ''partition_data_time()''& ''partition_data_id()''может использоваться для перемещения данных из этих родительских таблиц в соответствующие дочерние таблицы.
* p_exact_count сообщит функции вернуть точное количество строк в каждом родительском элементе, если они будут найдены. Это значение по умолчанию, если параметр не указан. Если вас не волнует точное количество, вы можете установить для него значение false, и оно вернется, если найдет хотя бы одну строку в любом родительском элементе. Это может значительно ускорить проверку, если много данных попадает в родительский раздел или имеется много управляемых разделов.
apply_constraints(
p_parent_table text,
p_child_table text DEFAULT NULL,
p_job_id bigint DEFAULT NULL,
p_debug BOOLEAN DEFAULT FALSE)
* Примените ограничения к дочерним таблицам в заданном наборе разделов для настроенных столбцов (все имена ограничений имеют префикс «partmanconstr_»).
* Обратите внимание, что это не нужно вызывать вручную для поддержки пользовательских ограничений. Создание новых разделов автоматически управляет добавлением ограничений к старым дочерним таблицам.
* Столбцы, на которые должны быть наложены ограничения, задаются в столбце массива **limited_cols** таблицы **part_config** или при создании с параметром ''create_parent()''.
* Если ''pg_partman''ограничения уже существуют в дочерней таблице, функция чисто пропустит существующие и не создаст дубликаты.
* Если данные столбцы содержат все значения NULL, никаких ограничений не будет.
* Если указан параметр дочерней таблицы, ограничения будут применяться только к этой дочерней таблице.
* Если параметр p_child_table не задан, ограничения помещаются в последнюю дочернюю таблицу старше ''optimize_constraint''значения. Например, если значение optimise_constraint равно 30, тогда ограничения будут помещены в дочернюю таблицу, которая находится на расстоянии 31 от текущего раздела (при условии, что предварительное создание раздела поддерживается в актуальном состоянии).
* Если вам нужно применить ограничения ко всем старым дочерним таблицам, используйте прилагаемый скрипт Python (reapply_constraint.py). В этом скрипте есть параметры, которые упрощают применение ограничений с минимальным влиянием на производительность.
* Параметр p_job_id является необязательным. Он предназначен для внутреннего использования и позволяет консолидировать регистрацию заданий в исходном задании, вызвавшем эту функцию, если это применимо.
* Параметр p_debug покажет вам использованный оператор создания ограничения.
drop_constraints(
p_parent_table text,
p_child_table text,
p_debug boolean DEFAULT false)
* Отбросьте ограничения, созданные ''pg_partman''для столбцов, настроенных в part_config . Это упрощает очистку ограничений, если необходимо отредактировать старые данные, а ограничения не позволяют это сделать.
* Будут удалены только те ограничения, которые начинаются с ''partmanconstr%%_*%%''для данной дочерней таблицы и настроенных столбцов.
* Если вам нужно удалить ограничения для всех дочерних таблиц, используйте прилагаемый скрипт Python ( ''reapply_constraint.py''). В этом скрипте есть параметры, которые упрощают снятие ограничений с минимальным влиянием на производительность.
* Параметр отладки покажет вам использованный оператор удаления ограничений.
reapply_privileges(p_parent_table text)
* Эта функция используется для повторного применения права собственности и предоставления прав на все дочерние таблицы в зависимости от того, что установлено родительской таблицей.
* Привилегии, которыми обладает родительская таблица, будут предоставлены всем дочерним таблицам, а привилегии, которых нет у родительской таблицы, будут отозваны (с помощью CASCADE).
* Проверяются привилегии SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES и TRIGGER.
* Имейте в виду, что для больших наборов разделов это может быть очень длительной операцией, поэтому она была выделена в отдельную функцию для независимого запуска. Применяются только привилегии, которые различаются между родительским и дочерним разделами, но он все равно должен выполнять поиск и сравнение в системном каталоге для каждого отдельного дочернего раздела и всех индивидуальных привилегий для каждого.
* ''p_parent_table''- родительская таблица набора разделов. Должна быть квалифицирована схема и соответствовать имени родительской таблицы, уже настроенному в ''pg_partman''.
apply_foreign_keys(
p_parent_table text,
p_child_table text DEFAULT NULL,
p_job_id bigint DEFAULT NULL,
p_debug boolean DEFAULT false)
* Элемент ненумерованного спискаПрименяет любые внешние ключи, существующие в родительской таблице в наборе разделов, ко всем дочерним таблицам.
* Эта функция автоматически вызывается всякий раз, когда создается новая дочерняя таблица, поэтому нет необходимости запускать ее вручную, если только вам не нужно исправить существующую дочернюю таблицу.
* Элемент ненумерованного списка
* Если вам нужно применить это ко всему набору разделов, см . Python-скрипт **reapply_foreign_keys.py** . Это будет зафиксировано после каждого создания FK, чтобы избежать конфликтов.
* Эту функцию можно использовать с любым набором наследования таблиц, а не только с теми, которыми управляет ''pg_partman''.
* Параметр p_job_id является необязательным. Он предназначен для внутреннего использования и позволяет консолидировать регистрацию заданий в исходном задании, вызвавшем эту функцию, если это применимо.
* Элемент ненумерованного спискаПараметр p_debug покажет вам использованный оператор создания ограничения.
==== Функции разрушения ====
undo_partition_time(
p_parent_table text,
p_batch_count int DEFAULT 1,
p_batch_interval interval DEFAULT NULL,
p_keep_table boolean DEFAULT true,
p_lock_wait numeric DEFAULT 0) RETURNS bigint
* Элемент ненумерованного спискаОтменить набор разделов на основе времени, созданный ''pg_partman''. Эта функция ПЕРЕМЕЩАЕТ данные из существующих дочерних разделов в родительскую таблицу.
* При запуске этой функции триггер в родительской таблице и функция триггера немедленно удаляются (если они все еще существуют). Это означает, что любые дальнейшие записи выполняются для родителя.
* При запуске этой функции для **undo_in_progress** столбца в таблице конфигурации устанавливается значение true. Это приводит к остановке всего управления созданием и хранением разделов.
* Если вы пытаетесь автоматически разбить на разделы большой объем данных, рекомендуется запустить эту функцию с внешним скриптом и соответствующими пакетными настройками. Это поможет избежать блокировок транзакций и предотвратит обширный откат в случае сбоя. См. Скрипты раздел для включенного скрипта Python, который сделает это за вас.
* По умолчанию разделы не УДАЛЯЮТСЯ, они НЕ НАСЛЕДУЮТСЯ. Это оставляет предыдущие дочерние таблицы пустыми, независимыми таблицами.
* Без ручной установки какого-либо пакетного аргумента каждый запуск функции будет перемещать все данные из одного раздела в родительский.
* После отмены наследования/удаления всех дочерних таблиц данные конфигурации ''pg_partman''автоматически удаляются.
* Для разделенных таблиц вы должны начать с родительской таблицы самого низкого уровня и отменить оттуда, а затем продвигаться вверх. Если вы попытаетесь отменить разбиение набора подразделов, функция остановится с предупреждением, чтобы сообщить вам об этом.
* ''p_parent_table'' - родительская таблица набора разделов. Должна быть квалифицирована схема и соответствовать имени родительской таблицы, уже настроенному в **pg_partman**.
* ''p_batch_count''- необязательный аргумент, он устанавливает, сколько раз перемещать объем данных, равный ''p_batch_interval''аргументу (или интервалу раздела по умолчанию, если он не установлен) за один запуск функции. По умолчанию 1.
* ''p_batch_interval''— необязательный аргумент, интервал времени, сколько данных нужно переместить. Это может быть меньше интервала секционирования, что позволяет разбивать секции очень большого размера на более мелкие пакеты фиксации. По умолчанию используется сконфигурированный интервал раздела, если он не задан или если вы задали интервал, превышающий интервал раздела.
* ''p_keep_table''— необязательный аргумент, установка которого в false приведет к тому, что старая дочерняя таблица будет удалена, а не отменена, после того как все ее данные будут перемещены. Обратите внимание, что для фактического удаления/отмены наследования таблицы из набора требуется как минимум два пакета.
* ''p_lock_wait''- необязательный аргумент, задает, сколько времени в секундах ждать разблокировки таблицы или строки перед истечением времени ожидания. По умолчанию ждать вечно.
* Возвращает количество строк, перемещенных в родительскую таблицу. Возвращает ноль, когда все дочерние таблицы пусты.
undo_partition_id(
p_parent_table text,
p_batch_count int DEFAULT 1,
p_batch_interval bigint DEFAULT NULL,
p_keep_table boolean DEFAULT true,
p_lock_wait numeric DEFAULT 0) RETURNS bigint
* Отменить набор разделов на основе идентификатора, созданный ''pg_partman''. Эта функция ПЕРЕМЕЩАЕТ данные из существующих дочерних разделов в родительскую таблицу.
* Когда эта функция запускается, триггер в родительской таблице и функция триггера немедленно удаляются (если они все еще существуют). Это означает, что любые дальнейшие записи выполняются для родителя.
* При запуске этой функции для **''undo_in_progress''**столбца в таблице конфигурации устанавливается значение true. Это приводит к остановке всего управления созданием и хранением разделов.
* Если вы пытаетесь автоматически разбить на разделы большой объем данных, рекомендуется запустить эту функцию с внешним скриптом и соответствующими пакетными настройками. Это поможет избежать блокировок транзакций и предотвратит обширный откат в случае сбоя. См. раздел « Скрипты » для включенного скрипта Python, который сделает это за вас.
* По умолчанию разделы не УДАЛЯЮТСЯ, они НЕ НАСЛЕДУЮТСЯ. Это оставляет предыдущие дочерние таблицы пустыми, независимыми таблицами.
* Без ручной установки какого-либо пакетного аргумента каждый запуск функции будет перемещать все данные из одного раздела в родительский.
* После отмены наследования/удаления всех дочерних таблиц данные конфигурации ''pg_partman''автоматически удаляются.
* Для разделенных таблиц вы должны начать с родительской таблицы самого низкого уровня и отменить оттуда, а затем продвигаться вверх. Если вы попытаетесь отменить разбиение набора подразделов, функция остановится с предупреждением, чтобы сообщить вам об этом.
* ''p_parent_table''- родительская таблица набора разделов. Должна быть квалифицирована схема и соответствовать имени родительской таблицы, уже настроенному в ''pg_partman''.
* ''p_batch_count''- необязательный аргумент, он устанавливает, сколько раз перемещать объем данных, равный ''p_batch_interval''аргументу (или интервалу раздела по умолчанию, если он не установлен) за один запуск функции. По умолчанию 1.
* ''p_batch_interval''- необязательный аргумент, целое число, представляющее интервал перемещения данных. Это может быть меньше интервала секционирования, что позволяет разбивать секции очень большого размера на более мелкие пакеты фиксации. По умолчанию используется сконфигурированный интервал раздела, если он не задан или если вы задали интервал, превышающий интервал раздела.
* ''p_keep_table''- необязательный аргумент, установка которого в false приведет к тому, что старая дочерняя таблица будет удалена, а не удалена, после того как все ее данные будут перемещены. Обратите внимание, что для фактического удаления/отмены наследования таблицы из набора требуется как минимум два пакета (второй пакет видит, что в нем больше нет данных, и удаляет его).
* ''p_lock_wait''- необязательный аргумент, задает, сколько времени в секундах ждать разблокировки таблицы или строки перед истечением времени ожидания. По умолчанию ждать вечно.
* Возвращает количество строк, перемещенных в родительскую таблицу. Возвращает ноль, когда все дочерние таблицы пусты.
undo_partition(
p_parent_table text,
p_batch_count int DEFAULT 1,
p_keep_table boolean DEFAULT true,
p_jobmon boolean DEFAULT true,
p_lock_wait numeric DEFAULT 0) RETURNS bigint
* Отменить наследование родительской/дочерней таблицы любого набора разделов, а не только тех, которыми управляет ''pg_partman''. Эта функция КОПИРУЕТ данные из существующих дочерних разделов в родительскую таблицу.
* ПРЕДУПРЕЖДЕНИЕ. При использовании в подразделенном наборе, не управляемом ''pg_partman'', результаты могут быть непредсказуемыми. Не рекомендуется этого делать.
* Если вам нужно сохранить данные в ваших дочерних таблицах после того, как они будут помещены в родительскую, используйте эту функцию.
* В отличие от других функций отмены, данные нельзя копировать пакетами, меньшими, чем интервал разделения. Каждый запуск функции копирует весь раздел в родительский.
* При запуске этой функции для ''undo_in_progress'' столбца в таблице конфигурации устанавливается значение true, если им управлял pg_partman. Это приводит к остановке всего управления созданием и хранением разделов, ТОЛЬКО если ими управлял pg_partman.
* Если вы пытаетесь автоматически разбить на разделы большой объем данных, рекомендуется запустить эту функцию с внешним скриптом и соответствующими пакетными настройками. Это поможет избежать блокировок транзакций и предотвратит обширный откат в случае сбоя. См. раздел « Скрипты » для включенного скрипта Python, который сделает это за вас.
* По умолчанию разделы не УДАЛЯЮТСЯ, они НЕ НАСЛЕДУЮТСЯ. Это оставляет предыдущие дочерние таблицы такими, какими они были, но больше не наследуются от родителя. Не работает на нескольких уровнях наследования (подразделах) при удалении таблиц.
* ''p_parent_table''- родительская таблица набора разделов. Должен соответствовать схеме, но НЕ должен управляться ''pg_partman''.
* ''p_batch_count''- необязательный аргумент, он устанавливает, сколько разделов копировать данные за один запуск. По умолчанию 1.
* ''p_keep_table''- необязательный аргумент, установка которого в false приведет к тому, что старая дочерняя таблица будет удалена, а не унаследована.
* ''p_jobmon''- необязательный параметр, запрещающий undo_partition() использовать ''pg_jobmon''расширение для регистрации того, что оно делает. По умолчанию имеет значение true, если не установлено.
* ''p_lock_wait''- необязательный аргумент, задает, сколько времени в секундах ждать разблокировки таблицы или строки перед истечением времени ожидания. По умолчанию ждать вечно.
* Возвращает количество строк, перемещенных в родительскую таблицу. Возвращает ноль, когда все дочерние таблицы пусты.
drop_partition_time(
p_parent_table text,
p_retention interval DEFAULT NULL,
p_keep_table boolean DEFAULT NULL,
p_keep_index boolean DEFAULT NULL,
p_retention_schema text DEFAULT NULL) RETURNS int
* Эта функция используется для удаления дочерних таблиц из набора разделов на основе времени. По умолчанию таблица просто не наследуется и фактически не удаляется. Для автоматического удаления старых таблиц рекомендуется использовать ''run_maintenance()''функцию с настроенным сохранением, а не вызывать ее напрямую.
* ''p_parent_table''- существующая родительская таблица набора разделов на основе времени. ДОЛЖЕН соответствовать схеме, даже если она находится в общедоступной схеме.
* ''p_retention''- необязательный параметр для указания интервала времени хранения и немедленного удаления таблиц, содержащих только данные старше заданного интервала. Если у вас уже есть значение хранения, установленное в таблице конфигурации, функция будет использовать его, в противном случае оно переопределит его. Если нет, этот параметр является обязательным. Дополнительную информацию о настройках хранения см. в разделе «О программе» выше.
* ''p_keep_table''- необязательный параметр, указывающий partman, следует ли сохранить или удалить таблицу в дополнение к отмене ее наследования. TRUE означает, что таблица фактически не будет удалена; FALSE означает, что таблица будет удалена. Эта функция будет просто использовать значение, настроенное в **part_config** , если оно не задано явно. Этот параметр игнорируется, если задана функция reintention_schema.
* ''p_keep_index''- необязательный параметр, указывающий partman сохранять или удалять индексы дочерней таблицы, если она не унаследована. TRUE означает, что индексы будут сохранены; FALSE означает, что все индексы будут удалены. Эта функция будет просто использовать значение, настроенное в **part_config** , если оно не задано явно. Этот параметр игнорируется, если для параметра p_keep_table задано значение FALSE или если задана схема Retention_schema.
* ''p_retention_schema''- необязательный параметр, указывающий partman переместить таблицу в другую схему вместо ее удаления. Установите это в схему, в которую вы хотите переместить таблицу. Эта функция будет просто использовать настроенное значение, ''part_config'' если оно не задано явно. Если этот параметр установлен, сохранение ''p_keep_table''и ''p_keep_index''параметры игнорируются.
* Возвращает количество затронутых разделов.
drop_partition_id(
p_parent_table text,
p_retention bigint DEFAULT NULL,
p_keep_table boolean DEFAULT NULL,
p_keep_index boolean DEFAULT NULL,
p_retention_schema text DEFAULT NULL) RETURNS int
* Эта функция используется для удаления дочерних таблиц из набора разделов на основе идентификатора. По умолчанию таблица просто не наследуется и фактически не удаляется. Для автоматического удаления старых таблиц рекомендуется использовать ''run_maintenance()''функцию с настроенным сохранением, а не вызывать ее напрямую.
* ''p_parent_table''- существующая родительская таблица набора разделов на основе времени. ДОЛЖЕН соответствовать схеме, даже если она находится в общедоступной схеме.
* ''p_retention''- необязательный параметр, чтобы указать целочисленный интервал хранения и немедленно удалить таблицы, содержащие только данные, меньшие, чем текущее максимальное значение идентификатора минус заданное значение удержания. Если у вас уже есть значение хранения, установленное в таблице конфигурации, функция будет использовать его, в противном случае оно переопределит его. Если нет, этот параметр является обязательным. Дополнительную информацию о настройках хранения см. в разделе « **О программе» выше.**
* ''p_keep_table''- необязательный параметр, указывающий partman, следует ли сохранить или удалить таблицу в дополнение к отмене ее наследования. TRUE означает, что таблица фактически не будет удалена; FALSE означает, что таблица будет удалена. Эта функция будет просто использовать значение, настроенное в **part_config** , если оно не задано явно. Этот параметр игнорируется, если задана функция reintention_schema.
* ''p_keep_index''- необязательный параметр, указывающий partman сохранять или удалять индексы дочерней таблицы, если она не унаследована. TRUE означает, что индексы будут сохранены; FALSE означает, что все индексы будут удалены. Эта функция будет просто использовать значение, настроенное в **part_config** , если оно не задано явно. Этот параметр игнорируется, если для параметра p_keep_table задано значение FALSE или если задана схема Retention_schema.
* ''p_retention_schema''- необязательный параметр, указывающий partman переместить таблицу в другую схему вместо ее удаления. Установите это в схему, в которую вы хотите переместить таблицу. Эта функция будет просто использовать значение, настроенное в **part_config** , если оно не задано явно. Если этот параметр установлен, параметры хранения p_keep_table и p_keep_index игнорируются.
* Возвращает количество затронутых разделов.
drop_partition_column(
p_parent_table text,
p_column text) RETURNS void
* В зависимости от того, когда был добавлен столбец (до или после настройки секционирования), удаление его на родителя может или не может удалить его из всех дочерних элементов. Эта функция используется для обеспечения того, чтобы столбец всегда удалялся из родительского и всех дочерних столбцов в наборе разделов.
* Использует предложение IF EXISTS во всех операторах удаления, поэтому может выдавать уведомления/предупреждения о том, что столбец не найден. Вы можете смело игнорировать эти предупреждения. Он не должен выдавать никаких ошибок.
==== Столы ====
**''part_config''**
Хранит все данные конфигурации для наборов разделов, управляемых расширением. Единственные столбцы в этой таблице, которые когда-либо должны быть изменены вручную, это:
- **retention**, **retention_schema**, **retention_keep_table** и **retention_keep_index** для настройки политики хранения набора разделов.
- **constraint_cols** чтобы partman управлял дополнительными ограничениями и **optimize_constraint** контролировал их добавление
- **premake**, **optimize_trigger**, **inherit_fk**, **use_run_maintenance** , **jobmon** чтобы изменить поведение по умолчанию.
Остальные управляются самим расширением и не должны изменяться без крайней необходимости.
* ''parent_table''
* Родительская таблица набора разделов
* ''control''
* Столбец, используемый в качестве элемента управления ограничениями раздела. Должен быть столбцом на основе времени или целого числа.
* ''partition_type''
* Тип разбиения. Должен быть одним из типов, упомянутых выше в ''create_parent()''информации.
* ''partition_interval''
* Значение текстового типа, определяющее интервал для каждого раздела.
* Должно быть значение, которое можно привести к типу данных interval или bigint.
* ''constraint_cols''
* Столбец массива, в котором перечислены столбцы, к которым применяются дополнительные ограничения. См. раздел « **О** программе» для получения дополнительной информации о том, как работает эта функция.
* ''premake''
* Сколько разделов оставить предварительно созданными перед текущим разделом. По умолчанию 4.
* ''optimize_trigger''
* Управляет количеством разделов, которые наиболее эффективно обрабатываются триггером. См. ''create_parent()''функцию для получения дополнительной информации. По умолчанию 4.
* ''optimize_constraint''
* Управляет тем, какие старые таблицы получают дополнительные ограничения, если они настроены для этого. Дополнительную информацию см . в разделе « **О** программе». По умолчанию 30.
* ''epoch''
* Отметьте, что таблица должна быть разделена по времени целочисленным значением эпохи вместо отметки времени. См. ''create_parent()''функцию для получения дополнительной информации. По умолчанию «нет».
* ''inherit_fk''
* Установите, ''pg_partman''управляет ли наследование внешних ключей от родительской таблицы всеми дочерними элементами.
* По умолчанию ИСТИНА. Также можно установить с помощью ''create_parent()''функции во время создания.
* ''retention''
* Значение текстового типа, которое определяет, насколько старыми могут быть данные в дочернем разделе, прежде чем они будут удалены.
* Должно быть значение, которое может быть приведено к типам данных interval (для разделения по времени) или bigint (для последовательного разделения).
* Оставьте этот столбец NULL (по умолчанию), чтобы всегда сохранять все дочерние разделы. Дополнительную информацию см . в разделе « **О** программе».
* ''retention_schema''
* Схема для перемещения таблиц как части системы хранения вместо их удаления. Отменяет параметры хранения * .
* ''retention_keep_table''
* Логическое значение, определяющее, сохраняются ли удаленные дочерние таблицы или действительно удаляются.
* По умолчанию TRUE, чтобы сохранить таблицу и только отменить ее наследование. Установите значение FALSE, чтобы полностью удалить дочерние таблицы из базы данных.
* ''retention_keep_index''
* Логическое значение, определяющее, удаляются ли индексы для дочерних таблиц, которые не унаследованы.
* Значение по умолчанию — ИСТИНА. Установите значение FALSE, чтобы индексы дочерней таблицы удалялись, когда она не унаследована.
* ''infinite_time_partitions''
* По умолчанию новые разделы в наборе, основанном на времени, не будут созданы, если новые данные не будут вставлены, чтобы предотвратить создание бесконечного количества пустых таблиц.
* Если вы все же хотите, чтобы новые разделы создавались, несмотря на отсутствие новых данных, установите для этого параметра значение TRUE.
* По умолчанию ЛОЖЬ.
* ''datetime_string''
* Для разделения по времени это строка формата даты и времени, используемая при именовании дочерних разделов.
* ''use_run_maintenance''
* Логическое значение, указывающее ''run_maintenance()''функции, должна ли она автоматически управлять созданием новой дочерней таблицы при ''run_maintenance()''вызове без параметра таблицы.
* Если ''run_maintenance()''задан параметр таблицы, этот параметр игнорируется, и обслуживание всегда будет выполняться.
* По умолчанию TRUE для разделения по времени.
* По умолчанию FALSE для одноуровневого последовательного разделения, при желании его можно изменить на TRUE.
* При изменении существующего последовательного секционированного набора с FALSE на TRUE необходимо запустить create_function_id%%('%%parent_schema.parent_table'), чтобы изменить триггерную функцию, чтобы она больше не создавала новые секции.
* По умолчанию TRUE для всех таблиц подразделов.
* ''jobmon''
* Логическое значение, определяющее, используется ли ''pg_jobmon''расширение для регистрации/мониторинга обслуживания разделов. По умолчанию истинно.
* ''sub_partition_set_full''
* Логическое значение для обозначения того, что последний раздел для набора подразделов создан. Позволяет run_maintenance() работать более эффективно, когда имеется большое количество наборов подразделов.
* ''undo_in_progress''
* Устанавливается функциями undo_partition всякий раз, когда они запускаются. ''run_maintenance()''Если это значение равно true, это приводит к тому, что функция прекращает все операции по созданию и сохранению разделов . Значение по умолчанию — ложь.
* ''trigger_exception_handling''
* Логическое значение, которое можно задать, чтобы позволить триггерной функции секционирования обрабатывать любые исключения, возникающие при записи в эту таблицу. Обработка этого в этом случае означает помещение данных в родительскую таблицу, чтобы попытаться гарантировать отсутствие потери данных в случае ошибок. Имейте в виду, что перехват исключения здесь переопределит любую другую обработку исключений, которая может быть выполнена при записи в этот секционированный набор (например, обработка уникального нарушения ограничения для его игнорирования). Само существование этого блока исключений также увеличивает потребление xid, поскольку каждая вставленная строка будет увеличивать глобальное значение xid. Если эта таблица имеет высокую скорость вставки, вы можете быстро достичь переноса xid, поэтому используйте это осторожно. По умолчанию для этого параметра установлено значение false, чтобы избежать неожиданного поведения в других ситуациях обработки исключений.
* ''p_upsert''
* текстовое значение предложения ON CONFLICT для включения в триггер раздела. По умолчанию используется значение « (пустая строка), что означает, что оно неактивно. См . определение функции create_parent() и раздел « О программе » для получения дополнительной информации.
* ''trigger_return_null''
* Логическое значение, позволяющее управлять поведением триггера раздела RETURN. По умолчанию это верно, и триггер возвращает NULL, чтобы предотвратить попадание данных в родительскую таблицу, а также в дочерние. Однако если у вас есть несколько триггеров и вы полагаетесь на то, что возвращаемое значение будет значением столбца NEW, это может вызвать проблему. Установка для этого значения конфигурации значения false приведет к тому, что триггер раздела вернется в состояние RETURN NEW. Затем вы несете ответственность за правильную обработку возвращаемого значения в другом триггере. В противном случае это приведет к тому, что новые данные попадут как в дочернюю, так и в родительскую таблицу набора разделов.
**''part_config_sub''**
* Хранит все данные конфигурации для наборов с подразделами, управляемых ''pg_partman''.
* Столбец **''sub_parent''**является родительской таблицей набора подразделов, а все остальные столбцы управляют тем, как подразделяются дочерние элементы этого родителя.
* Все столбцы кроме ''sub_parent''работают точно так же, как и их аналоги в **''part_config''**таблице.
==== Скрипты ====
Если расширение было установлено с помощью make , указанные ниже файлы сценариев должны были быть установлены в каталог двоичных файлов PostgreSQL.
''partition_data.py''
* Сценарий Python, упрощающий разбиение на разделы в зафиксированных пакетах.
* Вызывает либо partition_data_time(), либо partition_data_id() в зависимости от значения, заданного для --type.
* Коммит выполняется в конце каждого интервала и/или полностью созданного раздела.
* Возвращает общее количество строк, перемещенных в секции. Автоматически останавливается, когда родитель пуст.
* Чтобы избежать большой нагрузки и конфликтов во время секционирования, при запуске этого сценария автоочистка для родительской таблицы и всех дочерних таблиц отключена. Когда разделение завершено, для автоочистки возвращается значение по умолчанию, а родительская таблица очищается, когда она очищается.
* ''--parent (-p)'': родительская таблица уже созданного набора разделов. Необходимый.
* ''--type (-t)'': Тип разбиения. Допустимые значения: «time» и «id». Необходимый.
* ''--connection (-c)'': Строка подключения для использования psycopg. По умолчанию «host=» (локальный сокет).
* ''--interval (-i)'': Значение, которое передается функции секционирования в качестве ''p_batch_interval''аргумента. Используйте это, чтобы установить интервал, меньший, чем интервал разделения, для фиксации данных в меньших пакетах. По умолчанию используется интервал раздела, если он не указан.
* ''--batch (-b)'': Сколько раз перебирать значение, заданное для --interval. Если --interval не задан, будет использоваться интервал раздела по умолчанию и создано не более -b раздела(ов). Скрипт фиксируется в конце каждого отдельного пакета. (НЕ передается как p_batch_count в функцию разделения). Если не задано, все данные в родительской таблице будут секционированы за один запуск скрипта.
* ''--wait (-w)'': Заставляет скрипт приостанавливаться на заданное количество секунд между фиксациями (пакетами).
* ''--order (-o)'': позволяет указать порядок переноса данных из родительского объекта в дочерний: по возрастанию (ASC) или по убыванию (DESC). По умолчанию — АСК.
* ''--lockwait (-l)'': Тайм-аут блокировки в несколько секунд при перемещении данных. Если блокировка не получена, эта партия будет предпринята еще раз.
* ''--lockwait_tries'': количество раз, когда истечет время ожидания блокировки, прежде чем отказаться от разделения. По умолчанию 10.
* ''--autovacuum_on'': для отключения автоочистки требуется кратковременная блокировка, чтобы ИЗМЕНИТЬ свойство таблицы. Установите этот параметр, чтобы оставить автоочистку включенной и избежать попытки блокировки.
* ''--quiet (-q)'': Переключите настройку, чтобы остановить весь вывод во время и после разделения.
* ''--version'': распечатайте минимальную версию ''pg_partman''этого скрипта, с которой он будет работать. Установленная версия ''pg_partman''может быть больше этой.
* ''--debug''Показать дополнительные выходные данные отладки
* Примеры:
Partition all data in a parent table. Commit after each partition is made.
python partition_data.py -c "host=localhost dbname=mydb" -p schema.parent_table -t time
Partition by id in smaller intervals and pause between them for 5 seconds (assume >100 partition interval)
python partition_data.py -p schema.parent_table -t id -i 100 -w 5
Partition by time in smaller intervals for at most 10 partitions in a single run (assume monthly partition interval)
python partition_data.py -p schema.parent_table -t time -i "1 week" -b 10
''undo_partition.py''
* Сценарий Python, упрощающий отмену разделов в зафиксированных пакетах.
* Также может работать с любым родительским/дочерним набором разделов, не управляемым, ''pg_partman''если параметр --type не установлен.
* Этот сценарий вызывает либо undo_partition(), либо undo_partition_time(), либо undo_partition_id в зависимости от значения, заданного для --type.
* Коммит выполняется в конце каждого интервала и/или опустевшего раздела.
* Возвращает общее количество строк, помещенных в родительский элемент. Автоматически останавливается, когда последняя дочерняя таблица пуста.
* ''--parent (-p)'': Родительская таблица набора разделов. Необходимый.
* ''--type (-t)'': Тип разбиения. Допустимые значения: «time» и «id». Если не задать этот аргумент, будет использоваться undo_partition() и работать с любым набором родительских/дочерних таблиц.
* ''--connection (-c)'': Строка подключения для использования psycopg. По умолчанию «host=» (локальный сокет).
* ''--interval (-i)'': значение, которое передается функции секционирования как ''p_batch_interval''. Используйте это, чтобы установить интервал, меньший, чем интервал разделения, для фиксации данных в меньших пакетах. По умолчанию используется интервал раздела, если он не указан.
* ''--batch (-b)'': Сколько раз перебирать значение, заданное для --interval. Если --interval не установлен, будет использоваться интервал раздела по умолчанию и отменено не более -b раздела(ов). Скрипт фиксируется в конце каждого отдельного пакета. (НЕ передается как p_batch_count для функции отмены). Если не задано, все данные будут перемещены в родительскую таблицу за один запуск скрипта.
* ''--wait (-w)'': Заставляет скрипт приостанавливаться на заданное количество секунд между фиксациями (пакетами).
* ''--droptable (-d)'': настройка переключателя для удаления дочерних таблиц, когда они пусты. Оставьте опцию, чтобы просто отменить наследование.
* ''--quiet (-q)'': Переключите настройку, чтобы остановить весь вывод во время и после отмены разделения.
* ''--version'': распечатайте минимальную версию ''pg_partman''этого скрипта, с которой он будет работать. Установленная версия ''pg_partman''может быть больше этой.
* ''--debug'': Показать дополнительные выходные данные отладки
''dump_partition.py''
* Скрипт Python для вывода таблиц, содержащихся в данной схеме. Использует pg_dump, создает хеш-файл SHA-512 файла дампа, а затем удаляет таблицу.
* В сочетании с конфигурационным параметром Retention_schema предоставляет способ надежного вывода таблиц, которые обычно просто удаляются системой хранения.
* Таблицы не удаляются, если pg_dump не завершается успешно.
* Параметры подключения для psycopg и pg_dump были разделены из-за явных различий в их требованиях в зависимости от конфигурации подключения к вашей базе данных.
* Все значения по умолчанию для опции dump%%_*%% такие же, как и для pg_dump, если они не заданы.
* Будет работать с любой заданной схемой, а не только с той, которая используется для управления ''pg_partman''хранением.
* ''--schema (-n)'': схема, содержащая таблицы, которые будут выгружены. (Необходимый).
* ''--connection (-c)'': Строка подключения для использования psycopg. Используемая роль должна иметь возможность выбирать из pg_catalog.pg_tables в соответствующей базе данных и удалять все таблицы в данной схеме. По умолчанию «host=» (локальный сокет). Обратите внимание, что это отличается от параметров, отправляемых в pg_dump.
* ''--output (-o)'': Путь к месту вывода файла дампа. По умолчанию это место, откуда запускается скрипт.
* ''--dump_database (-d)'': Используется для pg_dump, так же, как его опция --dbname или конечный параметр имени базы данных.
* ''--dump_host'': Используется для pg_dump, так же, как и его опция --host.
* ''--dump_username'': Используется для pg_dump, так же, как и его опция --username.
* ''--dump_port'': Используется для pg_dump, так же, как и его опция --port.
* ''--pg_dump_path'': Путь к двоичному расположению pg_dump. Должен быть установлен, если не указан в текущем PATH.
* ''--Fp'': дамп в текстовом формате pg_dump. По умолчанию используется двоичный пользовательский (-Fc).
* ''--nohashfile'': НЕ создавайте отдельный файл с хешем SHA-512 дампа. Если файлы дампа очень большие, генерация хэша может занять много времени.
* ''--nodrop'': НЕ удаляйте таблицы из данной схемы после дампа/хеширования.
* ''--verbose (-v)'': более подробный вывод.
* ''--version'': распечатайте минимальную версию ''pg_partman''этого скрипта, с которой он будет работать. Установленная версия ''pg_partman''может быть больше этой.
''vacuum_maintenance.py''
* Сценарий Python для выполнения дополнительного обслуживания VACUUM в заданном наборе разделов. Основная цель этого — предоставить более простой способ замораживания кортежей в старых разделах, в которые больше не записываются записи. Это позволяет автоочистке безопасно пропускать их, не вызывая проблем с переносом идентификатора транзакции. Дополнительную информацию по этому вопросу обслуживания см. в документации PostgreSQL: [[https://translate.google.com/website?sl=en&tl=ru&hl=ru&u=http://www.postgresql.org/docs/current/static/routine-vacuuming.html%23VACUUM-FOR-WRAPAROUND|http://www.postgresql.org/docs/current/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND]] .
* Очищает все дочерние таблицы в заданном наборе разделов, чей возраст (relfrozenxid) больше, чем Vape_freeze_min_age, включая родительскую таблицу.
* Настоятельно рекомендуется запускать этот скрипт по расписанию с параметром --freeze, если у вас есть дочерние таблицы, в которые никогда не выполнялась запись после определенного периода времени.
* --parent (-p): родительская таблица уже созданного набора разделов. (Необходимый)
* --connection (-c): Строка подключения для использования psycopg. По умолчанию «host=» (локальный сокет).
* --freeze (-z): устанавливает параметр FREEZE для команды VACUUM.
* --full (-f): устанавливает параметр FULL для команды VACUUM. Обратите внимание, что --freeze не требуется, если вы установите это. Перед запуском рекомендуется просмотреть --dryrun, так как он заблокирует все таблицы, с которыми работает, возможно, включая родительскую.
* --vacuum_freeze_min_age (-a): по умолчанию сценарий получает это значение из системных каталогов. Установив это, вы можете переопределить значение, полученное из базы данных. Обратите внимание, что это не изменяет значение в базе данных, а только значение, которое использует этот скрипт.
* --noparent: Обычно родительская таблица включается в список таблиц для очистки, если ее возраст (relfrozenxid) выше, чем Vape_freeze_min_age. Установите это, чтобы принудительно исключить родительскую таблицу, даже если она соответствует этому критерию.
* --dryrun: Показать, что будет делать скрипт, не запуская его в базе данных. Настоятельно рекомендуем ознакомиться с этим перед первым запуском.
* --quiet (-q): отключить весь вывод.
* --debug: Показать дополнительный вывод отладки.
''reapply_indexes.py''
* Сценарий Python для повторного применения индексов к дочерним таблицам в наборе разделов после их изменения в родительской таблице.
* Любые индексы, которые в настоящее время существуют в дочерних элементах и соответствуют определению в родительском элементе, останутся без изменений. При желании можно воссоздать соответствующие индексы, а также первичный ключ.
* Индексы, не существующие в родительском элементе, будут удалены из всех дочерних элементов.
* Коммиты выполняются после удаления/создания каждого индекса, чтобы предотвратить длительные транзакции и блокировки.
* ПРИМЕЧАНИЕ. Имена новых индексов создаются на основе имени дочерней таблицы и используемых столбцов, поэтому их имена могут отличаться от имен, заданных в родительской таблице. Это делается для того, чтобы инструмент учитывал длинные или повторяющиеся имена индексов. Если имя индекса будет дублироваться, в конец имени индекса добавляется инкрементный счетчик, чтобы его можно было создать. Сначала используйте параметр --dryrun, чтобы увидеть, что он будет делать и какие имена могут привести к такой обработке дубликатов.
* ''--parent (-p)'': родительская таблица уже созданного набора разделов. Необходимый.
* ''--connection (-c)'': Строка подключения для использования psycopg. По умолчанию «host=» (локальный сокет).
* ''--concurrent'': создавать индексы с параметром CONCURRENTLY. Обратите внимание, что это не работает с первичными ключами, если указано --primary.
* ''--drop_concurrent'': Одновременное удаление индексов при их повторном создании (PostgreSQL >= v9.2). Обратите внимание, что это не работает с первичными ключами, если указано --primary.
* ''--recreate_all (-R)'': по умолчанию, если индекс существует в дочернем элементе и совпадает с родительским, он не будет затронут. При установке этого параметра все дочерние индексы будут удалены и созданы заново. Будет подчиняться параметрам --concurrent и --drop_concurrent, если они заданы. Не будет пересоздавать первичные ключи, если не указан параметр --primary.
* ''--primary'': По умолчанию первичный ключ не создается заново. Установите этот параметр, если это необходимо. Обратите внимание, что это приведет к монопольной блокировке дочерней таблицы на время воссоздания.
* ''--jobs (-j)'': Используйте библиотеку многопроцессорной обработки python для параллельного воссоздания индексов. Обратите внимание, что это для таблицы, а не для индекса. Будьте очень осторожны, устанавливая этот параметр, если нагрузка на ваши системы вызывает беспокойство.
* ''--wait (-w)'': подождите заданное количество секунд после завершения создания индексов для таблицы, прежде чем переходить к следующей. При использовании с -j вместо этого будет установлена пауза между пакетами параллельных заданий.
* ''--dryrun'': Покажите, что будет делать скрипт без фактического запуска его в базе данных. Настоятельно рекомендуем ознакомиться с этим перед запуском. Обратите внимание, что если несколько индексов получат одно и то же имя по умолчанию, повторяющиеся имена будут отображаться в пробном запуске (поскольку индекс не существует в каталоге для его проверки). Когда запускается настоящая вещь, повторяющиеся имена будут обрабатываться, как указано в ПРИМЕЧАНИИ выше.
* ''--quiet'': отключить весь вывод.
* ''--nonpartman''Если набор разделов, на котором вы выполняете это, не управляется pg_partman, установите этот флаг, иначе этот скрипт может не работать. Обратите внимание, что расширение pg_partman по-прежнему необходимо установить, чтобы это работало, поскольку оно использует определенные внутренние функции. Когда это установлено, порядок переиндексации таблиц является алфавитным, а не логическим.
* ''--version'': распечатайте минимальную версию ''pg_partman''этого скрипта, с которой он будет работать. Установленная версия ''pg_partman''может быть больше этой.
''reapply_constraints.py''* Сценарий Python для переопределения ограничений для дочерних таблиц в заданном наборе разделов для столбцов, настроенных в таблице **part_config** . * Обычно используется режим -d для удаления ограничений, редактирования данных по мере необходимости, а затем режим -a для повторного применения ограничений. * ''--parent (-p)'': Родительская таблица уже созданного набора разделов. (Обязательно) * ''--connection (-c)'': Строка подключения для использования psycopg. По умолчанию «host=» (локальный сокет). * ''--drop_constraints (-d)'': удалить все ограничения, управляемые ''pg_partman''. Сбрасывает ограничения для ВСЕХ дочерних таблиц в наборе разделов. * ''--add_constraints (-a)'': Применить ограничения для сконфигурированных столбцов ко всем дочерним таблицам старше предварительно созданного значения. *''--jobs (-j)'': Используйте библиотеку многопроцессорной обработки python для параллельного воссоздания индексов. Значение для -j — это количество одновременно выполняемых заданий. Обратите внимание, что это для таблицы, а не для индекса. Будьте очень осторожны, устанавливая этот параметр, если нагрузка на ваши системы вызывает беспокойство. * ''--wait (-w)'': подождите заданное количество секунд после того, как для таблицы были сняты или применены ограничения, прежде чем переходить к следующей. При использовании с -j вместо этого будет установлена пауза между пакетами параллельных заданий. * ''--dryrun'': Показать, что будет делать скрипт, не запуская его в базе данных. Настоятельно рекомендуем ознакомиться с этим перед запуском. * ''--quiet (-q)'': Выключить весь вывод. * ''--version'': Распечатайте минимальную версию ''pg_partman''этого скрипта, с которой он должен работать. Установленная версия ''pg_partman''может быть больше этой.
''reapply_foreign_keys.py''
* Сценарий Python для повторного создания унаследованных внешних ключей для всего набора разделов.
* Все существующие внешние ключи во всех дочерних таблицах удаляются, а внешние ключи, существующие в родительской таблице на момент запуска, будут применяться ко всем дочерним.
* Фиксирует после создания каждого внешнего ключа, чтобы избежать длительных периодов конкуренции.
* ''--parent (-p)'': родительская таблица уже созданного набора разделов. (Необходимый)
* ''--connection (-c)'': Строка подключения для использования psycopg. По умолчанию «host=» (локальный сокет).
* ''--quiet (-q)'': Переключите настройку, чтобы остановить весь вывод во время и после отмены разделения.
* ''--dryrun'': Покажите, что будет делать скрипт без фактического запуска его в базе данных. Настоятельно рекомендуем ознакомиться с этим перед запуском.
* ''--nonpartman''Если набор разделов, на котором вы работаете, не управляется pg_partman, установите этот флаг. В противном случае используются внутренние функции pg_partman, и этот скрипт может не работать. Когда это установлено, порядок смены ключей таблиц является алфавитным, а не логическим.
* ''--version'': распечатайте минимальную версию ''pg_partman''этого скрипта, с которой он будет работать. Установленная версия ''pg_partman''может быть больше этой.
* ''--debug'': Показать дополнительные выходные данные отладки
''check_unique_constraints.py''
* Секционирование с использованием наследования имеет тот недостаток, что ограничение уникальности не может применяться ко всем таблицам во всем наборе разделов, не вызывая больших проблем с производительностью, когда набор разделов начинает становиться очень большим. Этот сценарий используется для проверки того, что все строки в наборе разделов уникальны для заданных столбцов.
* Обратите внимание, что в очень больших наборах разделов это может быть дорогостоящей операцией, которая может занимать большой кусок дискового пространства. Требуемого объема памяти достаточно для вывода всех данных столбца индекса в виде открытого текстового файла.
* Если есть значение столбца, нарушающее ограничение уникальности, этот сценарий вернет эти значения столбца вместе с подсчетом количества каждого значения. Вывод также может быть упрощен до одного общего целочисленного значения, чтобы его было проще использовать с приложениями мониторинга.
* ''--parent (-p)'': родительская таблица набора разделов для проверки. (Необходимый)
* ''--column_list (-l)'': Список столбцов, разделенных запятыми, которые составляют уникальное ограничение для проверки. (Необходимый)
* ''--connection (-c)'': Строка подключения для использования psycopg. По умолчанию «host=» (локальный сокет).
* ''--temp (-t)'': путь к доступной для записи папке, которую можно использовать для временных рабочих файлов. Системная временная папка по умолчанию.
* ''--psql'': Полный путь к двоичному файлу psql, если он не указан в текущем PATH.
* ''--simple'': Выведите одно целое значение с общим количеством дубликатов. Используйте это для программного обеспечения мониторинга, которое требует проверки простого значения.
* ''--quiet (-q)'': подавлять весь вывод, если не обнаружено нарушение ограничения.
* ''--version'': распечатайте минимальную версию ''pg_partman''этого скрипта, с которой он будет работать. Установленная версия ''pg_partman''может быть больше этой.
////[[https://access-crunchydata-com.translate.goog/documentation/pg-partman/2.6.3/pg_partman_howto/?_x_tr_sl=en&_x_tr_tl=ru&_x_tr_hl=ru|Пример руководства по настройке секционирования на основе триггера]] ////