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.