Spec-Zone.ru › MySQL 5.7

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

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

  • Просто использование предложения partition_options с ALTER TABLE для таблицы с разбиением перераспределяет таблицу в соответствии со схемой разбиения, определенной partition_options. Это предложение всегда начинается с PARTITION BY и следует той же синтаксической структуре и другим правилам, что и предложение partition_options для CREATE TABLE (подробнее см. Раздел 13.1.18, «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.

    Чтобы обновить KEY разбитую таблицу, созданную в MySQL 5.1, сначала выполните SHOW CREATE TABLE и обратите внимание на точные столбцы и количество разделов, показанных. Теперь выполните оператор ALTER TABLE, используя точно тот же список столбцов и количество разделов, что и в операторе CREATE TABLE, добавив ALGORITHM=2 сразу после ключевых слов PARTITION BY. (Вы также должны включить ключевое слово LINEAR, если оно использовалось для исходного определения таблицы.) Пример из сеанса в клиенте mysql показан здесь:

    mysql> SHOW CREATE TABLE p\G
    *************************** 1. row ***************************
           Table: p
    Create Table: CREATE TABLE `p` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `cd` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    /*!50100 PARTITION BY LINEAR KEY (id)
    PARTITIONS 32 */
    1 row in set (0.00 sec)
    
    mysql> ALTER TABLE p PARTITION BY LINEAR KEY ALGORITHM=2 (id) PARTITIONS 32;
    Query OK, 0 rows affected (5.34 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> SHOW CREATE TABLE p\G
    *************************** 1. row ***************************
           Table: p
    Create Table: CREATE TABLE `p` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `cd` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    /*!50100 PARTITION BY LINEAR KEY (id)
    PARTITIONS 32 */
    1 row in set (0.00 sec)
    

    Переход с таблицы, созданной с использованием функций хеширования ключей по умолчанию в MySQL 5.5 и более поздних версиях, для ее использования сервером MySQL 5.1 аналогичен, за исключением того, что в этом случае вы должны использовать ALGORITHM=1, чтобы принудительно перестроить разделы таблицы с использованием функций хеширования ключей MySQL 5.1. Рекомендуется не делать этого, за исключением случаев, когда это необходимо для совместимости с сервером MySQL 5.1, так как улучшенные KEY функции хеширования, используемые по умолчанию в MySQL 5.5 и более поздних версиях, устраняют ряд проблем, обнаруженных в более ранней реализации.

    Примечание

    Таблица, обновленная с помощью ALTER TABLE ... PARTITION BY ALGORITHM=2 [LINEAR] KEY ..., больше не может использоваться сервером MySQL 5.1. (Такую таблицу необходимо перевести обратно с помощью ALTER TABLE ... PARTITION BY ALGORITHM=1 [LINEAR] KEY ..., прежде чем она сможет снова использоваться сервером MySQL 5.1.)

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

    Предложение partition_definition для ALTER TABLE ADD PARTITION поддерживает те же опции, что и предложение с тем же именем для оператора CREATE TABLE. (См. Раздел 13.1.18, «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. См. Раздел 22.3.1, «Управление разделами RANGE и LIST» и Раздел 21.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 таблиц. Более подробную информацию см. в Разделе 14.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';
    

    TRUNCATE PARTITION поддерживается только для разбитых таблиц, которые используют хранилища MyISAM, InnoDB или MEMORY. Он также работает с таблицами BLACKHOLE (но не оказывает никакого эффекта). Он не поддерживается для таблиц ARCHIVE.

    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.

    • Это утверждение также может быть использовано без опции partition_names INTO (partition_definitions) для таблиц, которые автоматически разделяются с помощью разбиения HASH, чтобы принудительно перераспределить данные. (В настоящее время только таблицы NDB автоматически разделяются таким образом.) Это полезно в кластере NDB, когда после добавления новых узлов данных NDB Cluster в существующий кластер NDB Cluster, вы хотите перераспределить существующие данные таблицы NDB Cluster на новые узлы данных. В таких случаях следует вызвать утверждение с опцией ALGORITHM=INPLACE; другими словами, как показано здесь:

      ALTER TABLE table ALGORITHM=INPLACE, REORGANIZE PARTITION;
      

      Другие операторы DDL не могут выполняться одновременно с онлайн-перестройкой таблицы — другими словами, другие операторы DDL не могут быть выпущены во время выполнения оператора ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION. Более подробную информацию о добавлении узлов данных кластера NDB онлайн см. в Разделе 21.6.7, «Добавление узлов данных кластера NDB онлайн».

      Примечание

      ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION не работает с таблицами, которые были созданы с использованием опции MAX_ROWS, поскольку она использует постоянное значение MAX_ROWS, указанное в исходном операторе CREATE TABLE, для определения необходимого количества разделов, поэтому новые разделы не создаются. Вместо этого можно использовать ALTER TABLE ... ALGORITHM=INPLACE, MAX_ROWS=rows для увеличения максимального числа строк для такой таблицы; в этом случае ALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITION не требуется (и вызывает ошибку при выполнении). Значение rows должно быть больше значения, указанного для MAX_ROWS в исходном операторе CREATE TABLE для его работы.

      Использование MAX_ROWS для принудительного задания количества разделов таблицы устарело в NDB 7.5.4 и более поздних версиях; используйте PARTITION_BALANCE вместо этого (см. Настройка параметров NDB_TABLE).

      Попытка использовать REORGANIZE PARTITION без опции partition_names INTO (partition_definitions) в явных разделяемых таблицах приводит к ошибке REORGANIZE PARTITION без параметров может быть использована только для автоматически разделяемых таблиц с использованием разбиения HASH.

    Примечание

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

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

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

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

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

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

    Чтобы обойти эту проблему, используйте операторы ALTER TABLE ... REBUILD PARTITION и ALTER TABLE ... ANALYZE PARTITION вместо этого.

    Опции ANALYZE PARTITION, CHECK PARTITION, OPTIMIZE PARTITION и REPAIR PARTITION не разрешены для таблиц, которые не разделены.

  • В MySQL 5.7.9 и более поздних версиях можно использовать ALTER TABLE ... UPGRADE PARTITIONING для обновления разделённой таблицы InnoDB, которая была создана с помощью старого универсального обработчика разбиения, до встроенного обработчика разбиения InnoDB, используемого в MySQL 5.7.6 и более поздних версиях. Начиная с MySQL 5.7.9, утилита mysql_upgrade проверяет такие разделённые таблицы InnoDB и пытается обновить их до встроенного разбиения в рамках своей обычной работы.

    Важно

    Разделённые InnoDB таблицы, которые не используют встроенный обработчик разбиения InnoDB, не могут быть использованы в MySQL 8.0 или более поздних версиях. ALTER TABLE ... UPGRADE PARTITIONING не поддерживается в MySQL 8.0 или более поздних версиях; поэтому все разделённые InnoDB таблицы, использующие универсальный обработчик, должны быть обновлены до встроенного обработчика InnoDB до обновления вашей установки MySQL до MySQL 8.0 или более поздних версий.

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

  • Использование опции ENGINE с ALTER TABLE изменяет механизм хранения, используемый таблицей, не затрагивая разбиение.

При запуске ALTER TABLE ... EXCHANGE PARTITION или ALTER TABLE ... TRUNCATE PARTITION на разделённой таблице, использующей MyISAM (или другом механизме хранения, использующем блокировку таблицы), блокируются только те разделы, которые фактически считываются. (Это не относится к разделённым таблицам, использующим механизм хранения с блокировкой строк, такой как InnoDB.) См. Раздел 22.6.4, «Разбиение и блокировка».

Оператор 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, так как эти опции действуют на отдельные разделы. Более подробная информация приведена в Разделе 13.1.8.1, «Операции ALTER TABLE Partition Operations».

В данном операторе 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 завершаются неудачно, если проверяемый или восстанавливаемый раздел содержит какие-либо ошибки дублирования ключей.

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

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

Spec-Zone.ru

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