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 pPARTITION 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_namesINTO (partition_definitions)HASH, чтобы принудительно перераспределить данные. (В настоящее время только таблицыNDBавтоматически разделяются таким образом.) Это полезно в кластере NDB, когда после добавления новых узлов данных NDB Cluster в существующий кластер NDB Cluster, вы хотите перераспределить существующие данные таблицы NDB Cluster на новые узлы данных. В таких случаях следует вызвать утверждение с опциейALGORITHM=INPLACE; другими словами, как показано здесь:ALTER TABLE
tableALGORITHM=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=для увеличения максимального числа строк для такой таблицы; в этом случаеrowsALTER TABLE ... ALGORITHM=INPLACE, REORGANIZE PARTITIONне требуется (и вызывает ошибку при выполнении). Значениеrowsдолжно быть больше значения, указанного дляMAX_ROWSв исходном оператореCREATE TABLEдля его работы.Использование
MAX_ROWSдля принудительного задания количества разделов таблицы устарело в NDB 7.5.4 и более поздних версиях; используйтеPARTITION_BALANCEвместо этого (см. Настройка параметров NDB_TABLE).Попытка использовать
REORGANIZE PARTITIONбез опциив явных разделяемых таблицах приводит к ошибке REORGANIZE PARTITION без параметров может быть использована только для автоматически разделяемых таблиц с использованием разбиения HASH.partition_namesINTO (partition_definitions)
ПримечаниеДля разделов, которые не были явным образом указаны, 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.