1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-Pg-Partman

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
pg_partman_5.0.1_upgrade.md 18 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 21:50 171ec7b

Руководство по обновлению до версии pg_partman 5.0.1

ВАЖНО: В данном документе предполагается, что все наборы разделов являются нативными наборами разделов. Если у вас есть основанные на триггерах наборы разделов, вы должны сначала перенести их в нативные, прежде чем выполнять дальнейшую работу, чтобы сделать ваши наборы разделов совместимыми с pg_partman версии 5.0.1 и выше.

Ошибка триггера во время обновления

Если вы видите следующие ошибки во время обновления, вам придётся выполнить поэтапное обновление pg_partman. Обновление должно добавить ограничения и изменить значения таблицы за одну транзакцию, а PostgreSQL не всегда это позволяет.

ERROR:  cannot ALTER TABLE "part_config_sub" because it has pending trigger events

Или от Amazon RDS

ERROR: 42501: cannot fire deferred trigger within security-restricted operation

Сначала обновите напрямую до 5.0.0

BEGIN;
ALTER EXTENSION pg_partman UPDATE TO '5.0.0';
COMMIT;

Затем НЕМЕДЛЕННО обновите до 5.0.1

BEGIN;
ALTER EXTENSION pg_partman UPDATE TO '5.0.1';
COMMIT;

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

Устаревшие методы разбиения на разделы

Существует несколько схем разбиения на разделы, которые pg_partman поддерживал до версии 5.0.1, но больше не поддерживает, а именно ISO еженедельные и квартальные. Обратите внимание, что всё ещё можно разбивать на разделы с этими интервалами в версии 5 и выше, используя интервалы «1 неделя» или «3 месяца». Просто специализированные версии этого разбиения, которые были выполнены ранее, больше не поддерживаются.

Ранее еженедельное разбиение можно было выполнить, используя формат недели ISO IYYYwIW, что приводило к суффиксам разделов, таким как 2021w44 или 1994w32, где число после w было пронумерованной неделей этого года, и год всегда был выровнен с неделей ISO. Также поддерживался метод квартального разбиения с суффиксом YYYYq#, где # был одним из 4 стандартных кварталов в году, начиная с 1 января. Метод квартального разбиения был особенно проблематичным для поддержки, поскольку не все основанные на времени функции поддерживали его должным образом.

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

  • YYYYMMDD для интервалов, равных или превышающих 1 день
  • YYYYMMDD_HH24MISS для интервалов менее 1 дня (поддерживается вплоть до 1 секунды)

Поддержка пользовательских интервалов всегда была возможна с помощью pg_partman, особенно при использовании нативного разбиения. Однако упрощение поддерживаемых суффиксов значительно упрощает обслуживание кода. Если вы использовали любой из этих методов разбиения на разделы, вам придётся перейти от них, чтобы использовать pg_partman версии 5.0.1 или выше. Миграцию можно выполнить до или после обновления, но просто учтите, что обслуживание разделов не будет работать для этих методов в версиях 5+ и будет генерировать ошибки, когда обслуживание запускается для этих наборов, до тех пор, пока миграция не будет завершена.

Обратите внимание, что ранее hourly разбиение не имело секунд в суффиксе, но любые новые наборы разделов, созданные с этим интервалом, будут иметь их. Нет жёсткого требования к миграции, как для еженедельных и квартальных, но будет несоответствие в именовании дочерних таблиц с любыми существующими наборами разделов до версии 5.х. Можно провести миграцию, аналогичную приведённым ниже примерам, если требуется согласованность.

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

Еженедельная миграция

Вот пример еженедельного набора разделов, созданного с помощью pg_partman версии 4.7.3.

 \d+ partman_test.time_taptest_table
                                                       Partitioned table "partman_test.time_taptest_table" Сопоставление | Может принимать значение NULL | По умолчанию | Хранение | Сжатие | Цель статистики | Описание
--------+--------------------------+-----------+----------+------------------------------------------------+----------+-------------+--------------+-------------
 col1   | timestamp with time zone |           |          |                                                | plain    |             |              |
 col2   | text                     |           |          |                                                | extended |             |              |
 col3   | integer                  |           | not null | EXTRACT(epoch FROM CURRENT_TIMESTAMP)::integer | plain    |             |              |
