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 автоматически обрабатывает это для всех дочерних таблиц, триггерных функций и триггеров. Он урежет существующее имя родительской таблицы, чтобы оно соответствовало требуемому суффиксу. Имейте в виду, что если у вас есть таблицы с очень длинными похожими именами, вы можете столкнуться с конфликтами имен, если они являются частью отдельных наборов разделов. Имейте в виду, что при последовательном секционировании со временем имя таблицы будет усекаться все больше и больше, чтобы соответствовать более длинному суффиксу раздела. Поэтому, хотя расширение попытается обработать этот пограничный случай за вас, рекомендуется, чтобы имена таблиц, которые будут секционированы, были как можно короче.
Наследование таблиц в 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.
Расширение 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 и т. д.).
В 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:
Для запуска всех этих функций необходимо использовать суперпользователя, чтобы правильно установить привилегии и права собственности во всех случаях. Все они устанавливаются с помощью SECURITY DEFINER, поэтому, если вы не можете использовать суперпользователя, просто назначьте роль суперпользователя в качестве владельца.
В качестве примечания для людей, которые не были в курсе, вы можете называть аргументы в вызовах функций, чтобы упростить их вызов и избежать путаницы, когда есть много возможных аргументов. Если для значения указано значение по умолчанию, передавать значение этому аргументу не требуется. Например: SELECT create_parent('schema.table', 'col1', 'time', 'daily', p_start_partition := '2015-10-20');
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)
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того, как должна быть разделена каждая дочерняя таблица.p_parent_tableаргумент, который вы изначально дали create_parent(), будет точно таким же значением, которое вы дали create_sub_parent(). Если вам нужно дальнейшее разбиение, вы должны начать давать create_sub_parent()другое значение (дочерние таблицы набора разделов верхнего уровня).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
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
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
p_parent_tableпараметр недоступен с этим методом, поэтому, если вам нужно запустить его для определенного набора разделов, вы должны сделать это вручную или по расписанию, как указано выше. Другие параметры имеют значения postgresql.conf, которые можно установить. См. раздел BGW выше.run_maintenance()обслуживания разделов, но это можно переопределить. По умолчанию последовательное разбиение создает новые разделы, когда текущий достигает 50% своей максимальной емкости. Это может вызвать конкуренцию за очень высокие таблицы транзакций. Если сконфигурировано run_maintenance()для последовательного разбиения на разделы, вы должны вызывать его достаточно часто, чтобы создание раздела опережало скорость вставки, иначе данные попадут в родительский раздел.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)
check_parent(p_exact_count BOOLEAN DEFAULT TRUE)
pg_partmanуправляют, не вставлялись строки.partition_data_time()& partition_data_id()может использоваться для перемещения данных из этих родительских таблиц в соответствующие дочерние таблицы.apply_constraints( p_parent_table text, p_child_table text DEFAULT NULL, p_job_id BIGINT DEFAULT NULL, p_debug BOOLEAN DEFAULT FALSE)
create_parent().pg_partmanограничения уже существуют в дочерней таблице, функция чисто пропустит существующие и не создаст дубликаты.optimize_constraintзначения. Например, если значение optimise_constraint равно 30, тогда ограничения будут помещены в дочернюю таблицу, которая находится на расстоянии 31 от текущего раздела (при условии, что предварительное создание раздела поддерживается в актуальном состоянии).drop_constraints( p_parent_table text, p_child_table text, p_debug BOOLEAN DEFAULT FALSE)
pg_partmanдля столбцов, настроенных в part_config . Это упрощает очистку ограничений, если необходимо отредактировать старые данные, а ограничения не позволяют это сделать.partmanconstr_*для данной дочерней таблицы и настроенных столбцов.reapply_constraint.py). В этом скрипте есть параметры, которые упрощают снятие ограничений с минимальным влиянием на производительность.reapply_privileges(p_parent_table text)
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)
pg_partman. 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. Эта функция ПЕРЕМЕЩАЕТ данные из существующих дочерних разделов в родительскую таблицу. 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. Это приводит к остановке всего управления созданием и хранением разделов.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.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
part_config
Хранит все данные конфигурации для наборов разделов, управляемых расширением. Единственные столбцы в этой таблице, которые когда-либо должны быть изменены вручную, это:
Остальные управляются самим расширением и не должны изменяться без крайней необходимости.
parent_tablecontrolpartition_typecreate_parent()информации.partition_intervalconstraint_colspremakeoptimize_triggercreate_parent()функцию для получения дополнительной информации. По умолчанию 4.optimize_constraintepochcreate_parent()функцию для получения дополнительной информации. По умолчанию «нет».inherit_fkpg_partmanуправляет ли наследование внешних ключей от родительской таблицы всеми дочерними элементами.create_parent()функции во время создания.retentionretention_schemaretention_keep_tableretention_keep_indexinfinite_time_partitionsdatetime_stringuse_run_maintenancerun_maintenance()функции, должна ли она автоматически управлять созданием новой дочерней таблицы при run_maintenance()вызове без параметра таблицы.run_maintenance()задан параметр таблицы, этот параметр игнорируется, и обслуживание всегда будет выполняться.jobmonpg_jobmonрасширение для регистрации/мониторинга обслуживания разделов. По умолчанию истинно.sub_partition_set_fullundo_in_progressrun_maintenance()Если это значение равно true, это приводит к тому, что функция прекращает все операции по созданию и сохранению разделов . Значение по умолчанию — ложь.trigger_exception_handlingp_upserttrigger_return_null
part_config_sub
pg_partman.sub_parentявляется родительской таблицей набора подразделов, а все остальные столбцы управляют тем, как подразделяются дочерние элементы этого родителя.sub_parentработают точно так же, как и их аналоги в part_configтаблице.Если расширение было установлено с помощью make , указанные ниже файлы сценариев должны были быть установлены в каталог двоичных файлов PostgreSQL.
partition_data.py
–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
pg_partmanесли параметр –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
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
reapply_indexes.py
–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
–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может быть больше этой.Пример руководства по настройке секционирования на основе триггера