Spec-Zone.ru › MySQL 9.2

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

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

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

    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.21, «Операция CREATE TABLE», для синтаксиса и описания.) Предположим, что у вас есть разбитая таблица, созданная, как показано здесь:

    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 объединяются с первыми четырьмя разбиениями (разбиения с номерами 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-9.2-en/alter-table-partition-operations.html

Spec-Zone.ru

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