Ключ раздела: RANGE (col1)
Разделы: partman_test.time_taptest_table_p2023w05 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-01-30 00:00:00-05') ДО ('2023-02-06 00:00:00-05'),
partman_test.time_taptest_table_p2023w06 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-02-06 00:00:00-05') ДО ('2023-02-13 00:00:00-05'),
partman_test.time_taptest_table_p2023w07 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-02-13 00:00:00-05') ДО ('2023-02-20 00:00:00-05'),
partman_test.time_taptest_table_p2023w08 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-02-20 00:00:00-05') ДО ('2023-02-27 00:00:00-05'),
partman_test.time_taptest_table_p2023w09 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-02-27 00:00:00-05') ДО ('2023-03-06 00:00:00-05'),
partman_test.time_taptest_table_p2023w10 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-03-06 00:00:00-05') ДО ('2023-03-13 00:00:00-04'),
partman_test.time_taptest_table_p2023w11 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-03-13 00:00:00-04') ДО ('2023-03-20 00:00:00-04'),
partman_test.time_taptest_table_p2023w12 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-03-20 00:00:00-04') ДО ('2023-03-27 00:00:00-04'),
partman_test.time_taptest_table_p2023w13 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-03-27 00:00:00-04') ДО ('2023-04-03 00:00:00-04'),
partman_test.time_taptest_table_p2023w14 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-04-03 00:00:00-04') ДО ('2023-04-10 00:00:00-04'),
partman_test.time_taptest_table_p2023w15 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-04-10 00:00:00-04') ДО ('2023-04-17 00:00:00-04'),
partman_test.time_taptest_table_p2023w16 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-04-17 00:00:00-04') ДО ('2023-04-24 00:00:00-04'),
partman_test.time_taptest_table_p2023w17 ДЛЯ ЗНАЧЕНИЙ ОТ ('2023-04-24 00:00:00-04') ДО ('2023-05-01 00:00:00-04'),
partman_test.time_taptest_table_default DEFAULT

Содержание таблицы конфигурации:
```sql
SELECT * FROM partman.part_config;

-[ RECORD 1 ]--------------+-------------------------------------------------
parent_table               | partman_test.time_taptest_table
control                    | col1
partition_type             | native
partition_interval         | 7 days
constraint_cols            |
premake                    | 4
optimize_trigger           | 4
optimize_constraint        | 30
epoch                      | none
inherit_fk                 | t
retention                  |
retention_schema           |
retention_keep_table       | t
retention_keep_index       | t
infinite_time_partitions   | f
datetime_string            | IYYY"w"IW
automatic_maintenance      | on
jobmon                     | t
sub_partition_set_full     | f
undo_in_progress           | f
trigger_exception_handling | f
upsert                     |
trigger_return_null        | t
template_table             | partman.template_partman_test_time_taptest_table
publications               |
inherit_privileges         | f
constraint_valid           | t
subscription_refresh       |
drop_cascade_fk            | f
ignore_default_data        | f

Для генерации SQL, который переименует таблицы в соответствии с новым шаблоном именования, поддерживаемым в версии 5.x и выше, необходимо выполнить следующие шаги:

  • Заменить имя родительской таблицы на ваше собственное.
  • В первой функции substring число после for должно соответствовать количеству символов, которое вы хотите заменить. Перевод текста запроса на русский язык:

Длина имени родительской таблицы +2 для учёта _p. В данном случае 20.

  • Во второй функции substring число после from должно быть предыдущим числом +1. В данном случае 21.
SELECT format(
    'ALTER TABLE %I.%I RENAME TO %I;'
    , n.nspname
    , c.relname
    , substring(c.relname from 1 for 20) || to_char(to_timestamp(substring(c.relname from 21), 'IYYY"w"IW'), 'YYYYMMDD')
)
FROM pg_inherits h
JOIN pg_class c ON h.inhrelid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE h.inhparent::regclass = 'partman_test.time_taptest_table'::regclass
AND c.relname NOT LIKE '%_default'
ORDER BY c.relname;

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

Наконец, вам нужно обновить столбец datetime_string в таблице part_config, чтобы он соответствовал новому шаблону суффикса.

UPDATE partman.part_config SET datetime_string = 'YYYYMMDD';

Теперь мы можем проверить, работает ли это, увеличив значение premake. Значение по умолчанию для premake равно 4, так что если вы изменили его ранее, просто добавьте единицу к этому значению. Мы также устанавливаем здесь infinite_time_partitions в true, потому что в наборе разделов может ещё не быть достаточно данных для создания будущих таблиц. После тестирования эту настройку можно снова отключить, если это нежелательно.

UPDATE partman.part_config SET premake = premake+1, infinite_time_partitions = true;

Теперь мы можем вызвать run_maintenance(), чтобы убедиться, что обслуживание разделов работает должным образом.

SELECT partman.run_maintenance('partman_test.time_taptest_table');
keith=# \d+ partman_test.time_taptest_table
                                                       Partitioned table "partman_test.time_taptest_table"
 Column |           Type           | Collation | Nullable |                    Default                     | Storage  | Compression | Stats target | Description
--------+--------------------------+-----------+----------+------------------------------------------------+----------+-------------+--------------+-------------
 col1   | timestamp with time zone |           |          |                                                | plain    |             |              |
 col2   | text                     |           |          |
``` **Квартальное разбиение**

