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.