Spec-Zone.ru › MySQL 8.4

15.1.9.1 Операции над разделами таблицы ALTER TABLE

Операции, связанные с разбиением, для ALTER TABLE могут использоваться с разбиениыми таблицами для перераспределения, добавления, удаления, отбрасывания, импорта, слияния и разделения разделов, а также для выполнения обслуживания разбиения.

  • Просто используя partition_options раздел с ALTER TABLE на таблице с разбиением, перераспределяет таблицу в соответствии со схемой разбиения, определенной partition_options. Этот раздел всегда начинается с PARTITION BY и следует той же синтаксической структуре и другим правилам, что и partition_options раздел для CREATE TABLE (подробнее см. Раздел 15.1.20, «CREATE TABLE Statement»), и также может быть использован для разбиения существующей таблицы, которая еще не разбита. Например, рассмотрим (неразбитую) таблицу, определённую следующим образом:

    CREATE TABLE t1 (
        id INT,
        year_col INT
    );
    

    Эта таблица может быть разбита на HASH, используя столбец id в качестве ключа разбиения, на 8 разделов с помощью этого оператора:

    ALTER TABLE t1
        PARTITION BY HASH(id)
        PARTITIONS 8;
    

    MySQL поддерживает опцию ALGORITHM с [SUB]PARTITION BY [LINEAR] KEY. ALGORITHM=1 заставляет сервер использовать те же функции хэширования ключей, что и MySQL 5.1, при вычислении размещения строк в разделах; ALGORITHM=2 означает, что сервер использует функции хэширования ключей, реализованные и используемые по умолчанию для новых KEY разбитых таблиц в MySQL 5.5 и более поздних версиях. (Разбитые таблицы, созданные с функциями хэширования ключей, используемыми в MySQL 5.5 и более поздних версиях, не могут использоваться сервером MySQL 5.1). Отсутствие указания опции эквивалентно использованию ALGORITHM=2. Эта опция предназначена в основном для использования при обновлении или понижении версии [LINEAR] KEY разбитых таблиц между MySQL 5.1 и более поздними версиями MySQL, или для создания таблиц, разбитых по KEY или LINEAR KEY на сервере MySQL 5.5 или более поздних версий, которые могут использоваться на сервере MySQL 5.1.

    Результат выполнения оператора ALTER TABLE ... PARTITION BY должен соответствовать правилам, аналогичным тем, которые применяются к таблицам, созданным с помощью CREATE TABLE ... PARTITION BY. Это включает в себя правила, регулирующие отношения между любыми уникальными ключами (включая первичный ключ), которые может иметь таблица, и столбцом или столбцами, используемыми в выражении разбиения, как обсуждается в Разделе 26.6.1, «Ключи разбиения, первичные ключи и уникальные ключи». Правила CREATE TABLE ... PARTITION BY для указания количества разделов также применяются к ALTER TABLE ... PARTITION BY.

    Раздел partition_definition для ALTER TABLE ADD PARTITION поддерживает те же параметры, что и раздел с аналогичным именем для оператора CREATE TABLE. (См. Раздел 15.1.20, «CREATE TABLE Statement», для синтаксиса и описания). Предположим, что вы имеете разбитую таблицу, созданную следующим образом:

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999)
    );
    

    Вы можете добавить новый раздел p3 к этой таблице для хранения значений, меньших 2002 следующим образом:

    ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));
    

    DROP PARTITION может использоваться для удаления одного или нескольких RANGE или LIST разделов. Этот оператор не может быть использован с HASH или KEY разделами; вместо этого используйте COALESCE PARTITION (см. далее в этом разделе). Любые данные, которые хранились в удаленных разделах, перечисленных в списке partition_names, будут удалены. Например, для таблицы t1, определенной ранее, вы можете удалить разделы, имеющие имена p0 и p1, как показано здесь:

    ALTER TABLE t1 DROP PARTITION p0, p1;
    
    Примечание

    DROP PARTITION не работает с таблицами, использующими хранилище NDB. См. Раздел 26.3.1, «Управление разделами RANGE и LIST» и Раздел 25.2.7, «Известные ограничения NDB Cluster».

    ADD PARTITION и DROP PARTITION в настоящее время не поддерживают IF [NOT] EXISTS.

    Параметры DISCARD PARTITION ... TABLESPACE и IMPORT PARTITION ... TABLESPACE расширяют эту функцию до отдельных InnoDB разделов таблицы. У каждого InnoDB раздела таблицы есть свой файл табличного пространства (файл .ibd). Эта функция упрощает копирование табличных пространств с работающего экземпляра MySQL на другой работающий экземпляр или восстановление на том же экземпляре. Оба параметра принимают список имен разделов, разделённых запятыми.

    ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
    
    ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;
    

    При выполнении DISCARD PARTITION ... TABLESPACE и IMPORT PARTITION ... TABLESPACE на подразделённых таблицах разрешены имена как разделов, так и подразделов. При указании имени раздела, в процесс включаются подразделённые таблицы этого раздела.

    Эта функция также поддерживает копирование или восстановление разбитых InnoDB таблиц. Подробнее см. Раздел 17.6.1.3, «Импорт таблиц InnoDB».

    Переименование разбитых таблиц поддерживается. Вы можете переименовать отдельные разделы косвенно, используя ALTER TABLE ... REORGANIZE PARTITION; однако эта операция копирует данные раздела.

    Для удаления строк из выбранных разделов используйте параметр TRUNCATE PARTITION. Этот параметр принимает список одного или нескольких разделённых запятыми имён разделов. Рассмотрим таблицу t1, созданную этим оператором:

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999),
        PARTITION p3 VALUES LESS THAN (2003),
        PARTITION p4 VALUES LESS THAN (2007)
    );
    

    Для удаления всех строк из раздела p0 используйте следующий оператор:

    ALTER TABLE t1 TRUNCATE PARTITION p0;
    

    Этот оператор эквивалентен следующему оператору DELETE:

    DELETE FROM t1 WHERE year_col < 1991;
    

    При усечении нескольких разделов разделы не обязательно должны быть смежными: это значительно упрощает операции удаления в разбитых таблицах, которые в противном случае потребовали бы очень сложных WHERE условий, если бы выполнялись с помощью операторов DELETE. Например, этот оператор удаляет все строки из разделов p1 и p3:

    ALTER TABLE t1 TRUNCATE PARTITION p1, p3;
    

    Эквивалентный оператор DELETE показан здесь:

    DELETE FROM t1 WHERE
        (year_col >= 1991 AND year_col < 1995)
        OR
        (year_col >= 2003 AND year_col < 2007);
    

    Если вы используете ключевое слово ALL вместо списка имён разделов, оператор применяется ко всем разделам таблицы.

    TRUNCATE PARTITION просто удаляет строки; он не изменяет определение таблицы или любого из её разделов.

    Для проверки удаления строк проверьте таблицу INFORMATION_SCHEMA.PARTITIONS, используя запрос, такой как этот:

    SELECT PARTITION_NAME, TABLE_ROWS
        FROM INFORMATION_SCHEMA.PARTITIONS
        WHERE TABLE_NAME = 't1';
    

    COALESCE PARTITION может использоваться с таблицами, разбитыми по HASH или KEY, для уменьшения количества разделов на number. Предположим, что вы создали таблицу t2 следующим образом:

    CREATE TABLE t2 (
        name VARCHAR (30),
        started DATE
    )
    PARTITION BY HASH( YEAR(started) )
    PARTITIONS 6;
    

    Чтобы уменьшить количество разделов, используемых t2, с 6 до 4, используйте следующий оператор:

    ALTER TABLE t2 COALESCE PARTITION 2;
    

    Данные, содержащиеся в последних number разделах, объединяются в оставшиеся разделы. В этом случае разделы 4 и 5 объединяются в первые 4 раздела (разделы с номерами 0, 1, 2 и 3).

    Для изменения некоторых, но не всех разделов, используемых разбитой таблицей, можно использовать REORGANIZE PARTITION. Этот оператор может быть использован несколькими способами:

    • Объединение набора разделов в один раздел. Это делается путём указания нескольких разделов в списке partition_names и предоставлением одного определения для partition_definition.

    • Разбиение существующего раздела на несколько разделов. Достигается путём указания одного раздела для partition_names и предоставления нескольких partition_definitions.

    • Изменение диапазонов для подмножества разделов, определённых с помощью VALUES LESS THAN, или списков значений для подмножества разделов, определённых с помощью VALUES IN.

    Примечание

    Для разделов, которые не были явно указаны, MySQL автоматически предоставляет имена по умолчанию p0, p1, p2 и так далее. То же самое относится и к подразделам.

    Дополнительную информацию об операторах ALTER TABLE ... REORGANIZE PARTITION и примерах см. в Разделе 26.3.1, «Управление разделами RANGE и LIST».

  • Для обмена разделом таблицы или подразделом с таблицей используйте оператор ALTER TABLE ... EXCHANGE PARTITION — то есть, для перемещения всех существующих строк в раздел или подраздел в неразбитую таблицу, и всех существующих строк в неразбитой таблице в раздел или подраздел таблицы.

    После добавления одного или нескольких столбцов в разбитую таблицу с помощью ALGORITHM=INSTANT, обмен разделами с этой таблицей больше невозможен.

    Информацию об использовании и примеры см. в Разделе 26.3.3, «Обмен разделами и подразделами с таблицами».

  • Несколько вариантов предоставляют функции обслуживания и ремонта разделов, аналогичные реализованным для неразделенных таблиц с помощью таких операторов, как CHECK TABLE и REPAIR TABLE (которые также поддерживаются для разделяемых таблиц; для получения дополнительной информации см. Раздел 15.7.3, «Операторы обслуживания таблиц»). К ним относятся ANALYZE PARTITION, CHECK PARTITION, OPTIMIZE PARTITION, REBUILD PARTITION и REPAIR PARTITION. Каждый из этих вариантов принимает предложение partition_names, содержащее одно или несколько имён разделов, разделённых запятыми. Разделы должны уже существовать в целевой таблице. Вы также можете использовать ключевое слово ALL вместо partition_names, в этом случае оператор действует на все разделы таблицы. Для получения дополнительной информации и примеров см. Раздел 26.3.4, «Обслуживание разделов».

    InnoDB в настоящее время не поддерживает оптимизацию по разделам; ALTER TABLE ... OPTIMIZE PARTITION приводит к перестроению и анализу всей таблицы, и выдаётся соответствующее предупреждение. (Ошибка #11751825, Ошибка #42822) Чтобы обойти эту проблему, используйте ALTER TABLE ... REBUILD PARTITION и ALTER TABLE ... ANALYZE PARTITION вместо этого.

    Варианты ANALYZE PARTITION, CHECK PARTITION, OPTIMIZE PARTITION и REPAIR PARTITION не поддерживаются для таблиц, которые не разделены.

  • REMOVE PARTITIONING позволяет удалить разделение таблицы, не затрагивая при этом таблицу или её данные. Этот вариант можно сочетать с другими вариантами ALTER TABLE, такими как те, которые используются для добавления, удаления или переименования столбцов или индексов.

  • Использование варианта ENGINE с ALTER TABLE изменяет используемый движок хранилища таблицы без влияния на разделение. Целевой движок хранилища должен предоставлять свой собственный обработчик разделения. Только движки хранилища InnoDB и NDB имеют встроенные обработчики разделения.

Оператор ALTER TABLE может содержать предложение PARTITION BY или REMOVE PARTITIONING в дополнение к другим спецификациям изменения, но предложения PARTITION BY или REMOVE PARTITIONING должны быть указаны последними после любых других спецификаций.

Варианты ADD PARTITION, DROP PARTITION, COALESCE PARTITION, REORGANIZE PARTITION, ANALYZE PARTITION, CHECK PARTITION и REPAIR PARTITION не могут быть объединены с другими спецификациями изменения в одном операторе ALTER TABLE, так как эти варианты действуют только на отдельные разделы. Для получения дополнительной информации см. Раздел 15.1.9.1, «Операции с разделами ALTER TABLE».

В данном операторе ALTER TABLE может быть использован только один экземпляр любого из следующих вариантов: PARTITION BY, ADD PARTITION, DROP PARTITION, TRUNCATE PARTITION, EXCHANGE PARTITION, REORGANIZE PARTITION или COALESCE PARTITION, ANALYZE PARTITION, CHECK PARTITION, OPTIMIZE PARTITION, REBUILD PARTITION, REMOVE PARTITIONING.

Например, следующие два оператора некорректны:

ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;

ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;

В первом случае вы можете одновременно анализировать разделы p1 и p2 таблицы t1 с помощью одного оператора с одним вариантом ANALYZE PARTITION, в котором перечислены оба раздела для анализа, например так:

ALTER TABLE t1 ANALYZE PARTITION p1, p2;

Во втором случае невозможно одновременно выполнять операции ANALYZE и CHECK над разными разделами одной таблицы. Вместо этого необходимо выполнить два отдельных оператора, например так:

ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;

Операции REBUILD в настоящее время не поддерживаются для подразделов. Ключевое слово REBUILD явно запрещено для подразделов и приводит к тому, что ALTER TABLE завершается с ошибкой, если оно используется.

Операции CHECK PARTITION и REPAIR PARTITION завершаются неудачно, если раздел для проверки или ремонта содержит ошибки дублирования ключей.

Для получения дополнительной информации об этих операторах см. Раздел 26.3.4, «Обслуживание разделов».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/alter-table-partition-operations.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API