Аналогично недельному, необходимо переименовать дочерние таблицы и обновить конфигурацию partman с новой строкой datetime_string. Ниже представлена таблица в её первоначальном виде с квартальными именами:

| Столбец | Тип | Сопоставление | Может быть NULL | По умолчанию | Хранение | Сжатие | Цель статистики | Описание |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| col1 | integer | — | — | — | plain | — | — | |
| col2 | text | — | — | — | extended | — | — ||
| col3 | timestamp with time zone | — | not null | now() | plain | — | — ||

Ключ раздела: RANGE (col3)
Разделы: 
* partman_test.time_taptest_table_p2022q1 FOR VALUES FROM ('2022-01-01 00:00:00-05') TO ('2022-04-01 00:00:00-04'),
* partman_test.time_taptest_table_p2022q2 FOR VALUES FROM ('2022-04-01 00:00:00-04') TO ('2022-07-01 00:00:00-04'),
* partman_test.time_taptest_table_p2022q3 FOR VALUES FROM ('2022-07-01 00:00:00-04') TO ('2022-10-01 00:00:00-04'),
* partman_test.time_taptest_table_p2022q4 FOR VALUES FROM ('2022-10-01 00:00:00-04') TO ('2023-01-01 00:00:00-05'),
* partman_test.time_taptest_table_p2023q1 FOR VALUES FROM ('2023-01-01 00:00:00-05') TO ('2023-04-01 00:00:00-04'),
* partman_test.time_taptest_table_p2023q2 FOR VALUES FROM ('2023-04-01 00:00:00-04') TO ('2023-07-01 00:00:00-04'),
* partman_test.time_taptest_table_p2023q3 FOR VALUES FROM ('2023-07-01 00:00:00-04') TO ('2023-10-01 00:00:00-04'),
* partman_test.time_taptest_table_p2023q4 FOR VALUES FROM ('2023-10-01 00:00:00-04') TO ('2024-01-01 00:00:00-05'),
* partman_test.time_taptest_table_p2024q1 FOR VALUES FROM ('2024-01-01 00:00:00-05') TO ('2024-04-01 00:00:00-04'),
* partman_test.time_taptest_table_default DEFAULT

Здесь приведён SQL для генерации переименования дочерних таблиц. Обратите внимание, что это немного сложнее, потому что квартальное разделение не работает так, как ожидается с функцией to_timestamp(). Мы должны использовать анонимную функцию для запуска некоторого PL/PQSL кода для генерации SQL для изменения имён этих таблиц.

Обратите внимание, что вам придётся настроить подстроку в генерации оператора ALTER TABLE, чтобы она соответствовала длине имени вашей родительской таблицы +2 (чтобы учесть «_p»). В этом случае значение равно 20.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-Pg-Partman.git
git@api.gitlife.ru:oschina-mirror/mirrors-Pg-Partman.git
oschina-mirror
mirrors-Pg-Partman
mirrors-Pg-Partman
master